ad23616c7b77e15a915fb086651860b63b055276
- 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>
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 installbelow 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.
Description
Languages
TypeScript
57.7%
Java
41.2%
Dockerfile
0.8%
HTML
0.3%