# dongiveajack/service-framework architecture

> Architecture diagram of the GitHub repository dongiveajack/service-framework, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dongiveajack/service-framework
- Repository: https://github.com/dongiveajack/service-framework

## Overview

Service Framework is a reusable Spring foundation for downstream microservices, not a standalone service. Its main workflow is authenticated REST CRUD/search through shared controllers and services into tenant-aware persistence; separate capabilities provide Realm-backed identity, audit history, notifications, CMS GraphQL/SNS, and standardized REST/gRPC errors. Relationships below are limited to visible source references and README-described behavior; unsampled configuration and subsystem internals are not asserted.

Main entry points: [`src/main/java/org/trips/service_framework/services/CmsService.java`](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/CmsService.java) (CMS workflows), [`src/main/java/org/trips/service_framework/services/BaseService.java`](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/BaseService.java) (CRUD service), [`src/main/java/org/trips/service_framework/controllers/BaseController.java`](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/controllers/BaseController.java) (CRUD controller), [`src/main/java/org/trips/service_framework/audit/services/AuditLogService.java`](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/services/AuditLogService.java) (Audit history)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["REST API"]
  node_base_controller["CRUD controller"]
  node_cms_controller["CMS endpoints<br/>[CmsController.java]"]
  node_rest_errors["REST errors"]
end

subgraph group_core["CRUD and Search"]
  node_base_service["CRUD service<br/>[BaseService.java]"]
  node_search_engine["Search engine<br/>[SearchHelper.java]"]
  node_base_entity["Entity model<br/>[BaseEntity.java]"]
  node_repository["Base repository"]
  node_routing["Tenant routing"]
end

subgraph group_identity["Identity and Audit"]
  node_auth_aspect["Auth aspect"]
  node_auth_service["Authentication<br/>[AuthService.java]"]
  node_realm_client["Realm client<br/>[RealmClient.java]"]
  node_context["Request context<br/>[Context.java]"]
  node_audit_api["Audit API"]
  node_audit_service["Audit history"]
  node_javers[("JaVers audit store")]
end

subgraph group_integrations["External Integrations"]
  node_notifications["Notification service"]
  node_notification_factory["Handler factory"]
  node_notification_handlers["Channel handlers"]
  node_mercury["Mercury client<br/>[MercuryClient.java]"]
  node_cms_service["CMS workflows<br/>[CmsService.java]"]
  node_cms_helper["SKU helper<br/>[CmsHelper.java]"]
  node_graphql["CMS GraphQL<br/>[GraphQLUtils.java]"]
  node_sns["SNS publisher"]
end

subgraph group_platform["Runtime Platform"]
end

node_consumer(("Microservice caller"))
node_external_services{{"External services"}}

node_consumer -->|"calls endpoints"| node_base_controller
node_base_controller -->|"delegates CRUD"| node_base_service
node_base_service -->|"reads and writes"| node_repository
node_base_service -->|"builds paging"| node_search_engine
node_base_service -->|"reads user ID"| node_context
node_base_service -->|"operates on"| node_base_entity
node_consumer -->|"calls endpoints"| node_cms_controller
node_cms_controller -->|"dispatches search"| node_cms_service
node_cms_service -->|"builds SKU queries"| node_cms_helper
node_cms_service -->|"uses GraphQL"| node_graphql
node_cms_service -->|"publishes SKU event"| node_sns
node_cms_service -->|"queries CMS"| node_external_services
node_cms_service -->|"publishes events"| node_external_services
node_base_controller -.->|"uses authentication"| node_auth_aspect
node_auth_aspect -.->|"authenticates"| node_auth_service
node_auth_service -->|"verifies identity"| node_realm_client
node_realm_client -->|"calls Realm"| node_external_services
node_audit_api -->|"requests history"| node_audit_service
node_audit_service -->|"loads authors"| node_auth_service
node_audit_service -.->|"queries changes"| node_javers
node_notifications -->|"selects handler"| node_notification_factory
node_notification_factory -.->|"dispatches channel"| node_notification_handlers
node_notification_handlers -->|"sends notification"| node_mercury
node_mercury -->|"calls Mercury"| node_external_services
node_rest_errors -->|"returns errors"| node_consumer
node_routing -->|"selects tenant"| node_context

click node_base_controller "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/controllers/BaseController.java"
click node_cms_controller "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/controllers/CmsController.java"
click node_rest_errors "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/exceptions/handlers/RestExceptionHandler.java"
click node_base_service "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/BaseService.java"
click node_search_engine "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/SearchHelper.java"
click node_base_entity "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/models/entities/BaseEntity.java"
click node_repository "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/models/repositories/BaseRepository.java"
click node_routing "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/RoutingDataSource.java"
click node_auth_aspect "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/aop/aspects/AuthenticateAspect.java"
click node_auth_service "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/AuthService.java"
click node_realm_client "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/clients/RealmClient.java"
click node_context "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/Context.java"
click node_audit_api "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/controllers/AuditLogController.java"
click node_audit_service "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/services/AuditLogService.java"
click node_javers "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/JaversDatasourceConfig.java"
click node_notifications "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/NotificationService.java"
click node_notification_factory "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/notificationHandler/NotificationHandlerFactory.java"
click node_notification_handlers "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/notificationHandler/NotificationHandler.java"
click node_mercury "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/clients/MercuryClient.java"
click node_cms_service "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/CmsService.java"
click node_cms_helper "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/helpers/CmsHelper.java"
click node_graphql "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/GraphQLUtils.java"
click node_sns "https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/events/SnsEventPublisher.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_base_controller,node_cms_controller,node_rest_errors toneBlue
class node_base_service,node_search_engine,node_base_entity,node_repository,node_routing toneAmber
class node_auth_aspect,node_auth_service,node_realm_client,node_context,node_audit_api,node_audit_service,node_javers toneMint
class node_notifications,node_notification_factory,node_notification_handlers,node_mercury,node_cms_service,node_cms_helper,node_graphql,node_sns toneRose
class node_consumer,node_external_services toneIndigo
```

## Components

### REST API

- [CRUD controller](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/controllers/BaseController.java): `src/main/java/org/trips/service_framework/controllers/BaseController.java`
- [CMS endpoints](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/controllers/CmsController.java): `src/main/java/org/trips/service_framework/controllers/CmsController.java`
- [REST errors](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/exceptions/handlers/RestExceptionHandler.java): `src/main/java/org/trips/service_framework/exceptions/handlers/RestExceptionHandler.java`

### CRUD and Search

- [CRUD service](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/BaseService.java): `src/main/java/org/trips/service_framework/services/BaseService.java`
- [Search engine](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/SearchHelper.java): `src/main/java/org/trips/service_framework/utils/SearchHelper.java`
- [Entity model](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/models/entities/BaseEntity.java): `src/main/java/org/trips/service_framework/models/entities/BaseEntity.java`
- [Base repository](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/models/repositories/BaseRepository.java): `src/main/java/org/trips/service_framework/models/repositories/BaseRepository.java`
- [Tenant routing](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/RoutingDataSource.java): `src/main/java/org/trips/service_framework/utils/RoutingDataSource.java`

### Identity and Audit

- [Auth aspect](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/aop/aspects/AuthenticateAspect.java): `src/main/java/org/trips/service_framework/aop/aspects/AuthenticateAspect.java`
- [Authentication](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/AuthService.java): `src/main/java/org/trips/service_framework/services/AuthService.java`
- [Realm client](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/clients/RealmClient.java): `src/main/java/org/trips/service_framework/clients/RealmClient.java`
- [Request context](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/Context.java): `src/main/java/org/trips/service_framework/utils/Context.java`
- [Audit API](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/controllers/AuditLogController.java): `src/main/java/org/trips/service_framework/audit/controllers/AuditLogController.java`
- [Audit history](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/services/AuditLogService.java): `src/main/java/org/trips/service_framework/audit/services/AuditLogService.java`
- [JaVers audit store](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/audit/JaversDatasourceConfig.java): `src/main/java/org/trips/service_framework/audit/JaversDatasourceConfig.java`

### External Integrations

- [Notification service](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/NotificationService.java): `src/main/java/org/trips/service_framework/services/NotificationService.java`
- [Handler factory](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/notificationHandler/NotificationHandlerFactory.java): `src/main/java/org/trips/service_framework/notificationHandler/NotificationHandlerFactory.java`
- [Channel handlers](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/notificationHandler/NotificationHandler.java): `src/main/java/org/trips/service_framework/notificationHandler/NotificationHandler.java`
- [Mercury client](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/clients/MercuryClient.java): `src/main/java/org/trips/service_framework/clients/MercuryClient.java`
- [CMS workflows](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/services/CmsService.java): `src/main/java/org/trips/service_framework/services/CmsService.java`
- [SKU helper](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/helpers/CmsHelper.java): `src/main/java/org/trips/service_framework/helpers/CmsHelper.java`
- [CMS GraphQL](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/utils/GraphQLUtils.java): `src/main/java/org/trips/service_framework/utils/GraphQLUtils.java`
- [SNS publisher](https://github.com/dongiveajack/service-framework/blob/cf_master/src/main/java/org/trips/service_framework/events/SnsEventPublisher.java): `src/main/java/org/trips/service_framework/events/SnsEventPublisher.java`

### Other components

- **Microservice caller**
- **External services**

## Connections

- Microservice caller → CRUD controller: calls endpoints (evidence: `README.md`)
- CRUD controller → CRUD service: delegates CRUD (evidence: `src/main/java/org/trips/service_framework/controllers/BaseController.java`)
- CRUD service → Base repository: reads and writes (evidence: `src/main/java/org/trips/service_framework/services/BaseService.java`)
- CRUD service → Search engine: builds paging (evidence: `src/main/java/org/trips/service_framework/services/BaseService.java`)
- CRUD service → Request context: reads user ID (evidence: `src/main/java/org/trips/service_framework/services/BaseService.java`)
- CRUD service → Entity model: operates on (evidence: `src/main/java/org/trips/service_framework/services/BaseService.java`)
- Microservice caller → CMS endpoints: calls endpoints (evidence: `src/main/java/org/trips/service_framework/controllers/CmsController.java`)
- CMS endpoints → CMS workflows: dispatches search (evidence: `src/main/java/org/trips/service_framework/controllers/CmsController.java`)
- CMS workflows → SKU helper: builds SKU queries (evidence: `src/main/java/org/trips/service_framework/services/CmsService.java`)
- CMS workflows → CMS GraphQL: uses GraphQL (evidence: `src/main/java/org/trips/service_framework/services/CmsService.java`)
- CMS workflows → SNS publisher: publishes SKU event (evidence: `src/main/java/org/trips/service_framework/services/CmsService.java`)
- CMS workflows → External services: queries CMS (evidence: `src/main/java/org/trips/service_framework/services/CmsService.java`)
- CMS workflows → External services: publishes events (evidence: `src/main/java/org/trips/service_framework/services/CmsService.java`)
- CRUD controller → Auth aspect: uses authentication
- Auth aspect → Authentication: authenticates
- Authentication → Realm client: verifies identity (evidence: `src/main/java/org/trips/service_framework/services/AuthService.java`)
- Realm client → External services: calls Realm (evidence: `src/main/java/org/trips/service_framework/clients/RealmClient.java`)
- Audit API → Audit history: requests history (evidence: `src/main/java/org/trips/service_framework/audit/controllers/AuditLogController.java`)
- Audit history → Authentication: loads authors (evidence: `src/main/java/org/trips/service_framework/audit/services/AuditLogService.java`)
- Audit history → JaVers audit store: queries changes
- Notification service → Handler factory: selects handler (evidence: `src/main/java/org/trips/service_framework/services/NotificationService.java`)
- Handler factory → Channel handlers: dispatches channel
- Channel handlers → Mercury client: sends notification (evidence: `src/main/java/org/trips/service_framework/notificationHandler/WhatsappNotificationHandler.java`)
- Mercury client → External services: calls Mercury (evidence: `src/main/java/org/trips/service_framework/clients/MercuryClient.java`)
- REST errors → Microservice caller: returns errors (evidence: `src/main/java/org/trips/service_framework/exceptions/handlers/RestExceptionHandler.java`)
- Tenant routing → Request context: selects tenant (evidence: `src/main/java/org/trips/service_framework/utils/RoutingDataSource.java`)
