# Agenda Médica
Um sistema simples de agendamento de consultas médicas, permitindo que os pacientes visualizem médicos disponíveis e agendem consultas.
## Funcionalidades
- **Listar Médicos**: Endpoint para listar médicos disponíveis com seus horários.
- **Criar Agendamento**: Endpoint para agendar consultas com um médico específico.
## Tecnologias Utilizadas
- **Node.js**: Ambiente de execução JavaScript.
- **TypeScript**: Superset do JavaScript que adiciona tipos.
- **Joi**: Biblioteca para validação de dados.
- **Serverless Framework**: Para deploy de funções em AWS Lambda.
- **Jest**: Framework de testes para JavaScript.
## Estrutura do Projeto
agenda-medica/
│
├── src/
│ ├── agenda/
│ │ ├── agenda-controller.ts # Controlador para operações de agendas
│ │ ├── agenda-interface.ts # Interface para a estrutura de dados de agendas
│ │ ├── agenda-service.ts # Serviços relacionados às agendas
│ │ ├── agenda-validation.ts # Validação dos dados de entrada de agendas
│ │ └── /tests/
│ │ └── agenda-service.test.ts # Testes unitários para o serviço de agendas
│ │
│ ├── agendamento/
│ │ ├── agendamento-controller.ts # Controlador para operações de agendamentos
│ │ ├── agendamento-interface.ts # Interface para estrutura de dados de agendamentos
│ │ ├── agendamento-dto.ts # DTO para padronização de dados de agendamentos
│ │ ├── agendamento-mocks.ts # Dados mockados para testes de agendamentos
│ │ ├── agendamento-service.ts # Serviços relacionados aos agendamentos
│ │ └── agendamento-validation.ts # Validação dos dados de entrada de agendamentos
│
├── package.json # Dependências e scripts do projeto
├── serverless.yml # Configuração do Serverless Framework
└── README.md # Documentação do projeto
## Instalação
1. Clone o repositório:
```bash
git clone https://github.com/jonathadev/agenda-medica
cd agenda-medica
- Instale as dependências:
npm install
Para iniciar o servidor localmente, execute o seguinte comando:
npx serverless offline
O servidor estará disponível em http://localhost:3000
.
rodando o npx serverless offline aparece mais endppoints entre eles endpoints
GET | http://localhost:3000/agendas │ │ POST | http://localhost:3000/2015-03-31/functions/getAgendas/invocations │ │ POST | http://localhost:3000/agendamento │ │ POST | http://localhost:3000/2015-03-31/functions/createAgendamento/invocations
/invocations
O endpoint POST | http://localhost:3000/2015-03-31/functions/getAgendas/invocations
que você está vendo é uma URL gerada pelo framework Serverless quando você está rodando suas funções AWS Lambda localmente usando o plugin serverless-offline
. Aqui está uma breve explicação sobre o que isso significa:
-
POST
: Esse é o método HTTP que está sendo utilizado para chamar a função. Normalmente, as funções Lambda são invocadas viaPOST
. -
http://localhost:3000
: Isso indica que o servidor está rodando localmente na sua máquina, na porta3000
. -
2015-03-31
: Essa parte da URL se refere à versão da API da AWS Lambda. É um padrão usado para garantir que a chamada da função seja compatível com a versão da API. -
functions/getAgendas
: Isso se refere à função Lambda chamadagetAgendas
. É assim que o Serverless organiza as funções. -
invocations
: Esta parte indica que você está invocando (ou chamando) a função Lambda.
Quando você usa serverless-offline
, o plugin cria um ambiente simulado para as funções Lambda e suas APIs. Isso permite que você teste suas funções localmente sem precisar implantá-las na AWS. A URL que você mencionou é como você faria uma chamada para sua função getAgendas
.
Para testar a função getAgendas
, você pode usar ferramentas como Postman, Insomnia, ou mesmo o curl
no terminal:
curl -X POST http://localhost:3000/2015-03-31/functions/getAgendas/invocations
- Certifique-se de que o servidor
serverless-offline
está em execução. Se não estiver, você precisará iniciá-lo com o comando:
serverless offline
- Esse tipo de endpoint é gerado automaticamente e não precisa ser modificado. Ele é útil apenas para fins de teste local.
O Serverless Framework por padrão define o estágio como dev
se nenhum estágio específico for configurado.
Para forçar a ausência do prefixo no ambiente local, uma abordagem eficaz é definir o estágio explicitamente no momento de execução ou configurar um nome customizado.
Aqui estão algumas opções:
Ao executar serverless offline
, você pode especificar o estágio diretamente no comando para sobrescrever o valor padrão dev
. No terminal, execute:
npx serverless offline --stage ""
Isso indica explicitamente ao Serverless Framework para usar um estágio vazio, removendo o prefixo /dev
das rotas.
Outra abordagem é criar um estágio customizado específico para o ambiente local, como offline
, e configurá-lo para não adicionar o prefixo. No serverless.yml
:
service: agenda-medica
frameworkVersion: ">=4.0.0"
provider:
name: aws
runtime: nodejs14.x
region: us-east-1
stage: offline # Defina o estágio para 'offline' ou outro nome customizado
plugins:
- serverless-offline
custom:
serverless-offline:
noPrependStageInUrl: true # Evita o prefixo do estágio nas rotas
port: 3000 # Define a porta
functions:
getAgendas:
handler: src/agenda/controller.getAgendas
events:
- http:
path: agendas
method: get
createAgendamento:
handler: src/agendamento/controller.createAgendamento
events:
- http:
path: agendamento
method: post
Algumas versões do serverless-offline
possuem a configuração noPrependStageInUrl
, que ajuda a remover o prefixo de estágio nas rotas:
custom:
serverless-offline:
noPrependStageInUrl: true
Essas configurações devem garantir que você possa acessar suas rotas no formato:
http://localhost:3000/agendas
http://localhost:3000/agendamento
Nota Essas configurações são específicas para o ambiente de desenvolvimento local. Quando você fizer o deploy na AWS, o estágio será importante para organizar suas rotas e separá-las por ambiente (desenvolvimento, produção, etc.). Assim, evite usar uma string vazia em produção para evitar conflitos.
Para rodar os testes, utilize o seguinte comando:
npm run test
usar colocar dto em agendas uma validacao em agendas?
usar colocar dto em agendamento para validar post mosks em agendamento nao usados
Sobre DTO Se você está usando apenas a interface e não precisa da complexidade adicional que um DTO (Data Transfer Object) pode trazer, não é obrigatório manter ambos. A decisão de usar uma interface, um DTO ou ambos depende da arquitetura e dos requisitos do seu projeto. Vamos analisar as diferenças e quando usar cada um:
Quando usar apenas a Interface Simplicidade: Se a estrutura de dados é simples e não precisa de transformação ou validação adicional, você pode usar apenas a interface. Tipo de Dados: A interface pode ser suficiente para definir o formato dos dados que você está trabalhando. Isso é comum em situações onde você apenas deseja tipar dados recebidos ou enviados, sem realizar validações complexas. Quando usar um DTO Validação: Se você precisa validar a entrada de dados antes de usá-los na lógica de negócios, um DTO pode ser útil. Você pode aplicar validações diretamente ao DTO usando bibliotecas como Joi. Transformação de Dados: Quando os dados recebidos precisam ser transformados ou processados antes de serem usados, um DTO pode ajudar a encapsular essa lógica. Encapsulamento: Um DTO pode ser usado para encapsular dados que não devem ser diretamente expostos, ajudando a proteger sua lógica interna.
Resumindo Se a interface é suficiente para atender às suas necessidades de tipo de dados e não há necessidade de validação ou transformação complexa, você pode manter apenas a interface. Se você achar que precisa de validação e transformação de dados no futuro, pode considerar a introdução de um DTO posteriormente. Fique à vontade para adaptar seu código conforme necessário! Se precisar de mais ajuda ou quiser discutir algo específico, é só avisar!
Sinta-se à vontade para abrir issues ou enviar pull requests para melhorias e correções.
Este projeto está licenciado sob a Licença MIT.
Sinta-se à vontade para modificar qualquer parte desse modelo! Se precisar de mais informações ou se houver algo específico que você gostaria de adicionar, é só avisar.