# bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum architecture

> Architecture diagram of the GitHub repository bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum, 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/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum
- Repository: https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum

## Overview

BorB is a Scrum/agile-methodology study and certification portal. A candidate registers or logs in, studies the topic material, then progresses through a randomized, timed question for each certification topic; answers and progress are recorded and certification results recalculated. Account recovery is a separate access workflow. The graph includes the documented UI and study capabilities, but sampled frontend excerpts do not establish specific browser-to-API calls, so those connections are not asserted. Several domain routes are represented at their exact source paths because their implementations were not sampled.

Main entry points: [`backend/src/app.js`](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/app.js) (Express application), [`backend/src/config/db.js`](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/config/db.js) (PostgreSQL pool), [`backend/src/routes/exames.js`](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/exames.js) (Exam workflow), [`backend/src/middlewares/autenticacao.js`](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/middlewares/autenticacao.js) (Session guard)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["Accounts and access"]
  node_web["Portal interface<br/>[inicial.js]"]
  node_registration["Registration UI<br/>[cadastro.js]"]
  node_login["Login and profile UI<br/>[form.js]"]
  node_recoveryui["Recovery UI<br/>[recuperacao.js]"]
  node_authroutes["Authentication routes<br/>[auth.js]"]
  node_authcontroller["Authentication<br/>[authController.js]"]
  node_candidatecontroller["Candidate registration"]
  node_recoveryroutes["Recovery routes<br/>[recuperacao.js]"]
  node_recoverycontroller["Password recovery"]
  node_authguard["Session guard<br/>[autenticacao.js]"]
end

subgraph group_learning["Study content"]
  node_topicsui["Topic navigation<br/>[menu-temas.js]"]
  node_studyui["Study experience<br/>[estudos.js]"]
  node_topicroutes["Topic listing<br/>[temas.js]"]
  node_studyroutes["Study content API<br/>[estudos.js]"]
end

subgraph group_cert["Certification"]
  node_examui["Exam experience<br/>[exame.js]"]
  node_timer["Question timer<br/>[cronometro.js]"]
  node_examroutes["Exam workflow<br/>[exames.js]"]
  node_closing["Question closure"]
  node_certservice["Certification results<br/>[certificacao.js]"]
end

subgraph group_platform["Platform and data"]
  node_questionimport["Question import"]
  node_topicimport["Topic import<br/>[importar-temas.js]"]
  node_server["Server and scheduler<br/>[server.js]"]
  node_app["Express application<br/>[app.js]"]
  node_session["Session configuration<br/>[sessao.js]"]
  node_candidate_model["Candidate data<br/>[candidatoModel.js]"]
  node_recovery_model["Recovery data"]
  node_database[("PostgreSQL pool<br/>[db.js]")]
  node_password["Password hashing<br/>[senha.js]"]
  node_recoverycode["Recovery codes"]
  node_email["Recovery email"]
end

node_candidate(("Candidate"))

node_candidate -->|"uses portal"| node_web
node_candidate -->|"registers"| node_registration
node_candidate -->|"signs in"| node_login
node_candidate -->|"recovers access"| node_recoveryui
node_candidate -->|"views topics"| node_topicsui
node_candidate -->|"studies topics"| node_studyui
node_candidate -->|"takes exam"| node_examui
node_app -->|"mounts"| node_authroutes
node_app -->|"mounts"| node_recoveryroutes
node_app -->|"mounts"| node_studyroutes
node_app -->|"mounts"| node_examroutes
node_app -->|"mounts"| node_topicroutes
node_app -->|"uses sessions"| node_session
node_app -->|"guards pages"| node_authguard
node_authroutes -->|"routes to"| node_authcontroller
node_authroutes -->|"checks sessions"| node_authguard
node_authcontroller -->|"reads candidate"| node_candidate_model
node_authcontroller -->|"verifies password"| node_password
node_candidatecontroller -->|"creates candidate"| node_candidate_model
node_candidatecontroller -->|"hashes password"| node_password
node_recoveryroutes -->|"routes to"| node_recoverycontroller
node_recoverycontroller -->|"updates recovery"| node_recovery_model
node_recoverycontroller -->|"sends code"| node_email
node_recoverycontroller -->|"generates code"| node_recoverycode
node_authguard -->|"checks candidate"| node_candidate_model
node_studyroutes -->|"requires session"| node_authguard
node_studyroutes -->|"queries content"| node_database
node_topicroutes -->|"reads topics"| node_database
node_examroutes -->|"requires session"| node_authguard
node_examroutes -->|"reads and writes"| node_database
node_examroutes -->|"closes expired"| node_closing
node_examroutes -->|"recalculates results"| node_certservice
node_server -->|"serves app"| node_app
node_server -->|"opens connection"| node_database
node_server -->|"sweeps expired"| node_closing
node_server -->|"recalculates results"| node_certservice
node_candidate_model -->|"queries candidates"| node_database
node_recovery_model -->|"transacts recovery"| node_database
node_recovery_model -->|"protects codes"| node_recoverycode
node_recovery_model -->|"hashes new password"| node_password
node_questionimport -->|"loads questions"| node_database
node_topicimport -->|"loads topics"| node_database

click node_web "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/inicial.js"
click node_registration "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/cadastro.js"
click node_login "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/form.js"
click node_recoveryui "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/recuperacao.js"
click node_authroutes "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/auth.js"
click node_authcontroller "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/controllers/authController.js"
click node_candidatecontroller "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/controllers/candidatoController.js"
click node_recoveryroutes "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/recuperacao.js"
click node_recoverycontroller "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/controllers/recuperacaoController.js"
click node_authguard "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/middlewares/autenticacao.js"
click node_topicsui "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/menu-temas.js"
click node_studyui "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/estudos.js"
click node_topicroutes "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/temas.js"
click node_studyroutes "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/estudos.js"
click node_examui "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/exame.js"
click node_timer "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/cronometro.js"
click node_examroutes "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/exames.js"
click node_closing "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/encerramentoQuestao.js"
click node_certservice "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/certificacao.js"
click node_questionimport "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/scripts/importar-questoes.js"
click node_topicimport "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/scripts/importar-temas.js"
click node_server "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/server.js"
click node_app "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/app.js"
click node_session "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/config/sessao.js"
click node_candidate_model "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/models/candidatoModel.js"
click node_recovery_model "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/models/recuperacaoModel.js"
click node_database "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/config/db.js"
click node_password "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/senha.js"
click node_recoverycode "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/codigoRecuperacao.js"
click node_email "https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/emailRecuperacao.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_web,node_registration,node_login,node_recoveryui,node_authroutes,node_authcontroller,node_candidatecontroller,node_recoveryroutes,node_recoverycontroller,node_authguard toneBlue
class node_topicsui,node_studyui,node_topicroutes,node_studyroutes toneAmber
class node_examui,node_timer,node_examroutes,node_closing,node_certservice toneMint
class node_questionimport,node_topicimport,node_server,node_app,node_session,node_candidate_model,node_recovery_model,node_database,node_password,node_recoverycode,node_email toneRose
class node_candidate toneIndigo
```

## Components

### Accounts and access

- [Portal interface](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/inicial.js): `frontend/js/inicial.js`
- [Registration UI](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/cadastro.js): `frontend/js/cadastro.js`
- [Login and profile UI](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/form.js): `frontend/js/form.js`
- [Recovery UI](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/recuperacao.js): `frontend/js/recuperacao.js`
- [Authentication routes](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/auth.js): `backend/src/routes/auth.js`
- [Authentication](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/controllers/authController.js): `backend/src/controllers/authController.js`
- [Candidate registration](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/controllers/candidatoController.js): `backend/src/controllers/candidatoController.js`
- [Recovery routes](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/recuperacao.js): `backend/src/routes/recuperacao.js`
- [Password recovery](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/controllers/recuperacaoController.js): `backend/src/controllers/recuperacaoController.js`
- [Session guard](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/middlewares/autenticacao.js): `backend/src/middlewares/autenticacao.js`

### Study content

- [Topic navigation](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/menu-temas.js): `frontend/js/menu-temas.js`
- [Study experience](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/estudos.js): `frontend/js/estudos.js`
- [Topic listing](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/temas.js): `backend/src/routes/temas.js`
- [Study content API](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/estudos.js): `backend/src/routes/estudos.js`

### Certification

- [Exam experience](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/exame.js): `frontend/js/exame.js`
- [Question timer](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/frontend/js/cronometro.js): `frontend/js/cronometro.js`
- [Exam workflow](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/routes/exames.js): `backend/src/routes/exames.js`
- [Question closure](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/encerramentoQuestao.js): `backend/src/services/encerramentoQuestao.js`
- [Certification results](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/certificacao.js): `backend/src/services/certificacao.js`

### Platform and data

- [Question import](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/scripts/importar-questoes.js): `backend/scripts/importar-questoes.js`
- [Topic import](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/scripts/importar-temas.js): `backend/scripts/importar-temas.js`
- [Server and scheduler](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/server.js): `backend/server.js`
- [Express application](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/app.js): `backend/src/app.js`
- [Session configuration](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/config/sessao.js): `backend/src/config/sessao.js`
- [Candidate data](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/models/candidatoModel.js): `backend/src/models/candidatoModel.js`
- [Recovery data](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/models/recuperacaoModel.js): `backend/src/models/recuperacaoModel.js`
- [PostgreSQL pool](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/config/db.js): `backend/src/config/db.js`
- [Password hashing](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/senha.js): `backend/src/services/senha.js`
- [Recovery codes](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/codigoRecuperacao.js): `backend/src/services/codigoRecuperacao.js`
- [Recovery email](https://github.com/bit-or-byte-devs/abp-1-portal-de-certifcacao-scrum/blob/main/backend/src/services/emailRecuperacao.js): `backend/src/services/emailRecuperacao.js`

### Other components

- **Candidate**

## Connections

- Candidate → Portal interface: uses portal
- Candidate → Registration UI: registers
- Candidate → Login and profile UI: signs in
- Candidate → Recovery UI: recovers access
- Candidate → Topic navigation: views topics
- Candidate → Study experience: studies topics
- Candidate → Exam experience: takes exam
- Express application → Authentication routes: mounts (evidence: `backend/src/app.js`)
- Express application → Recovery routes: mounts (evidence: `backend/src/app.js`)
- Express application → Study content API: mounts (evidence: `backend/src/app.js`)
- Express application → Exam workflow: mounts (evidence: `backend/src/app.js`)
- Express application → Topic listing: mounts (evidence: `backend/src/app.js`)
- Express application → Session configuration: uses sessions (evidence: `backend/src/app.js`)
- Express application → Session guard: guards pages (evidence: `backend/src/app.js`)
- Authentication routes → Authentication: routes to (evidence: `backend/src/routes/auth.js`)
- Authentication routes → Session guard: checks sessions (evidence: `backend/src/routes/auth.js`)
- Authentication → Candidate data: reads candidate (evidence: `backend/src/controllers/authController.js`)
- Authentication → Password hashing: verifies password (evidence: `backend/src/controllers/authController.js`)
- Candidate registration → Candidate data: creates candidate (evidence: `backend/src/controllers/candidatoController.js`)
- Candidate registration → Password hashing: hashes password (evidence: `backend/src/controllers/candidatoController.js`)
- Recovery routes → Password recovery: routes to (evidence: `backend/src/routes/recuperacao.js`)
- Password recovery → Recovery data: updates recovery (evidence: `backend/src/controllers/recuperacaoController.js`)
- Password recovery → Recovery email: sends code (evidence: `backend/src/controllers/recuperacaoController.js`)
- Password recovery → Recovery codes: generates code (evidence: `backend/src/controllers/recuperacaoController.js`)
- Session guard → Candidate data: checks candidate (evidence: `backend/src/middlewares/autenticacao.js`)
- Study content API → Session guard: requires session (evidence: `backend/src/routes/estudos.js`)
- Study content API → PostgreSQL pool: queries content (evidence: `backend/src/routes/estudos.js`)
- Topic listing → PostgreSQL pool: reads topics (evidence: `backend/src/routes/temas.js`)
- Exam workflow → Session guard: requires session (evidence: `backend/src/routes/exames.js`)
- Exam workflow → PostgreSQL pool: reads and writes (evidence: `backend/src/routes/exames.js`)
- Exam workflow → Question closure: closes expired (evidence: `backend/src/routes/exames.js`)
- Exam workflow → Certification results: recalculates results (evidence: `backend/src/routes/exames.js`)
- Server and scheduler → Express application: serves app (evidence: `backend/server.js`)
- Server and scheduler → PostgreSQL pool: opens connection (evidence: `backend/server.js`)
- Server and scheduler → Question closure: sweeps expired (evidence: `backend/server.js`)
- Server and scheduler → Certification results: recalculates results (evidence: `backend/server.js`)
- Candidate data → PostgreSQL pool: queries candidates (evidence: `backend/src/models/candidatoModel.js`)
- Recovery data → PostgreSQL pool: transacts recovery (evidence: `backend/src/models/recuperacaoModel.js`)
- Recovery data → Recovery codes: protects codes (evidence: `backend/src/models/recuperacaoModel.js`)
- Recovery data → Password hashing: hashes new password (evidence: `backend/src/models/recuperacaoModel.js`)
- Question import → PostgreSQL pool: loads questions (evidence: `backend/scripts/importar-questoes.js`)
- Topic import → PostgreSQL pool: loads topics (evidence: `backend/scripts/importar-temas.js`)
