achim ad23616c7b feat(backend): implement domain — users, projects, time entries, reports
- User, Project, TimeEntry JPA entities with SLF4J logging in services
- Native SQL aggregate queries: per-day (weekly) and per-project (monthly)
  both using COALESCE(project_rate, user_rate) for cost calculation
- ReportService parses ISO week/month strings, fills zero-day gaps,
  computes timeBudgetPct / costBudgetPct / breached per project
- ProjectService piggybacks on aggregateAllByProject for budget status
  on GET /api/projects (no N+1)
- GlobalExceptionHandler maps validation errors → 400 ProblemDetail,
  EntityNotFoundException → 404, IllegalArgumentException → 400
- Lombok on pom.xml (optional, used for @Getter/@Setter/@NoArgsConstructor)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 11:41:23 +02:00

App

React 19 + Spring Boot 3.4 web app backed by PostgreSQL 17.

Quick start

Requires a full JDK (not just JRE) for Maven compilation. mise install below handles this. Without mise: sudo apt install openjdk-21-jdk.

# 1. Pin toolchain — installs Java 21 JDK, Node 22, Maven, lefthook, gitleaks
mise install

# 2. Install deps and git hooks (or run the four commands manually)
mise run setup

# 3. Start the database
docker compose up -d

Open two terminals:

# Backend → http://localhost:8080
mvn -f backend/pom.xml spring-boot:run

# Frontend → http://localhost:5173  (proxies /api → :8080)
cd frontend && npm run dev

Verify everything

mise run check       # format-check + lint + test (both stacks)

Without mise:

mvn -f backend/pom.xml spotless:check -q
cd frontend && npx biome check src
mvn -f backend/pom.xml test -q
cd frontend && npx vitest run

Environment

.env.example documents all env vars. mise run setup copies it to .env automatically on first run.

S
Description
No description provided
Readme 121 KiB
Languages
TypeScript 57.7%
Java 41.2%
Dockerfile 0.8%
HTML 0.3%