|
1 | 1 | <!-- |
2 | 2 | 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. --> |
3 | 3 |
|
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 | + |
5 | 16 |
|
6 | 17 | ## Utilizando Knex para BD |
7 | 18 |
|
| 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 | + |
8 | 28 | ### Inicialmente limpe o Banco |
9 | 29 |
|
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` |
11 | 31 |
|
12 | 32 |
|
13 | 33 | ### Criar migration |
14 | 34 |
|
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` |
16 | 36 |
|
17 | 37 | ### Atributos da tabela |
18 | 38 |
|
19 | 39 | - Escreva em código a tabela com seus atributos (use como exemplo a tabela Usuários) |
20 | 40 |
|
21 | 41 | ### Rode a migration |
22 | 42 |
|
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` |
24 | 44 |
|
25 | 45 |
|
26 | 46 | ## Criar seeds (popular tabelas) |
27 | 47 |
|
28 | 48 | ### Crie o arquivo seed |
29 | 49 |
|
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` |
31 | 51 |
|
32 | 52 | ### Edite o seed |
33 | 53 |
|
34 | 54 | - Abra o arquivo criado e faça as modificações necessárias. |
35 | 55 |
|
36 | 56 | ### Rode o seed |
37 | 57 |
|
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 | + |
39 | 60 |
|
| 61 | +## Realização de testes |
40 | 62 |
|
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 ). |
42 | 68 |
|
43 | 69 | ### 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` |
45 | 71 |
|
46 | 72 | ### 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. |
48 | 121 |
|
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: |
50 | 124 |
|
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. |
52 | 128 |
|
| 129 | +**Frontend:** |
| 130 | +- `VITE_API_URL`: URL onde o backend está hospedado (ex: `https://seu-backend.vercel.app`). |
53 | 131 |
|
54 | | -## Configuração da verificação de code smells: |
|
0 commit comments