diff --git a/.gitignore b/.gitignore index 19a5b58..71b578d 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,10 @@ Thumbs.db docker-compose.override.yml certs/ +# Gradle +.gradle/ +build/ + # Java *.hprof diff --git a/AGENTS.md b/AGENTS.md index 2c1cac1..3ddd86c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,11 +24,23 @@ PostgreSQL 16. Deployed via Docker Compose. Always run these after making changes to verify nothing is broken. +Gradle lives at repo root. All commands below run from the repo root unless noted. + ### Quick start (everything) ```bash cp .env.example .env # first time only, then fill in keys docker compose up -d # starts postgres, backend, frontend +./gradlew up # same as above (Gradle wrapper) +``` + +### All-in-one + +```bash +./gradlew check # frontend lint → frontend test → backend test → integration test +./gradlew up # docker compose up -d +./gradlew down # docker compose down +./gradlew reset # docker compose down -v && docker compose up -d (full DB reset) ``` ### Frontend (Vue.js 3 + Vite) @@ -45,10 +57,8 @@ npm run test # vitest ### Backend (Spring Boot 4 + Java 21) ```bash -cd backend -./gradlew bootRun # dev server on :8080 -./gradlew test # JUnit 5 + Mockito -./gradlew check # full verification including integration tests +./gradlew :backend:bootRun # dev server on :8080 +./gradlew :backend:test # JUnit 5 + Mockito (backend only) ``` ### Stripe webhooks (local testing) @@ -80,7 +90,8 @@ bilhej/ │ │ ├── router/ # Vue Router config │ │ └── assets/ # Static files, CSS │ └── ... -├── backend/ # Spring Boot 4 (Java 21) +├── backend/ # Spring Boot 4 (Java 21) — Gradle subproject +│ ├── build.gradle # Spring Boot plugin, Java deps, test config │ ├── src/main/java/se/bilhalsning/ │ │ ├── config/ # @Configuration classes │ │ ├── controller/ # REST controllers @@ -96,7 +107,7 @@ bilhej/ │ ├── application-docker.yml # docker profile (PostgreSQL) │ └── db/migration/ # Flyway migrations ├── docker/ # Dockerfiles -│ ├── backend.Dockerfile # dev: JDK 21 + gradle bootRun +│ ├── backend.Dockerfile # dev: JDK 21 + gradle :backend:bootRun │ ├── backend.prod.Dockerfile # prod: multi-stage (Gradle build → JRE Alpine, non-root) │ ├── frontend.Dockerfile # dev: Node 24 + vite dev server │ ├── frontend.prod.Dockerfile # prod: multi-stage (Node build → nginx) @@ -104,6 +115,11 @@ bilhej/ │ └── entrypoint.sh # prod: self-signed cert generation ├── docker-compose.yml # dev: postgres + backend (bootRun) + frontend (Vite HMR) ├── docker-compose.prod.yml # prod: multi-stage images, no source mounts, restart always +├── gradlew # Gradle wrapper (repo root) +├── gradle/ +│ └── wrapper/ +├── settings.gradle # rootProject.name + include 'backend' +├── build.gradle # convenience tasks: check, up, down, reset ├── .env.example ├── AGENTS.md # This file ├── README.md diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..49d979f --- /dev/null +++ b/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'base' +} + +tasks.register('frontendLint', Exec) { + description = 'Run ESLint in the frontend directory' + workingDir = file("${rootProject.projectDir}/frontend") + commandLine 'npm', 'run', 'lint' +} + +tasks.register('frontendTest', Exec) { + description = 'Run Vitest in the frontend directory' + dependsOn frontendLint + workingDir = file("${rootProject.projectDir}/frontend") + commandLine 'npm', 'run', 'test' +} + +tasks.named('check').configure { + dependsOn frontendLint, frontendTest +} + +tasks.register('up', Exec) { + description = 'Start all services via Docker Compose' + workingDir = rootProject.projectDir + commandLine 'docker', 'compose', 'up', '-d' +} + +tasks.register('down', Exec) { + description = 'Stop all Docker Compose services' + workingDir = rootProject.projectDir + commandLine 'docker', 'compose', 'down' +} + +tasks.register('reset', Exec) { + description = 'Wipe database and restart all services' + workingDir = rootProject.projectDir + commandLine 'bash', '-c', 'docker compose down -v && docker compose up -d' +} diff --git a/docker-compose.yml b/docker-compose.yml index 444d45b..e8b081b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: postgres: condition: service_healthy volumes: - - ./backend:/app + - .:/app - gradle-cache:/root/.gradle frontend: diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 0d73282..a0960cc 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,3 +1,3 @@ FROM eclipse-temurin:21-jdk WORKDIR /app -ENTRYPOINT ["./gradlew", "bootRun", "--no-daemon"] +ENTRYPOINT ["./gradlew", ":backend:bootRun", "--no-daemon"] diff --git a/backend/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from backend/gradle/wrapper/gradle-wrapper.jar rename to gradle/wrapper/gradle-wrapper.jar diff --git a/backend/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from backend/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties diff --git a/backend/gradlew b/gradlew similarity index 100% rename from backend/gradlew rename to gradlew diff --git a/backend/settings.gradle b/settings.gradle similarity index 59% rename from backend/settings.gradle rename to settings.gradle index 7d5bf60..2a2d33a 100644 --- a/backend/settings.gradle +++ b/settings.gradle @@ -1 +1,3 @@ rootProject.name = 'bilhej' + +include 'backend'