add content

This commit is contained in:
liuyi 2025-05-12 14:03:52 +08:00
parent 65b52d8b6e
commit 6059ff4ed2
3 changed files with 62 additions and 5 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}