// Create technical design documents for ABP Framework features including API contracts, database schemas, and architecture decisions. Use when: (1) designing REST APIs, (2) planning database schemas, (3) creating technical specifications, (4) documenting architecture decisions (ADRs).
| name | technical-design-patterns |
| description | Create technical design documents for ABP Framework features including API contracts, database schemas, and architecture decisions. Use when: (1) designing REST APIs, (2) planning database schemas, (3) creating technical specifications, (4) documenting architecture decisions (ADRs). |
| layer | 2 |
| tech_stack | ["agnostic","markdown","mermaid"] |
| topics | ["technical-specification","api-contract","database-schema","adr","architecture-decisions"] |
| depends_on | ["mermaid-diagram-patterns"] |
| complements | ["api-design-principles"] |
| keywords | ["TSD","ADR","API Contract","Schema","ERD","Specification","Architecture"] |
Create comprehensive technical design documents that guide implementation of ABP Framework features.
A complete TSD for an ABP feature includes:
## API: {Resource}
### Overview
| Attribute | Value |
|-----------|-------|
| Base Path | `/api/app/{resources}` |
| Authentication | Required |
| Rate Limit | 100/min |
### Endpoints
| Method | Path | Description | Permission | Request | Response |
|--------|------|-------------|------------|---------|----------|
| GET | `/{resources}` | List with pagination | `{Project}.{Resources}` | `Get{Resource}ListInput` | `PagedResultDto<{Resource}Dto>` |
| GET | `/{resources}/{id}` | Get by ID | `{Project}.{Resources}` | - | `{Resource}Dto` |
| POST | `/{resources}` | Create new | `{Project}.{Resources}.Create` | `CreateUpdate{Resource}Dto` | `{Resource}Dto` |
| PUT | `/{resources}/{id}` | Update existing | `{Project}.{Resources}.Edit` | `CreateUpdate{Resource}Dto` | `{Resource}Dto` |
| DELETE | `/{resources}/{id}` | Soft delete | `{Project}.{Resources}.Delete` | - | - |
### DTOs
#### {Resource}Dto (Output)
```json
{
"id": "guid",
"property1": "string",
"property2": 0,
"creationTime": "datetime",
"lastModificationTime": "datetime"
}
{
"property1": "string (required, max 100)",
"property2": "number (optional, min 0)"
}
{
"filter": "string (optional)",
"sorting": "string (optional, e.g., 'name asc')",
"skipCount": "number (default 0)",
"maxResultCount": "number (default 10, max 100)"
}
## Database Schema Template
```markdown
## Entity: {Name}
### Table: {TableName}
| Column | Type | Nullable | Default | Constraints | Description |
|--------|------|----------|---------|-------------|-------------|
| `Id` | `uuid` | NO | `gen_random_uuid()` | PK | Unique identifier |
| `Name` | `varchar(100)` | NO | - | - | Display name |
| `Email` | `varchar(255)` | NO | - | UNIQUE | Contact email |
| `Status` | `smallint` | NO | `0` | - | Enum: 0=Active, 1=Inactive |
| `ParentId` | `uuid` | YES | - | FK | Reference to parent |
| `CreationTime` | `timestamp` | NO | `now()` | - | ABP audit field |
| `CreatorId` | `uuid` | YES | - | - | ABP audit field |
| `LastModificationTime` | `timestamp` | YES | - | - | ABP audit field |
| `LastModifierId` | `uuid` | YES | - | - | ABP audit field |
| `IsDeleted` | `boolean` | NO | `false` | - | ABP soft delete |
| `DeleterId` | `uuid` | YES | - | - | ABP audit field |
| `DeletionTime` | `timestamp` | YES | - | - | ABP audit field |
### Indexes
| Name | Columns | Type | Purpose |
|------|---------|------|---------|
| `PK_{Table}` | `Id` | Primary | Primary key |
| `IX_{Table}_Email` | `Email` | Unique | Email lookup |
| `IX_{Table}_Name` | `Name` | B-tree | Name search |
| `IX_{Table}_ParentId` | `ParentId` | B-tree | Parent lookup |
| `IX_{Table}_IsDeleted` | `IsDeleted` | Partial (false) | Active records filter |
### Relationships
| Relationship | Type | Target | FK Column | On Delete |
|--------------|------|--------|-----------|-----------|
| Parent | N:1 | `{Parent}` | `ParentId` | SET NULL |
| Children | 1:N | `{Child}` | - | CASCADE |
## Permissions: {Resource}
### Permission Definitions
| Permission | Display Name | Parent |
|------------|--------------|--------|
| `{Project}.{Resources}` | {Resource} Management | - |
| `{Project}.{Resources}.Create` | Create {Resource} | `{Project}.{Resources}` |
| `{Project}.{Resources}.Edit` | Edit {Resource} | `{Project}.{Resources}` |
| `{Project}.{Resources}.Delete` | Delete {Resource} | `{Project}.{Resources}` |
### Role Mapping
| Role | View | Create | Edit | Delete |
|------|------|--------|------|--------|
| Admin | โ | โ | โ | โ |
| Manager | โ | โ | โ | - |
| User | โ | - | - | - |
# ADR-{NNN}: {Decision Title}
**Status**: Proposed | Accepted | Deprecated | Superseded
**Date**: YYYY-MM-DD
**Deciders**: [List of people involved]
## Context
[Describe the issue motivating this decision. What is the problem we're trying to solve?]
## Decision Drivers
- [Driver 1: e.g., performance requirement]
- [Driver 2: e.g., maintainability concern]
- [Driver 3: e.g., team expertise]
## Considered Options
1. **[Option 1]** - [Brief description]
2. **[Option 2]** - [Brief description]
3. **[Option 3]** - [Brief description]
## Decision
We will use **[Option X]** because [rationale].
## Consequences
### Positive
- [Benefit 1]
- [Benefit 2]
### Negative
- [Drawback 1]
- [Drawback 2]
### Risks
- [Risk 1 and mitigation]
## Related Decisions
- [ADR-XXX: Related decision]
## Validation: CreateUpdate{Resource}Dto
| Property | Rules | Error Message |
|----------|-------|---------------|
| `Name` | Required, MaxLength(100) | "Name is required" / "Name cannot exceed 100 characters" |
| `Email` | Required, EmailFormat, MaxLength(255) | "Valid email is required" |
| `Phone` | Optional, PhoneFormat | "Invalid phone format" |
| `Amount` | Required, Range(0, 999999.99) | "Amount must be between 0 and 999999.99" |
## Caching: {Resource}
| Operation | Cache Key | TTL | Invalidation |
|-----------|-----------|-----|--------------|
| GetById | `{resource}:{id}` | 5 min | On Update, Delete |
| GetList | `{resource}:list:{hash}` | 1 min | On Create, Update, Delete |
| GetCount | `{resource}:count` | 1 min | On Create, Delete |
### Cache Implementation
- **Provider**: Redis (distributed)
- **Serialization**: JSON
- **Compression**: None (small payloads)
Before finalizing technical design: