Este documento fornece um resumo das rotas implementadas, as tecnologias utilizadas, os princípios SOLID seguidos, a configuração de ambiente e as instruções para subir o container Docker do serviço de gestão de leituras de consumo de água e gás.
As imagens utilizadas para exemplos estão localizadas na pasta images_examples
dentro do projeto. Estas imagens podem ser usadas para testar as rotas de upload e medição.
- O Insomnia foi utilizado para testar as rotas do serviço.
- O arquivo JSON de configuração do ambiente está localizado na pasta
insomnia
dentro do projeto.
Este projeto utiliza três labels principais para organizar e classificar issues, pull requests e outros itens relacionados ao desenvolvimento do software. Abaixo estão as descrições e finalidades de cada uma dessas labels.
-
Descrição: A label Produção é utilizada para identificar issues e pull requests que afetam diretamente o ambiente de produção. Isso inclui funcionalidades que estão prontas para serem lançadas aos usuários finais, correções de bugs em produção, e quaisquer mudanças que necessitem ser monitoradas cuidadosamente após o lançamento.
-
Quando Usar:
- Quando uma feature ou correção de bug está pronta para ser lançada em produção.
- Para identificar problemas críticos que afetam o ambiente de produção.
- Durante a fase de revisão final antes do lançamento.
-
Importância: É crucial garantir que todos os itens marcados com a label Produção tenham sido amplamente testados e validados, pois qualquer alteração aplicada afetará diretamente os usuários finais.
-
Descrição: A label Teste é utilizada para identificar issues e pull requests que estão em fase de teste. Isso inclui novas funcionalidades que precisam ser verificadas, correções de bugs que estão sendo validadas, ou qualquer outro item que ainda não foi aprovado para produção.
-
Quando Usar:
- Quando uma nova funcionalidade ou correção de bug foi implementada e precisa ser testada.
- Para identificar tarefas que estão em revisão pelos times de QA (Quality Assurance).
- Durante a fase de desenvolvimento, para marcar itens que requerem testes adicionais.
-
Importância: A fase de teste é essencial para garantir que todas as mudanças funcionem conforme o esperado antes de serem movidas para produção. As labels Teste ajudam a separar o que ainda está em validação do que já está pronto para ser lançado.
-
Descrição: A label Desenvolvimento é utilizada para identificar issues e pull requests que estão em fase de desenvolvimento ativo. Isso inclui a implementação de novas funcionalidades, correções de bugs, e outras atividades relacionadas ao código que ainda não estão prontas para teste ou produção.
-
Quando Usar:
- Quando você está trabalhando em uma nova feature ou correção de bug.
- Para marcar issues que estão sendo ativamente desenvolvidas.
- Durante a fase de planejamento e implementação de mudanças no projeto.
-
Importância: Marcar itens com a label Desenvolvimento ajuda a equipe a entender quais tarefas estão em progresso e quais ainda precisam ser trabalhadas antes de serem testadas.
O uso adequado das labels Produção, Teste, e Desenvolvimento é fundamental para manter o fluxo de trabalho organizado e garantir que cada fase do desenvolvimento seja tratada com a devida atenção. Certifique-se de aplicar as labels corretamente para que todos na equipe possam acompanhar o status de cada item de maneira clara e eficiente.
Veja o mini tutorial de como utilizar esta rota no final deste README
Esta rota faz o upload de uma imagem de medidor de água ou gás e retorna o valor da medição extraído da imagem.
- Função:
- Recebe a imagem do medidor em formato base64.
- Processa a imagem para obter a medição de consumo.
- Retorna o valor da medição e informações relacionadas.
Esta rota confirma a medição realizada.
- Função:
- Confirma ou corrige o valor lido pelo sistema.
- Atualiza a medição no banco de dados com o valor confirmado.
Esta rota retorna todas as medições realizadas para o cliente com o código 0001
.
- Função:
- Para retornar todas as medições de um cliente específico, o parâmetro
measure_type
deve ser passado vazio. - Se
measure_type
estiver preenchido, a rota filtrará as medições pelo tipo especificado (água ou gás).
- Para retornar todas as medições de um cliente específico, o parâmetro
Esta rota retorna as medições realizadas para o cliente com o código 0003
, filtrando por tipo de medição (água ou gás).
- Função:
- Filtra as medições retornadas com base no tipo de medição especificado.
Esta rota cria um novo cliente.
{
"code": "0001",
"email": "guilherme@example.com",
"name": "Guilherme Alves"
}
- Função:
- Registra um novo cliente no sistema com os dados fornecidos.
Esta rota lista todos os clientes.
- Função:
- Retorna uma lista de todos os clientes cadastrados no sistema.
O projeto foi desenvolvido utilizando as seguintes tecnologias:
- Express: Framework para construção do servidor web.
- Prisma: ORM para interação com o banco de dados.
- TypeScript: Superset do JavaScript que adiciona tipagem estática.
- Sharp: Biblioteca para manipulação e otimização de imagens.
- Multer: Middleware para manipulação de uploads de arquivos.
- Google Gemini API: Utilizada para extração de dados das imagens de medidores.
- Helmet: Middleware para proteger o aplicativo de várias vulnerabilidades de segurança da web.
- HPP: Middleware para prevenção de poluição de parâmetros HTTP.
- CORS: Middleware para habilitar o Cross-Origin Resource Sharing.
- Winston: Biblioteca para registro e gerenciamento de logs.
- dotenv: Carrega variáveis de ambiente de um arquivo
.env
. - reflect-metadata: Adiciona suporte a decorators e metadados no TypeScript.
- tmp: Utilizado para criar arquivos e diretórios temporários.
- ESLint: Ferramenta para análise de código estático, ajudando a manter a qualidade do código.
- Prettier: Ferramenta de formatação de código.
- SWC: Compilador super rápido para JavaScript e TypeScript.
- Nodemon: Ferramenta que reinicia automaticamente o servidor ao detectar mudanças no código.
- ts-node: Utilitário para rodar TypeScript diretamente no Node.js.
- @typescript-eslint: Plugin ESLint para trabalhar com TypeScript.
O desenvolvimento seguiu os princípios SOLID, garantindo que o código seja:
- Single Responsibility: Cada classe tem uma única responsabilidade.
- Open/Closed: O código é aberto para extensão, mas fechado para modificação.
- Liskov Substitution: As subclasses podem substituir suas classes base sem alterar o comportamento esperado.
- Interface Segregation: Interfaces são específicas e evitam a implementação de métodos desnecessários.
- Dependency Inversion: O código depende de abstrações e não de implementações concretas.
Abaixo está um exemplo de configuração de variáveis de ambiente para o projeto:
NODE_ENV=development
APP_PORT=4000
GEMINI_API_KEY=
DATABASE_URL="postgresql://user:password@host:port/table_name?schema=public"
Para construir e subir os containers, execute o comando:
docker-compose up --build
Para parar e remover os containers, execute o comando:
docker-compose down
Certifique-se de que o Docker e o Docker Compose estejam instalados e em execução na sua máquina antes de usar esses comandos.
Este guia explica como fazer o upload de uma imagem para o endpoint de upload de medidores usando o Insomnia.
-
Abrir o Insomnia
Certifique-se de que você tenha o Insomnia instalado e aberto em seu computador.
-
Criar uma Nova Requisição
- Clique no botão "New Request".
- Dê um nome à sua requisição, por exemplo, "Upload".
- Selecione o método HTTP como "POST".
- Clique em "Create".
-
Configurar a URL da Requisição
- No campo "URL", insira a URL do endpoint de upload. Exemplo:
{{ _.url_base }}/customer-measures/upload
- No campo "URL", insira a URL do endpoint de upload. Exemplo:
-
Adicionar Cabeçalhos
- Clique na aba "Headers".
- Adicione os seguintes cabeçalhos:
- Key:
Content-Type
| Value:multipart/form-data
- Key:
User-Agent
| Value:insomnia/9.3.3
- Key:
-
Adicionar o Corpo da Requisição
- Clique na aba "Body".
- Selecione a opção "Form Data".
- Adicione os seguintes campos:
- Key:
customer_code
| Value:0001
- Key:
measure_datetime
| Value:2024-03-28T13:19:54.197Z
- Key:
measure_type
| Value:GAS
- Key:
image
| Type:File
| File: Selecione o arquivo de imagem do seu computador (exemplo:gas.png
).
- Key:
-
Enviar a Requisição
- Clique no botão "Send" para enviar a requisição.
- O Insomnia irá enviar a imagem e os dados adicionais para o servidor.
-
Verificar a Resposta
- Após o envio, verifique a resposta na aba "Response" para confirmar se o upload foi bem-sucedido.
Aqui está um exemplo visual de como a configuração deve parecer no Insomnia:
Seguindo esses passos, você conseguirá enviar uma imagem para o endpoint de upload e verificar a resposta para garantir que o upload foi realizado corretamente.