# n-mehdi/ensai-projet-info-2a architecture

> Architecture diagram of the GitHub repository n-mehdi/ensai-projet-info-2a, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/n-mehdi/ensai-projet-info-2a
- Repository: https://github.com/n-mehdi/ensai-projet-info-2a

## Overview

ENSAI Cocktail Manager is a FastAPI/PostgreSQL application for managing cocktail recipes and a user’s cocktail-related resources. The main workflow is an API request, optional JWT-based user resolution, business logic in a service, and persistence through DAOs to PostgreSQL. Documented capabilities also include private cocktail access, reviews, favorites, tested cocktails, ingredient stock, shopping lists, and unit conversion. The graph follows the sampled routes and service/DAO references; unsampled capability links are documented at subsystem level rather than inferred as detailed call chains.

Main entry points: [`src/api/main.py`](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/main.py) (API router), [`src/service/cocktail_service.py`](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/cocktail_service.py) (Cocktail logic), [`src/service/liste_course_service.py`](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/liste_course_service.py) (Shopping lists), [`src/service/utilisateur_service.py`](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/utilisateur_service.py) (User service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API and identity"]
  node_app["Application entry<br/>[main.py]"]
  node_router["API router<br/>[main.py]"]
  node_auth["JWT user resolution<br/>[deps.py]"]
  node_user_routes["User routes"]
  node_login["Login routes<br/>[login.py]"]
  node_user_service["User service"]
end

subgraph group_recipes["Cocktail domain"]
  node_cocktail_routes["Cocktail routes<br/>[cocktail_routes.py]"]
  node_private_routes["Private cocktail access<br/>[acces_routes.py]"]
  node_cocktail_service["Cocktail logic"]
  node_reviews["Reviews<br/>[avis_routes.py]"]
  node_feature_routes["Favorites and tested cocktails"]
end

subgraph group_supplies["Stock and shopping"]
  node_shopping["Shopping lists"]
  node_shopping_routes["Shopping routes"]
  node_stock_routes["Stock routes"]
  node_stock_service["Stock logic<br/>[stock_service.py]"]
  node_ingredients["Ingredient logic"]
  node_units["Unit conversion"]
end

subgraph group_persistence["Data persistence"]
  node_user_dao["User persistence<br/>[utilisateur_dao.py]"]
  node_cocktail_dao["Cocktail persistence<br/>[cocktail_dao.py]"]
  node_stock_dao["Stock persistence<br/>[stock_dao.py]"]
  node_ingredient_dao["Ingredient persistence<br/>[ingredient_dao.py]"]
  node_db[("PostgreSQL")]
end

node_user(("User"))

node_user -->|"requests API"| node_app
node_app -->|"starts API"| node_router
node_router -->|"registers routes"| node_login
node_router -->|"registers routes"| node_user_routes
node_router -->|"registers routes"| node_cocktail_routes
node_router -->|"registers routes"| node_private_routes
node_router -->|"registers routes"| node_reviews
node_router -->|"registers routes"| node_shopping_routes
node_router -->|"registers routes"| node_stock_routes
node_router -->|"registers routes"| node_feature_routes
node_user_routes -->|"delegates to"| node_user_service
node_login -.->|"authenticates via"| node_user_service
node_auth -->|"resolves user via"| node_user_service
node_user_service -->|"reads and writes"| node_user_dao
node_cocktail_routes -->|"delegates to"| node_cocktail_service
node_private_routes -->|"uses service"| node_cocktail_service
node_cocktail_service -->|"queries recipes"| node_cocktail_dao
node_reviews -.->|"supports recipe reviews"| node_cocktail_routes
node_shopping_routes -->|"delegates to"| node_shopping
node_shopping -->|"looks up ingredients"| node_ingredient_dao
node_shopping -->|"reads stock"| node_stock_dao
node_shopping -->|"converts quantities"| node_units
node_stock_routes -->|"delegates to"| node_stock_service
node_stock_service -->|"reads and writes"| node_stock_dao
node_stock_service -->|"uses ingredient data"| node_ingredient_dao
node_cocktail_service -->|"checks availability"| node_stock_dao
node_cocktail_service -->|"normalizes measures"| node_units
node_ingredient_dao -->|"queries"| node_db
node_stock_dao -->|"queries"| node_db
node_cocktail_dao -->|"queries"| node_db
node_user_dao -->|"queries"| node_db

click node_app "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/main.py"
click node_router "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/main.py"
click node_auth "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/deps.py"
click node_user_routes "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/utilisateur_routes.py"
click node_login "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/login.py"
click node_user_service "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/utilisateur_service.py"
click node_user_dao "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/utilisateur_dao.py"
click node_cocktail_routes "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/cocktail_routes.py"
click node_private_routes "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/acces_routes.py"
click node_cocktail_service "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/cocktail_service.py"
click node_cocktail_dao "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/cocktail_dao.py"
click node_reviews "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/avis_routes.py"
click node_shopping "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/liste_course_service.py"
click node_shopping_routes "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/liste_course_routes.py"
click node_stock_routes "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/stock_course_routes.py"
click node_stock_service "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/stock_service.py"
click node_ingredients "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/ingredient_service.py"
click node_stock_dao "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/stock_dao.py"
click node_ingredient_dao "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/ingredient_dao.py"
click node_units "https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/utils/conversion_unite.py"
click node_feature_routes "https://github.com/n-mehdi/ensai-projet-info-2a/tree/main/src/api/routes"

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_app,node_router,node_auth,node_user_routes,node_login,node_user_service,node_user toneBlue
class node_cocktail_routes,node_private_routes,node_cocktail_service,node_reviews,node_feature_routes toneAmber
class node_shopping,node_shopping_routes,node_stock_routes,node_stock_service,node_ingredients,node_units toneMint
class node_user_dao,node_cocktail_dao,node_stock_dao,node_ingredient_dao,node_db toneRose
```

## Components

### API and identity

- [Application entry](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/main.py): `src/main.py`
- [API router](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/main.py): `src/api/main.py`
- [JWT user resolution](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/deps.py): `src/api/deps.py`
- [User routes](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/utilisateur_routes.py): `src/api/routes/utilisateur_routes.py`
- [Login routes](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/login.py): `src/api/routes/login.py`
- [User service](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/utilisateur_service.py): `src/service/utilisateur_service.py`

### Cocktail domain

- [Cocktail routes](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/cocktail_routes.py): `src/api/routes/cocktail_routes.py`
- [Private cocktail access](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/acces_routes.py): `src/api/routes/acces_routes.py`
- [Cocktail logic](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/cocktail_service.py): `src/service/cocktail_service.py`
- [Reviews](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/avis_routes.py): `src/api/routes/avis_routes.py`
- [Favorites and tested cocktails](https://github.com/n-mehdi/ensai-projet-info-2a/tree/main/src/api/routes): `src/api/routes`

### Stock and shopping

- [Shopping lists](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/liste_course_service.py): `src/service/liste_course_service.py`
- [Shopping routes](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/liste_course_routes.py): `src/api/routes/liste_course_routes.py`
- [Stock routes](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/api/routes/stock_course_routes.py): `src/api/routes/stock_course_routes.py`
- [Stock logic](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/stock_service.py): `src/service/stock_service.py`
- [Ingredient logic](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/service/ingredient_service.py): `src/service/ingredient_service.py`
- [Unit conversion](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/utils/conversion_unite.py): `src/utils/conversion_unite.py`

### Data persistence

- [User persistence](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/utilisateur_dao.py): `src/dao/utilisateur_dao.py`
- [Cocktail persistence](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/cocktail_dao.py): `src/dao/cocktail_dao.py`
- [Stock persistence](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/stock_dao.py): `src/dao/stock_dao.py`
- [Ingredient persistence](https://github.com/n-mehdi/ensai-projet-info-2a/blob/main/src/dao/ingredient_dao.py): `src/dao/ingredient_dao.py`
- **PostgreSQL**

### Other components

- **User**

## Connections

- User → Application entry: requests API (evidence: `README.md`)
- Application entry → API router: starts API (evidence: `src/main.py`)
- API router → Login routes: registers routes (evidence: `src/api/main.py`)
- API router → User routes: registers routes (evidence: `src/api/main.py`)
- API router → Cocktail routes: registers routes (evidence: `src/api/main.py`)
- API router → Private cocktail access: registers routes (evidence: `src/api/main.py`)
- API router → Reviews: registers routes (evidence: `src/api/main.py`)
- API router → Shopping routes: registers routes (evidence: `src/api/main.py`)
- API router → Stock routes: registers routes (evidence: `src/api/main.py`)
- API router → Favorites and tested cocktails: registers routes (evidence: `src/api/main.py`)
- User routes → User service: delegates to (evidence: `src/api/routes/utilisateur_routes.py`)
- Login routes → User service: authenticates via
- JWT user resolution → User service: resolves user via (evidence: `src/api/deps.py`)
- User service → User persistence: reads and writes (evidence: `src/service/utilisateur_service.py`)
- Cocktail routes → Cocktail logic: delegates to (evidence: `src/api/routes/cocktail_routes.py`)
- Private cocktail access → Cocktail logic: uses service (evidence: `src/api/routes/acces_routes.py`)
- Cocktail logic → Cocktail persistence: queries recipes (evidence: `src/service/cocktail_service.py`)
- Reviews → Cocktail routes: supports recipe reviews (evidence: `README.md`)
- Shopping routes → Shopping lists: delegates to (evidence: `src/api/routes/liste_course_routes.py`)
- Shopping lists → Ingredient persistence: looks up ingredients (evidence: `src/service/liste_course_service.py`)
- Shopping lists → Stock persistence: reads stock (evidence: `src/service/liste_course_service.py`)
- Shopping lists → Unit conversion: converts quantities (evidence: `src/service/liste_course_service.py`)
- Stock routes → Stock logic: delegates to (evidence: `src/api/routes/stock_course_routes.py`)
- Stock logic → Stock persistence: reads and writes (evidence: `src/service/stock_service.py`)
- Stock logic → Ingredient persistence: uses ingredient data (evidence: `src/service/stock_service.py`)
- Cocktail logic → Stock persistence: checks availability (evidence: `src/service/cocktail_service.py`)
- Cocktail logic → Unit conversion: normalizes measures (evidence: `src/service/cocktail_service.py`)
- Ingredient persistence → PostgreSQL: queries (evidence: `src/dao/ingredient_dao.py`)
- Stock persistence → PostgreSQL: queries (evidence: `src/dao/stock_dao.py`)
- Cocktail persistence → PostgreSQL: queries (evidence: `src/dao/cocktail_dao.py`)
- User persistence → PostgreSQL: queries (evidence: `src/dao/utilisateur_dao.py`)
