# eddymandran/bm-horizon-backend architecture

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

- Interactive diagram: https://gitdiagram.com/eddymandran/bm-horizon-backend
- Repository: https://github.com/eddymandran/bm-horizon-backend

## Overview

BmHorizon Backend is a Spring application for managing a portfolio of completed projects and categories, accepting public quote requests with photos, and providing authenticated administration. The main flows are public quote submission (validate and process photos, store files and the request, then publish an event) and admin portfolio/category management with public photo retrieval. The graph also shows authentication and shared file/photo processing. The README is empty; some controller, security, notification, and storage wiring is unsampled, so uncertain links are omitted or dashed.

Main entry points: [`src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java`](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java) (Portfolio photo service), [`src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java`](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java) (Quote submission), [`src/main/java/com/bmhorizon/securite/controller/AuthController.java`](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/controller/AuthController.java) (Authentication API), [`src/main/java/com/bmhorizon/storage/StockageFichiers.java`](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/storage/StockageFichiers.java) (File storage)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_portfolio["Portfolio management"]
  node_category_api["Category API"]
  node_category_service["Category management"]
  node_category_store[("Category repository")]
  node_realisation_public["Public portfolio API"]
  node_realisation_admin["Portfolio admin API"]
  node_realisation_service["Portfolio lifecycle"]
  node_realisation_store[("Portfolio repository")]
  node_photo_admin_api["Portfolio photo admin"]
  node_photo_public_api["Public photo API"]
end

subgraph group_quotes["Quote requests"]
  node_quote_api["Public quote API"]
  node_quote_service["Quote submission"]
  node_quote_store[("Quote repository")]
  node_notification["Quote notifications"]
end

subgraph group_media["Media processing"]
  node_photo_service["Portfolio photo service"]
  node_photo_processing["Image processing"]
  node_photo_store[("Portfolio photo records")]
end

subgraph group_identity["Identity and access"]
  node_auth_api["Authentication API"]
  node_auth_service["Credential authentication"]
  node_jwt["JWT services<br/>[JwtService.java]"]
  node_user_store[("User repository")]
end

subgraph group_platform["Shared platform"]
  node_file_storage["File storage"]
  node_s3_storage["S3 storage adapter<br/>[StockageS3.java]"]
  node_exception_handler["API error mapping"]
end

node_visitor(("Public visitor"))
node_admin(("Administrator"))

node_admin -.->|"manages categories"| node_category_api
node_category_api -->|"delegates to"| node_category_service
node_category_service -->|"reads and writes"| node_category_store
node_visitor -.->|"browses portfolio"| node_realisation_public
node_admin -.->|"manages projects"| node_realisation_admin
node_realisation_admin -->|"delegates to"| node_realisation_service
node_realisation_service -->|"reads and writes"| node_realisation_store
node_admin -->|"manages photos"| node_photo_admin_api
node_photo_admin_api -->|"delegates to"| node_photo_service
node_visitor -->|"requests photos"| node_photo_public_api
node_photo_public_api -->|"delegates to"| node_photo_service
node_photo_service -->|"processes images"| node_photo_processing
node_photo_service -->|"reads and writes"| node_photo_store
node_photo_service -->|"loads projects"| node_realisation_store
node_photo_service -->|"stores and opens files"| node_file_storage
node_visitor -->|"submits request"| node_quote_api
node_quote_api -->|"delegates to"| node_quote_service
node_quote_service -->|"processes images"| node_photo_processing
node_quote_service -->|"stores files"| node_file_storage
node_quote_service -->|"saves request"| node_quote_store
node_quote_service -->|"publishes event"| node_notification
node_admin -->|"authenticates"| node_auth_api
node_auth_api -->|"delegates to"| node_auth_service
node_auth_api -->|"issues JWT"| node_jwt
node_auth_service -.->|"looks up users"| node_user_store
node_file_storage -.->|"uses adapter"| node_s3_storage

click node_category_api "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/categorie/controller/CategorieController.java"
click node_category_service "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/categorie/service/CategorieService.java"
click node_category_store "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/categorie/repository/CategorieRepository.java"
click node_realisation_public "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/RealisationPublicController.java"
click node_realisation_admin "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/RealisationAdminController.java"
click node_realisation_service "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/service/RealisationService.java"
click node_realisation_store "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/repository/RealisationRepository.java"
click node_photo_admin_api "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/PhotoRealisationAdminController.java"
click node_photo_public_api "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/PhotoPublicController.java"
click node_photo_service "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java"
click node_photo_processing "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/photo/service/TraitementPhoto.java"
click node_photo_store "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/repository/RealisationPhotoRepository.java"
click node_quote_api "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/controller/DemandeDevisPublicController.java"
click node_quote_service "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java"
click node_quote_store "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/repository/DemandeDevisRepository.java"
click node_notification "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/notification/NotificationNouvelleDemandeListener.java"
click node_auth_api "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/controller/AuthController.java"
click node_auth_service "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/service/AuthentificationService.java"
click node_jwt "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/service/JwtService.java"
click node_user_store "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/repository/UtilisateurRepository.java"
click node_file_storage "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/storage/StockageFichiers.java"
click node_s3_storage "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/storage/StockageS3.java"
click node_exception_handler "https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/config/GlobalExceptionHandler.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_category_api,node_category_service,node_category_store,node_realisation_public,node_realisation_admin,node_realisation_service,node_realisation_store,node_photo_admin_api,node_photo_public_api toneBlue
class node_quote_api,node_quote_service,node_quote_store,node_notification toneAmber
class node_photo_service,node_photo_processing,node_photo_store toneMint
class node_auth_api,node_auth_service,node_jwt,node_user_store toneRose
class node_file_storage,node_s3_storage,node_exception_handler,node_visitor,node_admin toneIndigo
```

## Components

### Portfolio management

- [Category API](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/categorie/controller/CategorieController.java): `src/main/java/com/bmhorizon/categorie/controller/CategorieController.java`
- [Category management](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/categorie/service/CategorieService.java): `src/main/java/com/bmhorizon/categorie/service/CategorieService.java`
- [Category repository](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/categorie/repository/CategorieRepository.java): `src/main/java/com/bmhorizon/categorie/repository/CategorieRepository.java`
- [Public portfolio API](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/RealisationPublicController.java): `src/main/java/com/bmhorizon/realisation/controller/RealisationPublicController.java`
- [Portfolio admin API](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/RealisationAdminController.java): `src/main/java/com/bmhorizon/realisation/controller/RealisationAdminController.java`
- [Portfolio lifecycle](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/service/RealisationService.java): `src/main/java/com/bmhorizon/realisation/service/RealisationService.java`
- [Portfolio repository](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/repository/RealisationRepository.java): `src/main/java/com/bmhorizon/realisation/repository/RealisationRepository.java`
- [Portfolio photo admin](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/PhotoRealisationAdminController.java): `src/main/java/com/bmhorizon/realisation/controller/PhotoRealisationAdminController.java`
- [Public photo API](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/controller/PhotoPublicController.java): `src/main/java/com/bmhorizon/realisation/controller/PhotoPublicController.java`

### Quote requests

- [Public quote API](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/controller/DemandeDevisPublicController.java): `src/main/java/com/bmhorizon/demandedevis/controller/DemandeDevisPublicController.java`
- [Quote submission](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java): `src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java`
- [Quote repository](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/demandedevis/repository/DemandeDevisRepository.java): `src/main/java/com/bmhorizon/demandedevis/repository/DemandeDevisRepository.java`
- [Quote notifications](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/notification/NotificationNouvelleDemandeListener.java): `src/main/java/com/bmhorizon/notification/NotificationNouvelleDemandeListener.java`

### Media processing

- [Portfolio photo service](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java): `src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java`
- [Image processing](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/photo/service/TraitementPhoto.java): `src/main/java/com/bmhorizon/photo/service/TraitementPhoto.java`
- [Portfolio photo records](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/realisation/repository/RealisationPhotoRepository.java): `src/main/java/com/bmhorizon/realisation/repository/RealisationPhotoRepository.java`

### Identity and access

- [Authentication API](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/controller/AuthController.java): `src/main/java/com/bmhorizon/securite/controller/AuthController.java`
- [Credential authentication](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/service/AuthentificationService.java): `src/main/java/com/bmhorizon/securite/service/AuthentificationService.java`
- [JWT services](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/service/JwtService.java): `src/main/java/com/bmhorizon/securite/service/JwtService.java`
- [User repository](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/securite/repository/UtilisateurRepository.java): `src/main/java/com/bmhorizon/securite/repository/UtilisateurRepository.java`

### Shared platform

- [File storage](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/storage/StockageFichiers.java): `src/main/java/com/bmhorizon/storage/StockageFichiers.java`
- [S3 storage adapter](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/storage/StockageS3.java): `src/main/java/com/bmhorizon/storage/StockageS3.java`
- [API error mapping](https://github.com/eddymandran/bm-horizon-backend/blob/master/src/main/java/com/bmhorizon/config/GlobalExceptionHandler.java): `src/main/java/com/bmhorizon/config/GlobalExceptionHandler.java`

### Other components

- **Public visitor**
- **Administrator**

## Connections

- Administrator → Category API: manages categories
- Category API → Category management: delegates to (evidence: `src/main/java/com/bmhorizon/categorie/controller/CategorieController.java`)
- Category management → Category repository: reads and writes (evidence: `src/main/java/com/bmhorizon/categorie/service/CategorieService.java`)
- Public visitor → Public portfolio API: browses portfolio
- Administrator → Portfolio admin API: manages projects
- Portfolio admin API → Portfolio lifecycle: delegates to (evidence: `src/main/java/com/bmhorizon/realisation/controller/RealisationAdminController.java`)
- Portfolio lifecycle → Portfolio repository: reads and writes (evidence: `src/main/java/com/bmhorizon/realisation/service/RealisationService.java`)
- Administrator → Portfolio photo admin: manages photos (evidence: `src/main/java/com/bmhorizon/realisation/controller/PhotoRealisationAdminController.java`)
- Portfolio photo admin → Portfolio photo service: delegates to (evidence: `src/main/java/com/bmhorizon/realisation/controller/PhotoRealisationAdminController.java`)
- Public visitor → Public photo API: requests photos (evidence: `src/main/java/com/bmhorizon/realisation/controller/PhotoPublicController.java`)
- Public photo API → Portfolio photo service: delegates to (evidence: `src/main/java/com/bmhorizon/realisation/controller/PhotoPublicController.java`)
- Portfolio photo service → Image processing: processes images (evidence: `src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java`)
- Portfolio photo service → Portfolio photo records: reads and writes (evidence: `src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java`)
- Portfolio photo service → Portfolio repository: loads projects (evidence: `src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java`)
- Portfolio photo service → File storage: stores and opens files (evidence: `src/main/java/com/bmhorizon/realisation/service/PhotoRealisationService.java`)
- Public visitor → Public quote API: submits request (evidence: `src/main/java/com/bmhorizon/demandedevis/controller/DemandeDevisPublicController.java`)
- Public quote API → Quote submission: delegates to (evidence: `src/main/java/com/bmhorizon/demandedevis/controller/DemandeDevisPublicController.java`)
- Quote submission → Image processing: processes images (evidence: `src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java`)
- Quote submission → File storage: stores files (evidence: `src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java`)
- Quote submission → Quote repository: saves request (evidence: `src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java`)
- Quote submission → Quote notifications: publishes event (evidence: `src/main/java/com/bmhorizon/demandedevis/service/DemandeDevisService.java`)
- Administrator → Authentication API: authenticates (evidence: `src/main/java/com/bmhorizon/securite/controller/AuthController.java`)
- Authentication API → Credential authentication: delegates to (evidence: `src/main/java/com/bmhorizon/securite/controller/AuthController.java`)
- Authentication API → JWT services: issues JWT (evidence: `src/main/java/com/bmhorizon/securite/controller/AuthController.java`)
- Credential authentication → User repository: looks up users
- File storage → S3 storage adapter: uses adapter (evidence: `src/main/java/com/bmhorizon/storage/StockageS3.java`)
