He estado usando el framework Java Spring para desarrollar Microservicios. Recientemente comencé a explorar NestJS y tengo una pregunta sobre la creación de DTO de respuesta.
En Spring, los controladores son livianos, entregan la llamada a Service Layer.
La capa de servicio implementa la lógica de negocios y, finalmente, llama a las clases Mapper que son responsables de construir los DTO de respuesta. La clase de mapeador puede ser tan simple como clonar la entidad en un DTO o también puede crear objetos complejos utilizando varios objetos de entidad de base de datos.
En NestJS, en la mayoría de los ejemplos se utiliza class-transformer . Pero no estoy seguro de que el class-transformer sea lo suficientemente bueno para construir objetos complejos. Para mí class-transformer es básicamente clonar el objeto. El equivalente de que en Spring es
BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);Entonces mi pregunta es en NestJS, ¿qué capa es responsable de construir objetos de respuesta complejos? ¿Y es una buena práctica enviar el objeto Entity al Controller?
Alguien en otra respuesta dibuje esta imagen que explica el ciclo de vida de una solicitud dentro de NestJS (gritar a esa persona):
Para responder a su pregunta: what layer is responsible for building complex response objects? bueno, digo que los interceptores son el último bit de lógica que maneja las solicitudes, pero supongo que lo que está preguntando es "¿dónde se convierten las entidades automáticamente en DTO?" lo que explicaría su segunda pregunta: Is sending Entity object to Controller a good practice?
Respuesta corta: depende. Respuesta larga: los DTO son realmente útiles para desvincular la lógica de su solicitud con la lógica de su servicio, hay algunos valores que quizás no desee que el usuario sepa nunca y simplemente llénelos dentro de su lógica ... Y por lo tanto, es una buena práctica usar a ellos. Pero realmente, piense en su proyecto, el tamaño del mismo y lo que está tratando de lograr, especialmente ahora que tiene que manejar esa conversión.
Dicho esto, sobre la conversión entre Entidades y DTO. Una cosa que podría hacer es un conjunto manual total entre parámetros:
export class UserDTO { id: string; name: string; surname: string; toEntity(dto:UserDTO) { const model = new User(); model.id = id; model.fullname = `${dto.name}, ${dto.surname}` return model; } fromEntity(entity:User) { const dto = new UserDTO(); dto.id = entity.id; const [ name, surname ] = entity.(fullname as string).split(', ').map((name) => {name.tirm()}); dto.name = name, dto.surname = surname; } } Por otro lado, class-transformer y su uso de instanceToPlain y plainToClass pueden lograr muchos. Con el uso de decoradores como Expose y Exclude , puede manejar la mayoría de los casos de uso.
Y si eso no es suficiente, puede usar algo como: https://www.npmjs.com/package/@automapper/nestjs