Backend de um serviço que gerencia a leitura individualizada de consumo de água e gás. Este serviço utiliza IA para obter a medição através da foto de um medidor.
A descrição do teste está escrita neste pdf
- Commit Linter
- Cors
- Docker
- Dotenv
- Dotenv Expand
- Express
- ESLint
- GitHub Actions
- Husky
- Jest
- Knex
- Lint Staged
- Module Alias
- NodeJS
- Prettier
- PostgreSQL
- Swagger
- Supertest
- TS-Node-Dev
- TypeScript
- UUID
- Zod
Via Docker
Crie o arquivo .env
e atribua sua chave GEMINI_API_KEY
docker compose --profile prod up -d --build
Localmente
Renomeie o arquivo .env.example
para .env
e atribua sua chave GEMINI_API_KEY
A primeira vez que for executar é necessário rodar os seguintes comandos:
docker compose up -d
npm i
npm run migrate:latest
chmod +x init-dev.sh
npm run dev
Nas execuções seguintes, apenas o comando npm run dev
é necessário
Acesse: http://localhost:3005
├── .editorconfig
├── .env
├── .env.example
├── .eslintrc.cjs
├── .github
│ ├── assets
│ │ ├── base64.txt
│ │ ├── medidor.jpg
│ │ └── teste_técnico_desenvolvimento_web.pdf
│ └── workflows
│ └── ci.yml
├── .gitignore
├── .husky
│ └── pre-commit
├── .lintstagedrc.cjs
├── .nvmrc
├── .prettierrc.json
├── .vscode
│ └── settings.json
├── Dockerfile
├── Readme.md
├── compose.yml
├── init-dev.sh
├── jest.config.ts
├── jest.setup.ts
├── package-lock.json
├── package.json
├── src
│ ├── app.ts
│ ├── config
│ │ ├── alias-config.ts
│ │ ├── index.ts
│ │ └── swagger
│ │ ├── get-list.ts
│ │ ├── patch-confirm-doc.ts
│ │ ├── post-upload-doc.ts
│ │ └── swagger-config.ts
│ ├── controllers
│ │ ├── index.ts
│ │ └── measure-controller.ts
│ ├── database
│ │ ├── db.ts
│ │ ├── index.ts
│ │ ├── knexfile.ts
│ │ ├── migrations
│ │ │ └── 20240829015524_create_measures_table.ts
│ │ └── seeds
│ ├── errors
│ │ ├── base-error.ts
│ │ ├── index.ts
│ │ ├── internal-error.ts
│ │ ├── invalid-data.ts
│ │ ├── measure-already-confirmed.ts
│ │ ├── measure-already-exists.ts
│ │ ├── measure-not-found.ts
│ │ └── measures-not-found.ts
│ ├── interfaces
│ │ ├── index.ts
│ │ ├── llm-interface.ts
│ │ └── measure-interface.ts
│ ├── llm
│ │ ├── gen-ai-model.ts
│ │ └── index.ts
│ ├── middlewares
│ │ ├── confirm-validation.ts
│ │ ├── index.ts
│ │ ├── list-validation.ts
│ │ └── upload-validation.ts
│ ├── models
│ │ ├── index.ts
│ │ └── measure-model.ts
│ ├── routes.ts
│ ├── services
│ │ ├── index.ts
│ │ ├── llm-service.ts
│ │ └── measure-service.ts
│ ├── tests
│ │ ├── get.test.ts
│ │ ├── mocks
│ │ │ ├── index.ts
│ │ │ ├── measure-db.ts
│ │ │ └── measure-request-body.ts
│ │ ├── patch.test.ts
│ │ └── post.test.ts
│ └── utils
│ ├── files.ts
│ └── index.ts
└── tsconfig.json
Para rodar os testes é necessário que o servidor esteja executando, depois use o comando npm test
Foram implementados os seguintes casos:
GET /<customer code>/list
- should return 200 and a valid response when data is correct and has no params
- should return 200 a valid response when data is correct and has param equal to "WaTeR" (case insensitive)
- should return 200 a valid response when data is correct and has param equal to "gAs" (case insensitive)
- should return 400 if type is invalid
- should return 404 if no measures exists
PATCH /confirm
- should return 200 and a valid response when data is correct
- should return 400 if uuid is invalid
- should return 400 if confirmed value is invalid
- should return 404 if measure does not exist
- should return 409 if measure is already confirmed
POST /upload
- should return 200 and a valid response when data is correct
- should return 400 if image base64 is invalid
- should return 400 if customer code is invalid
- should return 400 if datetime is invalid
- should return 400 if type is invalid
- should return 409 if reading already exists for the month
- should return 500 if for internal error
A documentação da API foi feita utilizando o Swagger e é exibida quando o usuário acessa a rota /
.