# unb-mds/2026-2-bandejao architecture

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

- Interactive diagram: https://gitdiagram.com/unb-mds/2026-2-bandejao
- Repository: https://github.com/unb-mds/2026-2-bandejao

## Overview

Bandejão is an UnB RU menu service: published weekly PDFs are discovered and parsed into meals, diet categories, and allergens, then optionally synchronized to an API that imports and stores them. API consumers can query menus with diet and allergen filters; the README also describes campus, evaluation, and check-in capabilities. The sampled menu route confirms database reads and import writes. Evaluation, check-in, campus, and frontend implementation details were not sampled; the frontend source shown is still a starter screen, so it is not mapped as a working client.

Main entry points: [`backend/app/main.py`](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/main.py) (FastAPI application), [`backend/app/api/routes/cardapio.py`](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/cardapio.py) (Menu routes), [`extracao/extracao/sincronizar.py`](https://github.com/unb-mds/2026-2-bandejao/blob/main/extracao/extracao/sincronizar.py) (Sync command), [`extracao/extracao/main.py`](https://github.com/unb-mds/2026-2-bandejao/blob/main/extracao/extracao/main.py) (PDF extraction)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Menu extraction"]
  node_sync["Sync command<br/>[sincronizar.py]"]
  node_extract["PDF extraction<br/>[main.py]"]
end

subgraph group_api["Backend API"]
  node_app["FastAPI application<br/>[main.py]"]
  node_menus["Menu routes<br/>[cardapio.py]"]
  node_campus_route["Campus routes<br/>[campus.py]"]
  node_evaluation_route["Evaluation routes<br/>[avaliacao.py]"]
  node_checkin_route["Check-in routes<br/>[checkin.py]"]
  node_health_route["Health route<br/>[health.py]"]
  node_db_session["Database session<br/>[session.py]"]
end

subgraph group_domain["Menu data"]
  node_menu_schema["Menu schemas<br/>[cardapio.py]"]
  node_item_model["Menu item model<br/>[item_cardapio.py]"]
  node_menu_model["Menu model<br/>[cardapio.py]"]
  node_campus_model["Campus model<br/>[campus.py]"]
end

subgraph group_feedback["User feedback"]
  node_evaluation_model["Evaluation model<br/>[avaliacao.py]"]
  node_checkin_model["Check-in model<br/>[checkin.py]"]
end

node_ru(("RU website and PDFs"))
node_consumer(("API consumer"))
node_database[("PostgreSQL database")]

node_sync -->|"runs extraction"| node_extract
node_sync -->|"sends payload"| node_extract
node_extract -->|"fetches pages and PDFs"| node_ru
node_sync -->|"imports via API"| node_app
node_consumer -->|"requests API"| node_app
node_app -->|"dispatches"| node_menus
node_app -->|"dispatches"| node_campus_route
node_app -->|"dispatches"| node_evaluation_route
node_app -->|"dispatches"| node_checkin_route
node_app -->|"dispatches"| node_health_route
node_menus -->|"validates and formats"| node_menu_schema
node_menus -->|"obtains session"| node_db_session
node_menus -->|"queries and writes"| node_menu_model
node_menus -->|"queries and writes"| node_campus_model
node_menus -->|"creates items"| node_item_model
node_menu_model -->|"persists menu data"| node_database
node_item_model -->|"persists item data"| node_database
node_campus_model -->|"persists campus data"| node_database

click node_sync "https://github.com/unb-mds/2026-2-bandejao/blob/main/extracao/extracao/sincronizar.py"
click node_extract "https://github.com/unb-mds/2026-2-bandejao/blob/main/extracao/extracao/main.py"
click node_app "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/main.py"
click node_menus "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/cardapio.py"
click node_campus_route "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/campus.py"
click node_evaluation_route "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/avaliacao.py"
click node_checkin_route "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/checkin.py"
click node_health_route "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/health.py"
click node_menu_schema "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/schemas/cardapio.py"
click node_item_model "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/item_cardapio.py"
click node_menu_model "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/cardapio.py"
click node_campus_model "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/campus.py"
click node_evaluation_model "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/avaliacao.py"
click node_checkin_model "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/checkin.py"
click node_db_session "https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/db/session.py"

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_sync,node_extract toneBlue
class node_app,node_menus,node_campus_route,node_evaluation_route,node_checkin_route,node_health_route,node_db_session,node_database toneAmber
class node_menu_schema,node_item_model,node_menu_model,node_campus_model,node_consumer toneMint
class node_evaluation_model,node_checkin_model toneRose
class node_ru toneIndigo
```

## Components

### Menu extraction

- [Sync command](https://github.com/unb-mds/2026-2-bandejao/blob/main/extracao/extracao/sincronizar.py): `extracao/extracao/sincronizar.py`
- [PDF extraction](https://github.com/unb-mds/2026-2-bandejao/blob/main/extracao/extracao/main.py): `extracao/extracao/main.py`

### Backend API

- [FastAPI application](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/main.py): `backend/app/main.py`
- [Menu routes](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/cardapio.py): `backend/app/api/routes/cardapio.py`
- [Campus routes](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/campus.py): `backend/app/api/routes/campus.py`
- [Evaluation routes](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/avaliacao.py): `backend/app/api/routes/avaliacao.py`
- [Check-in routes](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/checkin.py): `backend/app/api/routes/checkin.py`
- [Health route](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/api/routes/health.py): `backend/app/api/routes/health.py`
- [Database session](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/db/session.py): `backend/app/db/session.py`

### Menu data

- [Menu schemas](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/schemas/cardapio.py): `backend/app/schemas/cardapio.py`
- [Menu item model](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/item_cardapio.py): `backend/app/models/item_cardapio.py`
- [Menu model](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/cardapio.py): `backend/app/models/cardapio.py`
- [Campus model](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/campus.py): `backend/app/models/campus.py`

### User feedback

- [Evaluation model](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/avaliacao.py): `backend/app/models/avaliacao.py`
- [Check-in model](https://github.com/unb-mds/2026-2-bandejao/blob/main/backend/app/models/checkin.py): `backend/app/models/checkin.py`

### Other components

- **RU website and PDFs**
- **API consumer**
- **PostgreSQL database**

## Connections

- Sync command → PDF extraction: runs extraction
- Sync command → PDF extraction: sends payload
- PDF extraction → RU website and PDFs: fetches pages and PDFs
- Sync command → FastAPI application: imports via API
- API consumer → FastAPI application: requests API
- FastAPI application → Menu routes: dispatches
- FastAPI application → Campus routes: dispatches
- FastAPI application → Evaluation routes: dispatches
- FastAPI application → Check-in routes: dispatches
- FastAPI application → Health route: dispatches
- Menu routes → Menu schemas: validates and formats
- Menu routes → Database session: obtains session
- Menu routes → Menu model: queries and writes
- Menu routes → Campus model: queries and writes
- Menu routes → Menu item model: creates items
- Menu model → PostgreSQL database: persists menu data
- Menu item model → PostgreSQL database: persists item data
- Campus model → PostgreSQL database: persists campus data
