{"id":15067878,"url":"https://github.com/deirofelippe/teste-tecnico-nimbus","last_synced_at":"2026-01-02T14:50:47.518Z","repository":{"id":256680280,"uuid":"856060991","full_name":"deirofelippe/teste-tecnico-nimbus","owner":"deirofelippe","description":"Aplicações feita para o teste técnico.","archived":false,"fork":false,"pushed_at":"2024-10-12T16:41:18.000Z","size":26097,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T18:24:50.027Z","etag":null,"topics":["django","docker","loguru","mailhog","mysql","phpmyadmin","pytest","python","reportlab"],"latest_commit_sha":null,"homepage":"","language":"Python","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/deirofelippe.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":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-11T23:24:23.000Z","updated_at":"2024-10-12T16:41:21.000Z","dependencies_parsed_at":"2024-11-22T05:15:25.882Z","dependency_job_id":null,"html_url":"https://github.com/deirofelippe/teste-tecnico-nimbus","commit_stats":{"total_commits":96,"total_committers":1,"mean_commits":96.0,"dds":0.0,"last_synced_commit":"91caed2fd37a7e25965b70fa9146dc81f0ea6421"},"previous_names":["deirofelippe/teste-tecnico-nimbus"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fteste-tecnico-nimbus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fteste-tecnico-nimbus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fteste-tecnico-nimbus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fteste-tecnico-nimbus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deirofelippe","download_url":"https://codeload.github.com/deirofelippe/teste-tecnico-nimbus/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243830912,"owners_count":20354850,"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":["django","docker","loguru","mailhog","mysql","phpmyadmin","pytest","python","reportlab"],"created_at":"2024-09-25T01:28:32.189Z","updated_at":"2026-01-02T14:50:47.492Z","avatar_url":"https://github.com/deirofelippe.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Teste Técnico da NIMBUS\n\nVídeo usando a aplicação 1 e aplicação 2\n\n[![Vídeo usando a aplicação 1 e aplicação 2](https://img.youtube.com/vi/qYRlWUg0b0I/0.jpg)](https://www.youtube.com/watch?v=qYRlWUg0b0I)\n\n**NOTA:** Criei um outro repositório ([aqui](https://github.com/deirofelippe/teste-dados-climaticos)) em que crio uma aplicação com Twisted e netCDF4, para conhecer essas ferramentas.\n\n## Sumário\n\n- [Tecnologias e libs usadas](#tecnologias-e-ferramentas-usadas)\n- [Como executar?](#como-executar)\n  - [Executando a aplicação 1](#executando-a-aplicação-1)\n  - [Executando a aplicação 2](#executando-a-aplicação-2)\n  - [Como executar os testes?](#como-executar-os-testes)\n  - [Gerar o relatório de cobertura de código?](#gerar-o-relatório-de-cobertura-de-código-aplicação-1)\n- [Execução da pipeline CI/CD com act (GitHub Action local)](#execução-da-pipeline-cicd-com-act-github-action-local)\n- [Execução do Kubernetes](#execução-do-kubernetes)\n- [Arquitetura usada e desenho](#arquitetura-usada-e-desenho)\n- [Padrões usados](#padrões-usados)\n- [Ferramentas de GUI](#ferramentas-de-gui)\n  - [Client HTTP (REST Client)](#client-http-rest-client)\n  - [GUI para banco de dados (phpMyAdmin)](#gui-para-banco-de-dados-phpmyadmin)\n  - [GUI para email (Mailhog)](#gui-para-email-mailhog)\n- [Checklist](#checklist)\n- [Melhoria nos sistemas](#melhoria-nos-sistemas)\n\n## Tecnologias e ferramentas usadas\n\n- Python 3.12.5\n- Django e Django REST framework\n- PyTest, Faker, PyTest Mock, PyTest Django\n- Docker 20.10.23\n- Docker Compose 2.15.1\n- Dev Container\n- MySQL e phpMyAdmin\n- Cerberus\n- Loguru\n- ReportLab\n\n## Como executar?\n\n- Resumo\n  - Para iniciar os containers, execute `make init-all`.\n  - `make app1-start` para executar (o comando acima já executa) a aplicação 1.\n  - `make app2-start` para executar a aplicação 2.\n\n### Executando a aplicação 1\n\n- Execute o comando `make app2-start` para rodar as migrations e iniciar o servidor.\n- Acesse o arquivo `./docs/customer.http` para testar a api. É preciso instalar o extensão do VS Code chamada Rest Client.\n- Acesse `http://localhost:8080` para visualizar o banco de dados pelo phpMyAdmin.\n- Os logs da aplicação 1 está na pasta `./aplicacao-1/logs/`.\n\n### Executando a aplicação 2\n\n- Configure o SMTP na pasta `./aplicacao-2/constants.py`.\n  - Caso queira usar o mailhog para testar o envio de email, deixe a constante `SMTP_TEST = True`.\n  - Caso queira usar outro servidor, marque como `False` e configure o `FROM_EMAIL`, `FROM_PASSWORD`, `SMTP_HOST`, e `SMTP_PORT`.\n- Coloque o arquivo bruto dentro da pasta `./aplicacao-2/` para o docker conseguir acessar. O caminho para o script acessar o arquivo bruto será `/app/aplicacao-2/\u003cnome-do-arquivo\u003e`.\n- Execute `make app2-start` para iniciar o script.\n- Os logs da aplicação 1 está na pasta `./aplicacao-2/logs/`.\n- Acesse `http://localhost:8025` para visualizar os emails enviados, caso esteja usando o mailhog\n- Os relatórios são armazenados na pasta `./aplicacao-2/reports/`.\n\n### Como executar os testes?\n\n#### Aplicação 1\n\n- `make app1`: acessa o container da aplicação 1.\n- `make test`: executa os testes.\n\n#### Aplicação 2\n\n- `make app2`: acessa o container da aplicação 2.\n- `make test`: executa os testes.\n\n### Gerar o relatório de cobertura de código? (Aplicação 1)\n\n- `make app1`: acessa o container.\n- `make test-cov`: executa a geração do relatório de cobertura de código.\n\n## Execução da pipeline CI/CD com act (GitHub Action local)\n\n- `make ci-cd`\n\n![](./docs/ci-cd.gif)\n\n## Execução do Kubernetes\n\n- kubectl create namespace nimbus\n- kubectl config set-context --current --namespace=nimbus\n- kubectl apply -f k8s/\n- watch -n 1 \"kubectl get all\"\n- kubectl port-forward service/app1 5784:80\n- kubectl port-forward service/phpmyadmin 8080:80\n- watch -n 1 \"kubectl get hpa\"\n\n## Arquitetura usada e desenho\n\nPor quê foi usada arquitetura em camadas?\n\n- Facilita o mock para os testes de integração e de unidade.\n- Separa as responsabilidades do código, facilitando a manutenção.\n\n### Desenho da arquitetura\n\n- Service: orquestra a lógica de negócio.\n- Repository: meio para qualquer acesso a serviços externos como api, banco de dados e etc.\n\n![](./docs/arquitetura.png)\n\n## Padrões usados\n\n- Service\n- Repository\n- Fail Fast/Early Return\n- Dependency Injection\n- Single Responsability Principle (SRP)\n- Evitei usar o List Comprehension no caso de if e for para deixar o código mais legível\n\n## Ferramentas de GUI\n\n### Client HTTP (REST Client)\n\nFoi usado a extensão Rest Client do VSCode para os testar os endpoints (como insomnia ou postman).\n\n![](./docs/images/rest-client.png)\n\n### GUI para banco de dados (phpMyAdmin)\n\nFoi usado o phpMyAdmin como interface gráfica para o banco de dados.\n\n![](./docs/images/php-my-admin.png)\n\n### GUI para email (Mailhog)\n\nFoi usado o mailhog como SMTP server local para testar envio de email.\n\n![](./docs/images/mailhog-1.png)\n\n![](./docs/images/mailhog-2.png)\n\n## Checklist\n\n- Projeto todo\n\n  - [ ] C4 Model para a documentação das aplicações\n  - [x] Commits semânticos\n\n- Aplicação 1\n\n  - Obrigatório:\n    - [x] Execução contínua, parando com comando explícito\n    - [x] Recepção de dado via protocolo TCP/IP (Django)\n    - [x] Armazenamento de dado (Banco com MySQL)\n    - [x] Responde \"Ok\" para o cliente quando tudo der certo\n    - [x] Os dados devem ser e estar no seguinte formato: nome,email,telefone,idade\n    - [x] Caso não atenda ao formato (validação com Cerberus), deve lançar erro com resposta genérica\n  - Opicional:\n    - [x] Logs com loguru\n    - [x] Testes automatizados com PyTest\n    - [ ] Testar todas as possibilidades de input, erros e branches\n    - [ ] API Versioning\n    - [x] Tratamento de error\n    - [x] Separação por layers\n\n- Aplicação 2\n\n  - Obrigatório:\n    - [x] Script deve receber os parametros:\n      - [x] Telefone: um ou mais separado por vírgula\n      - [x] Data: Y/m/d H:m:s\n      - [x] Envia_email: relatório deverá ou não ser enviado por email\n      - [x] Bruto: caminho para o arquivo bruto\n    - [x] Consultar dados informações salvas no banco de acordo com os parametros de entrada\n    - [x] Deve ler as informações de mensagem e evento do arquivo bruto de forma dinâmica\n    - [x] Gerar relatório (ReportLab)\n      - [x] Previsão de fenomeno deve ser agrupado por data e mensagem\n      - [x] Fenômeno deve ser marcado com vermelho se na mensagem aparecer a palavra \"forte\"\n      - [x] Seções do pdf: 1 - análise, 2 - previsões\n      - [x] Cada seção de previsão deve começar em nova página\n      - [x] Cabeçalho: título, nome do cliente, data da confecção, tipo do conteúdo (Análise ou Previsão)\n    - [x] Envio do relatório por email\n      - [x] Título com data do relatório\n      - [x] PDF anexado\n      - [x] Email de origem deve ser configuravel por constante\n    - [x] Registrar logs em um arquivo (Loguru)\n  - Opicional:\n    - [x] Testes automatizados com PyTest\n    - [ ] Testar as barnches de process_raw_file\n    - [ ] Buscar informações pela api (requests)\n    - [x] Tratamento de error\n    - [x] Separação por layers\n\n## Melhoria nos sistemas\n\n- Deixar o relatório mais parecido com o exemplo, como:\n  - \"Análise\" ou \"Previsão\" fazer parte do Header e se repetir em cada página\n  - Centralizar verticalmente o fenomeno no background e mover o background para a esquerda\n- Testar mais possibilidades no código (aplicação 1 e aplicação 2) para assegurar que tudo funcione, como:\n  - Possibilidade de input, limite máximo e mínimo\n  - Branches\n  - Casos de erro\n- Permitir uso de segundos e mais dados na data de confecção na aplicação 2\n- Melhorar a validação da aplicação 2\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeirofelippe%2Fteste-tecnico-nimbus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeirofelippe%2Fteste-tecnico-nimbus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeirofelippe%2Fteste-tecnico-nimbus/lists"}