{"id":29150617,"url":"https://github.com/emmannweb/back-end-engineer-test","last_synced_at":"2025-06-30T23:41:54.536Z","repository":{"id":301668455,"uuid":"1009942912","full_name":"emmannweb/back-end-engineer-test","owner":"emmannweb","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-28T04:30:01.000Z","size":492,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-28T05:27:47.804Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emmannweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support/phone_data.csv","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-28T02:38:07.000Z","updated_at":"2025-06-28T04:30:04.000Z","dependencies_parsed_at":"2025-06-28T05:38:23.832Z","dependency_job_id":null,"html_url":"https://github.com/emmannweb/back-end-engineer-test","commit_stats":null,"previous_names":["emmannweb/back-end-engineer-test"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/emmannweb/back-end-engineer-test","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emmannweb%2Fback-end-engineer-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emmannweb%2Fback-end-engineer-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emmannweb%2Fback-end-engineer-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emmannweb%2Fback-end-engineer-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emmannweb","download_url":"https://codeload.github.com/emmannweb/back-end-engineer-test/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emmannweb%2Fback-end-engineer-test/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262869399,"owners_count":23377280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-30T23:41:53.703Z","updated_at":"2025-06-30T23:41:54.531Z","avatar_url":"https://github.com/emmannweb.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"### - 2 Microservicos de NESTJS baseados em event com RabbitMQ\n\n##### - Os Microserviços são completamente isolados de acordo com a requisição, usando Docker e Docker compose, Swagger, Nest, MongoDB, RabbitMQ.\n\n##### - Algoritmos para receber, tratar, transformar e formatar os batches de 1.000 no total de 10.000, a ser enviado a cada 1 segundo, segundo a requisição para cadastro desses batches no segundo Microserviço no Mongo DB.\n\n##### - Fazer upload do arquivo CSV, com Validação (somente arquivo CSV) e tratamentos de erros.\n\n![My Image](images/swagger.png)\n\n![My Image](images/logs-proccessing.png)\n\n### - Instruções\n\n##### - Criar um arquivo .env no raiz da pasta e colocar as credencias:\n\n## Variáveis ​​de ambiente\n`DB_USER`\n`DB_PASSWORD`\n`DB_NAME`\n`RABBIT_URI`\n`CSV_PROCESS_QUEUE`\n\n## Instalação\n\nBaixe a pasta Github back-end-engineer-test (deve ter o docker instalado)\n\n```bash\n  cd back-end-engineer-test \n  RUN  docker compose up -d\n```\n\n```bash\n  Swagger\n  http://localhost:3000/api\n```\n\n```bash\n  RabbitMQ user:guest, password:guest\n  http://localhost:15672\n```\n\n```bash\n  POST REQUEST / UPLOAD CSV FILE\n  http://localhost:3000/create/batch\n```\n\n\n# Desafio Engenheiro Back-End Pleno 👩‍💻\n\nAgradecemos seu interesse em se tornar parte da nossa equipe!\n\n## Sobre a Empresa e o Ambiente de Trabalho 🚀\n\nSomos a **Growth Digital Marketing**, uma empresa especializada em marketing digital focada no mercado de **iGaming**. No nosso time de gestão de tráfego, nossos gestores investem mais de meio milhão de reais por dia em tráfego pago. Estamos em plena expansão, e nossa equipe é composta pelos melhores profissionais em suas áreas. Se você for escolhido, é porque acreditamos que você também é um dos melhores na sua especialidade.\n\nNossa empresa é altamente competitiva, e buscamos a excelência em cada projeto. Valorizamos a entrega pontual e a alta qualidade e mantemos um ambiente colaborativo onde todos se ajudam sempre que possível. Apoiamos o crescimento coletivo, equilibrando a intensidade de um mercado competitivo com uma cultura leve e de cooperação.\n\n## Sobre o Ambiente de Trabalho no Departamento de T.I ☕\n\nO departamento de TI da GDM reflete a cultura colaborativa da empresa. Somos um time de profissionais altamente qualificados com expertise em tecnologias de ponta e uma disposição para compartilhar conhecimento. O nosso setor é composto por engenheiros de frontend e backend que trabalham com tecnologias avançadas, além de um arquiteto de software que lidera a definição das melhores práticas e da infraestrutura, especialmente para soluções escaláveis em iGaming.\n\nNosso front-end é desenvolvido com **React.js** e **Next.js**, garantindo interfaces de alta performance. No backend, utilizamos principalmente **Node.js** e **NestJS** junto com uma robusta infraestrutura em nuvem na **AWS**.\n\n## Stack Necessária 💻\n\n- NodeJS ✔\n- TypeScript ✔\n- Nest.JS ✔\n- Docker ✔\n- MongoDb ✔\n- RabbitMQ ✔\n\n## Requisitos Técnicos 😁\n\n- Ambas as aplicações devem ser desenvolvidas em NestJS, seguindo os padrões de arquitetura DDD e aplicando os princípios de SOLID.\n- Cada aplicação deve incluir uma imagem Docker e um Dockerfile para facilitar o empacotamento e a execução em containers.\n- Se desejar, pode incluir um docker-compose para cada uma das aplicações, o que facilitará a simulação do deploy na AWS.\n- A comunicação entre as duas aplicações pode ser feita via HTTP, gRPC, ou através de algum sistema de mensageria (como RabbitMQ ou Kafka), à sua escolha, desde que seja justificada e eficiente para o envio em batches.\n\n## Descrição do Desafio 📰\n\nSe você pensa que o papel de um Engenheiro Back-End se resume a criar C.R.U.D. e consumir APIs, está muito enganado. Estamos procurando alguém que vá além, com habilidade de pensar sistemicamente e atuar de forma crítica em todo o ciclo de desenvolvimento de soluções robustas, escaláveis e orientadas a resultados.\n\n### Objetivo do Projeto\n\nO objetivo deste projeto é criar uma aplicação robusta para processamento de dados em batch, dividida em duas partes: uma aplicação que realiza a leitura e o envio dos dados em lotes e outra aplicação para recepção e armazenamento eficiente dessas informações, agregando-as por estado e total de pessoas, com a possibilidade de deploy em um ambiente escalável como a **AWS**.\n\nVocê encontrará em nosso repositório um arquivo .csv contendo 10 mil linhas e 4 colunas. Seu desafio como engenheiro back-end será desenvolver duas aplicações utilizando NestJS, aplicando os princípios de DDD (Domain-Driven Design) e SOLID, para processar, tratar e armazenar esses dados.\n\n### Aplicação 1 - Leitura e Envio dos Dados:\n\nO seu papel é desenvolver uma aplicação que seja capaz de:\n\n- Ler o arquivo .csv com eficiência, você pode optar por criar uma rota no controlador para receber o arquivo ou simplesmente ler o arquivo embutido no código, fica ao seu critério.\n- Processar os dados, tratando qualquer inconsistência.\n- Dividir os dados em batches de 1000 registros, respeitando o limite de envio de 1000 dados por segundo para a segunda aplicação.\n- Enviar esses batches para a segunda aplicação por meio de uma interface de comunicação (como uma API REST ou mensageria).\n\n### Aplicação 2 - Recepção e Armazenamento dos Dados:\n\n**A segunda aplicação já possui parte do código implementado, mas precisa ser completada.**\n\n- Esta aplicação será responsável por:\n- Receber os batches de dados da primeira aplicação.\n- Processar e armazenar os dados recebidos em um banco de dados não relacional, preferencialmente MongoDB, utilize a ODM que melhor agradar.\n- O dado que será armazenado no banco é o nome dos estados presentes no arquivo .csv, juntamente com a quantidade total de pessoas para cada estado (i.e., um somatório de pessoas por estado).\n\n### Etapas:\n\n1. Leitura de Dados (Aplicação 1):\n\n- Ler o arquivo .csv com 10 mil linhas de maneira eficiente, evitando carregar o arquivo inteiro na memória de uma vez.\n- Processar os dados para garantir sua integridade (tratar dados nulos, duplicados, etc.).\n- Implementar uma lógica de envio dos dados em batches de 1000 registros por segundo para a segunda aplicação.\n\n2. Armazenamento e Processamento (Aplicação 2):\n\n- Completar a aplicação para que ela possa receber os dados enviados pela primeira aplicação em batches.\n- Armazenar as informações no MongoDB, salvando a quantidade total de pessoas por estado.\n- Garantir que a aplicação seja capaz de lidar com grande volume de dados sem perda ou duplicidade.\n\n3. Deploy e Execução:\n\n- Criar Dockerfiles para ambas as aplicações, garantindo que elas possam ser empacotadas e executadas em containers de forma isolada.\n- Opcionalmente, criar um docker-compose para simular o ambiente de produção.\n- Certifique-se de que a solução seja escalável e eficiente para um possível deploy na AWS.\n\n### Considerações:\n\n**A segunda aplicação é esta que contem o arquivo de instruções, o CSV, você encontra na pasta support**\n\nA solução deve ser testável e escalável, garantindo que possa suportar o envio contínuo de dados em batch.\nUtilize boas práticas de desenvolvimento, como testes unitários, tratamento de erros, e logs para monitorar o comportamento das aplicações.\nDocumente a solução para facilitar a compreensão e o deploy por outros desenvolvedores ou engenheiros.\n\n## Diferenciais 💖\n\n- Experiência com sistemas de mensageria como RabbitMQ ou Kafka.\n- Conhecimento em práticas de CI/CD.\n- Familiaridade com deploy em ambientes de produção na AWS.\n\n## Critérios de Avaliação 📊\n\n- Qualidade do código, organização e aderência aos princípios de DDD e SOLID.\n- Eficiência na leitura e processamento dos dados do arquivo .csv.\n- Capacidade de enviar os dados em batches respeitando o limite de 1000 registros por segundo.\n- Implementação do armazenamento eficiente dos dados no banco de dados MongoDB.\n- Uso adequado de containers Docker e, se aplicável, docker-compose.\n\n## Próximos Passos\n\nEnvie o link da aplicação e do repositório para nosso time de recrutamento em [vagas@gdigitalmkt.com].\n\n**Boa sorte e mãos à obra!**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femmannweb%2Fback-end-engineer-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femmannweb%2Fback-end-engineer-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femmannweb%2Fback-end-engineer-test/lists"}