You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -70,7 +70,18 @@ Por defecto, el esquema de datos de Spring para la paginación es como el siguie
70
70
}
71
71
```
72
72
73
-
Así que necesitamos poder enviar y recuperar esa información desde Angular, nos hace falta crear esos objetos. Los objetos de paginación, al ser comunes a toda la aplicación, vamos a crearlos en `core/model/page`, mientras que la paginación de `AuthorPage.ts` la crearé en su propio model dentro de `author/model`.
73
+
Así que necesitamos poder enviar y recuperar esa información desde Angular, nos hace falta crear esos objetos. Los objetos de paginación, al ser comunes a toda la aplicación, vamos a crearlos en `core/model/page`.
74
+
75
+
!!! info "¿Por qué en `core/model/page` y no dentro del componente `author`?"
76
+
`SortPage`, `Pageable` y `PaginatedData`**no pertenecen al dominio de negocio de `Author`**; son contratos técnicos que describen cómo se comunica el frontend con el backend cuando los datos vienen paginados.
77
+
78
+
Cualquier otro listado de la aplicación —categorías, préstamos, juegos…— necesitará exactamente estos mismos objetos. Si los metiéramos dentro de `author/`, el día que quisiéramos paginar otro listado tendríamos dos opciones igual de malas: duplicar el código o importar clases de un módulo que no tiene nada que ver con tu entidad.
79
+
80
+
Colocarlos en `core/` sigue el principio de **reutilización y responsabilidad única**:
81
+
82
+
- Un único lugar donde mantener el contrato de paginación.
83
+
- Si el backend cambia el esquema (p. ej. renombra `pageNumber` a `page`), sólo hay que tocar un fichero.
84
+
- Cualquier desarrollador que llegue al proyecto sabrá dónde buscarlos sin tener que adivinar en qué módulo de negocio están escondidos.
74
85
75
86
=== "SortPage.ts"
76
87
``` TypeScript
@@ -89,25 +100,38 @@ Así que necesitamos poder enviar y recuperar esa información desde Angular, no
89
100
sort: SortPage[];
90
101
}
91
102
```
92
-
=== "AuthorPage.ts"
103
+
=== "PaginatedData.ts"
93
104
``` TypeScript
94
105
import { Pageable } from "src/app/core/model/page/Pageable";
95
-
import { Author } from "./Author";
96
106
97
-
export class AuthorPage {
98
-
content: Author[];
107
+
export class PaginatedData <TData>{
108
+
content: TData[];
99
109
pageable: Pageable;
100
110
totalElements: number;
101
111
}
102
112
```
103
113
114
+
!!! info "¿Qué es `<TData>`?"
115
+
`<TData>` es un **genérico de TypeScript** (el equivalente a los *generics* de Java `<T>` o de C# `<T>`).
116
+
117
+
Permite que `PaginatedData` sea una clase **reutilizable con cualquier tipo de contenido**, sin necesidad de crear una clase distinta para cada entidad:
TypeScript verifica el tipo en tiempo de compilación, por lo que si intentas acceder a una propiedad que no existe en `Author` dentro de un `PaginatedData<Author>`, el compilador te avisará de inmediato. Obtienes reutilización **y** seguridad de tipos al mismo tiempo.
126
+
104
127
Con estos objetos creados ya podemos implementar el servicio y sus datos mockeados.
105
128
106
129
=== "mock-authors.ts"
107
130
``` TypeScript
108
-
import { AuthorPage } from './model/AuthorPage';
131
+
import { PaginatedData } from 'src/app/core/model/page/PaginatedData';
0 commit comments