Introduce SteamOwnedGamesResponse and SteamProfileAndGamesResponse DTOs and extend SteamApiService with getOwnedGames(...) and getFullPlayerProfile(...) to fetch and combine player summary and owned games. Update SteamTestController to return the combined profile/games response. Remove redundant Steam service URL entries from application.yml. Add SteamApiServiceTest to cover player summary, owned games (including null fields), and the combined profile flow; service falls back to empty lists on errors.
To Be Played (TBP) - Core Service
This is the Core Service for the "To Be Played" project. It acts as the central modulith, handling all business logic in vertical micro-service ready slices.
🚀 Tech Stack
- Language: Java 25
- Framework: Spring Boot 4.1.x
- Security: Spring Security & JSON Web Tokens (JWT)
- Database: PostgreSQL 17
- Migrations: Flyway
- Observability: Spring Boot Actuator & Micrometer (Prometheus)
- Build Tool: Maven Wrapper (
mvnw) - CI/CD: Gitea Actions (Forgejo)
🏗️ Architecture (Clean Architecture)
The project strictly follows a Domain-Driven / Clean Architecture (Ports & Adapters) approach to ensure high maintainability and testability. The codebase is divided into three main layers to prevent framework lock-in and keep business logic isolated.
Layer Breakdown
-
API / Web Layer (
api)- Contains REST endpoints, DTOs (
Request/Responserecords), and Global Exception Handlers. - Uses
ApiMapperto map between DTOs and Domain Models. - Rule: This layer delegates to the Service layer and never accesses persistence directly.
- Contains REST endpoints, DTOs (
-
Business / Core Layer (
model,service,exception)- The heart of the application. Contains pure Java classes (Models) and Business Logic (Services).
- Throws specific business exceptions (e.g.,
InvalidCredentialsException). - Rule: This layer has no dependencies on the API or Persistence layer. It defines interfaces that the persistence layer must implement.
-
Persistence Layer (
persistence)- Handles database operations. Contains JPA Entities (
UserEntity), Spring Data Repositories, and theEntityMapper. - Implements the interfaces defined in the Domain layer.
- Rule: Entities never leak into the API layer.
- Handles database operations. Contains JPA Entities (
Note: Future implementations will include ArchUnit tests to automatically enforce these architectural boundaries during the CI pipeline.
⚙️ Local Development
Running the application locally is fully automated via Spring Boot's Docker Compose Support.
Prerequisites
- Java 25 installed
- Docker & Docker Compose running
How to start
- Simply run the application from your IDE (e.g., IntelliJ) via the
CoreServiceApplication.javamain class. - Spring Boot will automatically detect the
compose.yamland spin up a local PostgreSQL container (tbp_db_local) on port5432. - Flyway will automatically apply all database migrations located in
src/main/resources/db/migration. - The application will be available at
http://localhost:8090.
To stop the environment and clean the database volume (if needed):
docker compose down -v
🔐 API Versioning
All API endpoints utilize Query Parameter Versioning to keep URLs clean and manageable. Example: GET /api/users/me?v=1
🐳 CI/CD Pipeline
The project uses Gitea Actions for Continuous Integration and Deployment.
Quality Gate: Runs ./mvnw clean verify to ensure tests and builds pass.
Docker Build: Packages the application using a multi-stage Dockerfile.
Registry: Pushes the lightweight Alpine-based image to the private Gitea container registry (git.andreas-dahm.eu/lobo_corp/tbp-core-service:latest).
📈 Observability
Metrics and health checks are exposed out-of-the-box via Spring Boot Actuator:
Health: http://localhost:8090/actuator/health
Prometheus Metrics: http://localhost:8090/actuator/prometheus