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