diff --git a/src/api-key/api-key.dto.ts b/src/api-key/api-key.dto.ts index 0cddc6db..e4a4bb39 100644 --- a/src/api-key/api-key.dto.ts +++ b/src/api-key/api-key.dto.ts @@ -6,35 +6,40 @@ import { IsUUID, ValidateNested, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { Type } from 'class-transformer'; import { APIKey, APIKeyAttrs, APIKeyPermission } from './api-key.entity'; import { NamespaceResponseDto } from 'omniboxd/namespaces/dto/namespace-response.dto'; import { UserResponseDto } from 'omniboxd/user/dto/user-response.dto'; export class CreateAPIKeyDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.userId.isString'), + }) user_id: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.namespaceId.isString'), + }) namespace_id: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) @IsOptional() attrs?: APIKeyAttrs; } export class UpdateAPIKeyDto { - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) @IsOptional() attrs?: APIKeyAttrs; } export class PatchAPIKeyDto { - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() root_resource_id?: string; - @IsArray() + @IsArray({ message: i18nValidationMessage('validation.errors.isArray') }) @ValidateNested({ each: true }) @Type(() => Object) @IsOptional() @@ -42,19 +47,25 @@ export class PatchAPIKeyDto { } export class APIKeyResponseDto { - @IsUUID() + @IsUUID(undefined, { + message: i18nValidationMessage('validation.errors.isUUID'), + }) id: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) value: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.userId.isString'), + }) user_id: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.namespaceId.isString'), + }) namespace_id: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) attrs: APIKeyAttrs; created_at: Date; diff --git a/src/applications/applications.dto.ts b/src/applications/applications.dto.ts index 7947e9f7..ccf21539 100644 --- a/src/applications/applications.dto.ts +++ b/src/applications/applications.dto.ts @@ -1,40 +1,53 @@ import { IsOptional, IsString, IsUUID, IsObject } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { Applications } from 'omniboxd/applications/applications.entity'; export class FindAllApplicationsDto { - @IsUUID() + @IsUUID(undefined, { + message: i18nValidationMessage('validation.errors.isUUID'), + }) @IsOptional() api_key_id?: string; } export class CreateApplicationsDto { - @IsUUID() + @IsUUID(undefined, { + message: i18nValidationMessage('validation.errors.isUUID'), + }) @IsOptional() api_key_id?: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) @IsOptional() attrs?: Record; } export class ApplicationsResponseDto { - @IsUUID() + @IsUUID(undefined, { + message: i18nValidationMessage('validation.errors.isUUID'), + }) id: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.namespaceId.isString'), + }) namespace_id: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.userId.isString'), + }) user_id: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) app_id: string; - @IsUUID() + @IsUUID(undefined, { + message: i18nValidationMessage('validation.errors.isUUID'), + }) @IsOptional() api_key_id: string | null; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) attrs: Record; created_at: Date; diff --git a/src/auth/dto/invitation.dto.ts b/src/auth/dto/invitation.dto.ts index 6c535c4b..76b05504 100644 --- a/src/auth/dto/invitation.dto.ts +++ b/src/auth/dto/invitation.dto.ts @@ -1,32 +1,43 @@ import { Expose } from 'class-transformer'; import { IsEnum, IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { NamespaceRole } from 'omniboxd/namespaces/entities/namespace-member.entity'; import { ResourcePermission } from 'omniboxd/permissions/resource-permission.enum'; // Invite a user to a group or a resource within a namespace export class UserInvitationDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.namespaceId.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.namespaceId.isNotEmpty'), + }) namespaceId: string; @Expose() - @IsEnum(NamespaceRole) - @IsNotEmpty() + @IsEnum(NamespaceRole, { + message: i18nValidationMessage('validation.errors.isEnum'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) namespaceRole: NamespaceRole; @Expose() - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() resourceId?: string; @Expose() - @IsEnum(ResourcePermission) + @IsEnum(ResourcePermission, { + message: i18nValidationMessage('validation.errors.permission.isEnum'), + }) @IsOptional() permission?: ResourcePermission; @Expose() - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() groupId?: string | null; } diff --git a/src/auth/dto/invite-payload.dto.ts b/src/auth/dto/invite-payload.dto.ts index 84580628..2d5fb2af 100644 --- a/src/auth/dto/invite-payload.dto.ts +++ b/src/auth/dto/invite-payload.dto.ts @@ -1,11 +1,16 @@ import { Expose, Type } from 'class-transformer'; import { UserInvitationDto } from './invitation.dto'; import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class InvitePayloadDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.userId.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.userId.isNotEmpty'), + }) userId: string; @Expose() diff --git a/src/auth/dto/login-payload.dto.ts b/src/auth/dto/login-payload.dto.ts index a8c63db6..123db665 100644 --- a/src/auth/dto/login-payload.dto.ts +++ b/src/auth/dto/login-payload.dto.ts @@ -1,14 +1,21 @@ import { Expose } from 'class-transformer'; import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class LoginPayloadDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.email.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.email.isNotEmpty'), + }) email: string; @Expose() - @IsString() - @IsNotEmpty() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) sub: string; } diff --git a/src/auth/dto/signup-payload.dto.ts b/src/auth/dto/signup-payload.dto.ts index 370e0882..4da6ffa6 100644 --- a/src/auth/dto/signup-payload.dto.ts +++ b/src/auth/dto/signup-payload.dto.ts @@ -1,11 +1,16 @@ import { Expose, Type } from 'class-transformer'; import { UserInvitationDto } from './invitation.dto'; import { IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class SignUpPayloadDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.email.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.email.isNotEmpty'), + }) email: string; @Expose() diff --git a/src/auth/dto/wechat-login.dto.ts b/src/auth/dto/wechat-login.dto.ts index dfa9a18a..42edd8c9 100644 --- a/src/auth/dto/wechat-login.dto.ts +++ b/src/auth/dto/wechat-login.dto.ts @@ -1,7 +1,8 @@ import { IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class WechatCheckResponseDto { - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) status: 'pending' | 'success' | 'expired'; user?: { diff --git a/src/conversations/dto/create-conversation.dto.ts b/src/conversations/dto/create-conversation.dto.ts index 3bd86f9d..8011c4e8 100644 --- a/src/conversations/dto/create-conversation.dto.ts +++ b/src/conversations/dto/create-conversation.dto.ts @@ -1,7 +1,10 @@ import { IsString, IsOptional } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateConversationDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) @IsOptional() title?: string; } diff --git a/src/conversations/dto/update-conversation.dto.ts b/src/conversations/dto/update-conversation.dto.ts index 025206b5..48b8f34f 100644 --- a/src/conversations/dto/update-conversation.dto.ts +++ b/src/conversations/dto/update-conversation.dto.ts @@ -1,7 +1,12 @@ import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class UpdateConversationDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.title.isNotEmpty'), + }) title: string; } diff --git a/src/feedback/dto/create-feedback.dto.ts b/src/feedback/dto/create-feedback.dto.ts index 6727d82b..8ca77e60 100644 --- a/src/feedback/dto/create-feedback.dto.ts +++ b/src/feedback/dto/create-feedback.dto.ts @@ -5,20 +5,33 @@ import { IsNotEmpty, MaxLength, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { FeedbackType } from '../entities/feedback.entity'; export class CreateFeedbackDto { - @IsEnum(FeedbackType) - @IsNotEmpty() + @IsEnum(FeedbackType, { + message: i18nValidationMessage('validation.errors.type.isEnum'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.type.isNotEmpty'), + }) type: FeedbackType; - @IsString() - @IsNotEmpty() - @MaxLength(5000) + @IsString({ + message: i18nValidationMessage('validation.errors.description.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.description.isNotEmpty'), + }) + @MaxLength(5000, { + message: i18nValidationMessage('validation.errors.description.maxLength'), + }) description: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() - @MaxLength(500) + @MaxLength(500, { + message: i18nValidationMessage('validation.errors.maxLength'), + }) contactInfo?: string; } diff --git a/src/groups/dto/add-group-user.dto.ts b/src/groups/dto/add-group-user.dto.ts index 70482f87..425ba2c5 100644 --- a/src/groups/dto/add-group-user.dto.ts +++ b/src/groups/dto/add-group-user.dto.ts @@ -1,7 +1,11 @@ import { IsString, IsArray } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class AddGroupUserDto { - @IsArray() - @IsString({ each: true }) + @IsArray({ message: i18nValidationMessage('validation.errors.isArray') }) + @IsString({ + each: true, + message: i18nValidationMessage('validation.errors.isString'), + }) userIds: string[]; } diff --git a/src/groups/dto/create-group.dto.ts b/src/groups/dto/create-group.dto.ts index d40f5b5f..56540e14 100644 --- a/src/groups/dto/create-group.dto.ts +++ b/src/groups/dto/create-group.dto.ts @@ -1,7 +1,12 @@ import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateGroupDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.title.isNotEmpty'), + }) title: string; } diff --git a/src/groups/dto/group-user.dto.ts b/src/groups/dto/group-user.dto.ts index 224b2ba7..77e34419 100644 --- a/src/groups/dto/group-user.dto.ts +++ b/src/groups/dto/group-user.dto.ts @@ -1,23 +1,38 @@ import { IsNotEmpty, IsString } from 'class-validator'; import { Expose } from 'class-transformer'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class GroupUserDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.id.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.id.isNotEmpty'), + }) id: string; @Expose() - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.username.isString'), + }) username: string; @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.email.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.email.isNotEmpty'), + }) email: string; @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.role.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.role.isNotEmpty'), + }) role: string; } diff --git a/src/groups/dto/group.dto.ts b/src/groups/dto/group.dto.ts index 1f54bba3..973161cb 100644 --- a/src/groups/dto/group.dto.ts +++ b/src/groups/dto/group.dto.ts @@ -1,23 +1,36 @@ import { IsNotEmpty, IsString } from 'class-validator'; import { Expose } from 'class-transformer'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class GroupDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.id.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.id.isNotEmpty'), + }) id: string; @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.namespaceId.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.namespaceId.isNotEmpty'), + }) @Expose({ name: 'namespace_id' }) namespaceId: string; @Expose() - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) title: string; @Expose() - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.invitationId.isString'), + }) invitationId?: string; } diff --git a/src/groups/dto/update-group.dto.ts b/src/groups/dto/update-group.dto.ts index 7e5a2c93..ce964242 100644 --- a/src/groups/dto/update-group.dto.ts +++ b/src/groups/dto/update-group.dto.ts @@ -1,7 +1,12 @@ import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class UpdateGroupDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.title.isNotEmpty'), + }) title: string; } diff --git a/src/i18n/en/validation.json b/src/i18n/en/validation.json new file mode 100644 index 00000000..1559387d --- /dev/null +++ b/src/i18n/en/validation.json @@ -0,0 +1,95 @@ +{ + "errors": { + "isNotEmpty": "$property should not be empty", + "isString": "$property must be a string", + "isEmail": "$property must be a valid email address", + "isNumber": "$property must be a number", + "isBoolean": "$property must be a boolean value", + "isArray": "$property must be an array", + "isObject": "$property must be an object", + "isUUID": "$property must be a valid UUID", + "isDateString": "$property must be a valid date string", + "isInt": "$property must be an integer", + "isEnum": "$property must be a valid value", + "minLength": "$property must be at least $constraint1 characters", + "maxLength": "$property must not exceed $constraint1 characters", + "min": "$property must not be less than $constraint1", + "email": { + "isString": "Email must be a string", + "isNotEmpty": "Email is required", + "isEmail": "Email must be a valid email address" + }, + "password": { + "isString": "Password must be a string", + "isNotEmpty": "Password is required" + }, + "username": { + "isString": "Username must be a string", + "minLength": "Username must be at least 2 characters", + "maxLength": "Username must not exceed 32 characters" + }, + "name": { + "isString": "Name must be a string", + "isNotEmpty": "Name is required", + "minLength": "Name must be at least 2 characters", + "maxLength": "Name must not exceed 64 characters" + }, + "title": { + "isString": "Title must be a string", + "isNotEmpty": "Title is required" + }, + "description": { + "isString": "Description must be a string", + "isNotEmpty": "Description is required", + "maxLength": "Description must not exceed $constraint1 characters" + }, + "content": { + "isString": "Content must be a string", + "isNotEmpty": "Content is required" + }, + "mimetype": { + "isString": "Mimetype must be a string", + "isNotEmpty": "Mimetype is required" + }, + "parentId": { + "isString": "Parent ID must be a string", + "isNotEmpty": "Parent ID is required" + }, + "resourceType": { + "isEnum": "Resource type must be a valid value" + }, + "namespaceId": { + "isString": "Namespace ID must be a string", + "isNotEmpty": "Namespace ID is required" + }, + "userId": { + "isString": "User ID must be a string", + "isNotEmpty": "User ID is required" + }, + "permission": { + "isEnum": "Permission must be a valid value", + "isNotEmpty": "Permission is required" + }, + "url": { + "isString": "URL must be a string", + "isNotEmpty": "URL is required" + }, + "query": { + "isString": "Query must be a string", + "isNotEmpty": "Query is required" + }, + "type": { + "isEnum": "Type must be a valid value", + "isNotEmpty": "Type is required" + }, + "enabled": { + "isBoolean": "Enabled must be a boolean value" + }, + "requireLogin": { + "isBoolean": "Require login must be a boolean value" + }, + "allResources": { + "isBoolean": "All resources must be a boolean value" + } + } +} diff --git a/src/i18n/zh/validation.json b/src/i18n/zh/validation.json new file mode 100644 index 00000000..6b5e4409 --- /dev/null +++ b/src/i18n/zh/validation.json @@ -0,0 +1,95 @@ +{ + "errors": { + "isNotEmpty": "$property 不能为空", + "isString": "$property 必须是字符串", + "isEmail": "$property 必须是有效的邮箱地址", + "isNumber": "$property 必须是数字", + "isBoolean": "$property 必须是布尔值", + "isArray": "$property 必须是数组", + "isObject": "$property 必须是对象", + "isUUID": "$property 必须是有效的 UUID", + "isDateString": "$property 必须是有效的日期字符串", + "isInt": "$property 必须是整数", + "isEnum": "$property 必须是有效的值", + "minLength": "$property 长度至少为 $constraint1 个字符", + "maxLength": "$property 长度不能超过 $constraint1 个字符", + "min": "$property 不能小于 $constraint1", + "email": { + "isString": "邮箱必须是字符串", + "isNotEmpty": "邮箱不能为空", + "isEmail": "邮箱必须是有效的邮箱地址" + }, + "password": { + "isString": "密码必须是字符串", + "isNotEmpty": "密码不能为空" + }, + "username": { + "isString": "用户名必须是字符串", + "minLength": "用户名至少 2 个字符", + "maxLength": "用户名不能超过 32 个字符" + }, + "name": { + "isString": "名称必须是字符串", + "isNotEmpty": "名称不能为空", + "minLength": "名称至少 2 个字符", + "maxLength": "名称不能超过 64 个字符" + }, + "title": { + "isString": "标题必须是字符串", + "isNotEmpty": "标题不能为空" + }, + "description": { + "isString": "描述必须是字符串", + "isNotEmpty": "描述不能为空", + "maxLength": "描述不能超过 $constraint1 个字符" + }, + "content": { + "isString": "内容必须是字符串", + "isNotEmpty": "内容不能为空" + }, + "mimetype": { + "isString": "文件类型必须是字符串", + "isNotEmpty": "文件类型不能为空" + }, + "parentId": { + "isString": "父级 ID 必须是字符串", + "isNotEmpty": "父级 ID 不能为空" + }, + "resourceType": { + "isEnum": "资源类型必须是有效的值" + }, + "namespaceId": { + "isString": "命名空间 ID 必须是字符串", + "isNotEmpty": "命名空间 ID 不能为空" + }, + "userId": { + "isString": "用户 ID 必须是字符串", + "isNotEmpty": "用户 ID 不能为空" + }, + "permission": { + "isEnum": "权限必须是有效的值", + "isNotEmpty": "权限不能为空" + }, + "url": { + "isString": "URL 必须是字符串", + "isNotEmpty": "URL 不能为空" + }, + "query": { + "isString": "查询必须是字符串", + "isNotEmpty": "查询不能为空" + }, + "type": { + "isEnum": "类型必须是有效的值", + "isNotEmpty": "类型不能为空" + }, + "enabled": { + "isBoolean": "启用状态必须是布尔值" + }, + "requireLogin": { + "isBoolean": "需要登录必须是布尔值" + }, + "allResources": { + "isBoolean": "所有资源必须是布尔值" + } + } +} diff --git a/src/messages/dto/create-message.dto.ts b/src/messages/dto/create-message.dto.ts index af3d8add..17965197 100644 --- a/src/messages/dto/create-message.dto.ts +++ b/src/messages/dto/create-message.dto.ts @@ -1,11 +1,14 @@ import { IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { MessageStatus } from 'omniboxd/messages/entities/message.entity'; export class CreateMessageDto { message: Record; @IsOptional() - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.parentId.isString'), + }) parentId?: string; @IsOptional() diff --git a/src/namespace-resources/dto/create-file-req.dto.ts b/src/namespace-resources/dto/create-file-req.dto.ts index 082ae3a6..8f791759 100644 --- a/src/namespace-resources/dto/create-file-req.dto.ts +++ b/src/namespace-resources/dto/create-file-req.dto.ts @@ -6,21 +6,37 @@ import { IsString, Min, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateFileReqDto { @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.name.isNotEmpty'), + }) name: string; @Expose() - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.mimetype.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.mimetype.isNotEmpty'), + }) mimetype: string; @Expose() - @IsNumber() - @Min(1) + @IsNumber( + {}, + { + message: i18nValidationMessage( + 'validation.errors.maxRunningTasks.isNumber', + ), + }, + ) + @Min(1, { message: i18nValidationMessage('validation.errors.min') }) @IsOptional() size?: number; } diff --git a/src/namespace-resources/dto/create-resource.dto.ts b/src/namespace-resources/dto/create-resource.dto.ts index 6f886c9f..c84ff453 100644 --- a/src/namespace-resources/dto/create-resource.dto.ts +++ b/src/namespace-resources/dto/create-resource.dto.ts @@ -7,35 +7,51 @@ import { IsNotEmpty, ValidateIf, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { ResourceType } from 'omniboxd/resources/entities/resource.entity'; export class CreateResourceDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) @IsOptional() name: string; - @IsEnum(ResourceType) + @IsEnum(ResourceType, { + message: i18nValidationMessage('validation.errors.resourceType.isEnum'), + }) resourceType: ResourceType; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.parentId.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.parentId.isNotEmpty'), + }) parentId: string; - @IsArray() + @IsArray({ message: i18nValidationMessage('validation.errors.isArray') }) @IsOptional() - @IsString({ each: true }) + @IsString({ + each: true, + message: i18nValidationMessage('validation.errors.isString'), + }) tag_ids?: string[]; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.content.isString'), + }) @IsOptional() content?: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) @IsOptional() attrs?: Record; @ValidateIf((o) => o.resourceType === ResourceType.FILE) - @IsString() - @IsNotEmpty() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) file_id?: string; } diff --git a/src/namespace-resources/dto/open.create-resource.dto.ts b/src/namespace-resources/dto/open.create-resource.dto.ts index ddf3ab41..1efb2b53 100644 --- a/src/namespace-resources/dto/open.create-resource.dto.ts +++ b/src/namespace-resources/dto/open.create-resource.dto.ts @@ -6,26 +6,36 @@ import { IsNotEmpty, IsBoolean, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class OpenCreateResourceDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) @IsOptional() name?: string; - @IsArray() + @IsArray({ message: i18nValidationMessage('validation.errors.isArray') }) @IsOptional() - @IsString({ each: true }) + @IsString({ + each: true, + message: i18nValidationMessage('validation.errors.isString'), + }) tag_ids?: string[]; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.content.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.content.isNotEmpty'), + }) content: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) @IsOptional() attrs?: Record; - @IsBoolean() + @IsBoolean({ message: i18nValidationMessage('validation.errors.isBoolean') }) @IsOptional() skip_parsing_tags_from_content?: boolean; } diff --git a/src/namespace-resources/dto/update-resource.dto.ts b/src/namespace-resources/dto/update-resource.dto.ts index ef10f0de..bbb455d1 100644 --- a/src/namespace-resources/dto/update-resource.dto.ts +++ b/src/namespace-resources/dto/update-resource.dto.ts @@ -6,36 +6,54 @@ import { IsOptional, IsNotEmpty, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { ResourceType } from 'omniboxd/resources/entities/resource.entity'; export class UpdateResourceDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) @IsOptional() name?: string; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.namespaceId.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.namespaceId.isNotEmpty'), + }) namespaceId: string; - @IsEnum(ResourceType) + @IsEnum(ResourceType, { + message: i18nValidationMessage('validation.errors.resourceType.isEnum'), + }) @IsOptional() resourceType?: ResourceType; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.parentId.isString'), + }) @IsOptional() - @IsNotEmpty() + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.parentId.isNotEmpty'), + }) parentId?: string; - @IsArray() + @IsArray({ message: i18nValidationMessage('validation.errors.isArray') }) @IsOptional() - @IsString({ each: true }) + @IsString({ + each: true, + message: i18nValidationMessage('validation.errors.isString'), + }) tag_ids?: string[]; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.content.isString'), + }) @IsOptional() content?: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) @IsOptional() attrs?: Record; } diff --git a/src/namespaces/dto/create-namespace.dto.ts b/src/namespaces/dto/create-namespace.dto.ts index dc872199..cfb9b516 100644 --- a/src/namespaces/dto/create-namespace.dto.ts +++ b/src/namespaces/dto/create-namespace.dto.ts @@ -1,9 +1,18 @@ import { IsString, IsNotEmpty, MinLength, MaxLength } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateNamespaceDto { - @IsString() - @IsNotEmpty() - @MinLength(2) - @MaxLength(64) + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.name.isNotEmpty'), + }) + @MinLength(2, { + message: i18nValidationMessage('validation.errors.name.minLength'), + }) + @MaxLength(64, { + message: i18nValidationMessage('validation.errors.name.maxLength'), + }) name: string; } diff --git a/src/namespaces/dto/namespace-response.dto.ts b/src/namespaces/dto/namespace-response.dto.ts index a51b715f..ad189d0f 100644 --- a/src/namespaces/dto/namespace-response.dto.ts +++ b/src/namespaces/dto/namespace-response.dto.ts @@ -1,17 +1,31 @@ import { IsNumber, IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { Namespace } from '../entities/namespace.entity'; export class NamespaceResponseDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.id.isString'), + }) id: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) name: string; - @IsNumber() + @IsNumber( + {}, + { + message: i18nValidationMessage( + 'validation.errors.maxRunningTasks.isNumber', + ), + }, + ) maxRunningTasks: number; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.rootResourceId.isString'), + }) @IsOptional() rootResourceId: string | null; diff --git a/src/namespaces/dto/update-namespace.dto.ts b/src/namespaces/dto/update-namespace.dto.ts index 4bc863b5..9c891b5c 100644 --- a/src/namespaces/dto/update-namespace.dto.ts +++ b/src/namespaces/dto/update-namespace.dto.ts @@ -5,12 +5,21 @@ import { MinLength, MaxLength, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class UpdateNamespaceDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) @IsOptional() - @IsNotEmpty() - @MinLength(2) - @MaxLength(64) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.name.isNotEmpty'), + }) + @MinLength(2, { + message: i18nValidationMessage('validation.errors.name.minLength'), + }) + @MaxLength(64, { + message: i18nValidationMessage('validation.errors.name.maxLength'), + }) name?: string; } diff --git a/src/permissions/dto/permission.dto.ts b/src/permissions/dto/permission.dto.ts index 9d1012ee..1f4b3866 100644 --- a/src/permissions/dto/permission.dto.ts +++ b/src/permissions/dto/permission.dto.ts @@ -1,10 +1,15 @@ import { Expose } from 'class-transformer'; import { IsEnum, IsNotEmpty } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { ResourcePermission } from '../resource-permission.enum'; @Expose() export class PermissionDto { - @IsEnum(ResourcePermission) - @IsNotEmpty() + @IsEnum(ResourcePermission, { + message: i18nValidationMessage('validation.errors.permission.isEnum'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.permission.isNotEmpty'), + }) permission: ResourcePermission; } diff --git a/src/shares/dto/update-share-info-req.dto.ts b/src/shares/dto/update-share-info-req.dto.ts index d6447343..cca6988e 100644 --- a/src/shares/dto/update-share-info-req.dto.ts +++ b/src/shares/dto/update-share-info-req.dto.ts @@ -7,41 +7,53 @@ import { IsDateString, IsInt, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { ShareType } from '../entities/share.entity'; export class UpdateShareInfoReqDto { @IsOptional() - @IsBoolean() + @IsBoolean({ + message: i18nValidationMessage('validation.errors.enabled.isBoolean'), + }) @Expose({ name: 'enabled' }) enabled?: boolean; @IsOptional() - @IsBoolean() + @IsBoolean({ + message: i18nValidationMessage('validation.errors.allResources.isBoolean'), + }) @Expose({ name: 'all_resources' }) allResources?: boolean; @IsOptional() - @IsBoolean() + @IsBoolean({ + message: i18nValidationMessage('validation.errors.requireLogin.isBoolean'), + }) @Expose({ name: 'require_login' }) requireLogin?: boolean; @IsOptional() - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @Expose({ name: 'password' }) password?: string | null; @IsOptional() - @IsEnum(ShareType) + @IsEnum(ShareType, { + message: i18nValidationMessage('validation.errors.isEnum'), + }) @Expose({ name: 'share_type' }) shareType?: ShareType; @IsOptional() - @IsDateString() + @IsDateString( + {}, + { message: i18nValidationMessage('validation.errors.isDateString') }, + ) @Expose({ name: 'expires_at' }) expiresAt?: Date | null; @IsOptional() - @IsInt() + @IsInt({ message: i18nValidationMessage('validation.errors.isInt') }) @Expose({ name: 'expires_seconds' }) expiresSeconds?: number; } diff --git a/src/tag/dto/create-tag.dto.ts b/src/tag/dto/create-tag.dto.ts index a46614fb..30beaa5b 100644 --- a/src/tag/dto/create-tag.dto.ts +++ b/src/tag/dto/create-tag.dto.ts @@ -1,7 +1,12 @@ import { IsString, MaxLength } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateTagDto { - @IsString() - @MaxLength(20) + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) + @MaxLength(20, { + message: i18nValidationMessage('validation.errors.name.maxLength'), + }) name: string; } diff --git a/src/trace/dto/trace-event.dto.ts b/src/trace/dto/trace-event.dto.ts index e9735528..75200751 100644 --- a/src/trace/dto/trace-event.dto.ts +++ b/src/trace/dto/trace-event.dto.ts @@ -1,10 +1,15 @@ import { IsNotEmpty, IsString, IsObject } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class TraceEventDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.name.isNotEmpty'), + }) name: string; - @IsObject() + @IsObject({ message: i18nValidationMessage('validation.errors.isObject') }) props: Record; } diff --git a/src/trace/dto/trace-req.dto.ts b/src/trace/dto/trace-req.dto.ts index aa1f2f5f..ce7dffeb 100644 --- a/src/trace/dto/trace-req.dto.ts +++ b/src/trace/dto/trace-req.dto.ts @@ -1,9 +1,10 @@ import { IsArray, ValidateNested } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { Type } from 'class-transformer'; import { TraceEventDto } from 'omniboxd/trace/dto/trace-event.dto'; export class TraceReqDto { - @IsArray() + @IsArray({ message: i18nValidationMessage('validation.errors.isArray') }) @ValidateNested({ each: true }) @Type(() => TraceEventDto) events: TraceEventDto[]; diff --git a/src/user/dto/create-user-binding.dto.ts b/src/user/dto/create-user-binding.dto.ts index a68cda01..46b6b520 100644 --- a/src/user/dto/create-user-binding.dto.ts +++ b/src/user/dto/create-user-binding.dto.ts @@ -1,20 +1,26 @@ import { IsOptional, IsEmail, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateUserBindingDto { - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) loginId: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) loginType: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.username.isString'), + }) username: string; - @IsEmail() + @IsEmail( + {}, + { message: i18nValidationMessage('validation.errors.email.isEmail') }, + ) @IsOptional() email: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() lang?: string; } diff --git a/src/user/dto/create-user-option.dto.ts b/src/user/dto/create-user-option.dto.ts index 61d164b9..dd797dfa 100644 --- a/src/user/dto/create-user-option.dto.ts +++ b/src/user/dto/create-user-option.dto.ts @@ -1,10 +1,15 @@ import { IsString, MaxLength } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateUserOptionDto { - @IsString() - @MaxLength(64) + @IsString({ + message: i18nValidationMessage('validation.errors.name.isString'), + }) + @MaxLength(64, { + message: i18nValidationMessage('validation.errors.name.maxLength'), + }) name: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) value: string; } diff --git a/src/user/dto/create-user.dto.ts b/src/user/dto/create-user.dto.ts index ff6bbc82..b58f8dcc 100644 --- a/src/user/dto/create-user.dto.ts +++ b/src/user/dto/create-user.dto.ts @@ -6,22 +6,36 @@ import { MaxLength, MinLength, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CreateUserDto { - @IsString() - @MinLength(2) - @MaxLength(32) + @IsString({ + message: i18nValidationMessage('validation.errors.username.isString'), + }) + @MinLength(2, { + message: i18nValidationMessage('validation.errors.username.minLength'), + }) + @MaxLength(32, { + message: i18nValidationMessage('validation.errors.username.maxLength'), + }) username: string; - @IsEmail() + @IsEmail( + {}, + { message: i18nValidationMessage('validation.errors.email.isEmail') }, + ) @IsOptional() email: string; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.password.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.password.isNotEmpty'), + }) password: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() lang?: string; } diff --git a/src/user/dto/update-user-binding.dto.ts b/src/user/dto/update-user-binding.dto.ts index a74e7275..f843da3a 100644 --- a/src/user/dto/update-user-binding.dto.ts +++ b/src/user/dto/update-user-binding.dto.ts @@ -1,12 +1,15 @@ import { IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class UpdateUserBindingDto { - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) loginId: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) loginType: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.userId.isString'), + }) userId: string; } diff --git a/src/user/dto/update-user.dto.ts b/src/user/dto/update-user.dto.ts index 9125b4e9..cf7a9e69 100644 --- a/src/user/dto/update-user.dto.ts +++ b/src/user/dto/update-user.dto.ts @@ -5,25 +5,37 @@ import { MaxLength, IsOptional, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { Transform } from 'class-transformer'; export class UpdateUserDto { - @IsString() - @MinLength(2) - @MaxLength(32) + @IsString({ + message: i18nValidationMessage('validation.errors.username.isString'), + }) + @MinLength(2, { + message: i18nValidationMessage('validation.errors.username.minLength'), + }) + @MaxLength(32, { + message: i18nValidationMessage('validation.errors.username.maxLength'), + }) @IsOptional() username?: string; @Transform(({ value }) => (value === '' ? undefined : value)) - @IsEmail() + @IsEmail( + {}, + { message: i18nValidationMessage('validation.errors.email.isEmail') }, + ) @IsOptional() email?: string; - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) @IsOptional() code?: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.password.isString'), + }) @IsOptional() password?: string; } diff --git a/src/user/dto/user-response.dto.ts b/src/user/dto/user-response.dto.ts index becad04a..482dba88 100644 --- a/src/user/dto/user-response.dto.ts +++ b/src/user/dto/user-response.dto.ts @@ -1,15 +1,22 @@ import { IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { User } from '../entities/user.entity'; export class UserResponseDto { - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.id.isString'), + }) id: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.username.isString'), + }) @IsOptional() username: string | null; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.email.isString'), + }) @IsOptional() email: string | null; diff --git a/src/wizard/dto/chunk-callback.dto.ts b/src/wizard/dto/chunk-callback.dto.ts index 7448a053..07d9d2b3 100644 --- a/src/wizard/dto/chunk-callback.dto.ts +++ b/src/wizard/dto/chunk-callback.dto.ts @@ -5,24 +5,35 @@ import { IsString, Min, } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class ChunkCallbackDto { - @IsString() - @IsNotEmpty() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) id: string; - @IsNumber() - @Min(0) + @IsNumber( + {}, + { message: i18nValidationMessage('validation.errors.isNumber') }, + ) + @Min(0, { message: i18nValidationMessage('validation.errors.min') }) chunk_index: number; - @IsNumber() - @Min(1) + @IsNumber( + {}, + { message: i18nValidationMessage('validation.errors.isNumber') }, + ) + @Min(1, { message: i18nValidationMessage('validation.errors.min') }) total_chunks: number; - @IsString() - @IsNotEmpty() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) data: string; - @IsBoolean() + @IsBoolean({ message: i18nValidationMessage('validation.errors.isBoolean') }) is_final_chunk: boolean; } diff --git a/src/wizard/dto/collect-request.dto.ts b/src/wizard/dto/collect-request.dto.ts index 479aed4f..d83f420e 100644 --- a/src/wizard/dto/collect-request.dto.ts +++ b/src/wizard/dto/collect-request.dto.ts @@ -1,21 +1,36 @@ import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CompressedCollectRequestDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.url.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.url.isNotEmpty'), + }) url: string; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.title.isNotEmpty'), + }) title: string; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.parentId.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.parentId.isNotEmpty'), + }) parentId: string; } export class CollectRequestDto extends CompressedCollectRequestDto { - @IsString() - @IsNotEmpty() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) html: string; } diff --git a/src/wizard/dto/collect-response.dto.ts b/src/wizard/dto/collect-response.dto.ts index 1bbc87fc..bc84396f 100644 --- a/src/wizard/dto/collect-response.dto.ts +++ b/src/wizard/dto/collect-response.dto.ts @@ -1,11 +1,20 @@ import { IsNotEmpty, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class CollectResponseDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.task_id.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.task_id.isNotEmpty'), + }) task_id: string; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.resource_id.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.resource_id.isNotEmpty'), + }) resource_id: string; } diff --git a/src/wizard/dto/open-agent-request.dto.ts b/src/wizard/dto/open-agent-request.dto.ts index 0aefe2ec..8f5b9a14 100644 --- a/src/wizard/dto/open-agent-request.dto.ts +++ b/src/wizard/dto/open-agent-request.dto.ts @@ -1,25 +1,30 @@ import { IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; import { PrivateSearchToolDto, WebSearchToolDto, } from 'omniboxd/wizard/dto/agent-request.dto'; export class OpenAgentRequestDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.query.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.query.isNotEmpty'), + }) query: string; tools: Array; @IsOptional() - @IsBoolean() + @IsBoolean({ message: i18nValidationMessage('validation.errors.isBoolean') }) enable_thinking?: boolean; @IsOptional() - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) lang?: '简体中文' | 'English'; @IsOptional() - @IsString() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) parent_message_id?: string; } diff --git a/src/wizard/dto/open-collect-request.dto.ts b/src/wizard/dto/open-collect-request.dto.ts index a03ab580..db1c4390 100644 --- a/src/wizard/dto/open-collect-request.dto.ts +++ b/src/wizard/dto/open-collect-request.dto.ts @@ -1,15 +1,26 @@ import { IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class OpenCollectRequestDto { - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.url.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.url.isNotEmpty'), + }) url: string; - @IsString() - @IsNotEmpty() + @IsString({ + message: i18nValidationMessage('validation.errors.title.isString'), + }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.title.isNotEmpty'), + }) title: string; - @IsString() + @IsString({ + message: i18nValidationMessage('validation.errors.parentId.isString'), + }) @IsOptional() parentId?: string; } diff --git a/src/wizard/dto/task-callback.dto.ts b/src/wizard/dto/task-callback.dto.ts index 861c4a9c..4ade1128 100644 --- a/src/wizard/dto/task-callback.dto.ts +++ b/src/wizard/dto/task-callback.dto.ts @@ -1,8 +1,11 @@ import { IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { i18nValidationMessage } from 'nestjs-i18n'; export class TaskCallbackDto { - @IsString() - @IsNotEmpty() + @IsString({ message: i18nValidationMessage('validation.errors.isString') }) + @IsNotEmpty({ + message: i18nValidationMessage('validation.errors.isNotEmpty'), + }) id: string; @IsOptional()