# bsejawal/crud architecture

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

- Interactive diagram: https://gitdiagram.com/bsejawal/crud
- Repository: https://github.com/bsejawal/crud

## Overview

This is a Spring Boot person-record CRUD API backed by an in-memory H2 database. A client sends HTTP requests to the person endpoints; the controller handles ordinary CRUD directly through the repository and delegates partial updates to the service, which maps the saved entity to a DTO. At startup, a loader reads bundled JSON and seeds the repository. The README documents H2 access; sampled code also shows timing advice for the annotated list endpoint. Unsampled configuration and logging behavior are not expanded beyond documented or indexed evidence.

Main entry points: [`src/main/java/com/sejawal/crud/controller/PersonController.java`](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/controller/PersonController.java) (Person Controller), [`src/main/java/com/sejawal/crud/repository/PersonRepository.java`](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/repository/PersonRepository.java) (Person Repository), [`src/main/java/com/sejawal/crud/utils/DataLoader.java`](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/utils/DataLoader.java) (Startup Data Loader), [`src/main/java/com/sejawal/crud/mapper/PersonMapper.java`](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/mapper/PersonMapper.java) (Person Mapper)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["HTTP API"]
  node_controller["Person Controller"]
  node_service["Person Service<br/>[PersonService.java]"]
end

subgraph group_domain["Person Domain"]
  node_dto["Person DTO<br/>[PersonDto.java]"]
  node_mapper["Person Mapper<br/>[PersonMapper.java]"]
  node_entity["Person Entity<br/>[Person.java]"]
end

subgraph group_storage["Persistence and Seed Data"]
  node_repository["Person Repository"]
  node_database[("H2 Database<br/>[application.yml]")]
  node_loader["Startup Data Loader<br/>[DataLoader.java]"]
  node_seedjson["Seed Person JSON<br/>[person.json]"]
  node_dto_list["Person DTO List<br/>[PersonDtoList.java]"]
end

subgraph group_crosscut["Cross-Cutting"]
  node_timing_annotation["Timing Annotation"]
  node_timing_advice["Execution Timing Advice"]
  node_app["Application Bootstrap"]
end

node_client(("API Client"))

node_client -->|"sends requests"| node_controller
node_controller -->|"handles CRUD"| node_repository
node_controller -->|"delegates patch"| node_service
node_service -->|"loads and saves"| node_repository
node_service -->|"maps result"| node_mapper
node_mapper -->|"maps fields"| node_entity
node_mapper -->|"maps fields"| node_dto
node_repository -->|"stores entity"| node_entity
node_repository -.->|"persists records"| node_database
node_loader -->|"reads"| node_seedjson
node_loader -->|"deserializes into"| node_dto_list
node_loader -->|"converts records"| node_mapper
node_loader -->|"saves seed data"| node_repository
node_controller -->|"marks endpoint"| node_timing_annotation
node_timing_advice -->|"intercepts methods"| node_timing_annotation
node_app -.->|"enables web app"| node_controller

click node_controller "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/controller/PersonController.java"
click node_service "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/service/PersonService.java"
click node_dto "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/dto/PersonDto.java"
click node_mapper "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/mapper/PersonMapper.java"
click node_entity "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/model/Person.java"
click node_repository "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/repository/PersonRepository.java"
click node_database "https://github.com/bsejawal/crud/blob/master/src/main/resources/application.yml"
click node_loader "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/utils/DataLoader.java"
click node_seedjson "https://github.com/bsejawal/crud/blob/master/src/main/resources/data/person.json"
click node_dto_list "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/vo/PersonDtoList.java"
click node_timing_annotation "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/annotation/TrackExecutionTime.java"
click node_timing_advice "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/advice/ExecutionTimeTrackerAdvice.java"
click node_app "https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/CrudApplication.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_controller,node_service,node_client toneBlue
class node_dto,node_mapper,node_entity toneAmber
class node_repository,node_database,node_loader,node_seedjson,node_dto_list toneMint
class node_timing_annotation,node_timing_advice,node_app toneRose
```

## Components

### HTTP API

- [Person Controller](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/controller/PersonController.java): `src/main/java/com/sejawal/crud/controller/PersonController.java`
- [Person Service](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/service/PersonService.java): `src/main/java/com/sejawal/crud/service/PersonService.java`

### Person Domain

- [Person DTO](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/dto/PersonDto.java): `src/main/java/com/sejawal/crud/dto/PersonDto.java`
- [Person Mapper](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/mapper/PersonMapper.java): `src/main/java/com/sejawal/crud/mapper/PersonMapper.java`
- [Person Entity](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/model/Person.java): `src/main/java/com/sejawal/crud/model/Person.java`

### Persistence and Seed Data

- [Person Repository](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/repository/PersonRepository.java): `src/main/java/com/sejawal/crud/repository/PersonRepository.java`
- [H2 Database](https://github.com/bsejawal/crud/blob/master/src/main/resources/application.yml): `src/main/resources/application.yml`
- [Startup Data Loader](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/utils/DataLoader.java): `src/main/java/com/sejawal/crud/utils/DataLoader.java`
- [Seed Person JSON](https://github.com/bsejawal/crud/blob/master/src/main/resources/data/person.json): `src/main/resources/data/person.json`
- [Person DTO List](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/vo/PersonDtoList.java): `src/main/java/com/sejawal/crud/vo/PersonDtoList.java`

### Cross-Cutting

- [Timing Annotation](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/annotation/TrackExecutionTime.java): `src/main/java/com/sejawal/crud/annotation/TrackExecutionTime.java`
- [Execution Timing Advice](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/advice/ExecutionTimeTrackerAdvice.java): `src/main/java/com/sejawal/crud/advice/ExecutionTimeTrackerAdvice.java`
- [Application Bootstrap](https://github.com/bsejawal/crud/blob/master/src/main/java/com/sejawal/crud/CrudApplication.java): `src/main/java/com/sejawal/crud/CrudApplication.java`

### Other components

- **API Client**

## Connections

- API Client → Person Controller: sends requests (evidence: `README.md`)
- Person Controller → Person Repository: handles CRUD (evidence: `src/main/java/com/sejawal/crud/controller/PersonController.java`)
- Person Controller → Person Service: delegates patch (evidence: `src/main/java/com/sejawal/crud/controller/PersonController.java`)
- Person Service → Person Repository: loads and saves (evidence: `src/main/java/com/sejawal/crud/service/PersonService.java`)
- Person Service → Person Mapper: maps result (evidence: `src/main/java/com/sejawal/crud/service/PersonService.java`)
- Person Mapper → Person Entity: maps fields (evidence: `src/main/java/com/sejawal/crud/mapper/PersonMapper.java`)
- Person Mapper → Person DTO: maps fields (evidence: `src/main/java/com/sejawal/crud/mapper/PersonMapper.java`)
- Person Repository → Person Entity: stores entity (evidence: `src/main/java/com/sejawal/crud/repository/PersonRepository.java`)
- Person Repository → H2 Database: persists records (evidence: `README.md`)
- Startup Data Loader → Seed Person JSON: reads (evidence: `src/main/java/com/sejawal/crud/utils/DataLoader.java`)
- Startup Data Loader → Person DTO List: deserializes into (evidence: `src/main/java/com/sejawal/crud/utils/DataLoader.java`)
- Startup Data Loader → Person Mapper: converts records (evidence: `src/main/java/com/sejawal/crud/utils/DataLoader.java`)
- Startup Data Loader → Person Repository: saves seed data (evidence: `src/main/java/com/sejawal/crud/utils/DataLoader.java`)
- Person Controller → Timing Annotation: marks endpoint (evidence: `src/main/java/com/sejawal/crud/controller/PersonController.java`)
- Execution Timing Advice → Timing Annotation: intercepts methods (evidence: `src/main/java/com/sejawal/crud/advice/ExecutionTimeTrackerAdvice.java`)
- Application Bootstrap → Person Controller: enables web app
