169 lines
3.7 KiB
Markdown
169 lines
3.7 KiB
Markdown
# Bulk Actions Implementation
|
|
|
|
## Overview
|
|
|
|
This document describes the implementation of bulk action endpoints for the task management system. These endpoints allow coordinators and admins to perform batch operations on multiple tasks simultaneously.
|
|
|
|
## Endpoints
|
|
|
|
### 1. Bulk Status Update
|
|
|
|
**Endpoint:** `PUT /tasks/bulk/status`
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"task_ids": [1, 2, 3],
|
|
"status": "in_progress"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success_count": 3,
|
|
"failed_count": 0,
|
|
"errors": null
|
|
}
|
|
```
|
|
|
|
**Permissions:**
|
|
- Coordinators and admins can update any tasks
|
|
- Artists can only update their own assigned tasks
|
|
|
|
**Features:**
|
|
- Atomic transaction handling - either all tasks update or none
|
|
- Permission validation for all tasks before making changes
|
|
- Detailed error reporting for failed tasks
|
|
|
|
### 2. Bulk Assignment
|
|
|
|
**Endpoint:** `PUT /tasks/bulk/assign`
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"task_ids": [1, 2, 3],
|
|
"assigned_user_id": 5
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success_count": 3,
|
|
"failed_count": 0,
|
|
"errors": null
|
|
}
|
|
```
|
|
|
|
**Permissions:**
|
|
- Only coordinators and admins can perform bulk assignments
|
|
|
|
**Features:**
|
|
- Atomic transaction handling
|
|
- Validates user is a member of all task projects
|
|
- Sends notifications to assigned user for each task
|
|
- Detailed error reporting for failed tasks
|
|
|
|
## Schemas
|
|
|
|
### BulkStatusUpdate
|
|
```python
|
|
class BulkStatusUpdate(BaseModel):
|
|
task_ids: List[int] = Field(..., min_length=1)
|
|
status: TaskStatus
|
|
```
|
|
|
|
### BulkAssignment
|
|
```python
|
|
class BulkAssignment(BaseModel):
|
|
task_ids: List[int] = Field(..., min_length=1)
|
|
assigned_user_id: int
|
|
```
|
|
|
|
### BulkActionResult
|
|
```python
|
|
class BulkActionResult(BaseModel):
|
|
success_count: int
|
|
failed_count: int
|
|
errors: Optional[List[dict]] = None
|
|
```
|
|
|
|
## Atomicity
|
|
|
|
Both endpoints implement atomic transactions:
|
|
|
|
1. All tasks are fetched in a single query
|
|
2. All validations (permissions, project membership) are performed before any changes
|
|
3. If any validation fails, the transaction is rolled back and no changes are made
|
|
4. Only if all validations pass are the changes committed
|
|
|
|
This ensures that partial updates never occur - either all tasks are updated successfully or none are.
|
|
|
|
## Error Handling
|
|
|
|
Errors are returned in a structured format:
|
|
|
|
```json
|
|
{
|
|
"success_count": 1,
|
|
"failed_count": 2,
|
|
"errors": [
|
|
{
|
|
"task_id": 99,
|
|
"error": "Task not found"
|
|
},
|
|
{
|
|
"task_id": 100,
|
|
"error": "Not authorized to update this task"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
Common error scenarios:
|
|
- Task not found
|
|
- Insufficient permissions
|
|
- User not a project member (for assignments)
|
|
|
|
## Testing
|
|
|
|
A comprehensive test script is available at `backend/test_bulk_actions.py` that tests:
|
|
|
|
1. Successful bulk status updates
|
|
2. Successful bulk assignments
|
|
3. Error handling with invalid task IDs
|
|
4. Atomicity with mixed valid/invalid IDs
|
|
5. Permission validation
|
|
|
|
Run tests with:
|
|
```bash
|
|
python test_bulk_actions.py
|
|
```
|
|
|
|
## Implementation Notes
|
|
|
|
### Route Ordering
|
|
|
|
The bulk action endpoints are placed BEFORE the `/{task_id}` routes in the router to prevent FastAPI from trying to match "bulk" as a task_id parameter.
|
|
|
|
### Transaction Management
|
|
|
|
SQLAlchemy's session management is used for transactions:
|
|
- `db.commit()` commits all changes
|
|
- `db.rollback()` reverts all changes if errors occur
|
|
|
|
### Notifications
|
|
|
|
The bulk assignment endpoint sends individual notifications for each assigned task using the existing `notification_service.notify_task_assigned()` function.
|
|
|
|
## Requirements Validated
|
|
|
|
This implementation satisfies the following requirements from the spec:
|
|
|
|
- **4.2**: Bulk status update with atomic transaction handling
|
|
- **4.4**: Error handling and rollback on failure
|
|
- **5.3**: Bulk assignment with atomic transaction handling
|
|
- **5.5**: Error handling and rollback on failure
|