Skip to content

Commit

Permalink
Merge pull request #13 from FIAP-3SOAT-G15/add-tests-openapi
Browse files Browse the repository at this point in the history
Add unit & integration tests, OpenAPI, minor fixes
  • Loading branch information
wellyfrs authored Jul 26, 2024
2 parents 8cb1022 + dd44e50 commit 276101b
Show file tree
Hide file tree
Showing 38 changed files with 1,442 additions and 70 deletions.
28 changes: 24 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

> Acesse o [website](http://fiap-3soat-g15-healthmed.s3-website-us-east-1.amazonaws.com) da nossa documentação! ✨
>
> Publicamos nossa documentação automaticamente em nosso [website]((http://fiap-3soat-g15-healthmed.s3-website-us-east-1.amazonaws.com)). Lá você encontrará todas as informações, documentos e diagramas a respeito da nossa documentação e do nosso MVP de uma forma intuituva, agradável, e indexada, permitindo buscas eficientes. Boa leitura!
> Publicamos nossa documentação automaticamente em nosso [website](http://fiap-3soat-g15-healthmed.s3-website-us-east-1.amazonaws.com). Lá você encontrará todas as informações, documentos e diagramas a respeito da nossa documentação e do nosso MVP de uma forma intuituva, agradável, e indexada, permitindo buscas eficientes. Boa leitura!
Grupo 15:
**Grupo 15:**

- Bleno Humberto Claus
- Giovanni Di Luca Evangelista
Expand All @@ -21,9 +21,9 @@ Grupo 15:
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=FIAP-3SOAT-G15_healthmed-app&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=FIAP-3SOAT-G15_healthmed-app)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=FIAP-3SOAT-G15_healthmed-app&metric=coverage)](https://sonarcloud.io/summary/new_code?id=FIAP-3SOAT-G15_healthmed-app)

Nosso MVP é uma versão simplificada para fins de demonstração dos requisitos atendidos durante o Hackathon. Compreende um monolito com um banco de dados relacional e uso de serviços serverless na AWS. Toda a infraestrutura descrita em Terraform e a imagem da aplicação são automatizados em nossas pipelines com GitHub Actions, que inclui verificação dos testes e análise estática no SonarQube.
Nosso MVP é uma versão simplificada para fins de demonstração dos requisitos atendidos durante o Hackathon. Compreende um monolito com um banco de dados relacional e uso de serviços serverless na AWS. Toda a infraestrutura descrita em Terraform e a imagem da aplicação são automatizados em nossas pipelines com GitHub Actions, que inclui verificação dos testes e análise estática no Sonar.

Projeto no SonarCloud: https://sonarcloud.io/project/overview?id=FIAP-3SOAT-G15_healthmed-app
Projeto no SonarCloud: [https://sonarcloud.io/project/overview?id=FIAP-3SOAT-G15_healthmed-app](https://sonarcloud.io/project/overview?id=FIAP-3SOAT-G15_healthmed-app)

Também criamos uma extensa documentação para suportar uma aplicação escalável e resiliente que atenda a todos os requisitos não funcionais.

Expand All @@ -45,6 +45,12 @@ Para viabilizar o desenvolvimento de um sistema que esteja em conformidade com a
- [Storytelling](/docs/ddd.md#storytelling)
- [Event Storming](/docs/ddd.md#event-storming)

## Volumetria Estimada

- **usuários:** 20.000 usuários simultâneos usando em horários de pico sem problemas na experiência do usuário.
- **consultas:** 10.000 consultas diárias (2 consultas x 5000 médicos x dia), cada consulta gerando um link de reunião online com duração padrão de 50 minutos, suportando centenas de sessões simultâneas.
- **prontuário eletrônico:** milhões de documentos variados, de até 100 MB por arquivo.

## Decisões de Arquitetura

1. [Infraestrutura](/docs/001-infraestrutura.md)
Expand Down Expand Up @@ -135,3 +141,17 @@ mvn clean verify -DskipITs=false
```
mvn antrun:run@ktlint-format
```

## OpenAPI (Swagger)

Acesse localmente:

- UI: [http://localhost:8080/swagger-ui/index.html]()
- JSON: [http://localhost:8080/v3/api-docs]() ([baixar](docs/openapi.json))
- YAML: [http://localhost:8080/v3/api-docs.yaml]() ([baixar](docs/openapi.yaml))

Geração da documentação:

```
mvn -B verify -DskipOpenAPIGen=false
```
4 changes: 2 additions & 2 deletions docs/003-bancos-de-dados.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ Utilizaremos Amazon Aurora com PostgreSQL para os serviços de cadastro e agenda

### Positivas

### Amazon Aurora (PostgreSQL):
#### Amazon Aurora (PostgreSQL):

- melhor custo-benefício em comparação com RDS de acordo com a calculadora de custo da AWS.
- alta disponibilidade e desempenho com replicação automática.
- familiriedade com queries SQL.
- ACID.
- indexes, sharding, e outras opções para performance.

### Amazon DynamoDB:
#### Amazon DynamoDB:

- escalabilidade horizontal automática.
- baixa latência e alta performance.
Expand Down
2 changes: 1 addition & 1 deletion docs/004-estrategia-de-testes.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Adotaremos uma abordagem de testes baseada na pirâmide de testes, que inclui:
- testes end-to-end
- testes de performance / carga (ex.: usando Gatling)

Os testes unitários e de integração serão executados nas pipelines de CI, e um quality gate de 80% será definido (com o SonarQube) como requisito. BDD também será utilizado.
Os testes unitários e de integração serão executados nas pipelines de CI, e um quality gate de 80% será definido (com o Sonar) como requisito. BDD também será utilizado.

- Implementação
Testes Unitários:
Expand Down
32 changes: 29 additions & 3 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<img style="float: left; max-width: 50%;" src="cover.png">

Grupo 15:
**Grupo 15:**

- Bleno Humberto Claus
- Giovanni Di Luca Evangelista
Expand All @@ -15,9 +15,9 @@ Grupo 15:
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=FIAP-3SOAT-G15_healthmed-app&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=FIAP-3SOAT-G15_healthmed-app)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=FIAP-3SOAT-G15_healthmed-app&metric=coverage)](https://sonarcloud.io/summary/new_code?id=FIAP-3SOAT-G15_healthmed-app)

Nosso MVP é uma versão simplificada para fins de demonstração dos requisitos atendidos durante o Hackathon. Compreende um monolito com um banco de dados relacional e uso de serviços serverless na AWS. Toda a infraestrutura descrita em Terraform e a imagem da aplicação são automatizados em nossas pipelines com GitHub Actions, que inclui verificação dos testes e análise estática no SonarQube.
Nosso MVP é uma versão simplificada para fins de demonstração dos requisitos atendidos durante o Hackathon. Compreende um monolito com um banco de dados relacional e uso de serviços serverless na AWS. Toda a infraestrutura descrita em Terraform e a imagem da aplicação são automatizados em nossas pipelines com GitHub Actions, que inclui verificação dos testes e análise estática no Sonar.

Projeto no SonarCloud: https://sonarcloud.io/project/overview?id=FIAP-3SOAT-G15_healthmed-app
Projeto no SonarCloud: [https://sonarcloud.io/project/overview?id=FIAP-3SOAT-G15_healthmed-app](https://sonarcloud.io/project/overview?id=FIAP-3SOAT-G15_healthmed-app)

Também criamos uma extensa documentação para suportar uma aplicação escalável e resiliente que atenda a todos os requisitos não funcionais.

Expand Down Expand Up @@ -123,6 +123,18 @@ Itens adicionais que serão diferenciais para a classificação dos grupos:
- Documentação abrangente de todos os componentes e níveis da solução.
- Automatização do processo de gerenciamento e alteração de infraestrutura.

## DDD

- [Glossário Ubíquo](ddd.md#glossario-ubiquo)
- [Storytelling](ddd.md#storytelling)
- [Event Storming](ddd.md#event-storming)

## Volumetria Estimada

- **usuários:** 20.000 usuários simultâneos usando em horários de pico sem problemas na experiência do usuário.
- **consultas:** 10.000 consultas diárias (2 consultas x 5000 médicos x dia), cada consulta gerando um link de reunião online com duração padrão de 50 minutos, suportando centenas de sessões simultâneas.
- **prontuário eletrônico:** milhões de documentos variados, de até 100 MB por arquivo.

## Decisões de Arquitetura

1. [Infraestrutura](001-infraestrutura.md)
Expand Down Expand Up @@ -207,3 +219,17 @@ mvn clean verify -DskipITs=false
```
mvn antrun:run@ktlint-format
```

## OpenAPI (Swagger)

Acesse localmente:

- UI: [http://localhost:8080/swagger-ui/index.html]()
- JSON: [http://localhost:8080/v3/api-docs]() ([baixar](openapi.json))
- YAML: [http://localhost:8080/v3/api-docs.yaml]() ([baixar](openapi.yaml))

Geração da documentação:

```
mvn -B verify -DskipOpenAPIGen=false
```
1 change: 1 addition & 0 deletions docs/openapi.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"openapi":"3.0.1","info":{"title":"Health&Med MVP","description":"Demo API para sistema de consultas médicas online","contact":{"name":"Grupo 15","url":"http://fiap-3soat-g15-healthmed.s3-website-us-east-1.amazonaws.com"},"version":"1.0.0"},"servers":[{"url":"/"}],"paths":{"/healthmed/patient/{document}":{"put":{"tags":["patient-controller"],"summary":"Atualizar um cadastro de um paciente","operationId":"update","parameters":[{"name":"document","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientRequest"}}},"required":true},"responses":{"200":{"description":"Operação bem-sucedida","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Patient"}}}}}}},"/healthmed/doctor/{crm}":{"get":{"tags":["doctor-controller"],"operationId":"get","parameters":[{"name":"crm","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Doctor"}}}}}},"put":{"tags":["doctor-controller"],"summary":"Atualizar um cadastro de um médico","operationId":"update_1","parameters":[{"name":"crm","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoctorRequest"}}},"required":true},"responses":{"200":{"description":"Operação bem-sucedida","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Doctor"}}}}}}},"/healthmed/patient":{"post":{"tags":["patient-controller"],"summary":"Cria um cadastro de um paciente","operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientRequest"}}},"required":true},"responses":{"200":{"description":"Operação bem-sucedida","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Patient"}}}}}}},"/healthmed/medical-record/{appointmentNumber}/append":{"post":{"tags":["medical-record-controller"],"operationId":"appendAnnotations","parameters":[{"name":"appointmentNumber","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MedicalRecordContentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}},"/healthmed/medical-appointment/{document}/{crm}":{"post":{"tags":["medical-appointment-by-patient-controller"],"operationId":"scheduleAppointment","parameters":[{"name":"document","in":"path","required":true,"schema":{"type":"string"}},{"name":"crm","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeAndDateToScheduleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}},"/healthmed/medical-appointment/{document}/cancel/{appointmentNumber}":{"post":{"tags":["medical-appointment-by-patient-controller"],"operationId":"cancelAppointment","parameters":[{"name":"document","in":"path","required":true,"schema":{"type":"string"}},{"name":"appointmentNumber","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JustificationCancellationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}},"/healthmed/medical-appointment/{crm}/reject/{appointmentNumber}":{"post":{"tags":["medical-appointment-by-doctor-controller"],"operationId":"rejectAppointment","parameters":[{"name":"crm","in":"path","required":true,"schema":{"type":"string"}},{"name":"appointmentNumber","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}},"/healthmed/medical-appointment/{crm}/cancel/{appointmentNumber}":{"post":{"tags":["medical-appointment-by-doctor-controller"],"operationId":"acceptAppointment","parameters":[{"name":"crm","in":"path","required":true,"schema":{"type":"string"}},{"name":"appointmentNumber","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}},"/healthmed/doctor":{"post":{"tags":["doctor-controller"],"summary":"Cria um cadastro de um médico","operationId":"create_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoctorRequest"}}},"required":true},"responses":{"200":{"description":"Operação bem-sucedida","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Doctor"}}}}}}},"/healthmed/doctor/{crm}/update-availability":{"patch":{"tags":["doctor-controller"],"summary":"Atualizar os horarios disponiveis do medico","operationId":"updateAvailableTimes","parameters":[{"name":"crm","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableTimesRequest"}}},"required":true},"responses":{"200":{"description":"Operação bem-sucedida","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Doctor"}}}}}}},"/healthmed/medical-appointment/{document}":{"get":{"tags":["medical-appointment-by-patient-controller"],"operationId":"getAllMyAppointments","parameters":[{"name":"document","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}}},"/healthmed/medical-appointment/{crm}":{"get":{"tags":["medical-appointment-by-doctor-controller"],"operationId":"getAllMyAppointments_1","parameters":[{"name":"crm","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MedicalAppointment"}}}}}}}},"/healthmed/doctor/search":{"get":{"tags":["doctor-controller"],"operationId":"search","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"object","additionalProperties":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Doctor"}}}}}}}}},"components":{"schemas":{"PatientRequest":{"type":"object","properties":{"document":{"type":"string","description":"CPF","example":"12345678900"},"name":{"type":"string","description":"Name","example":"Foo Bar"},"email":{"type":"string","description":"Email","example":"foo_bar@gmail.com"},"phoneNumber":{"type":"string","description":"Phone number","example":"+5511999999999"},"zipCode":{"type":"string","description":"ZIP code","example":"12345678"},"address":{"type":"string","description":"Address","example":"123, Main St."}}},"Patient":{"required":["address","document","email","name","phoneNumber","zipCode"],"type":"object","properties":{"document":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"type":"string"},"zipCode":{"type":"string"},"address":{"type":"string"}}},"AvailablePeriodsRequest":{"type":"object","properties":{"start":{"type":"string","description":"Start time","format":"date-time"},"end":{"type":"string","description":"End time","format":"date-time"}},"description":"Available slots","example":{"MONDAY":[{"start":"2022-12-31T00:00:00","end":"2022-12-31T23:59:59"}]}},"AvailableTimesRequest":{"type":"object","properties":{"slots":{"type":"object","additionalProperties":{"type":"array","description":"Available slots","example":{"MONDAY":[{"start":"2022-12-31T00:00:00","end":"2022-12-31T23:59:59"}]},"items":{"$ref":"#/components/schemas/AvailablePeriodsRequest"}},"description":"Available slots","example":{"MONDAY":[{"start":"2022-12-31T00:00:00","end":"2022-12-31T23:59:59"}]}}},"description":"Available times"},"DoctorRequest":{"type":"object","properties":{"crm":{"type":"string","description":"CRM","example":"123456"},"document":{"type":"string","description":"CPF","example":"28685216907"},"specialty":{"type":"string","description":"Specialty","example":"Cardiologist"},"name":{"type":"string","description":"Name","example":"John Doe"},"email":{"type":"string","description":"Email","example":"john_doe@gmail.com"},"phoneNumber":{"type":"string","description":"Phone number","example":"+5511999999999"},"serviceZipCode":{"type":"string","description":"Service ZIP code","example":"12345678"},"serviceAddress":{"type":"string","description":"Service address","example":"123, Main St."},"availableTimes":{"$ref":"#/components/schemas/AvailableTimesRequest"},"appointmentPrice":{"type":"number","description":"Appointment price","example":100.0}}},"AvailablePeriods":{"required":["end","start"],"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}}},"AvailableTimes":{"required":["slots"],"type":"object","properties":{"slots":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/AvailablePeriods"}}}}},"Doctor":{"required":["appointmentPrice","availableTimes","crm","document","email","name","phoneNumber","serviceAddress","serviceZipCode","specialty"],"type":"object","properties":{"crm":{"type":"string"},"document":{"type":"string"},"specialty":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"type":"string"},"serviceZipCode":{"type":"string"},"serviceAddress":{"type":"string"},"availableTimes":{"$ref":"#/components/schemas/AvailableTimes"},"appointmentPrice":{"type":"number"}}},"MedicalRecordContentRequest":{"type":"object","properties":{"content":{"type":"string","description":"Medical record content","example":"Patient has a fever"}}},"MedicalAppointment":{"required":["doctor","estimatedTimeSpentInMinutes","expectedStartTime","patient","status"],"type":"object","properties":{"number":{"type":"integer","format":"int64"},"doctor":{"$ref":"#/components/schemas/Doctor"},"patient":{"$ref":"#/components/schemas/Patient"},"expectedStartTime":{"type":"string","format":"date-time"},"estimatedTimeSpentInMinutes":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["SCHEDULED","CANCELED","ACCEPTED","REJECTED","FINISHED"]},"statusChangedAt":{"type":"string","format":"date-time"},"justificationCancellationByPatient":{"type":"string"}}},"TimeAndDateToScheduleRequest":{"type":"object","properties":{"scheduleAt":{"type":"string","description":"scheduleAt","format":"date-time"}}},"JustificationCancellationRequest":{"type":"object","properties":{"text":{"type":"string","description":"Justification text","example":"I'm not feeling well"}}}},"securitySchemes":{"Bearer Authentication":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}}
Loading

0 comments on commit 276101b

Please sign in to comment.