backend/is the Spring Boot app: code inbackend/src/main/java, config inbackend/src/main/resources, Liquibase underbackend/src/main/resources/db.backend/src/test/javaholds JUnit/Spring tests.frontend/is the Vue 3 app: source infrontend/src, static assets infrontend/public, table configs infrontend/src/configs/tables.
cd backend && ./mvnw spring-boot:runstarts the API on port 8090.cd backend && ./mvnw testunit tests;./mvnw integration-testintegration tests;./mvnw verifyfull backend suite.cd backend && ./mvnw liquibase:updateapplies migrations;./mvnw liquibase:statusshows status.python3 validate_schema.pyvalidates schema vs Liquibase.cd frontend && npm installinstalls deps.cd frontend && npm run devstarts the UI on port 3001;npm run buildbuilds;npm run previewserves the build.cd frontend && npm run lintruns ESLint fixes.
- Backend follows Google Java Style and Checkstyle. Use
PascalCaseclasses,camelCasefields/methods, lowercase packages. - Frontend uses ESLint (
frontend/eslint.config.js). Keep existing naming patterns like*.config.jsunderfrontend/src/configs/tables. - Keep indentation consistent with the surrounding file and avoid changing existing Liquibase changesets.
- Backend tests use JUnit Jupiter and Spring Boot Test. Place tests in
backend/src/test/javaand align names with the class under test (e.g.,FooServiceTest). - No dedicated frontend test runner is configured yet; rely on
npm run lintand manual verification.
- Recent history mixes
fix(frontend): ...,style(frontend): ...,refactor(frontend): ..., plusRefactor:/Update:. Prefertype(scope): short imperative summary. - PRs should include a clear description, testing notes (commands run), and screenshots or short clips for UI changes.
- Backend overrides live in
backend/src/main/resources/application-local.yaml(gitignored).config.propertiescan be copied fromconfig.properties.example. .local.propsis also gitignored for local DB config. Do not commit secrets.- Frontend uses API base URL
http://localhost:8090/api/.
- Backend uses layered flow (Entity → Repository → Service → Controller) with DTOs and MapStruct (
BaseMapper+MapStructConfig). - All entities extend
BaseEntity(UUID v7 + timestamps). Component hierarchy uses Single Table Inheritance; discriminator values must match CSV seed data exactly. - Catalog pattern separates models/catalogs from instances; add new catalogs through Liquibase and CSVs.
- Liquibase: never edit existing changesets; add new ones, keep init before fill, CSV separator
;and quote'. - Frontend tables are configuration-driven: only
GenericTableView.vuerenders tables, configs live infrontend/src/configs/tablesandtableRegistry.js. - Frontend API modules must be factory functions (receive axios instance) and return axios responses; composables extract
.data. - Shared frontend data uses singleton composables (state declared outside). Delete functions are singular (
deleteEntity). - Routes for protected views must include
meta: { requiresAuth: true, roles: [...], tableKey: '...' }and follow existing naming conventions.