|
1 | | -# Teste Técnico para Desenvolvedor - Processamento de Documentos |
2 | | - |
3 | | -## Objetivo |
4 | | -Criar uma API que processe documentos (PDF e páginas web), extraia dados, armazene em um banco de dados e associe esses documentos a clientes cadastrados. |
5 | | - |
6 | | -## Requisitos Técnicos |
7 | | - |
8 | | -### 1. Estrutura da API |
9 | | -- Linguagem: Python EX: (FastAPI, Django REST Framework) ou Node.js EX: (Express/NestJS) |
10 | | -- Banco de dados: PostgreSQL (ou outro banco relacional) |
11 | | -- Processamento de PDF: QUalquer lib da preferencia |
12 | | -- Web scraping: BeautifulSoup (Python)/ Cheerio (Node.js) ou outra ferramenta da preferencia |
13 | | - |
14 | | -### 2. Funcionalidades |
15 | | - |
16 | | -#### Cadastro de Clientes |
17 | | -- CRUD completo para clientes |
18 | | -- Campos mínimos: ID, Nome, Email, Data de Cadastro |
19 | | - |
20 | | -#### Processamento de Documentos |
21 | | -- Endpoint para upload de PDF |
22 | | -- Endpoint para fornecer URL de página web |
23 | | -- Extração de dados dos documentos (pelo menos: título, conteúdo, data de processamento) |
24 | | -- Armazenamento dos documentos processados no banco de dados |
25 | | - |
26 | | -#### Associação de Documentos |
27 | | -- Cada documento processado deve ser associado a um cliente existente |
28 | | -- Relação 1:N (um cliente pode ter vários documentos) |
29 | | - |
30 | | -#### Consultas |
31 | | -- Listar todos os clientes com contagem de documentos |
32 | | -- Listar todos os documentos de um cliente específico |
33 | | -- Buscar documentos por usuario retornando os campos |
34 | | - |
35 | | -## Instruções para o Candidato |
36 | | - |
37 | | -1. Crie um repositorio no github para esse desafio |
38 | | -2. Implemente a API conforme os requisitos |
39 | | -3. Adicione um arquivo README.md com: |
40 | | - - Instruções para execução |
41 | | - - Exemplos de requisições |
42 | | - - Qualquer observação relevante |
43 | | -4. Crie um Dockerfile para containerizar a aplicação |
44 | | -5. Adicione testes unitários e de integração |
45 | | -6. (Opcional) Adicione autenticação JWT para proteger os endpoints |
46 | | - |
47 | | -## Critérios de Avaliação |
48 | | - |
49 | | -1. **Funcionalidade**: Todos os endpoints funcionando corretamente |
50 | | -2. **Qualidade de Código**: Organização, legibilidade, padrões de código |
51 | | -3. **Tratamento de Erros**: Mensagens claras e tratamento adequado |
52 | | -4. **Performance**: Processamento eficiente dos documentos |
53 | | -5. **Documentação**: README claro e exemplos de uso |
54 | | -6. **Testes**: Cobertura e qualidade dos testes |
| 1 | +# Backend Challenge - Processamento de Documentos |
| 2 | + |
| 3 | +## 📌 Visão Geral |
| 4 | + |
| 5 | +Este projeto é uma API desenvolvida para processar documentos (PDFs e páginas web), extrair dados, armazená-los em um banco de dados e associá-los a clientes cadastrados. A aplicação foi construída utilizando **NestJS** e segue boas práticas de desenvolvimento, como Design Pattern Singleton, SOLID, autenticação JWT, e integração com Docker. |
| 6 | + |
| 7 | +### Funcionalidades Principais |
| 8 | + |
| 9 | +- **Cadastro de Clientes**: CRUD completo para gerenciar clientes. |
| 10 | +- **Processamento de Documentos**: |
| 11 | + - Upload de PDFs e extração de título e conteúdo. |
| 12 | + - Processamento de páginas web via URL. |
| 13 | +- **Associação de Documentos**: Relacionamento 1:N entre clientes e documentos. |
| 14 | +- **Consultas**: |
| 15 | + - Listar clientes com contagem de documentos. |
| 16 | + - Listar documentos de um cliente específico. |
| 17 | + - Buscar documentos por cliente. |
| 18 | +- **Autenticação JWT**: Proteção de endpoints com autenticação baseada em tokens. |
| 19 | +- **Testes Automatizados**: Cobertura de testes unitários e de integração. |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## 🔥 Stack Utilizada |
| 24 | + |
| 25 | +- **Node.js**: Plataforma de execução JavaScript. |
| 26 | +- **NestJS**: Framework modular para construção de APIs escaláveis. |
| 27 | +- **PostgreSQL**: Banco de dados relacional. |
| 28 | +- **Prisma**: ORM para manipulação do banco de dados. |
| 29 | +- **JWT**: Autenticação baseada em tokens. |
| 30 | +- **Bcrypt**: Hash seguro de senhas. |
| 31 | +- **Cheerio**: Web scraping para extração de dados de páginas HTML. |
| 32 | +- **PDF-Parse**: Extração de dados de arquivos PDF. |
| 33 | +- **Docker**: Containerização para ambientes de desenvolvimento e produção. |
| 34 | +- **Jest**: Framework de testes unitários e de integração. |
| 35 | + |
| 36 | +--- |
| 37 | + |
| 38 | +## 🚀 Tecnologias Utilizadas |
| 39 | + |
| 40 | +- **Linguagem**: TypeScript |
| 41 | +- **Framework**: NestJS |
| 42 | +- **ORM**: Prisma |
| 43 | +- **Autenticação**: JWT e Bcrypt |
| 44 | +- **Validação de Dados**: Class Validator |
| 45 | +- **Testes**: Jest e Supertest |
| 46 | +- **Containerização**: Docker |
| 47 | +- **Web Scraping**: Cheerio |
| 48 | +- **Processamento de PDFs**: PDF-Parse |
| 49 | + |
| 50 | +--- |
| 51 | + |
| 52 | +## 📂 Estrutura do Projeto |
| 53 | + |
| 54 | +```plaintext |
| 55 | +/src |
| 56 | +|-- controllers/ # Controladores para gerenciar rotas |
| 57 | +|-- services/ # Lógica de negócios e integração com repositórios |
| 58 | +|-- repositories/ # Acesso ao banco de dados via Prisma |
| 59 | +|-- dtos/ # Data Transfer Objects para validação de dados |
| 60 | +|-- contracts/ # Interfaces e tipos compartilhados |
| 61 | +|-- errors/ # Classes de exceção personalizadas |
| 62 | +|-- config/ # Configurações da aplicação (ex.: banco de dados) |
| 63 | +|-- common/ # Pipes, guards e utilitários |
| 64 | +|-- main.ts # Arquivo principal da aplicação |
| 65 | +``` |
| 66 | + |
| 67 | +--- |
| 68 | + |
| 69 | +## 🛠️ Instalação do Projeto |
| 70 | + |
| 71 | +### Pré-requisitos |
| 72 | + |
| 73 | +- **Node.js**: Certifique-se de ter o Node.js instalado (v20.12 ou superior). |
| 74 | +- **Docker**: Instale o Docker e o Docker Compose para rodar os serviços. |
| 75 | +- **PostgreSQL**: Banco de dados utilizado pela aplicação. |
| 76 | + |
| 77 | +### Passos para Instalação |
| 78 | + |
| 79 | +### 1. Clone o repositório: |
| 80 | + |
| 81 | +```bash |
| 82 | +git clone https://github.com/seu-usuario/backend-challenge.git |
| 83 | +``` |
| 84 | + |
| 85 | +### 2. **Instale as dependências**: |
| 86 | + |
| 87 | +No diretório raiz do projeto, execute o seguinte comando para instalar todas as dependências necessárias: |
| 88 | + |
| 89 | +```bash |
| 90 | +npm install |
| 91 | +``` |
| 92 | + |
| 93 | +### 3. **Inicie a aplicação**: |
| 94 | + |
| 95 | +Execute o seguinte comando para iniciar a aplicação em modo de desenvolvimento: |
| 96 | + |
| 97 | +```bash |
| 98 | +npm run start:dev |
| 99 | +``` |
| 100 | + |
| 101 | +## 🖥️ Como Rodar a API |
| 102 | + |
| 103 | +### Ambiente de Desenvolvimento |
| 104 | + |
| 105 | +#### 1. **Inicie os serviços do Docker:** |
| 106 | + |
| 107 | +No diretório do projeto, execute o seguinte comando para subir os contêineres Docker que irão rodar o banco de dados e a aplicação: |
| 108 | + |
| 109 | +```bash |
| 110 | +docker-compose up -d postgres |
| 111 | +``` |
| 112 | + |
| 113 | +#### 2. **Instale as dependências:** |
| 114 | + |
| 115 | +No diretório raiz do projeto, execute o seguinte comando para instalar todas as dependências necessárias: |
| 116 | + |
| 117 | +```bash |
| 118 | +npm install |
| 119 | +``` |
| 120 | + |
| 121 | +#### 3. **Execute as migrações do Prisma:** |
| 122 | + |
| 123 | +Para configurar o banco de dados com as tabelas necessárias, execute as migrações do Prisma: |
| 124 | + |
| 125 | +```bash |
| 126 | +npx prisma migrate dev |
| 127 | +``` |
| 128 | + |
| 129 | +#### 4. **Inicie a aplicação:** |
| 130 | + |
| 131 | +Para iniciar a aplicação, use o seguinte comando: |
| 132 | + |
| 133 | +```bash |
| 134 | +npm run start:dev |
| 135 | +``` |
| 136 | + |
| 137 | +#### 5. Acesse a API |
| 138 | + |
| 139 | +Após iniciar a aplicação, ela estará disponível em: |
| 140 | + |
| 141 | +```bash |
| 142 | +http://localhost:3000/ |
| 143 | +``` |
| 144 | + |
| 145 | +### Ambiente de Produção |
| 146 | + |
| 147 | +#### 1. **Inicie a aplicação pelo Docker-Compose:** |
| 148 | + |
| 149 | +No diretório do projeto, execute o seguinte comando para subir os contêineres Docker que irão rodar o banco de dados e a aplicação: |
| 150 | + |
| 151 | +```bash |
| 152 | +docker-compose up -d |
| 153 | +``` |
| 154 | + |
| 155 | +#### 2. Acesse a API |
| 156 | + |
| 157 | +Após iniciar a aplicação, ela estará disponível em: |
| 158 | + |
| 159 | +```bash |
| 160 | +http://localhost:3000/ |
| 161 | +``` |
| 162 | + |
| 163 | +## 📚 Principais Rotas da API |
| 164 | + |
| 165 | +### Autenticação |
| 166 | + |
| 167 | +- **POST /auth/login**: |
| 168 | + - Autentica um usuário e retorna um token JWT. |
| 169 | + - **Body**: |
| 170 | + - `email`: E-mail do usuário. |
| 171 | + - `password`: Senha do usuário. |
| 172 | + - **Resposta**: |
| 173 | + - `token`: Token JWT gerado para autenticação. |
| 174 | + |
| 175 | +### Clientes |
| 176 | + |
| 177 | +- **POST /client**: |
| 178 | + |
| 179 | + - Cria um novo cliente. |
| 180 | + - **Body**: |
| 181 | + - `name`: Nome do cliente. |
| 182 | + - `email`: E-mail do cliente. |
| 183 | + - `password`: Senha do cliente. |
| 184 | + - **Resposta**: |
| 185 | + - `client`: Cliente recém-criado. |
| 186 | + |
| 187 | +- **GET /client**: |
| 188 | + |
| 189 | + - Lista todos os clientes. |
| 190 | + - **Resposta**: |
| 191 | + - `clients`: Lista de todos os clientes registrados no sistema. |
| 192 | + |
| 193 | +- **GET /client/document**: |
| 194 | + |
| 195 | + - Lista todos os documentos associados ao cliente autenticado. |
| 196 | + - **Headers**: |
| 197 | + - `Authorization`: Token JWT válido. |
| 198 | + - **Resposta**: |
| 199 | + - `documents`: Lista de documentos pertencentes ao cliente autenticado. |
| 200 | + |
| 201 | +- **GET /client/document/:id**: |
| 202 | + |
| 203 | + - Retorna um documento específico do cliente autenticado. |
| 204 | + - **Parâmetros**: |
| 205 | + - `id`: ID do documento. |
| 206 | + - **Headers**: |
| 207 | + - `Authorization`: Token JWT válido. |
| 208 | + - **Resposta**: |
| 209 | + - `document`: Objeto do documento correspondente ao `id`, caso pertença ao cliente autenticado. |
| 210 | + |
| 211 | +### Documentos |
| 212 | + |
| 213 | +- **POST /document/pdf**: |
| 214 | + |
| 215 | + - Faz upload de um PDF e processa o conteúdo. |
| 216 | + - **Body**: |
| 217 | + - `file`: Arquivo PDF. |
| 218 | + - **Resposta**: |
| 219 | + - `document`: Dados processados do PDF (como título, conteúdo extraído, data de processamento, etc.). |
| 220 | + |
| 221 | +- **POST /document/web**: |
| 222 | + |
| 223 | + - Processa uma página web a partir de uma URL. |
| 224 | + - **Body**: |
| 225 | + - `url`: URL da página web a ser processada. |
| 226 | + - **Resposta**: |
| 227 | + - `document`: Dados processados da página web. |
| 228 | + |
| 229 | +## ⚙️ Testes |
| 230 | + |
| 231 | +A aplicação conta com testes unitários e de integração utilizando o framework **Jest**. |
| 232 | + |
| 233 | +### 🔹 Rodar Testes Unitários |
| 234 | + |
| 235 | +Para executar os testes unitários da aplicação, utilize o seguinte comando: |
| 236 | + |
| 237 | +```bash |
| 238 | +npm run test |
| 239 | +``` |
| 240 | + |
| 241 | +### 🔹 Rodar Testes de Integração |
| 242 | + |
| 243 | +Para executar os testes de integração, utilize o seguinte comando: |
| 244 | + |
| 245 | +```bash |
| 246 | +npm run test:int |
| 247 | +``` |
0 commit comments