use only TOiR.domain.dsl like single source of truth for generation, update context for pinned .gitignore
This commit is contained in:
@@ -1,6 +1,44 @@
|
||||
# DSL Language Specification
|
||||
|
||||
This document describes the DSL (Domain Specific Language) used to specify fullstack CRUD applications. The DSL has four layers: Domain, DTO, API, and UI.
|
||||
This document describes the single DSL (Domain Specific Language) used to specify fullstack CRUD applications. The only required DSL input is `domain/*.dsl`.
|
||||
|
||||
---
|
||||
|
||||
# DSL Responsibility
|
||||
|
||||
The domain DSL defines only:
|
||||
|
||||
- domain model
|
||||
- relations
|
||||
- enums
|
||||
|
||||
The domain DSL is the single source of truth for:
|
||||
|
||||
- entities
|
||||
- attributes
|
||||
- primary keys
|
||||
- foreign keys
|
||||
- enums
|
||||
|
||||
The following layers are always derived from the domain DSL and must not be authored as standalone authoritative DSL inputs:
|
||||
|
||||
- DTO
|
||||
- API
|
||||
- UI
|
||||
|
||||
Optional extension mechanism:
|
||||
|
||||
```text
|
||||
overrides/
|
||||
api-overrides.dsl
|
||||
ui-overrides.dsl
|
||||
```
|
||||
|
||||
Override rules:
|
||||
|
||||
- Overrides are optional.
|
||||
- The generator must work without them.
|
||||
- Overrides may refine derived API or UI behavior, but they must not duplicate or redefine entities, attributes, primary keys, foreign keys, relations, or enums.
|
||||
|
||||
---
|
||||
|
||||
@@ -108,7 +146,7 @@ attribute equipmentTypeCode {
|
||||
|
||||
## required
|
||||
|
||||
- **is required** — attribute is non-nullable in domain and (unless overridden) in DTOs.
|
||||
- **is required** — attribute is non-nullable in the domain model and drives requiredness in derived DTO/API/UI artifacts.
|
||||
- Absence of `is required` means the attribute is optional (nullable).
|
||||
|
||||
---
|
||||
@@ -120,33 +158,6 @@ attribute equipmentTypeCode {
|
||||
|
||||
---
|
||||
|
||||
## map
|
||||
|
||||
Used in **DTO** and **UI** layers to bind a DTO/UI field to a domain entity attribute.
|
||||
|
||||
**In DTO:**
|
||||
|
||||
```
|
||||
attribute name {
|
||||
type string;
|
||||
map Equipment.name;
|
||||
}
|
||||
```
|
||||
|
||||
- Ensures DTO attribute corresponds to an existing `Entity.attribute` and that types align.
|
||||
|
||||
**In UI:**
|
||||
|
||||
```
|
||||
attribute Наименование {
|
||||
map Equipment.name;
|
||||
}
|
||||
```
|
||||
|
||||
- UI label (e.g. "Наименование") maps to domain field `Equipment.name` for correct data binding and generation.
|
||||
|
||||
---
|
||||
|
||||
# DSL → System Component Mapping
|
||||
|
||||
## DSL → Prisma
|
||||
@@ -174,9 +185,9 @@ attribute Наименование {
|
||||
| entity | One module (e.g. equipment.module.ts) |
|
||||
| entity | Controller with CRUD endpoints |
|
||||
| entity | Service with Prisma CRUD |
|
||||
| DTO (Create) | create-{entity}.dto.ts |
|
||||
| DTO (Update) | update-{entity}.dto.ts |
|
||||
| DTO (Response) | Used for GET response shape |
|
||||
| entity + attribute metadata | create-{entity}.dto.ts |
|
||||
| entity + attribute metadata | update-{entity}.dto.ts |
|
||||
| entity + attribute metadata | Response DTO / API shape |
|
||||
|
||||
API paths are derived from entity name: PascalCase → kebab-case, pluralized (e.g. `Equipment` → `/equipment`, `RepairOrder` → `/repair-orders`).
|
||||
|
||||
@@ -193,21 +204,12 @@ API paths are derived from entity name: PascalCase → kebab-case, pluralized (e
|
||||
| type date | DateInput, DateField |
|
||||
| enum | SelectInput with choices |
|
||||
| foreign key | ReferenceInput, ReferenceField |
|
||||
| UI attribute with map | Field with correct source |
|
||||
|
||||
---
|
||||
|
||||
# DTO Mapping
|
||||
# Derived Layer Mapping
|
||||
|
||||
- **map Entity.attribute** — DTO attribute corresponds to domain attribute; types must match.
|
||||
- **Create DTO** — must not include generated primary keys (e.g. no `id` for uuid PK).
|
||||
- **Update DTO** — all fields optional (nullable) for partial updates.
|
||||
- **List response DTO** — must expose `data` (array) and `total` (integer) for React Admin compatibility.
|
||||
|
||||
---
|
||||
|
||||
# UI Mapping
|
||||
|
||||
- Each UI attribute should have **map Entity.attribute** so it binds to a real domain field.
|
||||
- UI attribute name is the label (e.g. "Наименование"); **source** in generated components is the domain attribute name (e.g. `name`).
|
||||
- Enums → SelectInput; foreign keys → ReferenceInput/ReferenceField.
|
||||
- **Create DTO** — derived from domain attributes and must not include generated primary keys (for example no `id` for uuid PKs).
|
||||
- **Update DTO** — derived from the same domain attributes with all fields optional for partial updates.
|
||||
- **API response shape** — derived from domain attributes and must expose React Admin-compatible identifiers when needed.
|
||||
- **UI field mapping** — derived from attribute types, descriptions, enums, and foreign keys without a separate UI DSL.
|
||||
|
||||
Reference in New Issue
Block a user