# erikvictorino/barbearia-node.js architecture

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

- Interactive diagram: https://gitdiagram.com/erikvictorino/barbearia-node.js
- Repository: https://github.com/erikvictorino/barbearia-node.js

## Overview

This is a Node.js/Express barbershop booking application. Customers register or sign in, browse services, request appointments, and view their bookings; administrators can review appointments and manage services. Password recovery is a separate email-and-token workflow. The source excerpts show the main route, controller, middleware, and model responsibilities; some feature details are documented only by the source index, so uncertain links are omitted.

Main entry points: [`app.js`](https://github.com/erikvictorino/barbearia-node.js/blob/main/app.js) (Express app), [`app/controllers/agendamentoController.js`](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/agendamentoController.js) (Booking controller), [`config/database.js`](https://github.com/erikvictorino/barbearia-node.js/blob/main/config/database.js) (MySQL connection), [`app/routes/servicoRoutes.js`](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/servicoRoutes.js) (Service routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_express["Express app<br/>[app.js]"]
  node_home_routes["Booking routes<br/>[homeRoutes.js]"]
  node_auth_routes["Authentication routes<br/>[authRoutes.js]"]
  node_service_routes["Service routes<br/>[servicoRoutes.js]"]
  node_user_routes["User routes<br/>[userRoutes.js]"]
end

subgraph group_identity["Identity and access"]
  node_auth_controller["Authentication controller<br/>[authController.js]"]
  node_client_controller["Client controller"]
  node_token_check["Token verification<br/>[checkToken.js]"]
  node_user_check["User context<br/>[checkUser.js]"]
  node_role_check["Role authorization<br/>[checkFuncao.js]"]
  node_rate_limit["Login rate limit<br/>[rateLimit.js]"]
end

subgraph group_booking["Booking"]
  node_booking_controller["Booking controller"]
  node_booking_views["Booking and admin views"]
end

subgraph group_catalog["Service catalog"]
  node_service_controller["Service controller"]
  node_image_upload["Image upload<br/>[upload.js]"]
end

subgraph group_persistence["Persistence and integrations"]
  node_client_model[("Client records<br/>[Cliente.js]")]
  node_booking_model[("Appointment records<br/>[Agendamento.js]")]
  node_service_model[("Service records<br/>[Servicos.js]")]
  node_booking_service_model[("Appointment services")]
  node_barber_model[("Barber records<br/>[Barbeiro.js]")]
  node_reset_model[("Reset tokens<br/>[resetPassToken.js]")]
  node_database[("MySQL connection<br/>[database.js]")]
  node_mailer["Email sender<br/>[mailer.js]"]
  node_cloudinary["Cloudinary configuration<br/>[cloudinary.js]"]
end

node_customer(("Customer"))
node_admin(("Administrator"))
node_mail_service["Email service"]

node_customer -->|"sends requests"| node_express
node_admin -->|"sends requests"| node_express
node_express -->|"mounts routes"| node_home_routes
node_express -->|"mounts routes"| node_auth_routes
node_express -->|"mounts routes"| node_service_routes
node_express -->|"mounts routes"| node_user_routes
node_express -->|"runs middleware"| node_user_check
node_home_routes -->|"dispatches to"| node_booking_controller
node_auth_routes -->|"dispatches to"| node_auth_controller
node_auth_routes -->|"limits login"| node_rate_limit
node_service_routes -->|"dispatches to"| node_service_controller
node_user_routes -->|"dispatches to"| node_client_controller
node_home_routes -->|"checks identity"| node_token_check
node_home_routes -->|"checks role"| node_role_check
node_service_routes -->|"checks identity"| node_token_check
node_service_routes -->|"checks role"| node_role_check
node_service_routes -->|"uploads image"| node_image_upload
node_booking_controller -->|"reads and creates"| node_booking_model
node_booking_controller -->|"reads clients"| node_client_model
node_booking_controller -->|"reads services"| node_service_model
node_booking_controller -->|"creates links"| node_booking_service_model
node_booking_controller -->|"renders pages"| node_booking_views
node_auth_controller -->|"reads and updates"| node_client_model
node_auth_controller -->|"creates and validates"| node_reset_model
node_auth_controller -->|"sends reset email"| node_mailer
node_auth_controller -->|"renders pages"| node_booking_views
node_token_check -->|"looks up user"| node_client_model
node_user_check -->|"uses client model"| node_client_model
node_service_controller -->|"manages services"| node_service_model
node_service_controller -->|"uses upload"| node_image_upload
node_image_upload -->|"configures storage"| node_cloudinary
node_booking_model -->|"uses connection"| node_database
node_client_model -->|"uses connection"| node_database
node_service_model -->|"uses connection"| node_database
node_booking_service_model -->|"uses connection"| node_database
node_barber_model -->|"uses connection"| node_database
node_reset_model -->|"uses connection"| node_database
node_express -->|"authenticates connection"| node_database
node_mailer -.->|"sends email"| node_mail_service

click node_express "https://github.com/erikvictorino/barbearia-node.js/blob/main/app.js"
click node_home_routes "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/homeRoutes.js"
click node_auth_routes "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/authRoutes.js"
click node_service_routes "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/servicoRoutes.js"
click node_user_routes "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/userRoutes.js"
click node_booking_controller "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/agendamentoController.js"
click node_booking_views "https://github.com/erikvictorino/barbearia-node.js/tree/main/app/views"
click node_auth_controller "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/authController.js"
click node_client_controller "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/clienteController.js"
click node_token_check "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/checkToken.js"
click node_user_check "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/checkUser.js"
click node_role_check "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/checkFuncao.js"
click node_rate_limit "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/rateLimit.js"
click node_service_controller "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/servicoController.js"
click node_image_upload "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/upload.js"
click node_client_model "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Cliente.js"
click node_booking_model "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Agendamento.js"
click node_service_model "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Servicos.js"
click node_booking_service_model "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/ServicoAgendamento.js"
click node_barber_model "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Barbeiro.js"
click node_reset_model "https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/resetPassToken.js"
click node_database "https://github.com/erikvictorino/barbearia-node.js/blob/main/config/database.js"
click node_mailer "https://github.com/erikvictorino/barbearia-node.js/blob/main/config/mailer.js"
click node_cloudinary "https://github.com/erikvictorino/barbearia-node.js/blob/main/config/cloudinary.js"

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_express,node_home_routes,node_auth_routes,node_service_routes,node_user_routes toneBlue
class node_auth_controller,node_client_controller,node_token_check,node_user_check,node_role_check,node_rate_limit toneAmber
class node_booking_controller,node_booking_views toneMint
class node_service_controller,node_image_upload toneRose
class node_client_model,node_booking_model,node_service_model,node_booking_service_model,node_barber_model,node_reset_model,node_database,node_mailer,node_cloudinary,node_customer,node_admin,node_mail_service toneIndigo
```

## Components

### Web application

- [Express app](https://github.com/erikvictorino/barbearia-node.js/blob/main/app.js): `app.js`
- [Booking routes](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/homeRoutes.js): `app/routes/homeRoutes.js`
- [Authentication routes](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/authRoutes.js): `app/routes/authRoutes.js`
- [Service routes](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/servicoRoutes.js): `app/routes/servicoRoutes.js`
- [User routes](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/routes/userRoutes.js): `app/routes/userRoutes.js`

### Identity and access

- [Authentication controller](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/authController.js): `app/controllers/authController.js`
- [Client controller](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/clienteController.js): `app/controllers/clienteController.js`
- [Token verification](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/checkToken.js): `app/middlewares/checkToken.js`
- [User context](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/checkUser.js): `app/middlewares/checkUser.js`
- [Role authorization](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/checkFuncao.js): `app/middlewares/checkFuncao.js`
- [Login rate limit](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/rateLimit.js): `app/middlewares/rateLimit.js`

### Booking

- [Booking controller](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/agendamentoController.js): `app/controllers/agendamentoController.js`
- [Booking and admin views](https://github.com/erikvictorino/barbearia-node.js/tree/main/app/views): `app/views`

### Service catalog

- [Service controller](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/controllers/servicoController.js): `app/controllers/servicoController.js`
- [Image upload](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/middlewares/upload.js): `app/middlewares/upload.js`

### Persistence and integrations

- [Client records](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Cliente.js): `app/models/Cliente.js`
- [Appointment records](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Agendamento.js): `app/models/Agendamento.js`
- [Service records](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Servicos.js): `app/models/Servicos.js`
- [Appointment services](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/ServicoAgendamento.js): `app/models/ServicoAgendamento.js`
- [Barber records](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/Barbeiro.js): `app/models/Barbeiro.js`
- [Reset tokens](https://github.com/erikvictorino/barbearia-node.js/blob/main/app/models/resetPassToken.js): `app/models/resetPassToken.js`
- [MySQL connection](https://github.com/erikvictorino/barbearia-node.js/blob/main/config/database.js): `config/database.js`
- [Email sender](https://github.com/erikvictorino/barbearia-node.js/blob/main/config/mailer.js): `config/mailer.js`
- [Cloudinary configuration](https://github.com/erikvictorino/barbearia-node.js/blob/main/config/cloudinary.js): `config/cloudinary.js`

### Other components

- **Customer**
- **Administrator**
- **Email service**

## Connections

- Customer → Express app: sends requests
- Administrator → Express app: sends requests
- Express app → Booking routes: mounts routes (evidence: `app.js`)
- Express app → Authentication routes: mounts routes (evidence: `app.js`)
- Express app → Service routes: mounts routes (evidence: `app.js`)
- Express app → User routes: mounts routes (evidence: `app.js`)
- Express app → User context: runs middleware (evidence: `app.js`)
- Booking routes → Booking controller: dispatches to (evidence: `app/routes/homeRoutes.js`)
- Authentication routes → Authentication controller: dispatches to (evidence: `app/routes/authRoutes.js`)
- Authentication routes → Login rate limit: limits login (evidence: `app/routes/authRoutes.js`)
- Service routes → Service controller: dispatches to (evidence: `app/routes/servicoRoutes.js`)
- User routes → Client controller: dispatches to (evidence: `app/routes/userRoutes.js`)
- Booking routes → Token verification: checks identity (evidence: `app/routes/homeRoutes.js`)
- Booking routes → Role authorization: checks role (evidence: `app/routes/homeRoutes.js`)
- Service routes → Token verification: checks identity (evidence: `app/routes/servicoRoutes.js`)
- Service routes → Role authorization: checks role (evidence: `app/routes/servicoRoutes.js`)
- Service routes → Image upload: uploads image (evidence: `app/routes/servicoRoutes.js`)
- Booking controller → Appointment records: reads and creates (evidence: `app/controllers/agendamentoController.js`)
- Booking controller → Client records: reads clients (evidence: `app/controllers/agendamentoController.js`)
- Booking controller → Service records: reads services (evidence: `app/controllers/agendamentoController.js`)
- Booking controller → Appointment services: creates links (evidence: `app/controllers/agendamentoController.js`)
- Booking controller → Booking and admin views: renders pages (evidence: `app/controllers/agendamentoController.js`)
- Authentication controller → Client records: reads and updates (evidence: `app/controllers/authController.js`)
- Authentication controller → Reset tokens: creates and validates (evidence: `app/controllers/authController.js`)
- Authentication controller → Email sender: sends reset email (evidence: `app/controllers/authController.js`)
- Authentication controller → Booking and admin views: renders pages (evidence: `app/controllers/authController.js`)
- Token verification → Client records: looks up user (evidence: `app/middlewares/checkToken.js`)
- User context → Client records: uses client model (evidence: `app/middlewares/checkUser.js`)
- Service controller → Service records: manages services (evidence: `app/controllers/servicoController.js`)
- Service controller → Image upload: uses upload (evidence: `app/controllers/servicoController.js`)
- Image upload → Cloudinary configuration: configures storage (evidence: `app/middlewares/upload.js`)
- Appointment records → MySQL connection: uses connection (evidence: `app/models/Agendamento.js`)
- Client records → MySQL connection: uses connection (evidence: `app/models/Cliente.js`)
- Service records → MySQL connection: uses connection (evidence: `app/models/Servicos.js`)
- Appointment services → MySQL connection: uses connection (evidence: `app/models/ServicoAgendamento.js`)
- Barber records → MySQL connection: uses connection (evidence: `app/models/Barbeiro.js`)
- Reset tokens → MySQL connection: uses connection (evidence: `app/models/resetPassToken.js`)
- Express app → MySQL connection: authenticates connection (evidence: `app.js`)
- Email sender → Email service: sends email
