# letsafko/library-management architecture

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

- Interactive diagram: https://gitdiagram.com/letsafko/library-management
- Repository: https://github.com/letsafko/library-management

## Overview

Library Management is an HTTP library-loan system: clients manage books and members, borrow and return copies, and query penalties. The documented architecture routes API requests through application handlers, which apply domain rules and use repositories for persistence; validation and logging decorate handlers. The graph preserves the main documented use cases. Some endpoint-to-handler wiring and persistence details are inferred only from the documented layer boundaries, so uncertain internal calls are omitted.

Main entry points: [`src/Application/Features/Books/Returns/ReturnBookCommandHandler.cs`](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Returns/ReturnBookCommandHandler.cs) (Return Handler), [`src/Application/Features/Books/Borrow/BorrowBookCommandHandler.cs`](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Borrow/BorrowBookCommandHandler.cs) (Borrow Handler), [`src/Infrastructure/Persistence/BookRepository.cs`](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/BookRepository.cs) (Book Repository), [`src/Infrastructure/Persistence/MemberRepository.cs`](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/MemberRepository.cs) (Member Repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["HTTP API"]
  node_books_create_api["Create Book<br/>[Endpoint.cs]"]
  node_copy_add_api["Add Copy<br/>[Endpoint.cs]"]
  node_borrow_api["Borrow Copy<br/>[Endpoint.cs]"]
  node_return_api["Return Copy<br/>[Endpoint.cs]"]
  node_member_create_api["Create Member<br/>[Endpoint.cs]"]
  node_penalties_api["Get Penalties<br/>[Endpoint.cs]"]
end

subgraph group_application["Use Cases"]
  node_create_book["Create Book Handler"]
  node_add_copy["Add Copy Handler"]
  node_borrow_book["Borrow Handler"]
  node_return_book["Return Handler"]
  node_create_member["Create Member Handler"]
  node_get_penalties["Penalty Query Handler"]
  node_validation["Validation Decorator"]
  node_logging["Logging Decorator"]
end

subgraph group_domain["Library Domain"]
  node_book_domain["Books<br/>[Book.cs]"]
  node_member_domain["Members<br/>[Member.cs]"]
  node_loan_domain["Loans<br/>[Loan.cs]"]
end

subgraph group_infrastructure["Persistence"]
  node_book_repo["Book Repository<br/>[BookRepository.cs]"]
  node_member_repo["Member Repository"]
  node_db_context["EF Core Context"]
end

node_client(("API Client"))
node_postgres[("PostgreSQL")]
node_clock["Date-Time Provider"]

node_client -->|"sends request"| node_books_create_api
node_client -->|"sends request"| node_copy_add_api
node_client -->|"sends request"| node_borrow_api
node_client -->|"sends request"| node_return_api
node_client -->|"sends request"| node_member_create_api
node_client -->|"sends request"| node_penalties_api
node_books_create_api -->|"dispatches command"| node_create_book
node_copy_add_api -->|"dispatches command"| node_add_copy
node_borrow_api -->|"dispatches command"| node_borrow_book
node_return_api -->|"dispatches command"| node_return_book
node_member_create_api -->|"dispatches command"| node_create_member
node_penalties_api -->|"dispatches query"| node_get_penalties
node_create_book -->|"creates book"| node_book_domain
node_create_book -->|"adds book"| node_book_repo
node_add_copy -->|"loads and updates"| node_book_repo
node_add_copy -->|"adds copy"| node_book_domain
node_borrow_book -->|"loads and updates"| node_member_repo
node_borrow_book -->|"loads copy"| node_book_repo
node_borrow_book -->|"borrows copy"| node_member_domain
node_borrow_book -->|"reads time"| node_clock
node_return_book -->|"loads and updates"| node_member_repo
node_return_book -->|"loads and updates"| node_book_repo
node_return_book -->|"returns loan"| node_member_domain
node_return_book -->|"marks returned"| node_book_domain
node_return_book -->|"reads time"| node_clock
node_create_member -->|"creates member"| node_member_domain
node_create_member -->|"adds member"| node_member_repo
node_create_member -->|"reads time"| node_clock
node_get_penalties -->|"loads member"| node_member_repo
node_get_penalties -->|"calculates penalties"| node_member_domain
node_get_penalties -->|"reads time"| node_clock
node_book_repo -->|"queries and saves"| node_db_context
node_member_repo -->|"queries and saves"| node_db_context
node_db_context -->|"persists data"| node_postgres
node_validation -->|"wraps handler"| node_logging

click node_books_create_api "https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/Create/Endpoint.cs"
click node_copy_add_api "https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/AddCopy/Endpoint.cs"
click node_borrow_api "https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/Borrow/Endpoint.cs"
click node_return_api "https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/Returns/Endpoint.cs"
click node_member_create_api "https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Members/Create/Endpoint.cs"
click node_penalties_api "https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Members/GetPenalties/Endpoint.cs"
click node_create_book "https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Create/CreateBookCommandHandler.cs"
click node_add_copy "https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/AddCopy/AddBookCopyCommandHandler.cs"
click node_borrow_book "https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Borrow/BorrowBookCommandHandler.cs"
click node_return_book "https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Returns/ReturnBookCommandHandler.cs"
click node_create_member "https://github.com/letsafko/library-management/blob/main/src/Application/Features/Members/Create/CreateMemberCommandHandler.cs"
click node_get_penalties "https://github.com/letsafko/library-management/blob/main/src/Application/Features/Members/GetPenalties/GetMemberPenaltiesQueryHandler.cs"
click node_validation "https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Behaviors/ValidationDecorator.cs"
click node_logging "https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Behaviors/LoggingDecorator.cs"
click node_book_domain "https://github.com/letsafko/library-management/blob/main/src/Domain/Books/Book.cs"
click node_member_domain "https://github.com/letsafko/library-management/blob/main/src/Domain/Members/Member.cs"
click node_loan_domain "https://github.com/letsafko/library-management/blob/main/src/Domain/Loans/Loan.cs"
click node_book_repo "https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/BookRepository.cs"
click node_member_repo "https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/MemberRepository.cs"
click node_db_context "https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/ApplicationDbContext.cs"
click node_clock "https://github.com/letsafko/library-management/blob/main/src/SharedKernel/Primitives/IDateTimeProvider.cs"

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_books_create_api,node_copy_add_api,node_borrow_api,node_return_api,node_member_create_api,node_penalties_api,node_client toneBlue
class node_create_book,node_add_copy,node_borrow_book,node_return_book,node_create_member,node_get_penalties,node_validation,node_logging,node_postgres toneAmber
class node_book_domain,node_member_domain,node_loan_domain toneMint
class node_book_repo,node_member_repo,node_db_context toneRose
class node_clock toneIndigo
```

## Components

### HTTP API

- [Create Book](https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/Create/Endpoint.cs): `src/Api/Endpoints/Books/Create/Endpoint.cs`
- [Add Copy](https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/AddCopy/Endpoint.cs): `src/Api/Endpoints/Books/AddCopy/Endpoint.cs`
- [Borrow Copy](https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/Borrow/Endpoint.cs): `src/Api/Endpoints/Books/Borrow/Endpoint.cs`
- [Return Copy](https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Books/Returns/Endpoint.cs): `src/Api/Endpoints/Books/Returns/Endpoint.cs`
- [Create Member](https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Members/Create/Endpoint.cs): `src/Api/Endpoints/Members/Create/Endpoint.cs`
- [Get Penalties](https://github.com/letsafko/library-management/blob/main/src/Api/Endpoints/Members/GetPenalties/Endpoint.cs): `src/Api/Endpoints/Members/GetPenalties/Endpoint.cs`

### Use Cases

- [Create Book Handler](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Create/CreateBookCommandHandler.cs): `src/Application/Features/Books/Create/CreateBookCommandHandler.cs`
- [Add Copy Handler](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/AddCopy/AddBookCopyCommandHandler.cs): `src/Application/Features/Books/AddCopy/AddBookCopyCommandHandler.cs`
- [Borrow Handler](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Borrow/BorrowBookCommandHandler.cs): `src/Application/Features/Books/Borrow/BorrowBookCommandHandler.cs`
- [Return Handler](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Books/Returns/ReturnBookCommandHandler.cs): `src/Application/Features/Books/Returns/ReturnBookCommandHandler.cs`
- [Create Member Handler](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Members/Create/CreateMemberCommandHandler.cs): `src/Application/Features/Members/Create/CreateMemberCommandHandler.cs`
- [Penalty Query Handler](https://github.com/letsafko/library-management/blob/main/src/Application/Features/Members/GetPenalties/GetMemberPenaltiesQueryHandler.cs): `src/Application/Features/Members/GetPenalties/GetMemberPenaltiesQueryHandler.cs`
- [Validation Decorator](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Behaviors/ValidationDecorator.cs): `src/Infrastructure/Behaviors/ValidationDecorator.cs`
- [Logging Decorator](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Behaviors/LoggingDecorator.cs): `src/Infrastructure/Behaviors/LoggingDecorator.cs`

### Library Domain

- [Books](https://github.com/letsafko/library-management/blob/main/src/Domain/Books/Book.cs): `src/Domain/Books/Book.cs`
- [Members](https://github.com/letsafko/library-management/blob/main/src/Domain/Members/Member.cs): `src/Domain/Members/Member.cs`
- [Loans](https://github.com/letsafko/library-management/blob/main/src/Domain/Loans/Loan.cs): `src/Domain/Loans/Loan.cs`

### Persistence

- [Book Repository](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/BookRepository.cs): `src/Infrastructure/Persistence/BookRepository.cs`
- [Member Repository](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/MemberRepository.cs): `src/Infrastructure/Persistence/MemberRepository.cs`
- [EF Core Context](https://github.com/letsafko/library-management/blob/main/src/Infrastructure/Persistence/ApplicationDbContext.cs): `src/Infrastructure/Persistence/ApplicationDbContext.cs`

### Other components

- **API Client**
- **PostgreSQL**
- [Date-Time Provider](https://github.com/letsafko/library-management/blob/main/src/SharedKernel/Primitives/IDateTimeProvider.cs): `src/SharedKernel/Primitives/IDateTimeProvider.cs`

## Connections

- API Client → Create Book: sends request
- API Client → Add Copy: sends request
- API Client → Borrow Copy: sends request
- API Client → Return Copy: sends request
- API Client → Create Member: sends request
- API Client → Get Penalties: sends request
- Create Book → Create Book Handler: dispatches command
- Add Copy → Add Copy Handler: dispatches command
- Borrow Copy → Borrow Handler: dispatches command
- Return Copy → Return Handler: dispatches command
- Create Member → Create Member Handler: dispatches command
- Get Penalties → Penalty Query Handler: dispatches query
- Create Book Handler → Books: creates book
- Create Book Handler → Book Repository: adds book
- Add Copy Handler → Book Repository: loads and updates
- Add Copy Handler → Books: adds copy
- Borrow Handler → Member Repository: loads and updates
- Borrow Handler → Book Repository: loads copy
- Borrow Handler → Members: borrows copy
- Borrow Handler → Date-Time Provider: reads time
- Return Handler → Member Repository: loads and updates
- Return Handler → Book Repository: loads and updates
- Return Handler → Members: returns loan
- Return Handler → Books: marks returned
- Return Handler → Date-Time Provider: reads time
- Create Member Handler → Members: creates member
- Create Member Handler → Member Repository: adds member
- Create Member Handler → Date-Time Provider: reads time
- Penalty Query Handler → Member Repository: loads member
- Penalty Query Handler → Members: calculates penalties
- Penalty Query Handler → Date-Time Provider: reads time
- Book Repository → EF Core Context: queries and saves
- Member Repository → EF Core Context: queries and saves
- EF Core Context → PostgreSQL: persists data
- Validation Decorator → Logging Decorator: wraps handler
