LinkDesk/backend/docs/task-5-implementation-summa...

5.4 KiB

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:

{
    "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:

{
    "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:

    cd backend
    uvicorn main:app --reload
    
  2. Run the manual test script:

    python test_update_status_manual.py
    
  3. Or test manually using curl:

    # 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.