# johnphs-9/module4-deploy-simple-crm architecture

> Architecture diagram of the GitHub repository johnphs-9/module4-deploy-simple-crm, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/johnphs-9/module4-deploy-simple-crm
- Repository: https://github.com/johnphs-9/module4-deploy-simple-crm

## Overview

Simple CRM API is a Spring Boot customer-management backend. Clients authenticate with HTTP Basic for customer and health routes, or POST credentials to /auth/login for a JWT used on /api/**; authorized requests then use customer CRUD, search, and interaction endpoints. Customer operations pass through a service to JPA repositories and PostgreSQL. The README documents role-based access and PostgreSQL deployment; sampled sources show the customer and JWT call paths, while some endpoint/security wiring is documented rather than shown in excerpts.

Main entry points: [`simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java) (Customer Service), [`simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/CustomerRepository.java`](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/CustomerRepository.java) (Customer Repository), [`simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java`](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java) (Customer API), [`simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/InteractionRepository.java`](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/InteractionRepository.java) (Interaction Repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API Endpoints"]
  node_customer_api["Customer API"]
  node_health_api["Health Endpoint"]
  node_hello_api["Hello Endpoint"]
end

subgraph group_security["Authentication"]
  node_auth_api["Login Endpoint"]
  node_jwt_service["JWT Service<br/>[JwtService.java]"]
  node_jwt_filter["JWT Filter<br/>[JwtAuthFilter.java]"]
  node_security_config["Security Config"]
end

subgraph group_customers["Customer Domain"]
  node_customer_service["Customer Service"]
  node_service_contract["Service Contract"]
  node_customer_repo["Customer Repository"]
  node_interaction_repo["Interaction Repository"]
  node_customer_model["Customer Model<br/>[Customer.java]"]
  node_interaction_model["Interaction Model<br/>[Interaction.java]"]
  node_postgres[("PostgreSQL")]
end

subgraph group_runtime["Runtime Support"]
  node_exception_handler["Error Handler"]
  node_not_found["Missing Customer"]
  node_error_response["Error Response<br/>[ErrorResponse.java]"]
  node_data_loader["Data Loader<br/>[DataLoader.java]"]
  node_demo_service["Demo Service<br/>[DemoService.java]"]
end

node_client(("API Client"))

node_client -->|"calls customer routes"| node_customer_api
node_client -->|"checks health"| node_health_api
node_client -->|"submits credentials"| node_auth_api
node_client -.->|"calls hello route"| node_hello_api
node_customer_api -->|"delegates operations"| node_customer_service
node_customer_api -->|"uses contract"| node_service_contract
node_customer_service -->|"reads and writes"| node_customer_repo
node_customer_service -->|"saves interactions"| node_interaction_repo
node_customer_repo -->|"persists entity"| node_customer_model
node_interaction_repo -->|"persists entity"| node_interaction_model
node_customer_service -->|"operates on"| node_customer_model
node_customer_service -->|"links interaction"| node_interaction_model
node_customer_repo -.->|"stores entities"| node_postgres
node_interaction_repo -.->|"stores entities"| node_postgres
node_customer_service -->|"throws when absent"| node_not_found
node_exception_handler -->|"handles exception"| node_not_found
node_exception_handler -->|"returns error body"| node_error_response
node_auth_api -->|"issues token"| node_jwt_service
node_security_config -->|"registers filter"| node_jwt_filter
node_jwt_filter -->|"validates token"| node_jwt_service
node_security_config -.->|"protects routes"| node_client
node_data_loader -->|"loads customers"| node_customer_repo

click node_customer_api "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java"
click node_health_api "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/HealthController.java"
click node_hello_api "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/HelloController.java"
click node_auth_api "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/auth/AuthController.java"
click node_jwt_service "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtService.java"
click node_jwt_filter "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtAuthFilter.java"
click node_security_config "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/config/SecurityConfig.java"
click node_customer_service "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java"
click node_service_contract "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerService.java"
click node_customer_repo "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/CustomerRepository.java"
click node_interaction_repo "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/InteractionRepository.java"
click node_customer_model "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/model/Customer.java"
click node_interaction_model "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/model/Interaction.java"
click node_exception_handler "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/GlobalExceptionHandler.java"
click node_not_found "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/CustomerNotFoundException.java"
click node_error_response "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/ErrorResponse.java"
click node_data_loader "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DataLoader.java"
click node_demo_service "https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DemoService.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_customer_api,node_health_api,node_hello_api,node_client toneBlue
class node_auth_api,node_jwt_service,node_jwt_filter,node_security_config toneAmber
class node_customer_service,node_service_contract,node_customer_repo,node_interaction_repo,node_customer_model,node_interaction_model,node_postgres toneMint
class node_exception_handler,node_not_found,node_error_response,node_data_loader,node_demo_service toneRose
```

## Components

### API Endpoints

- [Customer API](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java`
- [Health Endpoint](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/HealthController.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/HealthController.java`
- [Hello Endpoint](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/HelloController.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/HelloController.java`

### Authentication

- [Login Endpoint](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/auth/AuthController.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/auth/AuthController.java`
- [JWT Service](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtService.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtService.java`
- [JWT Filter](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtAuthFilter.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtAuthFilter.java`
- [Security Config](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/config/SecurityConfig.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/config/SecurityConfig.java`

### Customer Domain

- [Customer Service](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`
- [Service Contract](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerService.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerService.java`
- [Customer Repository](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/CustomerRepository.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/CustomerRepository.java`
- [Interaction Repository](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/InteractionRepository.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/InteractionRepository.java`
- [Customer Model](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/model/Customer.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/model/Customer.java`
- [Interaction Model](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/model/Interaction.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/model/Interaction.java`
- **PostgreSQL**

### Runtime Support

- [Error Handler](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/GlobalExceptionHandler.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/GlobalExceptionHandler.java`
- [Missing Customer](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/CustomerNotFoundException.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/CustomerNotFoundException.java`
- [Error Response](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/ErrorResponse.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/ErrorResponse.java`
- [Data Loader](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DataLoader.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DataLoader.java`
- [Demo Service](https://github.com/johnphs-9/module4-deploy-simple-crm/blob/main/simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DemoService.java): `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DemoService.java`

### Other components

- **API Client**

## Connections

- API Client → Customer API: calls customer routes (evidence: `README.md`)
- API Client → Health Endpoint: checks health (evidence: `README.md`)
- API Client → Login Endpoint: submits credentials (evidence: `README.md`)
- API Client → Hello Endpoint: calls hello route
- Customer API → Customer Service: delegates operations (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java`)
- Customer API → Service Contract: uses contract (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/controller/CustomerController.java`)
- Customer Service → Customer Repository: reads and writes (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`)
- Customer Service → Interaction Repository: saves interactions (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`)
- Customer Repository → Customer Model: persists entity (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/CustomerRepository.java`)
- Interaction Repository → Interaction Model: persists entity (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/repository/InteractionRepository.java`)
- Customer Service → Customer Model: operates on (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`)
- Customer Service → Interaction Model: links interaction (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`)
- Customer Repository → PostgreSQL: stores entities
- Interaction Repository → PostgreSQL: stores entities
- Customer Service → Missing Customer: throws when absent (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/CustomerServiceImpl.java`)
- Error Handler → Missing Customer: handles exception (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/GlobalExceptionHandler.java`)
- Error Handler → Error Response: returns error body (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/exceptions/GlobalExceptionHandler.java`)
- Login Endpoint → JWT Service: issues token (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/auth/AuthController.java`)
- Security Config → JWT Filter: registers filter (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/config/SecurityConfig.java`)
- JWT Filter → JWT Service: validates token (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/security/JwtAuthFilter.java`)
- Security Config → API Client: protects routes (evidence: `README.md`)
- Data Loader → Customer Repository: loads customers (evidence: `simple-crm-api/src/main/java/sg/edu/ntu/simple_crm_api/service/DataLoader.java`)
