Skip to content

Commit 2564de3

Browse files
update README
1 parent b536912 commit 2564de3

File tree

121 files changed

+403
-326
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

121 files changed

+403
-326
lines changed

README.md

Lines changed: 89 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,131 @@
11
<!--
22
Construir um sistema de ponta a ponta que rastreia fóruns, processa o texto das threads, agrupa-as por assunto usando algoritmos de clusterização e apresenta os resultados através de uma API e uma interface web moderna, com um pipeline de implantação automatizado. -->
33

4-
[Documentação](https://docs.google.com/document/d/1iTnuSeAPAlk2lH9d5DYVGq13rWHw6SjgBQ8Ip_MBxJc/edit?usp=sharing)
4+
## Arquitetura
5+
6+
Utilizamos uma arquitetura monorepo separa em dois módulos, sendo eles backend e frontend.
7+
8+
### Frontend
9+
10+
- Para o frontend, foi utilizado o framework React em conjunto com Vite para sua configuração.
11+
12+
### Backend
13+
14+
- Para o backend, foi utilizado o framework Node.js e Express para sua configuração.
15+
516

617
## Utilizando Knex para BD
718

19+
- O projeto utiliza **Knex.js** como Query Builder para gerenciar a comunicação com o banco de dados. Esta escolha foi feita para permitir uma **estratégia de banco híbrida**, maximizando a produtividade no desenvolvimento e a performance em produção.
20+
21+
### Ambientes
22+
- **Desenvolvimento (SQLite):** Utilizamos SQLite localmente pela sua simplicidade. O banco reside em um arquivo local, facilitando testes e debugs.
23+
24+
- **Produção (PostgreSQL):** Utilizamos PostgreSQL (hospedado na Neon) para o deploy. Ele oferece a robustez, concorrência e segurança necessárias para uma aplicação real, além de tipos de dados mais rigorosos.
25+
26+
- **Hospedagem (Neon):** Escolhemos o serviço da [Neon](https://neon.com/) para hospedar o banco de produção na nuvem, de modo que as consultas e a persistência dos dados sejam gerenciadas de forma escalável e independente, alinhando-se perfeitamente à arquitetura serverless do backend na Vercel.
27+
828
### Inicialmente limpe o Banco
929

10-
- No terminal dentro da pasta backend, execute o comando: rm data/database.db
30+
- No terminal dentro da pasta **backend**, execute o comando: `rm data/database.db`
1131

1232

1333
### Criar migration
1434

15-
- No terminal dentro da pasta backend, execute o comando para criar uma migration: npx knex migrate:make tabelaDesejada --migrations-directory src/data/migrations
35+
- No terminal dentro da pasta **backend**, execute o comando para criar uma migration: `npx knex migrate:make tabelaDesejada --migrations-directory src/data/migrations`
1636

1737
### Atributos da tabela
1838

1939
- Escreva em código a tabela com seus atributos (use como exemplo a tabela Usuários)
2040

2141
### Rode a migration
2242

23-
- Para criar o arquivo em databse.bd, no terminal, na pasta backend/src, execute: npx knex migrate:latest --knexfile knexfile.ts
43+
- Para criar o arquivo em databse.bd, no terminal, na pasta **backend/src**, execute: `npx knex migrate:latest --knexfile knexfile.ts`
2444

2545

2646
## Criar seeds (popular tabelas)
2747

2848
### Crie o arquivo seed
2949

30-
- No terminal dentro da pasta backend, execute o comando para criar um seed: npx knex seed:make nomeTabela --knexfile src/knexfile.ts
50+
- No terminal dentro da pasta **backend**, execute o comando para criar um seed: `npx knex seed:make nomeTabela --knexfile src/knexfile.ts`
3151

3252
### Edite o seed
3353

3454
- Abra o arquivo criado e faça as modificações necessárias.
3555

3656
### Rode o seed
3757

38-
- Após rodar as migrações, dentro da pasta backend execute o comando: npx knex seed:run --knexfile src/knexfile.ts
58+
- Após rodar as migrações, dentro da pasta **backend** execute o comando: `npx knex seed:run --knexfile src/knexfile.ts`
59+
3960

61+
## Realização de testes
4062

41-
## Realização de testes
63+
### Backend
64+
- Para o backend foram utilizadas as bibliotecas **Jest** ( para rodar os testes ) e **Supertest** ( para simular as requisições HTTP para a API ).
65+
66+
### Frontend
67+
- Para o frontend, como o ambiente é composto por **Vite**, foi utilizado a biblioteca **Vitest** que é compatível com o **Jest** ( para rpdar os testes ), **React Testing Library** ( para renderizar componentes ) e **Happy-DOM** ( para simular o navegador ).
4268

4369
### Testes unitários:
44-
- No terminal dentro da pasta backend, execute o comando: npm test
70+
- No terminal dentro da pasta **backend** ou **frontend**, execute o comando: `npm test`
4571

4672
### Cobertura de testes:
47-
- No terminal dentro da pasta backend, execute o comando: npm run test:coverage
73+
- No terminal dentro da pasta **backend**, execute o comando: `npm run test:coverage`
74+
75+
- Para verificar a cobertura de testes, entre na pasta **backend/src/coverage/lcov-report** e abra o arquivo index.html no navegador para melhor análise.
76+
77+
- No terminal dentro da pasta **frontend**, execute o comando: `npm run test:coverage`
78+
79+
- Para verificar a cobertura de testes, entre na pasta **frontend/coverage** e abra o arquivo index.html no navegador para melhor análise.
80+
81+
## Qualidade de Código
82+
83+
Para garantir a manutenibilidade e segurança do projeto, utilizamos a plataforma **[Qlty.sh](https://qlty.sh/)** integrada ao nosso pipeline de CI/CD (GitHub Actions).
84+
85+
A ferramenta realiza uma análise em todo o monorepo (Frontend e Backend) a cada *push* ou *pull request*, verificando:
86+
87+
* **Linting e Padrões:** Verifica se o código segue as melhores práticas de TypeScript/React e Node.js.
88+
* **Segurança:** Detecta segredos expostos (chaves de API, senhas) e vulnerabilidades em dependências.
89+
* **Code smells:** Identifica funções complexas, código duplicado e outros code smells que dificultam a manutenção.
90+
91+
### Gestão Automática de Dívida Técnica
92+
Nosso pipeline possui um script personalizado que processa os relatórios gerados pela Qlty. Se um "Code Smell" ou vulnerabilidade for encontrado, o sistema **cria automaticamente uma Issue no GitHub** com a tag `technical-debt`, contendo:
93+
* O arquivo e a linha do problema.
94+
* A regra violada.
95+
* A sugestão de correção.
96+
97+
98+
## Deploy e Infraestrutura
99+
100+
A aplicação utiliza uma arquitetura **Serverless** moderna, hospedada inteiramente na nuvem para garantir escalabilidade e alta disponibilidade.
101+
102+
### Arquitetura de Hospedagem (Vercel)
103+
O projeto está estruturado como um **Monorepo**, mas o deploy é realizado em dois serviços distintos dentro da [Vercel](https://vercel.com/):
104+
105+
1. **Backend (API Serverless):**
106+
* Hospedado como *Serverless Functions* utilizando o runtime do Node.js.
107+
* Ponto de entrada configurado via `vercel.json` para redirecionar tráfego para `api/index.ts`.
108+
* Gerencia a conexão com o banco de dados e regras de negócio.
109+
110+
2. **Frontend (SPA React):**
111+
* Hospedado como site estático otimizado.
112+
* Comunica-se com o Backend através da variável de ambiente `VITE_API_URL`.
113+
114+
### Pipeline de CI/CD (GitHub Actions)
115+
O deploy é totalmente automatizado via **GitHub Actions**. O fluxo de entrega contínua funciona da seguinte maneira:
116+
117+
1. **Push na Main:** Ao aprovar um Pull Request para a branch `main`.
118+
2. **Testes e Qualidade:** O pipeline executa os testes automatizados (Backend e Frontend) e a análise de qualidade (Qlty).
119+
3. **Migração de Banco de Dados:** O GitHub Actions conecta-se ao banco de produção (Neon) e executa as `migrations` do Knex para garantir que a estrutura das tabelas esteja atualizada.
120+
4. **Deploy Vercel:** A Vercel detecta a alteração, realiza o build do Backend e do Frontend separadamente e publica a nova versão.
48121

49-
- No terminal dentro da pasta frontend, execute o comando: npm run test:coverage
122+
### Variáveis de Ambiente Necessárias
123+
Para rodar este projeto em produção (ou localmente conectado à nuvem), as seguintes variáveis são necessárias:
50124

51-
- Para verificar a cobertura de testes, entre na pasta backend/src/coverage/lcov-report e abra o arquivo index.html no navegador para melhor análise.
125+
**Backend:**
126+
- `DATABASE_URL`: String de conexão do PostgreSQL (Neon).
127+
- `TOKEN_SECRET`: Chave secreta para assinatura de tokens JWT.
52128

129+
**Frontend:**
130+
- `VITE_API_URL`: URL onde o backend está hospedado (ex: `https://seu-backend.vercel.app`).
53131

54-
## Configuração da verificação de code smells:

backend/src/business/businessLogicProfile.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class businessLogicProfile{
1111

1212
const fieldsToUpdate: any = {};
1313

14-
if (data.nomeCompleto) fieldsToUpdate.fullName = data.nomeCompleto; // Note a conversão de nome
14+
if (data.nomeCompleto) fieldsToUpdate.fullName = data.nomeCompleto;
1515
if (data.email) fieldsToUpdate.email = data.email;
1616
if (data.username) fieldsToUpdate.username = data.username;
1717
if (data.telefone) fieldsToUpdate.phone = data.telefone;

backend/src/coverage/clover.xml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<coverage generated="1764638666203" clover="3.2.0">
3-
<project timestamp="1764638666203" name="All files">
2+
<coverage generated="1764696623502" clover="3.2.0">
3+
<project timestamp="1764696623502" name="All files">
44
<metrics statements="439" coveredstatements="381" conditionals="129" coveredconditionals="84" methods="96" coveredmethods="81" elements="664" coveredelements="546" complexity="0" loc="439" ncloc="439" packages="4" files="8" classes="8"/>
55
<package name="src">
66
<metrics statements="110" coveredstatements="105" conditionals="0" coveredconditionals="0" methods="27" coveredmethods="25"/>
7-
<file name="app.ts" path="/home/cecilia/Documents/CTable/backend/src/app.ts">
7+
<file name="app.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/app.ts">
88
<metrics statements="13" coveredstatements="13" conditionals="0" coveredconditionals="0" methods="4" coveredmethods="4"/>
99
<line num="1" count="5" type="stmt"/>
1010
<line num="2" count="5" type="stmt"/>
@@ -20,7 +20,7 @@
2020
<line num="26" count="5" type="stmt"/>
2121
<line num="30" count="5" type="stmt"/>
2222
</file>
23-
<file name="routes.ts" path="/home/cecilia/Documents/CTable/backend/src/routes.ts">
23+
<file name="routes.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/routes.ts">
2424
<metrics statements="97" coveredstatements="92" conditionals="0" coveredconditionals="0" methods="23" coveredmethods="21"/>
2525
<line num="1" count="5" type="stmt"/>
2626
<line num="2" count="5" type="stmt"/>
@@ -123,7 +123,7 @@
123123
</package>
124124
<package name="src.business">
125125
<metrics statements="215" coveredstatements="183" conditionals="125" coveredconditionals="81" methods="44" coveredmethods="34"/>
126-
<file name="businessLogicAuth.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicAuth.ts">
126+
<file name="businessLogicAuth.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicAuth.ts">
127127
<metrics statements="28" coveredstatements="28" conditionals="10" coveredconditionals="9" methods="2" coveredmethods="2"/>
128128
<line num="3" count="5" type="stmt"/>
129129
<line num="4" count="5" type="stmt"/>
@@ -154,7 +154,7 @@
154154
<line num="80" count="2" type="stmt"/>
155155
<line num="88" count="5" type="stmt"/>
156156
</file>
157-
<file name="businessLogicCommunity.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicCommunity.ts">
157+
<file name="businessLogicCommunity.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicCommunity.ts">
158158
<metrics statements="91" coveredstatements="77" conditionals="55" coveredconditionals="36" methods="22" coveredmethods="15"/>
159159
<line num="1" count="5" type="stmt"/>
160160
<line num="10" count="17" type="stmt"/>
@@ -248,7 +248,7 @@
248248
<line num="306" count="0" type="stmt"/>
249249
<line num="314" count="5" type="stmt"/>
250250
</file>
251-
<file name="businessLogicProfile.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicProfile.ts">
251+
<file name="businessLogicProfile.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicProfile.ts">
252252
<metrics statements="23" coveredstatements="20" conditionals="16" coveredconditionals="11" methods="2" coveredmethods="2"/>
253253
<line num="1" count="5" type="stmt"/>
254254
<line num="3" count="5" type="stmt"/>
@@ -274,7 +274,7 @@
274274
<line num="54" count="2" type="stmt"/>
275275
<line num="60" count="5" type="stmt"/>
276276
</file>
277-
<file name="businessLogicProject.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicProject.ts">
277+
<file name="businessLogicProject.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicProject.ts">
278278
<metrics statements="73" coveredstatements="58" conditionals="44" coveredconditionals="25" methods="18" coveredmethods="15"/>
279279
<line num="2" count="5" type="stmt"/>
280280
<line num="9" count="17" type="stmt"/>
@@ -353,7 +353,7 @@
353353
</package>
354354
<package name="src.controller">
355355
<metrics statements="110" coveredstatements="89" conditionals="4" coveredconditionals="3" methods="24" coveredmethods="21"/>
356-
<file name="requestController.ts" path="/home/cecilia/Documents/CTable/backend/src/controller/requestController.ts">
356+
<file name="requestController.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/controller/requestController.ts">
357357
<metrics statements="110" coveredstatements="89" conditionals="4" coveredconditionals="3" methods="24" coveredmethods="21"/>
358358
<line num="1" count="5" type="stmt"/>
359359
<line num="2" count="5" type="stmt"/>
@@ -469,7 +469,7 @@
469469
</package>
470470
<package name="src.utils">
471471
<metrics statements="4" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="1" coveredmethods="1"/>
472-
<file name="validationUser.ts" path="/home/cecilia/Documents/CTable/backend/src/utils/validationUser.ts">
472+
<file name="validationUser.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/utils/validationUser.ts">
473473
<metrics statements="4" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="1" coveredmethods="1"/>
474474
<line num="1" count="5" type="stmt"/>
475475
<line num="4" count="5" type="stmt"/>

0 commit comments

Comments
 (0)