chore(deps): add zod and nestjs-zod for schema validation
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user