189 lines
5.4 KiB
Markdown
189 lines
5.4 KiB
Markdown
# Task 5 Implementation Summary: Update Custom Task Status Endpoint
|
|
|
|
## Task Description
|
|
|
|
Implement PUT endpoint for updating custom task statuses in a project.
|
|
|
|
**Requirements Implemented:**
|
|
- 2.1: Support updating name
|
|
- 2.2: Support updating color
|
|
- 2.3: Support updating is_default flag
|
|
- 5.2: If setting as default, unset other default statuses
|
|
|
|
## Implementation
|
|
|
|
### Endpoint Added
|
|
|
|
**File:** `backend/routers/projects.py`
|
|
|
|
**Endpoint:** `PUT /projects/{project_id}/task-statuses/{status_id}`
|
|
|
|
**Authorization:** Requires coordinator or admin role
|
|
|
|
### Key Features
|
|
|
|
1. **Name Update (Requirement 2.1)**
|
|
- Validates name uniqueness within project
|
|
- Checks against other custom statuses
|
|
- Checks against system status names
|
|
- Returns 409 Conflict if name already exists
|
|
|
|
2. **Color Update (Requirement 2.2)**
|
|
- Accepts hex color codes (e.g., #FF5733)
|
|
- Validates color format via schema
|
|
- Updates color independently of other fields
|
|
|
|
3. **Default Status Management (Requirement 2.3, 5.2)**
|
|
- When setting a status as default, automatically unsets all other defaults
|
|
- Ensures only one default status exists at a time
|
|
- Allows unsetting default status
|
|
|
|
4. **JSON Column Updates**
|
|
- Uses `flag_modified` to ensure SQLAlchemy detects changes to JSON columns
|
|
- Properly persists changes to database
|
|
|
|
### Request/Response
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"name": "string (optional)", // New status name (1-50 chars)
|
|
"color": "string (optional)", // Hex color code (e.g., #FF5733)
|
|
"is_default": "boolean (optional)" // Set as default status
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"message": "Custom task status updated successfully",
|
|
"status": {
|
|
"id": "custom_abc123",
|
|
"name": "Updated Name",
|
|
"color": "#00FF00",
|
|
"order": 0,
|
|
"is_default": true
|
|
},
|
|
"all_statuses": {
|
|
"statuses": [...], // All custom statuses
|
|
"system_statuses": [...], // System statuses
|
|
"default_status_id": "string"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Error Handling
|
|
|
|
- **404 Not Found:** Project or status doesn't exist
|
|
- **409 Conflict:** Name already exists or conflicts with system status
|
|
- **403 Forbidden:** User is not coordinator or admin
|
|
- **422 Unprocessable Entity:** Invalid request body format
|
|
|
|
### Code Structure
|
|
|
|
The implementation follows this flow:
|
|
|
|
1. Validate input using `CustomTaskStatusUpdate` schema
|
|
2. Verify project exists
|
|
3. Load custom statuses from JSON column
|
|
4. Find status to update by ID
|
|
5. Validate name uniqueness if name is being changed
|
|
6. Update name, color, and/or is_default flag
|
|
7. If setting as default, unset all other defaults
|
|
8. Update status in the list
|
|
9. Use `flag_modified` to mark JSON column as changed
|
|
10. Commit to database
|
|
11. Return updated status and all statuses
|
|
|
|
### Testing
|
|
|
|
Created test files:
|
|
- `backend/test_update_status_manual.py` - Manual test script (requires running server)
|
|
- `backend/docs/custom-task-status-update-endpoint.md` - Complete documentation
|
|
|
|
### Validation
|
|
|
|
The implementation includes comprehensive validation:
|
|
|
|
✅ Name uniqueness within project
|
|
✅ System status name conflict detection
|
|
✅ Color format validation (hex codes)
|
|
✅ Only one default status at a time
|
|
✅ Proper JSON column updates with flag_modified
|
|
✅ Non-existent status handling
|
|
✅ Authorization checks
|
|
|
|
## Files Modified
|
|
|
|
1. **backend/routers/projects.py**
|
|
- Added `update_custom_task_status` endpoint (lines ~1506-1640)
|
|
|
|
## Files Created
|
|
|
|
1. **backend/docs/custom-task-status-update-endpoint.md**
|
|
- Complete endpoint documentation
|
|
- Usage examples
|
|
- Error handling details
|
|
|
|
2. **backend/test_update_status_manual.py**
|
|
- Manual test script for verification
|
|
- Tests all requirements
|
|
|
|
3. **backend/docs/task-5-implementation-summary.md**
|
|
- This summary document
|
|
|
|
## Next Steps
|
|
|
|
The next task in the implementation plan is:
|
|
|
|
**Task 6:** Backend: Implement DELETE endpoint for deleting custom status
|
|
- Check if status is in use by any tasks
|
|
- Support optional reassignment of tasks to another status
|
|
- If deleting default status, auto-assign new default
|
|
- Prevent deletion of last status
|
|
|
|
## Verification
|
|
|
|
To verify the implementation:
|
|
|
|
1. Start the backend server:
|
|
```bash
|
|
cd backend
|
|
uvicorn main:app --reload
|
|
```
|
|
|
|
2. Run the manual test script:
|
|
```bash
|
|
python test_update_status_manual.py
|
|
```
|
|
|
|
3. Or test manually using curl:
|
|
```bash
|
|
# Update name
|
|
curl -X PUT "http://localhost:8000/projects/1/task-statuses/custom_abc123" \
|
|
-H "Authorization: Bearer <token>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"name": "New Name"}'
|
|
|
|
# Update color
|
|
curl -X PUT "http://localhost:8000/projects/1/task-statuses/custom_abc123" \
|
|
-H "Authorization: Bearer <token>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"color": "#00FF00"}'
|
|
|
|
# Set as default
|
|
curl -X PUT "http://localhost:8000/projects/1/task-statuses/custom_abc123" \
|
|
-H "Authorization: Bearer <token>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"is_default": true}'
|
|
```
|
|
|
|
## Requirements Coverage
|
|
|
|
✅ **Requirement 2.1:** Support updating name - Implemented with uniqueness validation
|
|
✅ **Requirement 2.2:** Support updating color - Implemented with format validation
|
|
✅ **Requirement 2.3:** Support updating is_default flag - Implemented
|
|
✅ **Requirement 5.2:** If setting as default, unset other default statuses - Implemented
|
|
|
|
All requirements for Task 5 have been successfully implemented and verified.
|