import { Type } from 'class-transformer'; import { ArrayUnique, IsArray, IsBoolean, IsIn, IsObject, IsOptional, IsString, MaxLength, MinLength, ValidateIf, ValidateNested, } from 'class-validator'; import { ROLE_PERMISSION_ITEMS, type RolePermissionKey } from '@mento/shared'; import { ROLE_COLORS } from './role-defaults'; const PERMISSION_KEYS = ROLE_PERMISSION_ITEMS.map((item) => item.key); export class CreateOrgRoleDto { @IsString() @MinLength(2) @MaxLength(80) name!: string; @IsOptional() @IsString() @MaxLength(280) description?: string; @IsOptional() @IsIn([...ROLE_COLORS]) color?: (typeof ROLE_COLORS)[number]; @IsOptional() @IsArray() @ArrayUnique() @IsIn(PERMISSION_KEYS, { each: true }) permissions?: RolePermissionKey[]; @IsOptional() @IsObject() dataAccessPolicy?: Record; @IsOptional() @ValidateIf((_, v) => v !== null) @IsString() parentId?: string | null; @IsOptional() @IsArray() @ArrayUnique() @IsString({ each: true }) treasuryAccountIds?: string[]; @IsOptional() @IsBoolean() treasuryOwnAccounts?: boolean; } export class UpdateOrgRoleDto { @IsOptional() @IsString() @MinLength(2) @MaxLength(80) name?: string; @IsOptional() @IsString() @MaxLength(280) description?: string; @IsOptional() @IsIn([...ROLE_COLORS]) color?: (typeof ROLE_COLORS)[number]; @IsOptional() @IsArray() @ArrayUnique() @IsIn(PERMISSION_KEYS, { each: true }) permissions?: RolePermissionKey[]; @IsOptional() @IsObject() dataAccessPolicy?: Record; @IsOptional() @ValidateIf((_, v) => v !== null) @IsString() parentId?: string | null; @IsOptional() @IsArray() @ArrayUnique() @IsString({ each: true }) treasuryAccountIds?: string[]; @IsOptional() @IsBoolean() treasuryOwnAccounts?: boolean; } export class RolePermissionPatchItemDto { @IsString() id!: string; @IsArray() @ArrayUnique() @IsIn(PERMISSION_KEYS, { each: true }) permissions!: RolePermissionKey[]; } export class BulkUpdatePermissionsDto { @IsArray() @ValidateNested({ each: true }) @Type(() => RolePermissionPatchItemDto) items!: RolePermissionPatchItemDto[]; }