# unb-mds/2026-2-bandejao-unb architecture

> Architecture diagram of the GitHub repository unb-mds/2026-2-bandejao-unb, 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/unb-mds/2026-2-bandejao-unb
- Repository: https://github.com/unb-mds/2026-2-bandejao-unb

## Overview

Bandejão is a university-restaurant PWA for browsing campus menus, submitting meal reviews, and checking community-based queue information. Its main visitor workflow selects a campus, retrieves a menu through the frontend API client, and presents it with diet/allergen filters; authenticated users can also register or log in and use review/check-in features. The README documents automated PDF ingestion, queue forecasting, history, and GPS check-in, but those implementations are not present in the supplied tree. The graph shows documented capabilities without asserting unseen call paths; the sampled backend currently exposes simulated account endpoints and a status route.

Main entry points: [`frontend/src/router/index.js`](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/router/index.js) (Screen routing), [`frontend/src/services/apiClient.js`](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/services/apiClient.js) (API client), [`backend/apps/core/models.py`](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/core/models.py) (Application database), [`frontend/src/views/CardapioView.vue`](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CardapioView.vue) (Menu screen)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["PWA experience"]
  node_app["Vue app shell<br/>[App.vue]"]
  node_router["Screen routing<br/>[index.js]"]
  node_api["API client<br/>[apiClient.js]"]
  node_authstate["Auth state<br/>[auth.js]"]
  node_pwa["PWA setup<br/>[pwa.js]"]
  node_accountview["Account screens<br/>[CadastroView.vue]"]
end

subgraph group_menu["Menu discovery"]
  node_campus["Campus selection<br/>[CampusView.vue]"]
  node_preferences["Menu preferences<br/>[preferencias.js]"]
  node_menuview["Menu screen<br/>[CardapioView.vue]"]
  node_filter["Diet and marker filters<br/>[FiltroCardapio.vue]"]
  node_menuutils["Menu selection and filtering<br/>[cardapio.js]"]
  node_menustore["Menu data state<br/>[cardapio.js]"]
  node_pdfingest["PDF menu ingestion"]
end

subgraph group_community["Community features"]
  node_reviewsview["Review screens<br/>[AvaliacoesView.vue]"]
  node_reviewwidget["Review widget"]
  node_reviewstore["Review state<br/>[avaliacoes.js]"]
  node_reviewapi["Review API<br/>[views.py]"]
  node_queueview["Queue forecast and check-in<br/>[FilaView.vue]"]
  node_queueapi["Queue status API<br/>[views.py]"]
end

subgraph group_server["Django API"]
  node_domain["Campus and day models<br/>[models.py]"]
  node_menuapi["Menu API<br/>[views.py]"]
  node_accountapi["Account endpoints<br/>[views.py]"]
  node_urls["API URL routing<br/>[urls.py]"]
  node_database[("Application database<br/>[models.py]")]
end

node_visitor(("Visitor"))
node_user(("Signed-in user"))

node_visitor -->|"opens screens"| node_router
node_user -->|"opens screens"| node_router
node_app -->|"renders routes"| node_router
node_campus -->|"remembers campus"| node_preferences
node_router -->|"routes to"| node_campus
node_router -->|"routes to"| node_menuview
node_menuview -.->|"loads menu"| node_menustore
node_menustore -.->|"requests data"| node_api
node_api -.->|"HTTP requests"| node_urls
node_urls -->|"routes account"| node_accountapi
node_urls -->|"includes status"| node_queueapi
node_urls -.->|"menu endpoint"| node_menuapi
node_menuapi -.->|"reads menu"| node_database
node_domain -->|"defines entities"| node_database
node_filter -->|"applies filters"| node_preferences
node_menuview -.->|"shows filters"| node_filter
node_menuview -.->|"formats menu"| node_menuutils
node_menuapi -.->|"reads imported menu"| node_pdfingest
node_router -->|"routes to"| node_reviewsview
node_reviewsview -.->|"loads reviews"| node_reviewstore
node_reviewwidget -.->|"submits review"| node_reviewstore
node_reviewstore -.->|"requests data"| node_api
node_reviewapi -.->|"stores reviews"| node_database
node_router -->|"routes to"| node_queueview
node_queueview -.->|"requests status"| node_api
node_queueapi -.->|"uses check-ins"| node_database
node_router -->|"routes to"| node_accountview
node_accountview -.->|"requests account"| node_api
node_api -.->|"sets session token"| node_authstate
node_accountapi -.->|"manages accounts"| node_database
node_app -->|"registers worker"| node_pwa

click node_app "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/App.vue"
click node_router "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/router/index.js"
click node_api "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/services/apiClient.js"
click node_authstate "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/auth.js"
click node_pwa "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/pwa.js"
click node_campus "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CampusView.vue"
click node_preferences "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/preferencias.js"
click node_menuview "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CardapioView.vue"
click node_filter "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/components/FiltroCardapio.vue"
click node_menuutils "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/utils/cardapio.js"
click node_menustore "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/cardapio.js"
click node_pdfingest "https://github.com/unb-mds/2026-2-bandejao-unb/tree/main/backend/apps/cardapio"
click node_reviewsview "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/AvaliacoesView.vue"
click node_reviewwidget "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/components/AvaliacaoWidget.vue"
click node_reviewstore "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/avaliacoes.js"
click node_reviewapi "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/avaliacoes/views.py"
click node_queueview "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/FilaView.vue"
click node_queueapi "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/status/views.py"
click node_domain "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/core/models.py"
click node_menuapi "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/cardapio/views.py"
click node_accountview "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CadastroView.vue"
click node_accountapi "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/usuarios/views.py"
click node_urls "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/config/urls.py"
click node_database "https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/core/models.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_app,node_router,node_api,node_authstate,node_pwa,node_accountview,node_user toneBlue
class node_campus,node_preferences,node_menuview,node_filter,node_menuutils,node_menustore,node_pdfingest toneAmber
class node_reviewsview,node_reviewwidget,node_reviewstore,node_reviewapi,node_queueview,node_queueapi toneMint
class node_domain,node_menuapi,node_accountapi,node_urls,node_database toneRose
class node_visitor toneIndigo
```

## Components

### PWA experience

- [Vue app shell](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/App.vue): `frontend/src/App.vue`
- [Screen routing](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/router/index.js): `frontend/src/router/index.js`
- [API client](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/services/apiClient.js): `frontend/src/services/apiClient.js`
- [Auth state](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/auth.js): `frontend/src/stores/auth.js`
- [PWA setup](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/pwa.js): `frontend/src/pwa.js`
- [Account screens](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CadastroView.vue): `frontend/src/views/CadastroView.vue`

### Menu discovery

- [Campus selection](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CampusView.vue): `frontend/src/views/CampusView.vue`
- [Menu preferences](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/preferencias.js): `frontend/src/stores/preferencias.js`
- [Menu screen](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/CardapioView.vue): `frontend/src/views/CardapioView.vue`
- [Diet and marker filters](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/components/FiltroCardapio.vue): `frontend/src/components/FiltroCardapio.vue`
- [Menu selection and filtering](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/utils/cardapio.js): `frontend/src/utils/cardapio.js`
- [Menu data state](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/cardapio.js): `frontend/src/stores/cardapio.js`
- [PDF menu ingestion](https://github.com/unb-mds/2026-2-bandejao-unb/tree/main/backend/apps/cardapio): `backend/apps/cardapio`

### Community features

- [Review screens](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/AvaliacoesView.vue): `frontend/src/views/AvaliacoesView.vue`
- [Review widget](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/components/AvaliacaoWidget.vue): `frontend/src/components/AvaliacaoWidget.vue`
- [Review state](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/stores/avaliacoes.js): `frontend/src/stores/avaliacoes.js`
- [Review API](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/avaliacoes/views.py): `backend/apps/avaliacoes/views.py`
- [Queue forecast and check-in](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/frontend/src/views/FilaView.vue): `frontend/src/views/FilaView.vue`
- [Queue status API](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/status/views.py): `backend/apps/status/views.py`

### Django API

- [Campus and day models](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/core/models.py): `backend/apps/core/models.py`
- [Menu API](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/cardapio/views.py): `backend/apps/cardapio/views.py`
- [Account endpoints](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/usuarios/views.py): `backend/apps/usuarios/views.py`
- [API URL routing](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/config/urls.py): `backend/config/urls.py`
- [Application database](https://github.com/unb-mds/2026-2-bandejao-unb/blob/main/backend/apps/core/models.py): `backend/apps/core/models.py`

### Other components

- **Visitor**
- **Signed-in user**

## Connections

- Visitor → Screen routing: opens screens (evidence: `frontend/src/router/index.js`)
- Signed-in user → Screen routing: opens screens (evidence: `frontend/src/router/index.js`)
- Vue app shell → Screen routing: renders routes (evidence: `frontend/src/App.vue`)
- Campus selection → Menu preferences: remembers campus
- Screen routing → Campus selection: routes to (evidence: `frontend/src/router/index.js`)
- Screen routing → Menu screen: routes to (evidence: `frontend/src/router/index.js`)
- Menu screen → Menu data state: loads menu
- Menu data state → API client: requests data
- API client → API URL routing: HTTP requests
- API URL routing → Account endpoints: routes account (evidence: `backend/config/urls.py`)
- API URL routing → Queue status API: includes status (evidence: `backend/config/urls.py`)
- API URL routing → Menu API: menu endpoint
- Menu API → Application database: reads menu
- Campus and day models → Application database: defines entities (evidence: `backend/apps/core/models.py`)
- Diet and marker filters → Menu preferences: applies filters (evidence: `frontend/src/components/FiltroCardapio.vue`)
- Menu screen → Diet and marker filters: shows filters
- Menu screen → Menu selection and filtering: formats menu
- Menu API → PDF menu ingestion: reads imported menu
- Screen routing → Review screens: routes to (evidence: `frontend/src/router/index.js`)
- Review screens → Review state: loads reviews
- Review widget → Review state: submits review
- Review state → API client: requests data
- Review API → Application database: stores reviews
- Screen routing → Queue forecast and check-in: routes to (evidence: `frontend/src/router/index.js`)
- Queue forecast and check-in → API client: requests status
- Queue status API → Application database: uses check-ins
- Screen routing → Account screens: routes to (evidence: `frontend/src/router/index.js`)
- Account screens → API client: requests account
- API client → Auth state: sets session token
- Account endpoints → Application database: manages accounts
- Vue app shell → PWA setup: registers worker (evidence: `frontend/src/main.js`)
