Core (Backend)
Tech stack: Java 21, Spring Boot 4.0.3, GraphQL (schema-first), PostgreSQL, Keycloak 26.5.5, Liquibase, MapStruct, Envers.
Package root: com.axvero.ams.core
Commands
- Build:
./mvnw clean package - Validate:
./mvnw compile(tests are not working — do not run them) - Dev server:
./run.sh(prod-like),./run-debug.sh(JDWP 5005) - DB:
ams-deploy/docker-compose-local.yml— port 5433, db:core - Profiles:
src/main/resources/application-*.yaml
Database migrations
- Liquibase is active — every new table or column change requires a changelog file
- Add
src/main/resources/db/changelog/NNNN-description.sql(next sequential number) - Register it in
db/changelog/db.changelog-master.yamlunderdatabaseChangeLog - Use
--liquibase formatted sql+--changeset author:idheader format (see existing files for pattern)
Hard constraints
- Do NOT inject
CurrentUserContextinto services — resolvecurrentUserIdin the controller and pass it as a method parameter BaseEntityusesInheritanceType.JOINEDand is extended byUser,Organization,Team,Workspace— do NOT dissolve it; that is a dedicated future task- Every
OrgWorkspacemust have anOrgPublicProfile— create one viaOrgPublicProfileService.sync()immediately when creating anOrgWorkspace OrgPublicProfilesync:synced=trueauto-propagates from private org profile;synced=falseis independently managed- Role-based data scoping: clients see only their own data; staff see all — checked via
ClientService.findClientIdByUserIdAndWorkspaceId()