# salvadore1987/notification-hub architecture

> Architecture diagram of the GitHub repository salvadore1987/notification-hub, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/salvadore1987/notification-hub
- Repository: https://github.com/salvadore1987/notification-hub

## Overview

CommHub is a multi-channel messaging hub with a REST/Kafka submission API and an operator console. Its central workflow accepts a message, applies idempotency, templating, validation, routing, delivery filters and quota checks, then schedules delivery through provider adapters; provider callbacks and outbound events report delivery outcomes. The tree also documents batch and DLQ operations, configuration, templates, suppressions, audit, statistics and administration. The README is empty, and only selected sources were sampled, so links for unsampled adapter and application wiring are omitted where ownership is uncertain.

Main entry points: [`adapter/out/persistence`](https://github.com/salvadore1987/notification-hub/tree/main/adapter/out/persistence) (Message and config store), [`application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java) (Message pipeline), [`adapter/in/contract/src/main/java/uz/hamkorbank/commhub/adapter/in/contract`](https://github.com/salvadore1987/notification-hub/tree/main/adapter/in/contract/src/main/java/uz/hamkorbank/commhub/adapter/in/contract) (Payload mapping), [`adapter/in/scheduler/src/main/java/uz/hamkorbank/commhub/adapter/in/scheduler/MessageDispatchScheduler.java`](https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/scheduler/src/main/java/uz/hamkorbank/commhub/adapter/in/scheduler/MessageDispatchScheduler.java) (Scheduled dispatch)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Ingress and console"]
  node_console["Admin console<br/>[App.tsx]"]
  node_rest["REST API"]
  node_kafka_in["Kafka ingress"]
  node_admin_api["Admin API"]
  node_contract["Payload mapping"]
end

subgraph group_core["Message processing"]
  node_pipeline["Message pipeline"]
  node_dedup["Deduplication"]
  node_template["Template stage"]
  node_validation["Validation stage"]
  node_routing["Routing stage"]
  node_filters["Delivery filters"]
  node_quotas["Quota checks"]
end

subgraph group_delivery["Delivery and events"]
  node_dispatch["Scheduled dispatch"]
  node_provider["Channel providers"]
  node_callback["Provider callbacks"]
  node_events["Event publishing"]
end

subgraph group_operations["Operations and policy"]
  node_operations["Admin use cases"]
  node_query["Message queries"]
  node_batch_query["Batch queries"]
  node_template_query["Template preview"]
  node_suppression_query["Suppression checks"]
  node_audit_query["Audit queries"]
  node_dlq_query["DLQ queries"]
end

subgraph group_state["Persistence"]
  node_database[("Message and config store")]
  node_dedup_store[("Dedup registry")]
end

node_source(("Message source"))
node_operator(("Operator"))
node_kafka["Kafka broker"]

node_source -->|"submits"| node_rest
node_source -.->|"publishes"| node_kafka_in
node_rest -->|"decodes"| node_contract
node_kafka_in -->|"decodes"| node_contract
node_contract -->|"submits"| node_pipeline
node_operator -->|"uses"| node_console
node_console -->|"requests"| node_admin_api
node_admin_api -->|"invokes"| node_operations
node_pipeline -->|"checks idempotency"| node_dedup
node_pipeline -->|"renders content"| node_template
node_pipeline -->|"validates"| node_validation
node_pipeline -->|"selects provider"| node_routing
node_pipeline -->|"filters delivery"| node_filters
node_pipeline -->|"checks quotas"| node_quotas
node_pipeline -->|"stores messages"| node_database
node_dedup -->|"claims keys"| node_dedup_store
node_dispatch -->|"loads queued messages"| node_database
node_dispatch -->|"sends messages"| node_provider
node_provider -.->|"reports outcomes"| node_callback
node_callback -->|"updates delivery state"| node_database
node_events -->|"publishes status"| node_kafka
node_operations -->|"manages configuration"| node_database
node_query -->|"reads messages"| node_database
node_batch_query -->|"reads batches"| node_database
node_template_query -->|"reads templates and tariffs"| node_database
node_suppression_query -->|"checks suppressions"| node_database
node_audit_query -->|"reads audit log"| node_database
node_dlq_query -->|"reads DLQ"| node_database

click node_console "https://github.com/salvadore1987/notification-hub/blob/main/web/src/App.tsx"
click node_rest "https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/rest/src/main/java/uz/hamkorbank/commhub/adapter/in/rest/MessageController.java"
click node_kafka_in "https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/kafka/src/main/java/uz/hamkorbank/commhub/adapter/in/kafka/InboundMessageListener.java"
click node_admin_api "https://github.com/salvadore1987/notification-hub/tree/main/adapter/in/admin/src/main/java/uz/hamkorbank/commhub/adapter/in/admin"
click node_contract "https://github.com/salvadore1987/notification-hub/tree/main/adapter/in/contract/src/main/java/uz/hamkorbank/commhub/adapter/in/contract"
click node_pipeline "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java"
click node_dedup "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/DeduplicationService.java"
click node_template "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java"
click node_validation "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java"
click node_routing "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java"
click node_filters "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java"
click node_quotas "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java"
click node_dispatch "https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/scheduler/src/main/java/uz/hamkorbank/commhub/adapter/in/scheduler/MessageDispatchScheduler.java"
click node_provider "https://github.com/salvadore1987/notification-hub/tree/main/adapter/out/policy"
click node_callback "https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/callback/src/main/java/uz/hamkorbank/commhub/adapter/in/callback/ProviderCallbackController.java"
click node_events "https://github.com/salvadore1987/notification-hub/blob/main/adapter/out/kafka/src/main/java/uz/hamkorbank/commhub/adapter/out/kafka/KafkaStatusPublisherAdapter.java"
click node_operations "https://github.com/salvadore1987/notification-hub/tree/main/application/src/main/java/uz/hamkorbank/commhub/application/service"
click node_query "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/MessageQueryService.java"
click node_batch_query "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/BatchQueryService.java"
click node_template_query "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/TemplateQueryService.java"
click node_suppression_query "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/SuppressionQueryService.java"
click node_audit_query "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/AuditQueryService.java"
click node_dlq_query "https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/DlqQueryService.java"
click node_database "https://github.com/salvadore1987/notification-hub/tree/main/adapter/out/persistence"
click node_dedup_store "https://github.com/salvadore1987/notification-hub/blob/main/adapter/out/persistence/src/main/java/uz/hamkorbank/commhub/adapter/out/persistence/delivery/DedupRegistryPersistenceAdapter.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_console,node_rest,node_kafka_in,node_admin_api,node_contract toneBlue
class node_pipeline,node_dedup,node_template,node_validation,node_routing,node_filters,node_quotas toneAmber
class node_dispatch,node_provider,node_callback,node_events toneMint
class node_operations,node_query,node_batch_query,node_template_query,node_suppression_query,node_audit_query,node_dlq_query toneRose
class node_database,node_dedup_store,node_source,node_operator,node_kafka toneIndigo
```

## Components

### Ingress and console

- [Admin console](https://github.com/salvadore1987/notification-hub/blob/main/web/src/App.tsx): `web/src/App.tsx`
- [REST API](https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/rest/src/main/java/uz/hamkorbank/commhub/adapter/in/rest/MessageController.java): `adapter/in/rest/src/main/java/uz/hamkorbank/commhub/adapter/in/rest/MessageController.java`
- [Kafka ingress](https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/kafka/src/main/java/uz/hamkorbank/commhub/adapter/in/kafka/InboundMessageListener.java): `adapter/in/kafka/src/main/java/uz/hamkorbank/commhub/adapter/in/kafka/InboundMessageListener.java`
- [Admin API](https://github.com/salvadore1987/notification-hub/tree/main/adapter/in/admin/src/main/java/uz/hamkorbank/commhub/adapter/in/admin): `adapter/in/admin/src/main/java/uz/hamkorbank/commhub/adapter/in/admin`
- [Payload mapping](https://github.com/salvadore1987/notification-hub/tree/main/adapter/in/contract/src/main/java/uz/hamkorbank/commhub/adapter/in/contract): `adapter/in/contract/src/main/java/uz/hamkorbank/commhub/adapter/in/contract`

### Message processing

- [Message pipeline](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`
- [Deduplication](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/DeduplicationService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/DeduplicationService.java`
- [Template stage](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`
- [Validation stage](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`
- [Routing stage](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`
- [Delivery filters](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`
- [Quota checks](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/pipeline/MessagePipeline.java`

### Delivery and events

- [Scheduled dispatch](https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/scheduler/src/main/java/uz/hamkorbank/commhub/adapter/in/scheduler/MessageDispatchScheduler.java): `adapter/in/scheduler/src/main/java/uz/hamkorbank/commhub/adapter/in/scheduler/MessageDispatchScheduler.java`
- [Channel providers](https://github.com/salvadore1987/notification-hub/tree/main/adapter/out/policy): `adapter/out/policy`
- [Provider callbacks](https://github.com/salvadore1987/notification-hub/blob/main/adapter/in/callback/src/main/java/uz/hamkorbank/commhub/adapter/in/callback/ProviderCallbackController.java): `adapter/in/callback/src/main/java/uz/hamkorbank/commhub/adapter/in/callback/ProviderCallbackController.java`
- [Event publishing](https://github.com/salvadore1987/notification-hub/blob/main/adapter/out/kafka/src/main/java/uz/hamkorbank/commhub/adapter/out/kafka/KafkaStatusPublisherAdapter.java): `adapter/out/kafka/src/main/java/uz/hamkorbank/commhub/adapter/out/kafka/KafkaStatusPublisherAdapter.java`

### Operations and policy

- [Admin use cases](https://github.com/salvadore1987/notification-hub/tree/main/application/src/main/java/uz/hamkorbank/commhub/application/service): `application/src/main/java/uz/hamkorbank/commhub/application/service`
- [Message queries](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/MessageQueryService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/MessageQueryService.java`
- [Batch queries](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/BatchQueryService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/BatchQueryService.java`
- [Template preview](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/TemplateQueryService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/TemplateQueryService.java`
- [Suppression checks](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/SuppressionQueryService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/SuppressionQueryService.java`
- [Audit queries](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/AuditQueryService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/AuditQueryService.java`
- [DLQ queries](https://github.com/salvadore1987/notification-hub/blob/main/application/src/main/java/uz/hamkorbank/commhub/application/service/DlqQueryService.java): `application/src/main/java/uz/hamkorbank/commhub/application/service/DlqQueryService.java`

### Persistence

- [Message and config store](https://github.com/salvadore1987/notification-hub/tree/main/adapter/out/persistence): `adapter/out/persistence`
- [Dedup registry](https://github.com/salvadore1987/notification-hub/blob/main/adapter/out/persistence/src/main/java/uz/hamkorbank/commhub/adapter/out/persistence/delivery/DedupRegistryPersistenceAdapter.java): `adapter/out/persistence/src/main/java/uz/hamkorbank/commhub/adapter/out/persistence/delivery/DedupRegistryPersistenceAdapter.java`

### Other components

- **Message source**
- **Operator**
- **Kafka broker**

## Connections

- Message source → REST API: submits
- Message source → Kafka ingress: publishes
- REST API → Payload mapping: decodes
- Kafka ingress → Payload mapping: decodes
- Payload mapping → Message pipeline: submits
- Operator → Admin console: uses
- Admin console → Admin API: requests
- Admin API → Admin use cases: invokes
- Message pipeline → Deduplication: checks idempotency
- Message pipeline → Template stage: renders content
- Message pipeline → Validation stage: validates
- Message pipeline → Routing stage: selects provider
- Message pipeline → Delivery filters: filters delivery
- Message pipeline → Quota checks: checks quotas
- Message pipeline → Message and config store: stores messages
- Deduplication → Dedup registry: claims keys
- Scheduled dispatch → Message and config store: loads queued messages
- Scheduled dispatch → Channel providers: sends messages
- Channel providers → Provider callbacks: reports outcomes
- Provider callbacks → Message and config store: updates delivery state
- Event publishing → Kafka broker: publishes status
- Admin use cases → Message and config store: manages configuration
- Message queries → Message and config store: reads messages
- Batch queries → Message and config store: reads batches
- Template preview → Message and config store: reads templates and tariffs
- Suppression checks → Message and config store: checks suppressions
- Audit queries → Message and config store: reads audit log
- DLQ queries → Message and config store: reads DLQ
