Skip to content
This repository has been archived by the owner on Oct 19, 2024. It is now read-only.

Grupo-G03-4SOAT-FIAP/Health-Med-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Health&Med

Health&Med

API do Backend

Deploy to Amazon EKS Quality Gate Status Coverage

Projeto desenvolvido durante o Hackathon da Pós Tech em Software Architecture da FIAP.

🏆 Projeto vencedor do Hackathon Turma 4SOAT

▶️Clique aqui para assistir à apresentação no YouTube!

O PROBLEMA

A Health&Med, uma startup inovadora no setor de saúde, está desenvolvendo um novo sistema que irá revolucionar a Telemedicina no país. Atualmente, a startup oferece a possibilidade de agendamento de consultas e realização de consultas online (Telemedicina) por meio de sistemas terceiros como Google Agenda e Google Meetings.

Recentemente, a empresa recebeu um aporte e decidiu investir no desenvolvimento de um sistema proprietário, visando proporcionar um serviço de maior qualidade, segurança dos dados dos pacientes e redução de custos. O objetivo é criar um sistema robusto, escalável e seguro que permita o gerenciamento eficiente desses agendamentos e consultas.

Além de conter as funcionalidades de agendamento e realização de consultas online, o sistema terá o diferencial de uma nova funcionalidade: o Prontuário Eletrônico. O Prontuário Eletrônico permitirá o armazenamento e compartilhamento de documentos, exames, cartão de vacinas, e outros registros médicos entre as partes envolvidas, garantindo maior assertividade nos diagnósticos. Para viabilizar o desenvolvimento de um sistema que esteja em conformidade com as melhores práticas de qualidade e arquitetura de software, a Health&Med contratou os alunos do curso (SOAT) para fazer a análise do projeto e a arquitetura do software.

— Fonte: FIAP

Stack

NodeJS NestJS TypeScript Postgres Docker Kubernetes Terraform

Documentação

A documentação do projeto está disponível no GitHub Wiki.

Por que optamos por um Monolito Modular?

Modular Monolith

⚠️"Você não deve iniciar um novo projeto com microsserviços, mesmo se tiver certeza de que seu aplicativo será grande o suficiente para valer a pena." — Martin Fowler

Ao optar por um monolito modular temos o melhor dos dois mundos: A simplicidade e facilidade de gerenciamento de um monolito aliada a modularidade, flexibilidade e baixo acoplamento dos microsserviços.

Leia mais sobre as motivações para implementação de um monolito modular em Decisão de Arquitetura para o MVP da Health&Med na documentação.

Por que optamos pelo Modelo Relacional?

Modelo Relacional

Entendemos que o modelo relacional é o que mais se adequa ao nosso problema de negócio, contexto atual e requisitos na API da Health&Med.

Leia mais sobre as motivações para adoção do modelo relacional em Decisão de Arquitetura para Banco de Dados da Health&Med na documentação.

Por que optamos por uma SAGA Coreografada?

SAGA Coreografada

Devido a pequena quantidade de membros, optamos pela SAGA coreografada, conforme recomendado por Chris Richardson no livro "Microservices Patterns".

Leia mais sobre as motivações para implementação de uma SAGA coreografada em Decisão de Arquitetura para SAGA da Health&Med na documentação.

Por que optamos por um BFF?

Backend for Frontend

O API Gateway como BFF funciona como um único ponto de entrada para o(s) front-end(s), que não precisam conhecer o endereço de cada um dos serviços no backend. Outra grande vantagem é também a autenticação, realizada pelo próprio API Gateway em conjunto com o IdP Cognito da AWS.

Leia mais sobre as motivações para implementação do BFF em Decisão de Arquitetura para o BFF da Health&Med na documentação.

Arquitetura de Aplicação

Architectural Pattern: Modular Monolith + Hexagonal Architecture

Arquitetura de Aplicacao Clique na imagem para ampliar.

Arquitetura Cloud

Cloud provider: AWS

Clique aqui para ver no draw.io↗️

Mais detalhes sobre a motivação para adoção de cada serviço de nuvem estão disponíveis no diagrama.

Diagrama de Arquitetura Cloud Clique na imagem para ampliar.

Tip

Uma versão em alta definição do diagrama está disponível em formato SVG na pasta \docs\arquitetura-cloud

Executar a aplicação

  1. Baixe e instale o Node.js em https://nodejs.org/en/download
  2. Instale o CLI do NestJS através do comando npm i -g @nestjs/cli
  3. Navegue até a pasta raiz do projeto usando o Terminal;
  4. Faça uma cópia do arquivo .env.template com o nome .env e preencha as variáveis de ambiente dentro dele;
  5. Execute o comando npm install para instalar os pacotes npm;
  6. Execute o comando docker-compose up -d db para iniciar o container do banco de dados;
  7. Execute o comando docker-compose up -d localstack para iniciar o localstack;
  8. Use o comando npm run start para iniciar a aplicação.
  9. Acesse o Swagger em http://localhost:3000/swagger/
Como executar a aplicação usando o Docker Compose?

Executar a aplicação usando o Docker Compose

  1. Clone este repositório;
  2. Navegue até a pasta raiz do projeto usando o Terminal;
  3. Faça uma cópia do arquivo .env.template com o nome .env e preencha as variáveis de ambiente dentro dele;
  4. Execute o comando docker-compose up -d --build --force-recreate
  5. Acesse o Swagger em http://localhost:3000/swagger/
Como executar a aplicação usando o Kubernetes do Docker Desktop?

Executar a aplicação usando o Kubernetes do Docker Desktop

  1. Clone este repositório;
  2. Navegue até a pasta raiz do projeto usando o Terminal;
  3. Use o comando docker build -t health-med-api:latest . para gerar a imagem de container da aplicação;
  4. Use o comando kubectl apply -f k8s/development/postgres/namespace.yaml -f k8s/development/postgres/pvc-pv.yaml -f k8s/development/postgres/config.yaml -f k8s/development/postgres/secrets.yaml -f k8s/development/postgres/deployment.yaml -f k8s/development/postgres/service.yaml para fazer deploy do banco de dados;
  5. Use o comando kubectl apply -f k8s/development/api/namespace.yaml -f k8s/development/api/config.yaml -f k8s/development/api/secrets.yaml -f k8s/development/api/deployment.yaml -f k8s/development/api/service.yaml -f k8s/development/api/hpa.yaml para fazer deploy da aplicação;
  6. Acesse o Swagger em http://localhost:3000/swagger/

Para remover a aplicação do Kubernetes, use o comando kubectl delete namespace rms

Sobre os Secrets do Kubernetes

Em seu ambiente de desenvolvimento, por questão de segurança, abra os arquivos /k8s/development/postgres/secrets.yaml e /k8s/development/api/secrets.yaml na pasta /k8s/development e preencha os valores sensíveis manualmente.

No ambiente de produção os Secrets do Kubernetes são gerenciados pelo AWS Secrets Manager.

Para mais informações visite a página Boas práticas para secrets do Kubernetes.

Como testar as teleconsultas com o Google Meet?

Instruções para testar as teleconsultas com o Google Meet

Para testar o agendamento de consultas com o Google Meet siga o passo a passo disponível no Guia de início rápido do Node.js no portal Google for Developers.

Criar projeto no Console do Google Cloud

  1. Crie um projeto chamado Health-Med no Console do Google Cloud;
  2. No Console do Google Cloud, acesse APIs e Serviços e clique no botão + Ativar APIs e serviços;
  3. Procure pela Google Meet REST API na lista e clique em ATIVAR;
  4. No menu do lado esquerdo da tela, clique em Credenciais;
  5. Clique no botão + Criar credenciais e escolha a opção "ID do cliente OAuth";
  6. CLique no botão CONFIGURAR TELA DE CONSENTIMENTO e escolha opção "Externo" e clique em CRIAR;
  7. Na tela "Informações do app" preencha os dados do aplicativo como nome do app, e-mail para suporte, logotipo do app, dados de contato do desenvolvedor, etc. Clique no botão SALVAR E CONTINUAR;
  8. Na guia "Escopos" clique no botão ADICIONAR OU REMOVER ESCOPOS e selecione a opção https://www.googleapis.com/auth/meetings.space.created na lista. Clique no botão SALVAR E CONTINUAR;
  9. Na guia "Usuários de teste" clique no botão + ADD USERS e adicione o seu endereço de e-mail pessoal do @gmail.com. Depois clique no botão SALVAR E CONTINUAR;
  10. Clique no botão VOLTAR PARA O PAINEL.

Obter um ID do cliente OAuth 2.0

  1. No menu do lado esquerdo da tela, clique em Credenciais;
  2. Clique no botão + Criar credenciais e escolha a opção "ID do cliente OAuth";
  3. Em "Tipo de aplicativo" selecione "App para computador" e clique no botão CRIAR.
  4. Anote o ID do cliente e a Chave secreta do cliente e clique no botão BAIXAR O JSON;

Autenticação com a Conta pessoal do Google

  1. Visite a página Guia de início rápido do Node.js;
  2. Execute código de amostra na sua máquina local;

Copie o arquivo JSON que você baixou anteriormente na mesma pasta onde se encontra o arquivo index.js. Renomeie o arquivo JSON para credentials.json

  1. Execute o código de amostra usando o comando node .
  2. Ao executar o código de amostra será solicitado que você faça login com a sua Conta do Google pessoal;
  3. Logo após, será gerado um arquivo chamado token.json no mesmo diretório onde se encontra o arquivo index.js

O código de amostra também está disponível no GitHub em https://github.com/googleworkspace/node-samples/blob/main/meet/quickstart/index.js

Também é possível fazer autenticação usando Contas de Serviço ao invés de IDs do cliente OAuth 2.0, porém é necessário possuir uma conta Business (paga) do Google Workspaces com CNPJ para configurar o domain-wide delegation conforme instruções disponíveis aqui.

Informe as credenciais na aplicação

  1. Abra o arquivo token.json e copie todo o seu conteúdo;
  2. Abra o arquivo .env e cole o conteúdo do arquivo token.json na variável de ambiente GOOGLE_AUTHORIZED_USER_CREDS, entre aspas simples ' '
  3. Execute a aplição.

O token obtido no arquivo token.json vence depois de algum tempo, sendo necessário gerar outro token novamente usando o código de amostra conforme as instruções disponíveis acima.

Banco de Dados

Entendemos que o modelo relacional é o que mais se adequa ao nosso problema de negócio, contexto atual e requisitos na API da Health&Med.

Leia mais sobre as motivações para adoção do modelo relacional no Architectural Decision Record (ADR).

Quais são os parâmetros da conexão e credenciais para acesso ao banco de dados PostgreSQL?

Você pode conectar-se a instância de banco de dados PostgreSQL usando o pgAdmin, o terminal através do psql, ou qualquer outra IDE ou ferramenta compatível.

Host: localhost
Porta: 5432 (padrão)
Usuário: pguser
Senha: pgpwd
DB name: health_med

Como contribuir

Para contribuir com o projeto consulte o guia em CONTRIBUTING.md

Installation

$ npm install

Running the app

# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod

Test

# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

Métricas de código

Quality Gate Status Technical Debt Coverage Lines of Code Code Smells Maintainability Rating Security Rating Bugs Vulnerabilities Duplicated Lines (%) Reliability Rating

Projetos relacionados

Infrastructure as code (IaC) com Terraform
https://github.com/Grupo-G03-4SOAT-FIAP/Health-Med-iac

OWASP ZAP

Reports OWASP ZAP API Scan

Os reports de "antes" e "depois" encontram-se na pasta /docs/zap-scanning-report
Clique aqui para acessar↗️

Como escanear a API usando o OWASP ZAP?

ZAP - API Scan

Para escanear todos os endpoints da API em busca de vulnerabilidades siga o passo a passo abaixo.

  1. Execute a aplicação usando o Docker Compose;
  2. Execute o comando abaixo:
docker run --name zap --network host -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-api-scan.py -t http://localhost:3000/swagger-json -f openapi -r report.html

Substitua os parenteses em $(pwd) por chaves ${pwd} no Windows.

O report em formato HTML será gerado no diretório atual.

Clique aqui para obter mais informações sobre o API Scan do ZAP.

Relatório de Impacto à Proteção de Dados Pessoais (RIPD)

O Relatório de Impacto à Proteção de Dados Pessoais (RIPD) está disponível na pasta /docs/RIPD
Clique aqui para acessar↗️

Requisitos

Node.js v20.12.0 (LTS), Docker Desktop 24.0.6 e Kubernetes v1.28

SonarCloud