Skip to content

Task Management

This monorepo implements task management from persistence to user interface. A Spring Boot API stores tasks, reusable tags, and hierarchical nomenclatures in PostgreSQL, three reusable clients expose the same contract, and a React console provides day-to-day CRUD and task bulk data operations.

What You Will Run

The tutorial starts a complete local stack and creates one task. Tasks have a server-generated Long identifier, unique immutable code, required label, optional description, server-owned audit fields, status (TODO by default), priority (NORMAL by default), optional due date and assignee, tag IDs ([] by default), and an optional nomenclature ID.

Tags provide reusable flat labels. Nomenclatures provide a reusable tree through nullable parentId; tasks select one classification and any number of tags. The API rejects missing references, hierarchy cycles, and deletion of referenced taxonomy entries.

Modules

Module Purpose
api Spring Boot CRUD API backed by JPA and PostgreSQL.
java-client Maven client library using Java HttpClient.
react-client TypeScript client library for React or browser apps.
backend React + Vite management console.
dart-client Dart package for Flutter or Dart services.
docs MkDocs project documentation.
presentation Marp overview of the solution and its architecture.

See Recommended Copilot Skills for the skills to use when extending or maintaining each part of the monorepo.

Supported Stack Versions

Use these maintained baseline versions for local development and CI. Newer compatible patch releases are supported unless a module pins a version explicitly.

Technology Version
Node.js 24
pnpm 11
Java 25
Maven 3.9.16
Dart SDK 3.12.2
Spring Boot 4.1.1
Vite 8.2.2
Vitest 4.1.11
Vite React plugin 6.1.1
Redux Toolkit / RTK Query 2.12

Tutorial: Run the Solution

1. Start the stack

From the repository root:

Apply the task-domain database migration before starting the API, including for a new database.

make docker-up

Compose publishes the documentation on 8000, the API on 8989, and the console on 5173.

2. Create a Task

Log in first (local defaults are admin / admin) and use the returned token:

TOKEN=$(curl -s -X POST http://localhost:8989/api/v1/auth/login \
    -H "Content-Type: application/json" \
    -d '{"username":"admin","password":"admin"}' | jq -r .token)

curl -X POST http://localhost:8989/api/v1/task \
    -H "$(printf 'Authorization: %s %s' Bearer "$TOKEN")" \
    -H "Content-Type: application/json" \
    -d '{"code":"RELEASE-001","label":"Prepare release","description":"Review the release checklist"}'

The response resembles:

{
    "id": 1,
    "code": "RELEASE-001",
    "label": "Prepare release",
    "description": "Review the release checklist",
    "status": "TODO",
    "priority": "NORMAL",
    "dueDate": null,
    "assignedTo": null,
    "tagIds": [],
    "nomenclatureId": null,
    "createdDate": "2026-08-30T17:00:00Z",
    "lastModifiedDate": "2026-08-30T17:00:00Z",
    "createdBy": "admin",
    "lastModifiedBy": "admin"
}

The exact identifier and timestamps are assigned by the server.

3. Use the console

Open http://localhost:5173, select Tasks, and open the new task by its ID. From this page you can create, inspect, update, delete, seed, import, export, and print tasks. Use Tags and Nomenclatures to maintain reusable labels and classifications before assigning them to tasks.

Swagger UI is available at http://localhost:8989/swagger-ui.html.

4. Stop the stack

make docker-down

The PostgreSQL volume is retained. Follow Reset the demo database when you need a clean database.

Develop and Verify

make setup
make test
make build

Generate Java, React, and Dart coverage reports:

make coverage

Run only the API locally against PostgreSQL on localhost:5432:

make java-run

Then open http://localhost:8080/swagger-ui.html.

Continue with the API reference, architecture explanation, web console guide, or deployment guide.