chore(deps): add zod and nestjs-zod for schema validation

This commit is contained in:
2026-02-07 03:43:59 +08:00
parent 0bf46e887d
commit e8a8ad389c
7 changed files with 175 additions and 146 deletions

View File

@@ -1,46 +1,24 @@
import { IsString, IsNotEmpty, IsNumber, IsOptional, IsBoolean, Min, Max } from 'class-validator';
import { z } from "zod";
export class GenerateSerialDto {
@IsString()
@IsNotEmpty({ message: '企业名称不能为空' })
companyName: string;
export const GenerateSerialDto = z.object({
companyName: z.string().min(1, "企业名称不能为空"),
quantity: z.number().min(1).max(100).optional(),
validDays: z.number().optional(),
});
@IsOptional()
@IsNumber()
@Min(1)
@Max(100)
quantity?: number;
export const GenerateWithPrefixDto = GenerateSerialDto.extend({
serialPrefix: z.string().min(1, "自定义前缀不能为空"),
});
@IsOptional()
@IsNumber()
validDays?: number;
}
export const QRCodeDto = z.object({
baseUrl: z.string().optional(),
});
export class GenerateWithPrefixDto extends GenerateSerialDto {
@IsString()
@IsNotEmpty({ message: '自定义前缀不能为空' })
serialPrefix: string;
}
export class QRCodeDto {
@IsOptional()
@IsString()
baseUrl?: string;
}
export class UpdateSerialDto {
@IsOptional()
@IsString()
companyName?: string;
@IsOptional()
@IsString()
validUntil?: string;
@IsOptional()
@IsBoolean()
isActive?: boolean;
}
export const UpdateSerialDto = z.object({
companyName: z.string().optional(),
validUntil: z.string().optional(),
isActive: z.boolean().optional(),
});
export interface Serial {
id: number;

View File

@@ -1,18 +1,38 @@
import { Controller, Get, Post, Patch, Body, Param, Query, UseGuards, Req, HttpCode, HttpStatus } from '@nestjs/common';
import { Request } from 'express';
import { SerialsService } from './serials.service';
import { AuthGuard } from '../auth/auth.guard';
import { AdminGuard } from '../auth/admin.guard';
import { GenerateSerialDto, GenerateWithPrefixDto, QRCodeDto, UpdateSerialDto } from './dto';
import {
Controller,
Get,
Post,
Patch,
Body,
Param,
Query,
UseGuards,
Req,
HttpCode,
HttpStatus,
} from "@nestjs/common";
import { Request } from "express";
import { SerialsService } from "./serials.service";
import { AuthGuard } from "../auth/auth.guard";
import { AdminGuard } from "../auth/admin.guard";
import {
GenerateSerialDto,
GenerateWithPrefixDto,
QRCodeDto,
UpdateSerialDto,
} from "./dto";
@Controller('serials')
@Controller("serials")
export class SerialsController {
constructor(private readonly serialsService: SerialsService) {}
@Post('generate')
@Post("generate")
@UseGuards(AuthGuard, AdminGuard)
@HttpCode(HttpStatus.OK)
async generate(@Body() generateDto: GenerateSerialDto, @Req() req: Request) {
async generate(
@Body(GenerateSerialDto) generateDto: any,
@Req() req: Request,
) {
const serials = await this.serialsService.generate(
generateDto.companyName,
generateDto.quantity || 1,
@@ -25,10 +45,13 @@ export class SerialsController {
};
}
@Post('generate-with-prefix')
@Post("generate-with-prefix")
@UseGuards(AuthGuard, AdminGuard)
@HttpCode(HttpStatus.OK)
async generateWithPrefix(@Body() generateDto: GenerateWithPrefixDto, @Req() req: Request) {
async generateWithPrefix(
@Body(GenerateWithPrefixDto) generateDto: any,
@Req() req: Request,
) {
const serials = await this.serialsService.generate(
generateDto.companyName,
generateDto.quantity || 1,
@@ -42,44 +65,44 @@ export class SerialsController {
};
}
@Post(':serialNumber/qrcode')
@Post(":serialNumber/qrcode")
@UseGuards(AuthGuard)
@HttpCode(HttpStatus.OK)
async generateQRCode(
@Param('serialNumber') serialNumber: string,
@Body() qrCodeDto: QRCodeDto,
@Param("serialNumber") serialNumber: string,
@Body(QRCodeDto) qrCodeDto: any,
@Req() req: Request,
) {
return this.serialsService.generateQRCode(
serialNumber,
qrCodeDto.baseUrl,
req.get('host'),
req.get("host"),
req.protocol,
);
}
@Get(':serialNumber/query')
@Get(":serialNumber/query")
@HttpCode(HttpStatus.OK)
async query(@Param('serialNumber') serialNumber: string) {
async query(@Param("serialNumber") serialNumber: string) {
return this.serialsService.query(serialNumber);
}
@Get()
@UseGuards(AuthGuard)
async findAll(
@Query('page') page: string = '1',
@Query('limit') limit: string = '20',
@Query('search') search: string = '',
@Query("page") page: string = "1",
@Query("limit") limit: string = "20",
@Query("search") search: string = "",
) {
return this.serialsService.findAll(parseInt(page), parseInt(limit), search);
}
@Patch(':serialNumber')
@Patch(":serialNumber")
@UseGuards(AuthGuard, AdminGuard)
@HttpCode(HttpStatus.OK)
async update(
@Param('serialNumber') serialNumber: string,
@Body() updateDto: UpdateSerialDto,
@Param("serialNumber") serialNumber: string,
@Body(UpdateSerialDto) updateDto: any,
) {
return this.serialsService.update(serialNumber, {
companyName: updateDto.companyName,
@@ -88,10 +111,10 @@ export class SerialsController {
});
}
@Post(':serialNumber/revoke')
@Post(":serialNumber/revoke")
@UseGuards(AuthGuard, AdminGuard)
@HttpCode(HttpStatus.OK)
async revoke(@Param('serialNumber') serialNumber: string) {
async revoke(@Param("serialNumber") serialNumber: string) {
return this.serialsService.revoke(serialNumber);
}
}