Skip to content

Xác thực

Xác thực yêu cầu với @galaxy-stack/orbit-validation sử dụng schema Zod.

ValidationPipe

typescript
import { BunFactory } from '@galaxy-stack/orbit-core';
import { ValidationPipe } from '@galaxy-stack/orbit-validation';

const app = await BunFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());

Xác thực Schema Zod

typescript
import { z } from 'zod';
import { ZodValidationPipe } from '@galaxy-stack/orbit-validation';

const createUserSchema = z.object({
  name: z.string().min(2).max(50),
  email: z.string().email(),
  age: z.number().int().min(18).optional(),
  role: z.enum(['user', 'admin']).default('user'),
});

type CreateUserDto = z.infer<typeof createUserSchema>;

@Controller('users')
export class UsersController {
  @Post()
  createUser(
    @Body(new ZodValidationPipe(createUserSchema)) data: CreateUserDto,
  ) {
    return this.usersService.create(data);
  }
}

Decorator biến đổi

typescript
import { Transform, Trim, ToLowerCase, ToNumber } from '@galaxy-stack/orbit-validation';

class SearchDto {
  @Trim()
  @ToLowerCase()
  query: string;

  @ToNumber()
  page: number;

  @Transform(({ value }) => value.split(','))
  tags: string[];
}

Trình xác thực tùy chỉnh

typescript
const passwordSchema = z.string()
  .min(8)
  .regex(/[A-Z]/, 'Phải chứa chữ hoa')
  .regex(/[a-z]/, 'Phải chứa chữ thường')
  .regex(/[0-9]/, 'Phải chứa số');

const registrationSchema = z.object({
  email: z.string().email(),
  password: passwordSchema,
  confirmPassword: z.string(),
}).refine(data => data.password === data.confirmPassword, {
  message: 'Mật khẩu phải khớp',
  path: ['confirmPassword'],
});

Phản hồi lỗi

json
{
  "statusCode": 400,
  "message": "Xác thực thất bại",
  "errors": [
    {
      "field": "email",
      "message": "Định dạng email không hợp lệ"
    },
    {
      "field": "age",
      "message": "Phải ít nhất 18 tuổi"
    }
  ]
}

Released under the MIT License.