[ project / platform ]

In-house publishing back-office platform

Book Publishing Platform

Book Publishing Platform is an API-first back-office system for managing a publisher's catalog, designed and delivered end to end from domain modelling and persistence to a secured Android client and cloud deployment.

Architecture diagram showing a versioned api-spec repository generating a shared library for the backend, with a database, cloud deployment, and phone frontend.
The versioned API specification generates a library consumed by the backend; the Android client securely communicates with the cloud-hosted platform.

From publishing workflow to working software

Editorial Denes needed an internal catalog-management workflow that could keep books, authors, and collections in one dependable place. Book Publishing Platform centralizes that work as an in-house back-office system used in production, rather than treating each repository as a separate product.

The work spans the complete delivery path: understanding the requirements, modelling the publishing domain, designing the API, implementing persistence and security, integrating the client, testing the boundaries, and deploying the resulting service to the cloud.

Granular access to the platform

The platform implements JWT-based authentication and role- and permission-based authorization, providing granular control over access to the service and the actions each user can perform. These rules are enforced by the backend and remain independent from the current Android client.

One platform, clear system boundaries

OpenAPI contract

A versioned repository defines the public boundary independently from any one client or implementation.

Backend service

Kotlin and Spring Boot keep the domain, use cases, adapters, security, and persistence concerns explicit.

Administrative client

A native Android app consumes the secured API for day-to-day catalog management; it is one client of the platform.

Persistent catalog

PostgreSQL stores the publishing domain, with Liquibase making schema evolution repeatable and reviewable.

Keeping the domain at the center

Kotlin and Spring Boot

A pragmatic service foundation for the API, application use cases, and integration with the platform boundary.

Domain-Driven Design

The model follows the publishing problem and keeps business rules meaningful outside the transport layer.

Vertical slices

Business contexts keep domain, application, and infrastructure responsibilities close without collapsing their boundaries.

Hexagonal architecture

Ports and adapters isolate the domain from HTTP, persistence, frameworks, and other delivery mechanisms.

Persistence and security

PostgreSQL, Liquibase, JWT authentication, and server-side role checks protect and evolve the platform safely.

Treating the contract as a product boundary

The OpenAPI specification lives in its own versioned repository and acts as the source of truth for the API. It generates Kotlin interfaces and DTOs consumed by the backend, keeping the contract and implementation aligned.

  1. Define the boundary

    Endpoints, payloads, validation, and error shapes are maintained in the versioned OpenAPI specification.

  2. Generate the shared types

    Kotlin interfaces and DTOs turn the reviewed contract into an implementation-facing artifact.

  3. Implement behind the boundary

    The Spring Boot backend consumes the generated artifact, keeping transport changes explicit and reviewable.

Confidence through boundaries, tests, and automation

Domain boundaries

Isolated domain and use-case tests exercise business rules without requiring the web or database layers.

HTTP boundaries

Mapper and controller tests cover serialization, validation, security, and response behavior through Spring and MockMvc.

Production-shaped integration

PostgreSQL integration tests use Testcontainers, while higher-level API and integration validation checks the assembled system.

Android confidence

The client is tested at the ViewModel, repository, and Compose UI boundaries rather than only through manual checks.

Automated delivery gates

Pull-request and CI/CD validation provide repeatable checks before changes are integrated and deployed.

From product intent to production

  1. Define measurable objectives

    Project goals are translated into measurable OKRs and KPIs so delivery progress and engineering outcomes remain visible.

  2. Plan the work

    A GitHub Project makes priorities, status, stages, and delivery context visible across the platform.

  3. Refine the product scope

    Milestones turn the product outcome into requirements, success criteria, delivery stages, and explicit exclusions.

  4. Break down technical delivery

    Dependency-ordered issues describe one observable outcome at a time and keep backend, contract, client, and infrastructure work aligned.

  5. Implement and validate

    Focused branches carry the implementation, tests, and automated checks while unrelated work remains separate.

  6. Review, integrate, and deploy

    Pull-request review and CI/CD validation provide the delivery gate before the Dockerized service reaches Cloud Run.

A platform that can take on new workflows

Public publisher website

A web client is already in progress and can consume the same API without moving publishing rules into a frontend.

Inventory management

The backend can grow into stock and inventory workflows while keeping the publishing domain and access rules explicit.

More platform consumers

Additional clients and integrations can adopt the versioned contract without creating a separate product boundary.

Book Publishing Platform is one end-to-end engineering story: a production back office whose domain, API boundary, client, and delivery path are designed to evolve together.