# challenge-iclinic
Este repositório contém a solução para o desafio da IClinic.
## TOC
- [Instalação](#Instalação)
- [Configuração](#Configuração)
# Instalação
Requisitos:
* [NodeJS](https://nodejs.org/en/)
* [Yarn](https://yarnpkg.com/en/)
O Yarn foi escolhido por conta do avançado sistema de cache, entratanto, pode ser utilizado com o npm padrão.
``` bash
yarn
```
Após a instação das dependências, executar o comando para rodar o servidor em ambiente produção.
``` bash
yarn start
```
Executar o comando para rodar o servidor em ambiente de desenvolvimento.
``` bash
yarn dev
```
Executar o comando para rodar os testes de unidade e integração.
``` bash
yarn test
```
## Uso
.challenge-iclinic/
├─ \_\_tests\_\_
├─ scripts
├─ src
├─── app
├─── config
├─── database
├─── helpers
├─── routes
├─── services
└─── singletons
A seguinte estrutura é descrita:
* \_\_tests\_\_ diretório onde ficam os testes unitários e de integrações.
* scripts/ diretório que contém scripts auxiliares em bash para auxiliar o deploy e outras rotinas de infraestrutura.
* src/ diretório que contém todo o código fonte da aplicação (Podendo ser utilizado pelo Webpack para gerar o `dist`.
* app/ diretório que contém a regra de negócio da API, como controllers, models e middlewares.
* config/ arquivos em JS que fazem o setup de dependências chaves para o correto funcionamento da aplicação.
* database/ migrations, seeders e banco de dados local.
* helpers/ arquivos em JS que contém funções auxiliares várias funcionalidades.
* routes/ arquivos em JS para realizar o mapeamento das rotas.
* services/ abstrações de integrações com serviços externos como por exemplo: clínicas e métricas .
* singleton/ arquivos em JS que contém instâncias singulares de objetos que são utilizados em vários locais da aplicação.
# Configuração
Realizar cópias do .env.example.
``` bash
cp .env.example .env
cp .env.example .env.test
```
## Variáveis de ambiente
| Variável | Descrição |
|:----------:|:-------------:|
| APP_ENV | Ambiente da aplicação, podendo ser *development*, *testing*, *staging* ou *production*. |
| APP_SENTRY_DSN | Callback do Sentry para o envio de exceções/logs. |
| SERVER_PROTOCOL | Protocolo utilizado pelo servidor, podendo ser http ou https. |
| SERVER_HOST | Endereço do servidor. |
| SERVER_PORT | Porta do servidor. |
| CACHE_REQUEST_STORE | Adaptador para ser utilizado na persistência do cache das requisições. |
| CACHE_REQUEST_MAX | Quantidade máxima de URLs que serão cacheadas. |
| DB_USERNAME | Usuário do banco de dados. |
| DB_PASSWORD | Senha do banco de dados. |
| DB_DATABASE | Nome do banco de dados. |
| DB_HOST | Endereço do banco de dados. |
| DB_DIALECT | Tipo de banco de dados que será utilizado pelo Sequelize. |
| DB_STORAGE_SQLITE | Adaptador para ser utilizado na persistência dos dados no SQLite (Para desenvolvimento e testes automatizados). |
| DB_OPERATORS_ALIASES | Permitir o uso de apelidos para operações de busca. |
| PHYSICIANS_API_URI | URL do serviço de médicos. |
| PHYSICIANS_API_TOKEN | Token do serviço de médicos. |
| PHYSICIANS_API_RETRIES | Quantidade de tentativas para requisições ao serviço de médicos. |
| PHYSICIANS_API_TIMEOUT | Tempo máximo que a requisição pode durar para o serviço de médicos. |
| PHYSICIANS_API_TTL | Tempo de vida do cache para as URLs do serviço de médicos. |
| CLINICS_API_URI | URL do serviço de clínicas. |
| CLINICS_API_TOKEN | Token do serviço de clínicas. |
| CLINICS_API_RETRIES | Quantidade de tentativas para requisições ao serviço de clínicas. |
| CLINICS_API_TIMEOUT | Tempo máximo que a requisição pode durar para o serviço de clínicas. |
| CLINICS_API_TTL | Tempo de vida do cache para as URLs do serviço de clínicas. |
| PATIENTS_API_URI | URL do serviço de pacientes. |
| PATIENTS_API_TOKEN | Token do serviço de pacientes. |
| PATIENTS_API_RETRIES | Quantidade de tentativas para requisições ao serviço de pacientes. |
| PATIENTS_API_TIMEOUT | Tempo máximo que a requisição pode durar para o serviço de pacientes. |
| PATIENTS_API_TTL | Tempo de vida do cache para as URLs do serviço de pacientes. |
| METRICS_API_URI | URL do serviço de métricas. |
| METRICS_API_TOKEN | Token do serviço de métricas. |
| METRICS_API_RETRIES | Quantidade de tentativas para requisições ao serviço de métricas. |
| METRICS_API_TIMEOUT | Tempo máximo que a requisição pode durar para o serviço de métricas. |
| METRICS_API_TTL | Tempo de vida do cache para as URLs do serviço de métricas. |
**Nota: Com o ambiente da aplicação (APP_ENV) definido como *development*, serviços externos como Sentry serão desabilitados.**
### Variáveis de ambiente sugeridas para ambiente de desenvolvimento
###### .env
```env
APP_ENV=development
APP_SENTRY_DSN=
SERVER_PROTOCOL=https
SERVER_HOST=localhost
SERVER_PORT=3333
CACHE_REQUEST_STORE=memory
CACHE_REQUEST_MAX=500
DB_USERNAME=
DB_PASSWORD=
DB_DATABASE=
DB_HOST=
DB_DIALECT=sqlite
DB_STORAGE_SQLITE=database.sqlite
DB_OPERATORS_ALIASES=false
PHYSICIANS_API_URI=https://cryptic-scrubland-98389.herokuapp.com/v2
PHYSICIANS_API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzZXJ2aWNlIjoicGh5c2ljaWFucyJ9.Ei58MtFFGBK4uzpxwnzLxG0Ljdd-NQKVcOXIS4UYJtA
PHYSICIANS_API_RETRIES=2
PHYSICIANS_API_TIMEOUT=4000
PHYSICIANS_API_TTL=172800
CLINICS_API_URI=https://agile-earth-43435.herokuapp.com/v1
CLINICS_API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzZXJ2aWNlIjoiY2xpbmljcyJ9.r3w8KS4LfkKqZhOUK8YnIdLhVGJEqnReSClLCMBIJRQ
CLINICS_API_RETRIES=3
CLINICS_API_TIMEOUT=5000
CLINICS_API_TTL=259200
PATIENTS_API_URI=https://limitless-shore-81569.herokuapp.com/v3
PATIENTS_API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzZXJ2aWNlIjoicGF0aWVudHMifQ.Pr6Z58GzNRtjX8Y09hEBzl7dluxsGiaxGlfzdaphzVU
PATIENTS_API_RETRIES=2
PATIENTS_API_TIMEOUT=3000
PATIENTS_API_TTL=43200
METRICS_API_URI=https://mysterious-island-73235.herokuapp.com
METRICS_API_TOKEN=SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
METRICS_API_RETRIES=5
METRICS_API_TIMEOUT=6000
METRICS_API_TTL=0
```
###### .env.test
```env
APP_ENV=testing
APP_SENTRY_DSN=
SERVER_PROTOCOL=https
SERVER_HOST=localhost
SERVER_PORT=3333
CACHE_REQUEST_STORE=memory
CACHE_REQUEST_MAX=500
DB_USERNAME=
DB_PASSWORD=
DB_DATABASE=
DB_HOST=
DB_DIALECT=sqlite
DB_STORAGE_SQLITE=./__tests__/database.sqlite
DB_OPERATORS_ALIASES=false
PHYSICIANS_API_URI=https://cryptic-scrubland-98389.herokuapp.com/v2
PHYSICIANS_API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzZXJ2aWNlIjoicGh5c2ljaWFucyJ9.Ei58MtFFGBK4uzpxwnzLxG0Ljdd-NQKVcOXIS4UYJtA
PHYSICIANS_API_RETRIES=2
PHYSICIANS_API_TIMEOUT=4000
PHYSICIANS_API_TTL=172800
CLINICS_API_URI=https://agile-earth-43435.herokuapp.com/v1
CLINICS_API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzZXJ2aWNlIjoiY2xpbmljcyJ9.r3w8KS4LfkKqZhOUK8YnIdLhVGJEqnReSClLCMBIJRQ
CLINICS_API_RETRIES=3
CLINICS_API_TIMEOUT=5000
CLINICS_API_TTL=259200
PATIENTS_API_URI=https://limitless-shore-81569.herokuapp.com/v3
PATIENTS_API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzZXJ2aWNlIjoicGF0aWVudHMifQ.Pr6Z58GzNRtjX8Y09hEBzl7dluxsGiaxGlfzdaphzVU
PATIENTS_API_RETRIES=2
PATIENTS_API_TIMEOUT=3000
PATIENTS_API_TTL=43200
METRICS_API_URI=https://mysterious-island-73235.herokuapp.com
METRICS_API_TOKEN=SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
METRICS_API_RETRIES=5
METRICS_API_TIMEOUT=6000
METRICS_API_TTL=0
```