diff --git a/prompts/backend-rules.md b/prompts/backend-rules.md index c963034..c30e123 100644 --- a/prompts/backend-rules.md +++ b/prompts/backend-rules.md @@ -104,38 +104,44 @@ Type and decorator rules: | `decimal` | `string` | `@IsString()` | serialize with Prisma Decimal | | `date` | `string` | `@IsString()` | serialize as ISO string | | `boolean` | `boolean` | `@IsBoolean()` | | -| enum name | `string` | `@IsEnum(EnumName)` | | +| enum name | `EnumName` (imported from `../../enums/.enum`) | `@IsEnum(EnumName)` | Do not use `string` | Nullability rules: - every field that is not `is required` gets `@IsOptional()` before the type decorator - every generated DTO imports from `'class-validator'` -## Shared Enum Files +## Shared Types -Enums referenced by DTOs across multiple modules MUST be generated as standalone files at: +Shared TypeScript types are generated by the `shared-types` stage BEFORE +`nest-entities` runs. Per-entity modules MUST import them; they must NEVER +redefine them. -``` -server/src/enums/.enum.ts -``` +Zones: -Example for `EquipmentStatus`: -```ts -// server/src/enums/equipment-status.enum.ts -export enum EquipmentStatus { - Active = 'Active', - Repair = 'Repair', - Reserve = 'Reserve', - WriteOff = 'WriteOff', -} -``` +- `server/src/enums/.enum.ts` — one file per DSL enum +- `server/src/shared/pagination.ts` — `PaginatedResponse` and `ListQueryParams` +- `server/src/shared/index.ts` — barrel for shared types -DTO files import the enum with path `../../enums/.enum` (two levels up from `modules//dto/`): -```ts -import { EquipmentStatus } from '../../enums/equipment-status.enum'; -``` +Import conventions depend on the importing file's depth: -Do NOT inline enum values into DTOs. Do NOT put enum files inside the module folder. +- From a module/controller/service file at `server/src/modules//.ts`: + ```ts + import { EquipmentStatus } from '../../enums/equipment-status.enum'; + import { PaginatedResponse, ListQueryParams } from '../../shared/pagination'; + ``` + +- From a DTO file at `server/src/modules//dto/.ts` (one level deeper): + ```ts + import { EquipmentStatus } from '../../../enums/equipment-status.enum'; + import { PaginatedResponse, ListQueryParams } from '../../../shared/pagination'; + ``` + +Enum-typed DTO fields MUST be declared with the actual enum type, NOT +`string`. The enum is imported from the shared file above. `@IsEnum(EnumName)` +still applies at runtime for validation. Because the DTO type matches the +Prisma-generated enum type by name and by string values, service code can +pass DTOs into Prisma without `as EnumName` casts. ## Auth Import Paths