LinkDesk/backend/docs/custom-task-status-create-e...

173 lines
4.6 KiB
Markdown

# Custom Task Status Creation Endpoint Implementation
## Overview
Implemented the POST endpoint for creating custom task statuses in projects. This allows coordinators and admins to define project-specific task statuses beyond the built-in system statuses.
## Implementation Details
### Endpoint
- **Route**: `POST /projects/{project_id}/task-statuses`
- **Status Code**: 201 Created
- **Authorization**: Requires coordinator or admin role
### Features Implemented
#### 1. Status Name Uniqueness Validation
- Validates that the status name is unique within the project
- Case-insensitive comparison to prevent duplicates like "In Review" and "in review"
- Checks against both existing custom statuses and system statuses
- Returns 409 Conflict if duplicate found
#### 2. Auto-Assign Color from Palette
- Defines a default color palette with 10 distinct colors:
- Purple (#8B5CF6)
- Pink (#EC4899)
- Teal (#14B8A6)
- Orange (#F97316)
- Cyan (#06B6D4)
- Lime (#84CC16)
- Violet (#A855F7)
- Rose (#F43F5E)
- Sky (#22D3EE)
- Yellow (#FACC15)
- Automatically assigns the first unused color from the palette
- If all colors are used, cycles back through the palette
- Users can override by providing a custom color in hex format
#### 3. Unique Status ID Generation
- Generates unique IDs using UUID4 with format: `custom_{8-char-hex}`
- Example: `custom_0c7ba931`
- Ensures no ID collisions
#### 4. JSON Column Updates
- Uses SQLAlchemy's `flag_modified()` to properly track changes to JSON columns
- Ensures database updates are persisted correctly
#### 5. Status Ordering
- Automatically assigns order based on existing statuses
- New statuses are appended to the end (max_order + 1)
- Maintains consistent ordering for UI display
### Request Schema
```json
{
"name": "Ready for Review",
"color": "#8B5CF6" // Optional - auto-assigned if not provided
}
```
### Response Schema
```json
{
"message": "Custom task status 'Ready for Review' created successfully",
"status": {
"id": "custom_0c7ba931",
"name": "Ready for Review",
"color": "#EC4899",
"order": 3,
"is_default": false
},
"all_statuses": {
"statuses": [...], // All custom statuses
"system_statuses": [...], // Built-in system statuses
"default_status_id": "not_started"
}
}
```
### Validation Rules
#### Name Validation (via Pydantic schema)
- Minimum length: 1 character
- Maximum length: 50 characters
- Whitespace is trimmed
- Cannot be empty after trimming
#### Color Validation (via Pydantic schema)
- Must be valid hex color code format: `#RRGGBB`
- Example: `#FF5733`
- Normalized to uppercase
- Optional field
### Error Responses
#### 404 Not Found
```json
{
"detail": "Project not found"
}
```
#### 409 Conflict - Duplicate Name
```json
{
"detail": "Status with name 'Ready for Review' already exists in this project"
}
```
#### 409 Conflict - System Status Name
```json
{
"detail": "Status name 'In Progress' conflicts with a system status"
}
```
#### 422 Unprocessable Entity - Validation Error
```json
{
"detail": "1 validation error for CustomTaskStatusCreate\nname\n String should have at least 1 character..."
}
```
## Testing
### Test Results
All validation and functionality tests passed:
1. ✅ Create status without color (auto-assigned from palette)
2. ✅ Create status with custom color
3. ✅ Reject duplicate status names (409 Conflict)
4. ✅ Reject empty status names (422 Validation Error)
5. ✅ Reject invalid color formats (422 Validation Error)
6. ✅ Reject system status name conflicts (409 Conflict)
7. ✅ Proper ordering of statuses
8. ✅ Unique ID generation
9. ✅ JSON column updates with flag_modified
### Test Files
- `backend/test_create_custom_task_status.py` - Comprehensive test suite
- `backend/test_custom_status_validation.py` - Validation-focused tests
## Database Schema
The custom task statuses are stored in the `projects.custom_task_statuses` JSON column:
```json
[
{
"id": "custom_review",
"name": "In Review",
"color": "#8B5CF6",
"order": 0,
"is_default": false
},
{
"id": "custom_blocked",
"name": "Blocked",
"color": "#DC2626",
"order": 1,
"is_default": false
}
]
```
## Requirements Satisfied
- ✅ Requirement 1.2: Create new custom task status
- ✅ Requirement 1.3: Validate status name uniqueness within project
- ✅ Requirement 1.4: Auto-assign color from palette if not provided
## Next Steps
The following endpoints still need to be implemented:
- PUT endpoint for updating custom status (Task 5)
- DELETE endpoint for deleting custom status (Task 6)
- PATCH endpoint for reordering statuses (Task 7)