Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
12 KiB
Tasks Controller Documentation
File: controllers/admin/task.controller.js + controllers/admin/task_completion.controller.js
Base URL: /api/admin/task-lists
Guards: authenticate → requireAdmin() → adminLimiter
Table of Contents
Data Model
TaskList ──< Task ──< TaskRequirement
│
└──< TaskListGroup >── UserGroup
- A TaskList is a named container of tasks, visible to assigned user groups.
- A Task belongs to one TaskList and has 0-N requirements.
- A TaskRequirement specifies what a user must do (visit a link, upload a file, or read a course/unit/lesson).
- Completions are submitted by clients only — admins can view and archive/restore them.
Task Requirement Types
type |
Required Fields | Description |
|---|---|---|
visit_link |
link_url, link_label |
User must visit a URL |
upload_file |
allowed_file_types, max_file_count |
User must upload files |
read_course |
reference_id (course UUID), reference_label |
User must complete a course |
read_unit |
reference_id (unit UUID), reference_label |
User must complete a unit |
read_lesson |
reference_id (lesson UUID), reference_label |
User must complete a lesson |
Task Lists
Get All Task Lists
GET /api/admin/task-lists
Returns paginated active task lists.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page |
number | No | Default: 1 |
limit |
number | No | Default: 10 |
filters |
array | No | JSON filter array |
sort |
array | No | JSON sort array |
Response 200
{
"status": "success",
"message": "Task lists retrieved.",
"data": [...],
"pagination": { "page": 1, "limit": 10, "total": 5, "totalPages": 1 }
}
Get Single Task List
GET /api/admin/task-lists/:taskListId
Returns a task list with its full task tree (tasks → requirements) and assigned groups. Includes archived items (paranoid: false).
Response 200
{
"status": "success",
"message": "Task list retrieved.",
"data": {
"task_list_id": "uuid-...",
"name": "Onboarding Q1",
"description": "...",
"group_count": 2,
"groups": [
{ "group_id": 1, "name": "Engineering" }
],
"tasks": [
{
"task_id": "uuid-...",
"name": "Read the handbook",
"deadline": "2026-07-01T00:00:00.000Z",
"status": "pending",
"requirements": [
{ "requirement_id": "uuid-...", "type": "read_lesson", "reference_id": "uuid-..." }
]
}
],
"createdAt": "...",
"updatedAt": "..."
}
}
Create Task List
POST /api/admin/task-lists
Rate-limited.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Unique list name |
description |
string | No |
Response 201
{
"status": "success",
"message": "Task list created successfully.",
"data": { ... }
}
Update Task List
PATCH /api/admin/task-lists/:taskListId
Rate-limited.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | No | |
description |
string | No |
Response 200
{ "status": "success", "message": "Task list updated successfully.", "data": { ... } }
Archive Task List
DELETE /api/admin/task-lists/:taskListId
Rate-limited. Soft-deletes the task list.
Response 200
{ "status": "success", "message": "Task list archived successfully." }
Restore Task List
PATCH /api/admin/task-lists/:taskListId/restore
Rate-limited.
Response 200
{ "status": "success", "message": "Task list restored successfully.", "data": { ... } }
Bulk Archive Task Lists
POST /api/admin/task-lists/bulk-archive
Rate-limited.
Request Body
{ "ids": ["uuid-1", "uuid-2"] }
Response 200
{
"status": "success",
"message": "2 task list(s) archived successfully.",
"archived_ids": [...],
"skipped_ids": []
}
Bulk Restore Task Lists
POST /api/admin/task-lists/bulk-restore
Rate-limited. Same body shape as bulk archive.
Get Archived Task Lists
GET /api/admin/task-lists/archived
Returns paginated soft-deleted task lists.
Get Task List Field Values
GET /api/admin/task-lists/field-values
Returns distinct filterable field values for task lists.
Task List Groups
Get Assigned Groups
GET /api/admin/task-lists/:taskListId/groups
Returns all user groups currently assigned to the task list, including assignment metadata.
Response 200
{
"status": "success",
"message": "Task list groups retrieved.",
"data": [
{
"id": "uuid-...",
"task_list_id": "uuid-...",
"group_id": 1,
"assignedAt": "2026-06-01T00:00:00.000Z",
"assignedBy": 1,
"group": { "group_id": 1, "name": "Engineering" }
}
]
}
Assign Groups
POST /api/admin/task-lists/:taskListId/groups/assign
Rate-limited. Upsert-style — already-assigned groups are silently skipped.
Request Body
{ "group_ids": [1, 2, 3] }
Response 201
{
"status": "success",
"message": "2 group(s) assigned.",
"assigned_ids": [2, 3],
"already_assigned_ids": [1],
"invalid_ids": []
}
Unassign Groups
POST /api/admin/task-lists/:taskListId/groups/unassign
Rate-limited. Hard-deletes the junction rows (assignments are not soft-deleted).
Request Body
{ "group_ids": [2, 3] }
Response 200
{
"status": "success",
"message": "2 group(s) unassigned.",
"unassigned_ids": [2, 3],
"skipped_ids": []
}
Tasks
Get All Tasks
GET /api/admin/task-lists/:taskListId/tasks
Returns paginated tasks under a task list.
Query Parameters
Standard pagination + filters + sort.
Get Single Task
GET /api/admin/task-lists/:taskListId/tasks/:taskId
Returns a task with its requirements and the parent task list (including assigned groups).
Response 200
{
"status": "success",
"message": "Task retrieved.",
"data": {
"task_id": "uuid-...",
"task_list_id": "uuid-...",
"name": "Complete orientation",
"description": "...",
"deadline": "2026-07-01T00:00:00.000Z",
"status": "pending",
"requirements": [
{
"requirement_id": "uuid-...",
"type": "upload_file",
"allowed_file_types": ["application/pdf"],
"max_file_count": 1,
"order": 0
}
],
"taskList": { "task_list_id": "...", "name": "Onboarding Q1", "groups": [...] }
}
}
Create Task
POST /api/admin/task-lists/:taskListId/tasks
Rate-limited. Creates a task and optionally its requirements in a single transaction.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Task name |
description |
string | No | |
deadline |
date | No | ISO date string |
requirements |
array | No | Array of requirement objects (see Requirement Types above) |
Response 201
{
"status": "success",
"message": "Task created successfully.",
"data": { "task_id": "uuid-...", "name": "...", "requirements": [...] }
}
Update Task
PATCH /api/admin/task-lists/:taskListId/tasks/:taskId
Rate-limited. When requirements is provided, the full set is replaced (soft-delete + re-insert).
Note: Incoming requirement objects must not include
requirement_id— the server always generates fresh IDs to avoid collisions with soft-deleted rows.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | No | |
description |
string | No | |
deadline |
date | No | |
status |
string | No | pending, in_progress, completed, overdue |
requirements |
array | No | Full replacement set |
Archive Task
DELETE /api/admin/task-lists/:taskListId/tasks/:taskId
Rate-limited. Soft-deletes the task.
Restore Task
PATCH /api/admin/task-lists/:taskListId/tasks/:taskId/restore
Rate-limited.
Bulk Archive Tasks
POST /api/admin/task-lists/:taskListId/tasks/bulk-archive
Rate-limited.
Request Body
{ "ids": ["uuid-1", "uuid-2"] }
Bulk Restore Tasks
POST /api/admin/task-lists/:taskListId/tasks/bulk-restore
Rate-limited.
Get Archived Tasks
GET /api/admin/task-lists/:taskListId/tasks/archived
Get Task Field Values
GET /api/admin/task-lists/:taskListId/tasks/field-values
Completions
Completions are created by clients only. Admins can view and archive/restore them.
Each completion may have multiple attached files (task_completion_files).
Get All Completions
GET /api/admin/task-lists/:taskListId/tasks/:taskId/completions
Returns paginated completions for a task, with submitting user info and files.
Response 200
{
"status": "success",
"message": "Completions retrieved.",
"data": [
{
"completion_id": "uuid-...",
"task_id": "uuid-...",
"user_id": 42,
"note": "Attached the signed form.",
"submitted_at": "2026-06-15T10:00:00.000Z",
"user": { "user_id": 42, "email": "user@example.com", "name": "Jane Doe" },
"files": [
{
"file_id": "uuid-...",
"file_url": "https://...",
"file_name": "signed_form.pdf",
"file_size": 204800,
"mime_type": "application/pdf"
}
]
}
],
"pagination": { ... }
}
Get Single Completion
GET /api/admin/task-lists/:taskListId/tasks/:taskId/completions/:completionId
Returns a single completion with user and files.
Get Completions by User
GET /api/admin/task-lists/:taskListId/tasks/:taskId/completions/user/:userId
Returns all completions for a specific user on a specific task.
Archive Completion
DELETE /api/admin/task-lists/:taskListId/tasks/:taskId/completions/:completionId
Rate-limited. Soft-deletes a completion.
Restore Completion
PATCH /api/admin/task-lists/:taskListId/tasks/:taskId/completions/:completionId/restore
Rate-limited.
Bulk Archive Completions
POST /api/admin/task-lists/:taskListId/tasks/:taskId/completions/bulk-archive
Rate-limited.
Request Body
{ "ids": ["uuid-1", "uuid-2"] }
Bulk Restore Completions
POST /api/admin/task-lists/:taskListId/tasks/:taskId/completions/bulk-restore
Rate-limited.