diff --git a/nestjs-mongoose/src/common/pagination/pagination.dto.ts b/nestjs-mongoose/src/common/pagination/pagination.dto.ts index c6f4fca..5709ef1 100644 --- a/nestjs-mongoose/src/common/pagination/pagination.dto.ts +++ b/nestjs-mongoose/src/common/pagination/pagination.dto.ts @@ -1,5 +1,10 @@ import { IsInt, IsOptional, Min } from 'class-validator'; -import { ClassConstructor, ClassTransformOptions, Expose, plainToClass } from '@nestjs/class-transformer'; +import { + ClassConstructor, + ClassTransformOptions, + Expose, + plainToClass, +} from '@nestjs/class-transformer'; import { Type } from 'class-transformer'; import { ApiPropertyOptional } from '@nestjs/swagger'; @@ -26,7 +31,6 @@ export class PaginationParamsDto { } export class DataWithPaginationDto { - @Expose() data: T[]; @@ -38,8 +42,11 @@ export class DataWithPaginationDto { }; } -export function transformPlainToDataWithPaginationDto(cls: ClassConstructor, - plain: DataWithPaginationDto, options?: ClassTransformOptions): DataWithPaginationDto { +export function transformPlainToDataWithPaginationDto( + cls: ClassConstructor, + plain: DataWithPaginationDto, + options?: ClassTransformOptions, +): DataWithPaginationDto { const { data, meta } = plain; const transformedData = data.map((item) => { return plainToClass(cls, item, options); diff --git a/nestjs-mongoose/src/common/pagination/transform-pagination-response.decorator.ts b/nestjs-mongoose/src/common/pagination/transform-pagination-response.decorator.ts index 3a99620..e6b5992 100644 --- a/nestjs-mongoose/src/common/pagination/transform-pagination-response.decorator.ts +++ b/nestjs-mongoose/src/common/pagination/transform-pagination-response.decorator.ts @@ -1,18 +1,19 @@ -import { ClassConstructor, ClassTransformer, ClassTransformOptions } from "@nestjs/class-transformer"; -import { transformPlainToDataWithPaginationDto } from "./pagination.dto"; +import { + ClassConstructor, + ClassTransformOptions, +} from '@nestjs/class-transformer'; +import { transformPlainToDataWithPaginationDto } from './pagination.dto'; export function TransformPaginationResponse( classType: ClassConstructor, - params?: ClassTransformOptions + params?: ClassTransformOptions, ): MethodDecorator { return function ( target: Record, - propertyKey: string | Symbol, - descriptor: PropertyDescriptor + propertyKey: string | symbol, + descriptor: PropertyDescriptor, ): void { - const classTransformer: ClassTransformer = new ClassTransformer(); const originalMethod = descriptor.value; - descriptor.value = function (...args: any[]): Record { const result: any = originalMethod.apply(this, args); const isPromise = @@ -21,10 +22,9 @@ export function TransformPaginationResponse( typeof result.then === 'function'; return isPromise ? result.then((data: any) => - transformPlainToDataWithPaginationDto(classType, data, params) - ) + transformPlainToDataWithPaginationDto(classType, data, params), + ) : transformPlainToDataWithPaginationDto(classType, result, params); }; }; } - diff --git a/nestjs-mongoose/src/posts/dto/create-posts.dto.ts b/nestjs-mongoose/src/posts/dto/create-posts.dto.ts deleted file mode 100644 index dc3183d..0000000 --- a/nestjs-mongoose/src/posts/dto/create-posts.dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IsString, IsNotEmpty } from 'class-validator'; - -export class CreatePostsDto { - @IsString() - @IsNotEmpty() - title: string; - - @IsString() - @IsNotEmpty() - content: string; -} - -export default CreatePostsDto; diff --git a/nestjs-mongoose/src/posts/dto/create-update-posts.dto.ts b/nestjs-mongoose/src/posts/dto/create-update-posts.dto.ts new file mode 100644 index 0000000..ec04857 --- /dev/null +++ b/nestjs-mongoose/src/posts/dto/create-update-posts.dto.ts @@ -0,0 +1,26 @@ +import { IsOptional, IsString, IsNotEmpty } from 'class-validator'; + +interface PostDto { + title: string; + content: string; +} + +export class UpdatePostDto implements PostDto { + @IsString() + @IsOptional() + title: string; + + @IsString() + @IsOptional() + content: string; +} + +export class CreatePostDto implements PostDto { + @IsString() + @IsNotEmpty() + title: string; + + @IsString() + @IsNotEmpty() + content: string; +} diff --git a/nestjs-mongoose/src/posts/dto/posts.dto.ts b/nestjs-mongoose/src/posts/dto/posts.dto.ts index dafd7c7..4513a73 100644 --- a/nestjs-mongoose/src/posts/dto/posts.dto.ts +++ b/nestjs-mongoose/src/posts/dto/posts.dto.ts @@ -1,5 +1,5 @@ import { Expose, Transform } from '@nestjs/class-transformer'; -import { DataWithPaginationDto, PaginationParamsDto } from '../../common/pagination/pagination.dto'; +import { PaginationParamsDto } from '../../common/pagination/pagination.dto'; export class PostsDto { @Expose() @@ -20,5 +20,3 @@ export class PostsDto { } export class GetPostsDto extends PaginationParamsDto { } - -export class GetPostsResponseDto extends DataWithPaginationDto { } diff --git a/nestjs-mongoose/src/posts/dto/update-post.dto.ts b/nestjs-mongoose/src/posts/dto/update-post.dto.ts deleted file mode 100644 index 55d9b88..0000000 --- a/nestjs-mongoose/src/posts/dto/update-post.dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IsOptional, IsString } from 'class-validator'; - -export class UpdatePostDto { - @IsString() - @IsOptional() - title: string; - - @IsString() - @IsOptional() - content: string; -} - -export default UpdatePostDto; diff --git a/nestjs-mongoose/src/posts/dto/update-posts.dto.ts b/nestjs-mongoose/src/posts/dto/update-posts.dto.ts deleted file mode 100644 index 1313971..0000000 --- a/nestjs-mongoose/src/posts/dto/update-posts.dto.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Expose, Transform, Exclude } from '@nestjs/class-transformer'; - -export class UpdatePostsDto { - @Exclude() - id: string; - - @Expose() - title: string; - - @Expose() - @Transform(({ value }) => value || 'No-content') - content: string; - - @Expose() - createdAt: Date; -} diff --git a/nestjs-mongoose/src/posts/posts.controller.ts b/nestjs-mongoose/src/posts/posts.controller.ts index 25250c0..f6fea9b 100644 --- a/nestjs-mongoose/src/posts/posts.controller.ts +++ b/nestjs-mongoose/src/posts/posts.controller.ts @@ -11,10 +11,8 @@ import { Put, Query, } from '@nestjs/common'; -import CreatePostsDto from './dto/create-posts.dto'; import ParamsWithId from '../utils/paramsWithId'; -import UpdatePostDto from './dto/update-post.dto'; -import { UpdatePostsDto } from './dto/update-posts.dto'; +import { UpdatePostDto, CreatePostDto } from './dto/create-update-posts.dto'; import { TransformPlainToClass } from '@nestjs/class-transformer'; import { GetPostsDto, PostsDto } from './dto/posts.dto'; import { ApiBody, ApiTags } from '@nestjs/swagger'; @@ -41,10 +39,10 @@ export default class PostsController { } @Post() - @ApiBody({ type: CreatePostsDto }) + @ApiBody({ type: CreatePostDto }) @ApiBody(swaggerConfig.body) @TransformPlainToClass(PostsDto, { excludeExtraneousValues: true }) - async createPost(@Body() post: CreatePostsDto) { + async createPost(@Body() post: CreatePostDto) { return this.postsService.create(post); } @@ -57,18 +55,15 @@ export default class PostsController { @swaggerConfig.param.id @ApiBody(swaggerConfig.body) @Put(':id') - @TransformPlainToClass(UpdatePostsDto, { excludeExtraneousValues: true }) - async updatePost( - @Param() { id }: ParamsWithId, - @Body() post: CreatePostsDto, - ) { + @TransformPlainToClass(PostsDto, { excludeExtraneousValues: true }) + async updatePost(@Param() { id }: ParamsWithId, @Body() post: CreatePostDto) { return this.postsService.update(id, post); } @swaggerConfig.param.id @ApiBody(swaggerConfig.body) @Patch(':id') - @TransformPlainToClass(UpdatePostsDto, { excludeExtraneousValues: true }) + @TransformPlainToClass(PostsDto, { excludeExtraneousValues: true }) async partialUpdatePost( @Param() { id }: ParamsWithId, @Body() post: UpdatePostDto, diff --git a/nestjs-mongoose/src/posts/posts.service.ts b/nestjs-mongoose/src/posts/posts.service.ts index e02eeab..359080a 100644 --- a/nestjs-mongoose/src/posts/posts.service.ts +++ b/nestjs-mongoose/src/posts/posts.service.ts @@ -1,14 +1,14 @@ import { Model } from 'mongoose'; import { Injectable, NotFoundException } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; -import CreatePostsDto from './dto/create-posts.dto'; +import { CreatePostDto, UpdatePostDto } from './dto/create-update-posts.dto'; import { Post, PostDocument } from './post.schema'; import { paginate } from '../common/pagination/pagination-mongoose.helper'; import { PaginationParamsDto } from '../common/pagination/pagination.dto'; @Injectable() class PostsService { - constructor(@InjectModel(Post.name) private postModel: Model) { } + constructor(@InjectModel(Post.name) private postModel: Model) {} async findAll(paginationParams: PaginationParamsDto) { return paginate(this.postModel.find(), paginationParams); @@ -22,12 +22,12 @@ class PostsService { return post; } - create(postData: CreatePostsDto) { + create(postData: CreatePostDto) { const createdPost = new this.postModel(postData); return createdPost.save(); } - async update(id: string, postData: CreatePostsDto) { + async update(id: string, postData: CreatePostDto) { const post = await this.postModel .findByIdAndUpdate(id, postData) .setOptions({ overwrite: true, new: true }); @@ -37,7 +37,7 @@ class PostsService { return post; } - async partialUpdate(id: string, postData: CreatePostsDto) { + async partialUpdate(id: string, postData: UpdatePostDto) { const post = await this.postModel .findByIdAndUpdate(id, { $set: postData,