# tmzfranck/books-api-golang architecture

> Architecture diagram of the GitHub repository tmzfranck/books-api-golang, 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/tmzfranck/books-api-golang
- Repository: https://github.com/tmzfranck/books-api-golang

## Overview

This repository is a Go HTTP API for managing books, tags, reviews, and user accounts. Clients reach resource controllers through the HTTP router; controllers validate requests and delegate domain operations to use cases, which access persistent data through repositories. User capabilities include registration, login, token refresh and revocation, email verification, and password reset. The tree also shows an in-process worker pool for background email jobs and Redis-backed authentication support. Source excerpts confirm review flows and dependency wiring; other subsystem links reflect the visible layer structure, not inspected implementations.

Main entry points: [`internal/delivery/http/route/route.go`](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/route/route.go) (HTTP routes), [`internal/config/app.go`](https://github.com/tmzfranck/books-api-golang/blob/main/internal/config/app.go) (Dependency wiring), [`internal/usecase/user_usecase.go`](https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/user_usecase.go) (User use case), [`internal/jobs/worker.go`](https://github.com/tmzfranck/books-api-golang/blob/main/internal/jobs/worker.go) (Job worker pool)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_delivery["HTTP delivery"]
  node_router["HTTP routes<br/>[route.go]"]
  node_authmw["Auth middleware<br/>[auth_middleware.go]"]
  node_userctl["User controller<br/>[user_controller.go]"]
  node_bookctl["Book controller<br/>[book_controller.go]"]
  node_tagctl["Tag controller<br/>[tag_controller.go]"]
  node_reviewctl["Review controller"]
end

subgraph group_domain["Domain operations"]
  node_useruc["User use case<br/>[user_usecase.go]"]
  node_bookuc["Book use case<br/>[book_usecase.go]"]
  node_taguc["Tag use case<br/>[tag_usecase.go]"]
  node_reviewuc["Review use case<br/>[review_usecase.go]"]
  node_models["API models"]
  node_converters["Response converters"]
end

subgraph group_data["Persistence"]
  node_userrepo["User repository<br/>[user_repository.go]"]
  node_bookrepo["Book repository<br/>[book_repository.go]"]
  node_tagrepo["Tag repository<br/>[tag_repository.go]"]
  node_reviewrepo["Review repository"]
  node_entities["Domain entities"]
end

subgraph group_infra["Runtime services"]
  node_database[("SQL database")]
  node_redis[("Redis")]
  node_workers["Job worker pool<br/>[worker.go]"]
  node_email["Email sender<br/>[email.go]"]
  node_bootstrap["Dependency wiring<br/>[app.go]"]
  node_entry["Web entry point<br/>[main.go]"]
end

node_client(("API client"))

node_client -->|"sends requests"| node_router
node_router -->|"dispatches"| node_userctl
node_router -->|"dispatches"| node_bookctl
node_router -->|"dispatches"| node_tagctl
node_router -->|"dispatches"| node_reviewctl
node_authmw -->|"checks tokens"| node_redis
node_userctl -->|"invokes"| node_useruc
node_bookctl -->|"invokes"| node_bookuc
node_tagctl -->|"invokes"| node_taguc
node_reviewctl -->|"invokes"| node_reviewuc
node_useruc -->|"uses"| node_userrepo
node_bookuc -->|"uses"| node_bookrepo
node_taguc -->|"uses"| node_tagrepo
node_reviewuc -->|"queries and writes"| node_reviewrepo
node_reviewuc -->|"converts results"| node_converters
node_reviewrepo -->|"reads and writes"| node_database
node_reviewrepo -->|"maps records"| node_entities
node_entry -->|"configures"| node_bootstrap
node_bootstrap -->|"registers routes"| node_router
node_bootstrap -->|"injects worker pool"| node_workers
node_entry -->|"starts and stops"| node_workers
node_workers -->|"executes jobs"| node_email
node_useruc -.->|"submits mail jobs"| node_workers
node_useruc -.->|"uses"| node_redis
node_bootstrap -->|"provides connection"| node_database
node_bootstrap -->|"provides client"| node_redis

click node_router "https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/route/route.go"
click node_authmw "https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/middleware/auth_middleware.go"
click node_userctl "https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/user_controller.go"
click node_bookctl "https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/book_controller.go"
click node_tagctl "https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/tag_controller.go"
click node_reviewctl "https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/review_controller.go"
click node_useruc "https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/user_usecase.go"
click node_bookuc "https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/book_usecase.go"
click node_taguc "https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/tag_usecase.go"
click node_reviewuc "https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/review_usecase.go"
click node_models "https://github.com/tmzfranck/books-api-golang/tree/main/internal/model"
click node_converters "https://github.com/tmzfranck/books-api-golang/tree/main/internal/model/converter"
click node_userrepo "https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/user_repository.go"
click node_bookrepo "https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/book_repository.go"
click node_tagrepo "https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/tag_repository.go"
click node_reviewrepo "https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/review_repository.go"
click node_entities "https://github.com/tmzfranck/books-api-golang/tree/main/internal/entity"
click node_workers "https://github.com/tmzfranck/books-api-golang/blob/main/internal/jobs/worker.go"
click node_email "https://github.com/tmzfranck/books-api-golang/blob/main/internal/utils/email.go"
click node_bootstrap "https://github.com/tmzfranck/books-api-golang/blob/main/internal/config/app.go"
click node_entry "https://github.com/tmzfranck/books-api-golang/blob/main/cmd/web/main.go"

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_router,node_authmw,node_userctl,node_bookctl,node_tagctl,node_reviewctl,node_client toneBlue
class node_useruc,node_bookuc,node_taguc,node_reviewuc,node_models,node_converters toneAmber
class node_userrepo,node_bookrepo,node_tagrepo,node_reviewrepo,node_entities toneMint
class node_database,node_redis,node_workers,node_email,node_bootstrap,node_entry toneRose
```

## Components

### HTTP delivery

- [HTTP routes](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/route/route.go): `internal/delivery/http/route/route.go`
- [Auth middleware](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/middleware/auth_middleware.go): `internal/delivery/http/middleware/auth_middleware.go`
- [User controller](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/user_controller.go): `internal/delivery/http/user_controller.go`
- [Book controller](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/book_controller.go): `internal/delivery/http/book_controller.go`
- [Tag controller](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/tag_controller.go): `internal/delivery/http/tag_controller.go`
- [Review controller](https://github.com/tmzfranck/books-api-golang/blob/main/internal/delivery/http/review_controller.go): `internal/delivery/http/review_controller.go`

### Domain operations

- [User use case](https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/user_usecase.go): `internal/usecase/user_usecase.go`
- [Book use case](https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/book_usecase.go): `internal/usecase/book_usecase.go`
- [Tag use case](https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/tag_usecase.go): `internal/usecase/tag_usecase.go`
- [Review use case](https://github.com/tmzfranck/books-api-golang/blob/main/internal/usecase/review_usecase.go): `internal/usecase/review_usecase.go`
- [API models](https://github.com/tmzfranck/books-api-golang/tree/main/internal/model): `internal/model`
- [Response converters](https://github.com/tmzfranck/books-api-golang/tree/main/internal/model/converter): `internal/model/converter`

### Persistence

- [User repository](https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/user_repository.go): `internal/repository/user_repository.go`
- [Book repository](https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/book_repository.go): `internal/repository/book_repository.go`
- [Tag repository](https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/tag_repository.go): `internal/repository/tag_repository.go`
- [Review repository](https://github.com/tmzfranck/books-api-golang/blob/main/internal/repository/review_repository.go): `internal/repository/review_repository.go`
- [Domain entities](https://github.com/tmzfranck/books-api-golang/tree/main/internal/entity): `internal/entity`

### Runtime services

- **SQL database**
- **Redis**
- [Job worker pool](https://github.com/tmzfranck/books-api-golang/blob/main/internal/jobs/worker.go): `internal/jobs/worker.go`
- [Email sender](https://github.com/tmzfranck/books-api-golang/blob/main/internal/utils/email.go): `internal/utils/email.go`
- [Dependency wiring](https://github.com/tmzfranck/books-api-golang/blob/main/internal/config/app.go): `internal/config/app.go`
- [Web entry point](https://github.com/tmzfranck/books-api-golang/blob/main/cmd/web/main.go): `cmd/web/main.go`

### Other components

- **API client**

## Connections

- API client → HTTP routes: sends requests
- HTTP routes → User controller: dispatches
- HTTP routes → Book controller: dispatches
- HTTP routes → Tag controller: dispatches
- HTTP routes → Review controller: dispatches
- Auth middleware → Redis: checks tokens
- User controller → User use case: invokes
- Book controller → Book use case: invokes
- Tag controller → Tag use case: invokes
- Review controller → Review use case: invokes
- User use case → User repository: uses
- Book use case → Book repository: uses
- Tag use case → Tag repository: uses
- Review use case → Review repository: queries and writes
- Review use case → Response converters: converts results
- Review repository → SQL database: reads and writes
- Review repository → Domain entities: maps records
- Web entry point → Dependency wiring: configures
- Dependency wiring → HTTP routes: registers routes
- Dependency wiring → Job worker pool: injects worker pool
- Web entry point → Job worker pool: starts and stops
- Job worker pool → Email sender: executes jobs
- User use case → Job worker pool: submits mail jobs
- User use case → Redis: uses
- Dependency wiring → SQL database: provides connection
- Dependency wiring → Redis: provides client
