Criar uma aplicação backend em Node.js utilizando TypeScript que permita:
- O upload de uma planilha com 100 mil linhas 📄.
- Processar e armazenar os dados em um banco de dados PostgreSQL 🛢️.
- Disponibilizar uma API avançada para acesso a esses dados 🔍.
Desenvolver uma aplicação que atenda aos seguintes requisitos funcionais e não funcionais, aplicando boas práticas de desenvolvimento e fornecendo explicações detalhadas sobre o código e as escolhas técnicas realizadas.
-
Endpoint de Upload:
- Fazer o upload da planilha baseSerImportada.csv na raiz do projeto. --ok
- A planilha conterá 100 mil linhas de dados a serem processados. --ok
- Swagger: O upload deve ser possível pela interface interativa da documentação Swagger. --ok
-
⚡ Processamento Assíncrono:
- Processar o arquivo utilizando filas (ex: BullMQ, RabbitMQ) para garantir que o upload não bloqueie a thread principal. --ok
- O usuário deve receber uma resposta imediatamente após o envio do arquivo. --ok
-
📊 Feedback de Status:
- Implementar uma forma de verificar o status do processamento (ex: "em andamento", "concluído", "erro"). --ok
- O feedback pode ser fornecido por polling em um endpoint específico ou via websockets 🔄. --ok
-
Endpoints:
- Listar, filtrar, ordenar e buscar dados armazenados.
- Retornar dados de forma paginada 📄.
-
📌 Paginação Eficiente:
- Utilizar paginação baseada em cursor ou keyset pagination para garantir performance em grandes volumes de dados.
-
🔧 Filtragem e Ordenação Avançadas:
- Permitir filtros pelos campos:
GivenName,City,TropicalZodiac,Occupation,Vehicle,CountryFull. - Suportar múltiplos critérios de ordenação.
- Permitir filtros pelos campos:
-
📋 Informação Adicional no Response:
- Incluir a quantidade de registros retornados na página atual.
- Banco de dados: PostgreSQL.
- Modelagem eficiente com uso de índices e tipos de dados apropriados.
- Utilizar BullMQ, RabbitMQ ou Kafka para gerenciamento do processamento.
- Controlar concorrência para evitar problemas como race conditions.
-
Performance:
- Otimizar o tempo de resposta das rotas 🕒.
- Retornar um contador do tempo de execução em cada operação.
-
Escalabilidade:
- Documentar como a aplicação pode ser escalada horizontalmente 🔀.
-
🧰 Cache:
- Considerar o uso de cache (ex: Redis) para consultas frequentes.
-
Explicação do Código:
- Fornecer explicações detalhadas e comentários para esclarecer partes complexas 🛠️.
-
📖 README:
- Incluir instruções claras para configuração e execução do projeto.
-
📑 Documentação da API:
- Utilizar Swagger para documentar e interagir com os endpoints.
- Deploy via Vercel:
- Demonstrar a entrega da aplicação hospedada na plataforma Vercel 🌐.
- Disponibilizar o código em um repositório público ou privado no GitHub.
- Incluir:
- Instruções claras de instalação e configuração no
Explicacao.md📜. - Scripts para inicialização e deploy local ⚡.
- Documentação detalhada no Swagger.
- Instruções claras de instalação e configuração no
- Estruture o projeto de forma modular para facilitar manutenção e escalabilidade 🛠️.
- Garanta a clareza do código e da documentação para demonstrar domínio técnico 📚.
O desafio será avaliado com base em:
- 📊 Desempenho:
- Tempo de processamento do upload e resposta da API.
- 📘 Justificativas Técnicas:
- Decisões arquiteturais e tecnológicas.
- 🎨 Criatividade e Inovação:
- Funcionalidades extras que agreguem valor.
- 📚 Documentação:
- Qualidade e clareza do
Explicacao.mde dos comentários no código.
- Qualidade e clareza do
Boa sorte e divirta-se! 🚀
- Upload de Arquivo:
{
"message": "Arquivo recebido com sucesso. Processamento iniciado.",
"uploadId": "123e4567-e89b-12d3-a456-426614174000"
}- Status do Processamento:
{
"uploadId": "123e4567-e89b-12d3-a456-426614174000",
"status": "concluído" // ou "em processamento", "erro"
}- Listagem de Dados:
{
"data": [
{
"GivenName": "Maria",
"Surname": "Silva",
"City": "São Paulo",
"TropicalZodiac": "Virgem",
"Occupation": "Advogada",
"Vehicle": "Honda Civic",
"CountryFull": "Brasil"
// ... outros campos
},
// ... mais registros
],
"pagination": {
"currentPage": 1,
"perPage": 20,
"totalPages": 5000,
"totalRecords": 100000,
"currentCount": 20
}
}- Exemplo de Tempo de Execução:
{
"data": [
// ... registros
],
"pagination": {
// ... informações de paginação
},
"executionTime": "120ms"
}