Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
84689fd
config: novo teste
nicolasreisdev Nov 20, 2025
4149190
config: atualização de pipeline e novo teste.
nicolasreisdev Nov 20, 2025
27f1b23
config: desconsiderando testes para testar a pipeline.
nicolasreisdev Nov 20, 2025
f79086b
config: adaptando testes para testar pipeline
nicolasreisdev Nov 20, 2025
d430a0a
config: teste apos configuração em qlty.sh
nicolasreisdev Nov 20, 2025
92cd173
config: novo teste
nicolasreisdev Nov 20, 2025
734482a
config: teste
nicolasreisdev Nov 20, 2025
8b23e3f
config: teste comments
nicolasreisdev Nov 20, 2025
28cc71d
config: teste criação de issues.
nicolasreisdev Nov 20, 2025
2c41ceb
fix pipe config
nicolasreisdev Nov 20, 2025
d292b6d
fix qlty error
nicolasreisdev Nov 20, 2025
5a6ed84
pelo amor de Deus funciona
nicolasreisdev Nov 20, 2025
121953b
por favor
nicolasreisdev Nov 20, 2025
ab54d11
agora acho que o comando esta certo
nicolasreisdev Nov 20, 2025
fa68c67
ta quase
nicolasreisdev Nov 20, 2025
eaa563c
por favor
nicolasreisdev Nov 20, 2025
b8d4a96
ultima tentativa
nicolasreisdev Nov 20, 2025
d62e93d
vamo
nicolasreisdev Nov 20, 2025
7c27468
fui burro e esqueci de tirar o bgl da pipe
nicolasreisdev Nov 20, 2025
2c21a79
pls
nicolasreisdev Nov 20, 2025
8fa7203
pls
nicolasreisdev Nov 20, 2025
5b1cc6b
new test
nicolasreisdev Nov 21, 2025
5a468d6
new command in CLI
nicolasreisdev Nov 21, 2025
fe73e67
CLI funcionando, tentar criar issues.
nicolasreisdev Nov 21, 2025
b8de83d
fix issues create
nicolasreisdev Nov 21, 2025
16136c5
fix create
nicolasreisdev Nov 21, 2025
e6b1c05
fix erros: new test
nicolasreisdev Nov 21, 2025
9d45c6b
Merge branch 'main' of https://github.com/nicolasreisdev/CTable into …
nicolasreisdev Nov 21, 2025
4d92fc8
config issues create and fix #86, Close #86
nicolasreisdev Nov 21, 2025
c33617c
Refactor: Implementação completa das correções de validação e estabil…
nicolasreisdev Nov 21, 2025
04c2802
Merge branch 'back/ceci' of https://github.com/nicolasreisdev/CTable …
nicolasreisdev Nov 21, 2025
36036ce
adicionando lógica de criação de comunidade e iniciando endpoint
nicolasreisdev Nov 21, 2025
709b988
adicionando funcionalidade de criar comunidade.
nicolasreisdev Nov 21, 2025
568d691
add novos endpoints válidos para comunidades.
nicolasreisdev Nov 22, 2025
c781ca1
Merge branch 'main' of https://github.com/nicolasreisdev/CTable into …
nicolasreisdev Nov 22, 2025
3ecf31f
feature: adicionando endpoints de retorno de comunidades do usuário e…
nicolasreisdev Nov 25, 2025
31baaec
feature: new features for community
nicolasreisdev Nov 25, 2025
3ae528b
resolve merge
nicolasreisdev Nov 29, 2025
12f3e7f
adicionando lógica de comentários em projetos.
nicolasreisdev Nov 29, 2025
e936fe7
adicionando lógica para sair de comunidade.
nicolasreisdev Nov 29, 2025
9088a47
finalizando endpoints e features
nicolasreisdev Nov 30, 2025
917df18
fix errors and new feature for feed
nicolasreisdev Nov 30, 2025
af8bfe3
Merge branch 'main' of https://github.com/nicolasreisdev/CTable into …
nicolasreisdev Nov 30, 2025
85fccc6
teste no backend e frontend. Criação de issues e pipeline atualizados.
nicolasreisdev Nov 30, 2025
03d775f
fix errors in pipeline
nicolasreisdev Nov 30, 2025
daedf85
Merge branch 'main' into deploy/nicolas
nicolasreisdev Nov 30, 2025
5153a0f
fix errors in pipeline
nicolasreisdev Nov 30, 2025
b52fa43
fix errors in pipeline
nicolasreisdev Nov 30, 2025
e00b482
config visualization
nicolasreisdev Dec 1, 2025
7de8658
Merge branch 'main' into deploy/nicolas
nicolasreisdev Dec 1, 2025
6e537d4
fix error
nicolasreisdev Dec 1, 2025
df6f42d
Merge branch 'deploy/nicolas' of https://github.com/nicolasreisdev/CT…
nicolasreisdev Dec 1, 2025
8cf13db
test for deploy
nicolasreisdev Dec 1, 2025
10af266
fix errors
nicolasreisdev Dec 1, 2025
210cec3
Merge branch 'main' into deploy/nicolas
nicolasreisdev Dec 1, 2025
9b4360d
fix vercel error
nicolasreisdev Dec 1, 2025
55d4f8e
Merge branch 'deploy/nicolas' of https://github.com/nicolasreisdev/CT…
nicolasreisdev Dec 1, 2025
f79620e
refatoração para deploy do frontend
nicolasreisdev Dec 1, 2025
13764f4
feature de rotas públicas e privadas
nicolasreisdev Dec 1, 2025
a270960
refatoração para deploy
nicolasreisdev Dec 1, 2025
64912f8
Merge branch 'main' of https://github.com/nicolasreisdev/CTable into …
nicolasreisdev Dec 1, 2025
f69c198
update
nicolasreisdev Dec 2, 2025
9bf2c86
Merge branch 'main' of https://github.com/nicolasreisdev/CTable into …
nicolasreisdev Dec 2, 2025
b536912
Merge branch 'main' of https://github.com/nicolasreisdev/CTable into …
nicolasreisdev Dec 2, 2025
2564de3
update README
nicolasreisdev Dec 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 89 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,131 @@
<!--
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. -->

[Documentação](https://docs.google.com/document/d/1iTnuSeAPAlk2lH9d5DYVGq13rWHw6SjgBQ8Ip_MBxJc/edit?usp=sharing)
## Arquitetura

Utilizamos uma arquitetura monorepo separa em dois módulos, sendo eles backend e frontend.

### Frontend

- Para o frontend, foi utilizado o framework React em conjunto com Vite para sua configuração.

### Backend

- Para o backend, foi utilizado o framework Node.js e Express para sua configuração.


## Utilizando Knex para BD

- 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.

### Ambientes
- **Desenvolvimento (SQLite):** Utilizamos SQLite localmente pela sua simplicidade. O banco reside em um arquivo local, facilitando testes e debugs.

- **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.

- **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.

### Inicialmente limpe o Banco

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


### Criar migration

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

### Atributos da tabela

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

### Rode a migration

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


## Criar seeds (popular tabelas)

### Crie o arquivo seed

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

### Edite o seed

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

### Rode o seed

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


## Realização de testes

## Realização de testes
### Backend
- Para o backend foram utilizadas as bibliotecas **Jest** ( para rodar os testes ) e **Supertest** ( para simular as requisições HTTP para a API ).

### Frontend
- 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 ).

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

### Cobertura de testes:
- No terminal dentro da pasta backend, execute o comando: npm run test:coverage
- No terminal dentro da pasta **backend**, execute o comando: `npm run test:coverage`

- 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.

- No terminal dentro da pasta **frontend**, execute o comando: `npm run test:coverage`

- Para verificar a cobertura de testes, entre na pasta **frontend/coverage** e abra o arquivo index.html no navegador para melhor análise.

## Qualidade de Código

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).

A ferramenta realiza uma análise em todo o monorepo (Frontend e Backend) a cada *push* ou *pull request*, verificando:

* **Linting e Padrões:** Verifica se o código segue as melhores práticas de TypeScript/React e Node.js.
* **Segurança:** Detecta segredos expostos (chaves de API, senhas) e vulnerabilidades em dependências.
* **Code smells:** Identifica funções complexas, código duplicado e outros code smells que dificultam a manutenção.

### Gestão Automática de Dívida Técnica
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:
* O arquivo e a linha do problema.
* A regra violada.
* A sugestão de correção.


## Deploy e Infraestrutura

A aplicação utiliza uma arquitetura **Serverless** moderna, hospedada inteiramente na nuvem para garantir escalabilidade e alta disponibilidade.

### Arquitetura de Hospedagem (Vercel)
O projeto está estruturado como um **Monorepo**, mas o deploy é realizado em dois serviços distintos dentro da [Vercel](https://vercel.com/):

1. **Backend (API Serverless):**
* Hospedado como *Serverless Functions* utilizando o runtime do Node.js.
* Ponto de entrada configurado via `vercel.json` para redirecionar tráfego para `api/index.ts`.
* Gerencia a conexão com o banco de dados e regras de negócio.

2. **Frontend (SPA React):**
* Hospedado como site estático otimizado.
* Comunica-se com o Backend através da variável de ambiente `VITE_API_URL`.

### Pipeline de CI/CD (GitHub Actions)
O deploy é totalmente automatizado via **GitHub Actions**. O fluxo de entrega contínua funciona da seguinte maneira:

1. **Push na Main:** Ao aprovar um Pull Request para a branch `main`.
2. **Testes e Qualidade:** O pipeline executa os testes automatizados (Backend e Frontend) e a análise de qualidade (Qlty).
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.
4. **Deploy Vercel:** A Vercel detecta a alteração, realiza o build do Backend e do Frontend separadamente e publica a nova versão.

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

- 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.
**Backend:**
- `DATABASE_URL`: String de conexão do PostgreSQL (Neon).
- `TOKEN_SECRET`: Chave secreta para assinatura de tokens JWT.

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

## Configuração da verificação de code smells:
2 changes: 1 addition & 1 deletion backend/src/business/businessLogicProfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class businessLogicProfile{

const fieldsToUpdate: any = {};

if (data.nomeCompleto) fieldsToUpdate.fullName = data.nomeCompleto; // Note a conversão de nome
if (data.nomeCompleto) fieldsToUpdate.fullName = data.nomeCompleto;
if (data.email) fieldsToUpdate.email = data.email;
if (data.username) fieldsToUpdate.username = data.username;
if (data.telefone) fieldsToUpdate.phone = data.telefone;
Expand Down
20 changes: 10 additions & 10 deletions backend/src/coverage/clover.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1764638666203" clover="3.2.0">
<project timestamp="1764638666203" name="All files">
<coverage generated="1764696623502" clover="3.2.0">
<project timestamp="1764696623502" name="All files">
<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"/>
<package name="src">
<metrics statements="110" coveredstatements="105" conditionals="0" coveredconditionals="0" methods="27" coveredmethods="25"/>
<file name="app.ts" path="/home/cecilia/Documents/CTable/backend/src/app.ts">
<file name="app.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/app.ts">
<metrics statements="13" coveredstatements="13" conditionals="0" coveredconditionals="0" methods="4" coveredmethods="4"/>
<line num="1" count="5" type="stmt"/>
<line num="2" count="5" type="stmt"/>
Expand All @@ -20,7 +20,7 @@
<line num="26" count="5" type="stmt"/>
<line num="30" count="5" type="stmt"/>
</file>
<file name="routes.ts" path="/home/cecilia/Documents/CTable/backend/src/routes.ts">
<file name="routes.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/routes.ts">
<metrics statements="97" coveredstatements="92" conditionals="0" coveredconditionals="0" methods="23" coveredmethods="21"/>
<line num="1" count="5" type="stmt"/>
<line num="2" count="5" type="stmt"/>
Expand Down Expand Up @@ -123,7 +123,7 @@
</package>
<package name="src.business">
<metrics statements="215" coveredstatements="183" conditionals="125" coveredconditionals="81" methods="44" coveredmethods="34"/>
<file name="businessLogicAuth.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicAuth.ts">
<file name="businessLogicAuth.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicAuth.ts">
<metrics statements="28" coveredstatements="28" conditionals="10" coveredconditionals="9" methods="2" coveredmethods="2"/>
<line num="3" count="5" type="stmt"/>
<line num="4" count="5" type="stmt"/>
Expand Down Expand Up @@ -154,7 +154,7 @@
<line num="80" count="2" type="stmt"/>
<line num="88" count="5" type="stmt"/>
</file>
<file name="businessLogicCommunity.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicCommunity.ts">
<file name="businessLogicCommunity.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicCommunity.ts">
<metrics statements="91" coveredstatements="77" conditionals="55" coveredconditionals="36" methods="22" coveredmethods="15"/>
<line num="1" count="5" type="stmt"/>
<line num="10" count="17" type="stmt"/>
Expand Down Expand Up @@ -248,7 +248,7 @@
<line num="306" count="0" type="stmt"/>
<line num="314" count="5" type="stmt"/>
</file>
<file name="businessLogicProfile.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicProfile.ts">
<file name="businessLogicProfile.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicProfile.ts">
<metrics statements="23" coveredstatements="20" conditionals="16" coveredconditionals="11" methods="2" coveredmethods="2"/>
<line num="1" count="5" type="stmt"/>
<line num="3" count="5" type="stmt"/>
Expand All @@ -274,7 +274,7 @@
<line num="54" count="2" type="stmt"/>
<line num="60" count="5" type="stmt"/>
</file>
<file name="businessLogicProject.ts" path="/home/cecilia/Documents/CTable/backend/src/business/businessLogicProject.ts">
<file name="businessLogicProject.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/business/businessLogicProject.ts">
<metrics statements="73" coveredstatements="58" conditionals="44" coveredconditionals="25" methods="18" coveredmethods="15"/>
<line num="2" count="5" type="stmt"/>
<line num="9" count="17" type="stmt"/>
Expand Down Expand Up @@ -353,7 +353,7 @@
</package>
<package name="src.controller">
<metrics statements="110" coveredstatements="89" conditionals="4" coveredconditionals="3" methods="24" coveredmethods="21"/>
<file name="requestController.ts" path="/home/cecilia/Documents/CTable/backend/src/controller/requestController.ts">
<file name="requestController.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/controller/requestController.ts">
<metrics statements="110" coveredstatements="89" conditionals="4" coveredconditionals="3" methods="24" coveredmethods="21"/>
<line num="1" count="5" type="stmt"/>
<line num="2" count="5" type="stmt"/>
Expand Down Expand Up @@ -469,7 +469,7 @@
</package>
<package name="src.utils">
<metrics statements="4" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="1" coveredmethods="1"/>
<file name="validationUser.ts" path="/home/cecilia/Documents/CTable/backend/src/utils/validationUser.ts">
<file name="validationUser.ts" path="/home/nicolas/Área de Trabalho/CTable/backend/src/utils/validationUser.ts">
<metrics statements="4" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="1" coveredmethods="1"/>
<line num="1" count="5" type="stmt"/>
<line num="4" count="5" type="stmt"/>
Expand Down
Loading
Loading