Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lucasanes/consultorio-medico
Consultório Médico - Desafio Back End
https://github.com/lucasanes/consultorio-medico
graphql nestjs swagger typescript
Last synced: 26 days ago
JSON representation
Consultório Médico - Desafio Back End
- Host: GitHub
- URL: https://github.com/lucasanes/consultorio-medico
- Owner: lucasanes
- Created: 2024-06-27T16:32:01.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2024-07-02T12:54:29.000Z (7 months ago)
- Last Synced: 2024-11-09T02:16:08.978Z (3 months ago)
- Topics: graphql, nestjs, swagger, typescript
- Language: TypeScript
- Homepage: https://consultorio-api.lucasanes.com/api
- Size: 701 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Consultório Médico API
Este é um projeto de API para gerenciar um sistema de consultório médico. A API foi desenvolvida utilizando NestJS e Prisma ORM, e suporta tanto REST quanto GraphQL para manipulação de dados.
## Tecnologias Utilizadas
- **NestJS** para a construção do backend
- **PostgreSQL** como banco de dados relacional
- **Prisma** como ORM para interações com o banco de dados
- **GraphQL** para consultas eficientes aos dados## Pré-requisitos
Lista de ferramentas necessárias:
- [NPM](https://www.npmjs.com/)
- [Node.js](https://nodejs.org/pt)
- [PostgreSQL](https://www.postgresql.org/)## Importante
### Criação do usuário
Para executar qualquer rota, você precisa estar autenticado, logo, o primeiro passo é criar um usuário.
OBS: O usuário pode ter o Role USER ou ADMIN. Role USER pode executar apenas rotas GET.Rota:
```js
POST /user
```Body:
```json
{
"name": "Lucas",
"email": "[email protected]",
"password": "Lucas123",
"role": "ADMIN"
}
```Response:
```json
{
"id": 1,
"name": "Lucas",
"email": "[email protected]",
"password": "Lucas123",
"role": "ADMIN",
"isValidated": false
}
```### Login
Após criado seu usuário, você precisará fazer login.
Rota:
```js
POST /user/signin
```Body:
```json
{
"email": "[email protected]",
"password": "Lucas123"
}
```Response:
```json
{
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFETUlOIiwiaWF0IjoxNzE5NjA0NjE5LCJleHAiOjE3MTk2OTEwMTl9._4O5O5vmfkIWPl3YPSZhepMiPcqTncK7cPiE4pTpn3k"
}
```### Verificação
Também foi criada uma integração com e-mail, então após login, será necessário a verificação do e-mail.
Para isso, basta ir em seu email, e checar a mensagem que lhe foi enviada quando criada a conta.
Este e-mail terá um código, irei mostrar como usá-lo.Rota:
```js
POST /user/verify
```Body:
```json
{
"email": "[email protected]",
"code": "A1B2C3"
}
```Response:
```json
{
"E-mail verificado."
}
```## Caso tenha esquecido sua senha
Você primeiro terá de enviar um código a seu e-mail.
Rota:
```js
POST /user/forgot-password
```Body:
```json
{
"email": "[email protected]"
}
```Response:
```json
{
"Email enviado com sucesso."
}
```Agora poderá alterar a senha pelo uso deste código.
Rota:
```js
POST /user/change-password
```Body:
```json
{
"email": "[email protected]",
"code": "A1B2C3",
"password": "Lucas12345"
}
```### Agora está tudo pronto!
## Configuração do Projeto
### 1. Clone o Repositório
```sh
git clone https://github.com/lucasanes/consultorio-medico.git
cd consultorio-medico
```### 2. Instale as dependências
```sh
npm i
```### 3. Configure o arquivo .env
Para configurar o ambiente de desenvolvimento, é necessário um arquivo `.env` dentro do backend do projeto, pode simplesmente copiar o arquivo `.env.example` e renomeá-lo para `.env`.
```sh
cp .env.example .env
```## 4. Banco de Dados
Para acessar o banco de dados, é necessário um cliente de PostgreSQL, como o [DBeaver](https://dbeaver.io/). Utilize as seguintes credenciais:
- **Host**: localhost
- **Port**: 5432
- **Database**: postgres
- **User**: postgres
- **Password**: admin### 5. Execute as migrações do Prisma
```sh
npx prisma migrate dev
```### 6. Inicie o servidor
```sh
npm start
```## API
A API REST estará disponível em http://localhost:3000.
E a API GraphQL esterá disponível em http://localhost:3000/graphql.
Para ver a documentação da API, acesse http://localhost:3000/api.## Tabelas
-
User-
id (Int, Primary Key)
-
name (String)
-
email (String)
-
password (String)
-
role (USER | ADMIN)
-
isValidated (Boolean)
-
-
Code-
id (Int, Primary Key)
-
code (String)
-
userEmail (String)
-
-
Doctor-
id (Int, Primary Key)
-
name (String)
-
specialty (String)
-
address (Address)
-
appointments (Appointment[])
-
-
Patient-
id (Int, Primary Key)
-
name (String)
-
age (Int)
-
appointments (PatientAppointment[])
-
-
Appointment-
id (Int, Primary Key)
-
date (String)
-
doctorId (Int)
-
patients (PatientAppointment[])
-
-
Address-
id (Int, Primary Key)
-
street (String)
-
neighborhood (String)
-
complement (String)
-
city (String)
-
state (String)
-
doctorId (Int)
-
-
PatientAppointment-
id (Int, Primary Key)
-
patientId (Int)
-
appointmentId (Int)
-
## Conexões entre Tabelas
-
Medico <-> Endereco: Relação 1 para 1 (um médico possui um endereço).
-
Consulta <-> Medico: Relação 1 para N (uma consulta possui um médico).
-
Consulta <-> Paciente: Relação N para N (uma consulta pode envolver vários pacientes).
## REST Endpoints
-
User-
GET /user/:id - Retorna um usuário específico pelo ID.
-
POST /user - Cria um novo usuário.
-
PATCH /user/:id - Atualiza os dados de um usuário existente.
-
DELETE /user/:id - Remove um usuário pelo ID.
-
POST /user/signin - Efetua o login, retornando e salvando o token em memória.
-
POST /user/signout - Desconecta o login.
-
POST /user/verify - Verifica o e-mail do usuário.
-
POST /user/forgot-password - Envia um código pelo e-mail para alteração de senha.
-
POST /user/change-password - Altera a senha pelo uso do código.
-
-
Doctor-
GET /doctor - Retorna todos os médicos cadastrados.
-
GET /doctor/:id - Retorna um médico específico pelo ID.
-
POST /doctor - Cria um novo médico.
-
PATCH /doctor/:id - Atualiza os dados de um médico existente.
-
DELETE /doctor/:id - Remove um médico pelo ID.
-
-
Patient-
GET /patient - Retorna todos os pacientes cadastrados.
-
GET /patient/:id - Retorna um paciente específico pelo ID.
-
POST /patient - Cria um novo paciente.
-
PATCH /patient/:id - Atualiza os dados de um paciente existente.
-
DELETE /patient/:id - Remove um paciente pelo ID.
-
-
Appointment-
GET /appointment - Retorna todas as consultas cadastradas.
-
GET /appointment/:id - Retorna uma consulta específica pelo ID.
-
POST /appointment - Cria uma nova consulta.
-
PATCH /appointment/:id - Atualiza os dados de uma consulta existente.
-
DELETE /appointment/:id - Remove uma consulta pelo ID.
-
-
Address-
GET /address - Retorna todos os endereços cadastrados.
-
GET /address/:id - Retorna um endereço específico pelo ID.
-
POST /address - Cria um novo endereço.
-
PATCH /address/:id - Atualiza os dados de um endereço existente.
-
DELETE /address/:id - Remove um endereço pelo ID.
-
## GraphQL Examples
```graphql
query Doctors {
doctors {
id
name
specialty
Address {
id
street
neighborhood
complement
city
state
}
appointments {
id
date
patients {
patient {
id
name
age
}
}
}
}
}
```
```graphql
mutation {
createDoctor(createDoctorDTO: {name: "Lucas", specialty: "Laringologista", addressId: 1}) {
id
name
specialty
Address {
id
street
neighborhood
complement
city
state
}
}
}
```
## Estrutura do projeto:
```
├── README.md
├── coverage
| ├── clover.xml
| ├── coverage-final.json
| ├── lcov-report
| | ├── base.css
| | ├── block-navigation.js
| | ├── favicon.png
| | ├── index.html
| | ├── prettify.css
| | ├── prettify.js
| | ├── sort-arrow-sprite.png
| | ├── sorter.js
| | └── src
| | ├── app.module.ts.html
| | ├── common
| | | ├── guards
| | | | ├── admin.guard.ts.html
| | | | ├── auth.guard.ts.html
| | | | └── index.html
| | | └── utils
| | | ├── generateCode.ts.html
| | | └── index.html
| | ├── dto
| | | ├── FindOneParams.ts.html
| | | ├── FindOneParamsGraphQL.ts.html
| | | └── index.html
| | ├── index.html
| | ├── main.ts.html
| | ├── models
| | | ├── address
| | | | ├── address.controller.ts.html
| | | | ├── address.model.ts.html
| | | | ├── address.module.ts.html
| | | | ├── address.resolver.ts.html
| | | | ├── address.service.ts.html
| | | | ├── dto
| | | | | ├── create-address.ts.html
| | | | | ├── index.html
| | | | | ├── update-address-id.ts.html
| | | | | └── update-address.ts.html
| | | | └── index.html
| | | ├── appointment
| | | | ├── appointment.controller.ts.html
| | | | ├── appointment.model.ts.html
| | | | ├── appointment.module.ts.html
| | | | ├── appointment.resolver.ts.html
| | | | ├── appointment.service.ts.html
| | | | ├── dto
| | | | | ├── create-appointment.ts.html
| | | | | ├── index.html
| | | | | ├── update-appointment-id.ts.html
| | | | | └── update-appointment.ts.html
| | | | └── index.html
| | | ├── auth
| | | | ├── auth.module.ts.html
| | | | ├── auth.service.ts.html
| | | | └── index.html
| | | ├── doctor
| | | | ├── doctor.controller.ts.html
| | | | ├── doctor.model.ts.html
| | | | ├── doctor.module.ts.html
| | | | ├── doctor.resolver.ts.html
| | | | ├── doctor.service.ts.html
| | | | ├── dto
| | | | | ├── create-doctor.ts.html
| | | | | ├── index.html
| | | | | ├── update-doctor-id.ts.html
| | | | | └── update-doctor.ts.html
| | | | └── index.html
| | | ├── email
| | | | ├── email.module.ts.html
| | | | ├── email.service.ts.html
| | | | └── index.html
| | | ├── patient
| | | | ├── dto
| | | | | ├── create-patient.ts.html
| | | | | ├── index.html
| | | | | ├── update-patient-id.ts.html
| | | | | └── update-patient.ts.html
| | | | ├── index.html
| | | | ├── patient.controller.ts.html
| | | | ├── patient.model.ts.html
| | | | ├── patient.module.ts.html
| | | | ├── patient.resolver.ts.html
| | | | └── patient.service.ts.html
| | | ├── patientAppointment
| | | | ├── index.html
| | | | └── patientAppointment.model.ts.html
| | | └── user
| | | ├── dto
| | | | ├── change-password.ts.html
| | | | ├── create-user.ts.html
| | | | ├── forgot-password.ts.html
| | | | ├── index.html
| | | | ├── signin-user.ts.html
| | | | ├── update-user-id.ts.html
| | | | ├── update-user.ts.html
| | | | └── verify-user.ts.html
| | | ├── index.html
| | | ├── msgResponse.model.ts.html
| | | ├── user.controller.ts.html
| | | ├── user.model.ts.html
| | | ├── user.module.ts.html
| | | ├── user.resolver.ts.html
| | | └── user.service.ts.html
| | ├── modules
| | | └── prisma
| | | ├── index.html
| | | ├── prisma.module.ts.html
| | | └── prisma.service.ts.html
| | └── test
| | ├── getPrismaTest.ts.html
| | ├── index.html
| | └── test-util.ts.html
| └── lcov.info
├── nest-cli.json
├── out.txt
├── package-lock.json
├── package.json
├── prisma
| ├── migrations
| | ├── 20240626165106_init
| | | └── migration.sql
| | ├── 20240626182323_rename
| | | └── migration.sql
| | ├── 20240626195829_add
| | | └── migration.sql
| | ├── 20240627132255_on_delete
| | | └── migration.sql
| | ├── 20240627133859_doctor
| | | └── migration.sql
| | ├── 20240628130643_add
| | | └── migration.sql
| | ├── 20240628180058_add
| | | └── migration.sql
| | ├── 20240628182233_add
| | | └── migration.sql
| | ├── 20240629003049_model
| | | └── migration.sql
| | └── migration_lock.toml
| └── schema.prisma
├── src
| ├── app.module.ts
| ├── common
| | ├── guards
| | | ├── admin.guard.spec.ts
| | | ├── admin.guard.ts
| | | ├── auth.guard.spec.ts
| | | └── auth.guard.ts
| | └── utils
| | └── generateCode.ts
| ├── dto
| | ├── FindOneParams.ts
| | └── FindOneParamsGraphQL.ts
| ├── main.ts
| ├── models
| | ├── address
| | | ├── address.controller.ts
| | | ├── address.model.ts
| | | ├── address.module.ts
| | | ├── address.resolver.ts
| | | ├── address.service.ts
| | | ├── dto
| | | | ├── create-address.ts
| | | | ├── update-address-id.ts
| | | | └── update-address.ts
| | | └── tests
| | | ├── address.controller.spec.ts
| | | ├── address.resolver.spec.ts
| | | └── address.service.spec.ts
| | ├── appointment
| | | ├── appointment.controller.ts
| | | ├── appointment.model.ts
| | | ├── appointment.module.ts
| | | ├── appointment.resolver.ts
| | | ├── appointment.service.ts
| | | ├── dto
| | | | ├── create-appointment.ts
| | | | ├── update-appointment-id.ts
| | | | └── update-appointment.ts
| | | └── tests
| | | ├── appointment.controller.spec.ts
| | | ├── appointment.resolver.spec.ts
| | | └── appointment.service.spec.ts
| | ├── auth
| | | ├── auth.module.ts
| | | └── auth.service.ts
| | ├── doctor
| | | ├── doctor.controller.ts
| | | ├── doctor.model.ts
| | | ├── doctor.module.ts
| | | ├── doctor.resolver.ts
| | | ├── doctor.service.ts
| | | ├── dto
| | | | ├── create-doctor.ts
| | | | ├── update-doctor-id.ts
| | | | └── update-doctor.ts
| | | └── tests
| | | ├── doctor.controller.spec.ts
| | | ├── doctor.resolver.spec.ts
| | | └── doctor.service.spec.ts
| | ├── email
| | | ├── email.module.ts
| | | ├── email.service.spec.ts
| | | └── email.service.ts
| | ├── patient
| | | ├── dto
| | | | ├── create-patient.ts
| | | | ├── update-patient-id.ts
| | | | └── update-patient.ts
| | | ├── patient.controller.ts
| | | ├── patient.model.ts
| | | ├── patient.module.ts
| | | ├── patient.resolver.ts
| | | ├── patient.service.ts
| | | └── tests
| | | ├── patient.controller.spec.ts
| | | ├── patient.resolver.spec.ts
| | | └── patient.service.spec.ts
| | ├── patientAppointment
| | | └── patientAppointment.model.ts
| | └── user
| | ├── dto
| | | ├── change-password.ts
| | | ├── create-user.ts
| | | ├── forgot-password.ts
| | | ├── signin-user.ts
| | | ├── update-user-id.ts
| | | ├── update-user.ts
| | | └── verify-user.ts
| | ├── msgResponse.model.ts
| | ├── tests
| | | ├── user.controller.spec.ts
| | | ├── user.resolver.spec.ts
| | | └── user.service.spec.ts
| | ├── user.controller.ts
| | ├── user.model.ts
| | ├── user.module.ts
| | ├── user.resolver.ts
| | └── user.service.ts
| ├── modules
| | └── prisma
| | ├── prisma.module.ts
| | ├── prisma.service.spec.ts
| | └── prisma.service.ts
| ├── schema.gql
| └── test
├── tsconfig.build.json
└── tsconfig.json
directory: 3219 file: 27647
```