# lucassaymon1/foodexplorer-api architecture

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

- Interactive diagram: https://gitdiagram.com/lucassaymon1/foodexplorer-api
- Repository: https://github.com/lucassaymon1/foodexplorer-api

## Overview

Food-Explorer is a REST API for a restaurant menu frontend. The main workflow is authenticated menu browsing and, for administrators, creating, editing, deleting, and replacing food pictures; food records and tags are stored in SQLite, while uploaded pictures are served from disk. User registration and login provide the identity and token used by protected routes. The README documents the frontend/API relationship and database-backed menu workflow. TagsController and route aggregation are included from the tree, but their internal behavior was not sampled.

Main entry points: [`src/routes/foods.routes.js`](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/foods.routes.js) (Food routes), [`src/database/knex/index.js`](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/knex/index.js) (Knex database client), [`src/routes/index.js`](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/index.js) (Route aggregator), [`src/middlewares/ensureAuthenticated.js`](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/middlewares/ensureAuthenticated.js) (JWT authentication)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_http["HTTP API"]
  node_server["Express server<br/>[server.js]"]
  node_route_index["Route aggregator<br/>[index.js]"]
  node_food_routes["Food routes<br/>[foods.routes.js]"]
  node_user_routes["User routes<br/>[users.routes.js]"]
  node_session_routes["Session routes<br/>[sessions.routes.js]"]
  node_tag_routes["Tag routes<br/>[tags.routes.js]"]
end

subgraph group_identity["Identity and Access"]
  node_users["User controller<br/>[UsersController.js]"]
  node_sessions["Session controller"]
  node_auth_middleware["JWT authentication"]
  node_admin_middleware["Admin authorization<br/>[ensureAdminUser.js]"]
  node_auth_config["JWT configuration<br/>[auth.js]"]
end

subgraph group_menu["Menu Management"]
  node_foods["Food controller<br/>[FoodsController.js]"]
  node_food_pictures["Picture controller"]
  node_tags["Tag controller<br/>[TagsController.js]"]
end

subgraph group_storage["Persistence and Files"]
  node_uploads_config["Upload configuration<br/>[uploads.js]"]
  node_disk_storage["Disk storage<br/>[DiskStorage.js]"]
  node_knex["Knex database client<br/>[index.js]"]
  node_sqlite_init["SQLite initialization<br/>[index.js]"]
  node_sqlite[("SQLite database<br/>[database.db]")]
end

node_frontend(("Frontend client"))
node_filesystem[("Upload filesystem")]

node_frontend -->|"sends requests"| node_server
node_server -->|"mounts routes"| node_route_index
node_server -->|"initializes"| node_sqlite_init
node_server -->|"serves files from"| node_uploads_config
node_route_index -->|"mounts"| node_food_routes
node_route_index -->|"mounts"| node_user_routes
node_route_index -->|"mounts"| node_session_routes
node_route_index -->|"mounts"| node_tag_routes
node_food_routes -->|"guards routes"| node_auth_middleware
node_food_routes -->|"guards writes"| node_admin_middleware
node_food_routes -->|"dispatches"| node_foods
node_food_routes -->|"dispatches"| node_food_pictures
node_food_routes -->|"configures uploads"| node_uploads_config
node_user_routes -->|"guards profile"| node_auth_middleware
node_user_routes -->|"dispatches"| node_users
node_session_routes -->|"guards session check"| node_auth_middleware
node_session_routes -->|"dispatches"| node_sessions
node_tag_routes -->|"guards routes"| node_auth_middleware
node_tag_routes -->|"dispatches"| node_tags
node_sessions -->|"reads JWT settings"| node_auth_config
node_auth_middleware -->|"reads JWT settings"| node_auth_config
node_users -->|"queries users"| node_knex
node_sessions -->|"queries users"| node_knex
node_foods -->|"queries foods and tags"| node_knex
node_food_pictures -->|"updates food records"| node_knex
node_tags -->|"queries data"| node_knex
node_sqlite_init -->|"initializes database"| node_sqlite
node_knex -->|"reads and writes"| node_sqlite
node_foods -->|"manages pictures"| node_disk_storage
node_food_pictures -->|"replaces pictures"| node_disk_storage
node_disk_storage -->|"uses paths"| node_uploads_config
node_disk_storage -->|"moves and deletes files"| node_filesystem

click node_server "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/server.js"
click node_route_index "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/index.js"
click node_food_routes "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/foods.routes.js"
click node_user_routes "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/users.routes.js"
click node_session_routes "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/sessions.routes.js"
click node_tag_routes "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/tags.routes.js"
click node_users "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/UsersController.js"
click node_sessions "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/SessionsController.js"
click node_auth_middleware "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/middlewares/ensureAuthenticated.js"
click node_admin_middleware "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/middlewares/ensureAdminUser.js"
click node_auth_config "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/configs/auth.js"
click node_foods "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/FoodsController.js"
click node_food_pictures "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/FoodsPictureController.js"
click node_tags "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/TagsController.js"
click node_uploads_config "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/configs/uploads.js"
click node_disk_storage "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/providers/DiskStorage.js"
click node_knex "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/knex/index.js"
click node_sqlite_init "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/sqlite/index.js"
click node_sqlite "https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/database.db"

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_server,node_route_index,node_food_routes,node_user_routes,node_session_routes,node_tag_routes,node_frontend toneBlue
class node_users,node_sessions,node_auth_middleware,node_admin_middleware,node_auth_config,node_filesystem toneAmber
class node_foods,node_food_pictures,node_tags toneMint
class node_uploads_config,node_disk_storage,node_knex,node_sqlite_init,node_sqlite toneRose
```

## Components

### HTTP API

- [Express server](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/server.js): `src/server.js`
- [Route aggregator](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/index.js): `src/routes/index.js`
- [Food routes](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/foods.routes.js): `src/routes/foods.routes.js`
- [User routes](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/users.routes.js): `src/routes/users.routes.js`
- [Session routes](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/sessions.routes.js): `src/routes/sessions.routes.js`
- [Tag routes](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/routes/tags.routes.js): `src/routes/tags.routes.js`

### Identity and Access

- [User controller](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/UsersController.js): `src/controllers/UsersController.js`
- [Session controller](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/SessionsController.js): `src/controllers/SessionsController.js`
- [JWT authentication](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/middlewares/ensureAuthenticated.js): `src/middlewares/ensureAuthenticated.js`
- [Admin authorization](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/middlewares/ensureAdminUser.js): `src/middlewares/ensureAdminUser.js`
- [JWT configuration](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/configs/auth.js): `src/configs/auth.js`

### Menu Management

- [Food controller](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/FoodsController.js): `src/controllers/FoodsController.js`
- [Picture controller](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/FoodsPictureController.js): `src/controllers/FoodsPictureController.js`
- [Tag controller](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/controllers/TagsController.js): `src/controllers/TagsController.js`

### Persistence and Files

- [Upload configuration](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/configs/uploads.js): `src/configs/uploads.js`
- [Disk storage](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/providers/DiskStorage.js): `src/providers/DiskStorage.js`
- [Knex database client](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/knex/index.js): `src/database/knex/index.js`
- [SQLite initialization](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/sqlite/index.js): `src/database/sqlite/index.js`
- [SQLite database](https://github.com/lucassaymon1/foodexplorer-api/blob/main/src/database/database.db): `src/database/database.db`

### Other components

- **Frontend client**
- **Upload filesystem**

## Connections

- Frontend client → Express server: sends requests
- Express server → Route aggregator: mounts routes
- Express server → SQLite initialization: initializes
- Express server → Upload configuration: serves files from
- Route aggregator → Food routes: mounts
- Route aggregator → User routes: mounts
- Route aggregator → Session routes: mounts
- Route aggregator → Tag routes: mounts
- Food routes → JWT authentication: guards routes
- Food routes → Admin authorization: guards writes
- Food routes → Food controller: dispatches
- Food routes → Picture controller: dispatches
- Food routes → Upload configuration: configures uploads
- User routes → JWT authentication: guards profile
- User routes → User controller: dispatches
- Session routes → JWT authentication: guards session check
- Session routes → Session controller: dispatches
- Tag routes → JWT authentication: guards routes
- Tag routes → Tag controller: dispatches
- Session controller → JWT configuration: reads JWT settings
- JWT authentication → JWT configuration: reads JWT settings
- User controller → Knex database client: queries users
- Session controller → Knex database client: queries users
- Food controller → Knex database client: queries foods and tags
- Picture controller → Knex database client: updates food records
- Tag controller → Knex database client: queries data
- SQLite initialization → SQLite database: initializes database
- Knex database client → SQLite database: reads and writes
- Food controller → Disk storage: manages pictures
- Picture controller → Disk storage: replaces pictures
- Disk storage → Upload configuration: uses paths
- Disk storage → Upload filesystem: moves and deletes files
