---
# System prepended metadata

title: challenge-iclinic

---

# 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
```