From 6059ff4ed2239faa29afc4381c08aefb50e3afbd Mon Sep 17 00:00:00 2001 From: liuyi Date: Mon, 12 May 2025 14:03:52 +0800 Subject: [PATCH] add content --- .../content/controllers/post.controller.ts | 36 ++++++++++++++++--- src/modules/content/dtos/create-post.dto.ts | 18 ++++++++++ src/modules/content/dtos/update-post.dto.ts | 13 +++++++ 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/modules/content/dtos/create-post.dto.ts create mode 100644 src/modules/content/dtos/update-post.dto.ts diff --git a/src/modules/content/controllers/post.controller.ts b/src/modules/content/controllers/post.controller.ts index d1f7fa6..e6bbaac 100644 --- a/src/modules/content/controllers/post.controller.ts +++ b/src/modules/content/controllers/post.controller.ts @@ -7,10 +7,14 @@ import { Param, Patch, Post, + ValidationPipe, } from '@nestjs/common'; import { isNil } from '@nestjs/common/utils/shared.utils'; +import { CreatePostDto } from '@/modules/content/dtos/create-post.dto'; +import { UpdatePostDto } from '@/modules/content/dtos/update-post.dto'; + import { PostEntity } from '../types'; let posts: PostEntity[] = [ @@ -39,7 +43,18 @@ export class PostController { } @Post() - async store(@Body() data: PostEntity) { + async store( + @Body( + new ValidationPipe({ + transform: true, + forbidNonWhitelisted: true, + forbidUnknownValues: true, + validationError: { target: false }, + groups: ['create'], + }), + ) + data: CreatePostDto, + ) { const newPost: PostEntity = { id: Math.max(...posts.map(({ id }) => id + 1)), ...data, @@ -49,14 +64,25 @@ export class PostController { } @Patch() - async update(@Body() data: PostEntity) { - let toUpdate = posts.find((item) => item.id === Number(data.id)); + async update( + @Body( + new ValidationPipe({ + transform: true, + forbidNonWhitelisted: true, + forbidUnknownValues: true, + validationError: { target: false }, + groups: ['update'], + }), + ) + { id, ...data }: UpdatePostDto, + ) { + let toUpdate = posts.find((item) => item.id === Number(id)); if (isNil(toUpdate)) { - throw new NotFoundException(`the post with id ${data.id} not exits!`); + throw new NotFoundException(`the post with id ${id} not exits!`); } toUpdate = { ...toUpdate, ...data }; - posts = posts.map((item) => (item.id === Number(data.id) ? toUpdate : item)); + posts = posts.map((item) => (item.id === Number(id) ? toUpdate : item)); return toUpdate; } diff --git a/src/modules/content/dtos/create-post.dto.ts b/src/modules/content/dtos/create-post.dto.ts new file mode 100644 index 0000000..5081fc1 --- /dev/null +++ b/src/modules/content/dtos/create-post.dto.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@nestjs/common'; +import { IsNotEmpty, IsOptional, MaxLength } from 'class-validator'; + +@Injectable() +export class CreatePostDto { + @MaxLength(255, { always: true, message: 'the max length of content title is $constraint1' }) + @IsNotEmpty({ groups: ['create'], message: 'the title of content should not be empty' }) + @IsOptional({ groups: ['update'] }) + title: string; + + @IsNotEmpty({ groups: ['create'], message: 'the body of content should not be empty' }) + @IsOptional({ groups: ['update'] }) + body: string; + + @MaxLength(500, { always: true, message: 'the max length of content summary is $constraint1' }) + @IsOptional({ always: true }) + summary?: string; +} diff --git a/src/modules/content/dtos/update-post.dto.ts b/src/modules/content/dtos/update-post.dto.ts new file mode 100644 index 0000000..e4e6ea1 --- /dev/null +++ b/src/modules/content/dtos/update-post.dto.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@nestjs/common'; +import { PartialType } from '@nestjs/swagger'; + +import { IsDefined, IsNumber } from 'class-validator'; + +import { CreatePostDto } from './create-post.dto'; + +@Injectable() +export class UpdatePostDto extends PartialType(CreatePostDto) { + @IsNumber(undefined, { groups: ['update'], message: 'The format of the post ID is incorrect.' }) + @IsDefined({ groups: ['update'], message: 'The post ID must be specified' }) + id: number; +}