Projeto Agenda é uma API que tem por objetivo permitir que prestadores de serviço possam divulgar seu trabalho e organizar a agenda de seus compromissos, de modo que os usuários do aplicativo possam verificar os serviços oferecidos, consultar horários disponíveis dos profissionais e agendar horários com os mesmos.
Prestador de serviço
- Pode cadastrar seus serviços, informando categoria e disponibilidade de horários.
- Pode consultar sua agenda de modo dinâmico, verificando todos os agendamentos futuros e também para as próximas duas horas.
- Pode consultar seu histórico de agendamentos, consultando todas os seus compromissos já marcados.
Usuário
- Pode consultar todas as categorias de serviço disponibilizadas e também os prestadores disponíveis por categoria, com informação da disponibilidade de cada prestador.
- Pode solicitar um agendamento de horário com o prestador.
- Pode atualizar os dados de um agendamento.
- Pode solicitar a exclusão de um agendamento.
Pré-requisitos
- Node.js (versão 14 ou superior)
- PostgreSQL
- Postman (necessário para testagem de endpoints)
Como executar a API
1 - Execute um git clone do projeto: git clone < link-do-repositorio >.
2 - Abra o projeto com a IDE de sua preferência.
3 - Abra o terminal dentro do diretório BACKEND e execute o comando: npm install.
4 - Após a execução bem-sucedida do comando npm install, crie um arquivo .env na raiz do projeto. Este arquivo deverá ser criado utilizando o bloco de notas, e deverá conter as seguintes informações (para se conectar ao banco de dados oficial do projeto, você deverá solicitar os dados de preenchimento abaixo para o administrador da API):
JWT_SECRET= sua_chave_secreta_jwt
JWT_EXPIRES_IN=1h
JWT_REFRESH_EXPIRES_IN=7d
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=seu_usuario_de_banco
DB_PASSWORD=sua_senha
DB_NAME=agenda_ii8x
DB_SCHEMA=agenda5 - Uma vez criado o arquivo .env, certifique-se de executar no Postgres a criação da database, de acordo com as informações contidas no arquivo .env (para conexão com o banco de dados oficial da API, será necessário solicitar os dados de conexão ao administrador da API)
6 - Novamente dentro da IDE, execute o seguinte comando no terminal: npm start
7 - Caso a conexão com o banco de dados for bem-sucedida, aparecerá uma mensagem de êxito no terminal, e você poderá testar os endpoints no Postman.
8 - Na raiz do projeto, existe uma coleção do Postman que será utilizada para testagem dos endpoints. Importe esta coleção para dentro do Postman e interaja com os endpoints conforme descrição abaixo. (ATENÇÃO: será necessário executar a rota de Login para geração de um Bearer Token, que será utilizado para acessar os endpoints de número 4, 5, 6, 7, 8, 9, 10, 11, 14 e 15, conforme abaixo - os demais não necessitam de autenticação).
A aplicação oferece os seguintes endpoints para interação com o sistema:
-
Endpoint de Registro de Prestador:
-
Endpoint: POST /register
-
Descrição: Este endpoint é utilizado para cadastrar um novo prestador na plataforma. Ele requer informações detalhadas sobre o prestador, como nome, e-mail, senha, CPF/CNPJ, atividade, serviços oferecidos, etc.
-
Corpo da requisição::
{ "nome": "João Rosa", "email": "joao.rosa.sbardelotto@example.com", "senha": "senhaSegura123", "telefone": "51999989991", "cpf_cnpj": "60000100001", "atividade": "Professora", "servico": "Aulas particulares", "logo_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...base64string", "social_media": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br", "cidade": "São Paulo", "estado": { "nome": "São Paulo", "sigla": "SP" }, "ritmo_trabalho": [ { "dia_semana": "segunda", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "terça", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "quarta", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "quinta", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "sexta", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" } ], "categoria_id": 1, "subcategoria_id": 2, "tipo_agenda": null }- Resposta Esperada em Caso de Sucesso – HTTP Status 201 (CREATED):
{ "message": "Prestador cadastrado com sucesso!", "resRows": [ { "usuario": { "id": 401, "nome": "João Rosa", "email": "joao.rosa.sbardelotto@example.com", "telefone": "51999989991", "tipo_usuario": "prestador " }, "prestador": { "id": 90, "cpf_cnpj": "60000100001", "atividade": "Professora", "tipo_agenda": null, "services": "Aulas particulares", "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...base64string", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" }, "cidade": { "id": 4855 }, "categoria": { "id": 1, "subcategoria_id": 2 }, "ritmoTrabalho": [ { "dia_semana": "segunda ", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "terça ", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "quarta ", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "quinta ", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" }, { "dia_semana": "sexta ", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" } ] } ] } -
-
Login:
-
Endpoint: POST /login
-
Descrição: Este endpoint é utilizado para realizar o login de um prestador já cadastrado. Após um login bem-sucedido, o sistema retorna um token JWT e um refresh token, que podem ser usados para autenticação.
-
Corpo da requisição::
{ "email": "rosi.cardoso99@example.com", "password": "senhaSegura123" }- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InJvc2kuY2FyZG9zbzk5QGV4YW1wbGUuY29tIiwidGlwb1VzdWFyaW8iOiJwcmVzdGFkb3IgICAgICAgICAgICIsImlhdCI6MTczMDE1Nzk3MywiZXhwIjoxNzMwMjQ0MzczfQ.WY1bvBdL6KMKQqrgOx3LE36C8XZf1wETQv_osQwJOyI", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InJvc2kuY2FyZG9zbzk5QGV4YW1wbGUuY29tIiwidGlwb1VzdWFyaW8iOiJwcmVzdGFkb3IgICAgICAgICAgICIsImlhdCI6MTczMDE1Nzk3MywiZXhwIjoxNzMwNzYyNzczfQ.uMQZ00gUKYpViXIR0C8ZHkRkr-ktkAYGQjha9NCCSBE", "usuario": { "id": 335, "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "senha": "$2a$08$U2coS.O2tBmWooPjAGFdSuezX..xuAGEXlQQDpPNIGz0h09i3.Tge", "telefone": "11999999999", "tipo_usuario": "prestador ", "cidade_id": 4854, "criado_em": "2024-10-28T23:12:47.735Z", "atualizado_em": null, "ativo": true } } -
-
Reset de Senha:
-
Endpoint: POST /reset-password
-
Descrição: Este endpoint é utilizado para resetar a senha de um prestador já cadastrado. Recebe o email do usuário para verificar se ele existe no sistema, e também recebe a nova senha que será armazenada.
-
Corpo da requisição::
{ "email": "rosi.cardoso99@example.com", "newPassword": "novaSenhaSegura123" }- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Senha atualizada com sucesso" } -
-
Obter agendamentos futuros de um prestador:
-
Endpoint: GET /agendamentosFuturos/{idPrestador}
-
Descrição: Esse endpoint é responsável por fornecer uma lista de agendamentos agendados de um prestador específico com base no idPrestador, Identificador do fornecedor para o que queremos buscar agendamentos futuros.
-
Corpo da requisição::
Não é necessário.- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamentos obtidos com sucesso!", "count": 1, "agendamentos": [ { "agendamento": { "id": 34, "data_agendamento": "2024-11-11T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-11-06T20:29:06.457Z", "atualizado_em": "2024-11-06T20:29:06.457Z" }, "cliente": { "id": 300, "nome": "Bianca Mendonça", "email": "luancarvalho@example.org405384066214102024", "telefone": "+55 (041) 6513 4477" }, "prestador": { "id": 62, "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "telefone": "11999999999c", "cpf_cnpj": "1234429923423401", "atividade": "Professora", "services": "Aulas particulares", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" } } ] } -
-
Obter agendamentos por id de prestador:
-
Endpoint: GET /agendamentos/{idPrestador}
-
Descrição: Este endpoint é utilizado para recuperar uma lista de agendamentos associados a um prestador.
-
Corpo da requisição::
Não é necessário.- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamentos obtidos com sucesso!", "count": 28, "agendamentos": [ { "agendamento": { "id": 4, "data_agendamento": "2024-10-28T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "teste", "status": "confirmado ", "criado_em": "2024-10-29T14:38:14.652Z", "atualizado_em": "2024-10-29T17:43:20.211Z" }, "cliente": { "id": 300, "nome": "Bianca Mendonça", "email": "luancarvalho@example.org405384066214102024", "telefone": "+55 (041) 6513 4477" }, "prestador": { "id": 62, "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "telefone": "11999999999c", "cpf_cnpj": "1234429923423401", "atividade": "Professora", "services": "Aulas particulares", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" } }, { "agendamento": { "id": 5, "data_agendamento": "2024-11-04T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "teste", "status": "pendente ", "criado_em": "2024-10-29T14:41:15.586Z", "atualizado_em": "2024-10-29T14:41:15.586Z" }, "cliente": { "id": 300, "nome": "Bianca Mendonça", "email": "luancarvalho@example.org405384066214102024", "telefone": "+55 (041) 6513 4477" }, "prestador": { "id": 62, "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "telefone": "11999999999c", "cpf_cnpj": "1234429923423401", "atividade": "Professora", "services": "Aulas particulares", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" } }, { "agendamento": { "id": 6, "data_agendamento": "2024-11-04T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-10-29T21:28:26.523Z", "atualizado_em": "2024-10-29T21:28:26.523Z" }, "cliente": { "id": 300, "nome": "Bianca Mendonça", "email": "luancarvalho@example.org405384066214102024", "telefone": "+55 (041) 6513 4477" }, "prestador": { "id": 62, "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "telefone": "11999999999c", "cpf_cnpj": "1234429923423401", "atividade": "Professora", "services": "Aulas particulares", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" } }, } -
-
Obter agendamentos por id de agendamento:
-
Endpoint: GET /agendamento/{idAgendamento}
-
Descrição: Este endpoint permite obter uma visão detalhada e específica de um compromisso, possibilitando a consulta a informações completas sobre o agendamento e os participantes envolvidos (cliente e prestador).
-
Corpo da requisição::
Não é necessário.- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamento obtido com sucesso!", "count": 1, "agendamentos": [ { "agendamento": { "id": 29, "data_agendamento": "2024-10-28T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-10-31T05:24:51.802Z", "atualizado_em": "2024-11-01T06:08:57.427Z" }, "cliente": { "id": 300, "nome": "Bianca Mendonça", "email": "luancarvalho@example.org405384066214102024", "telefone": "+55 (041) 6513 4477" }, "prestador": { "id": 62, "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "telefone": "11999999999c", "cpf_cnpj": "1234429923423401", "atividade": "Professora", "services": "Aulas particulares", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" } } ] } -
-
Obter agendamentos por id de prestador em um intervalo de tempo:
-
Endpoint: GET /agendamentos/{idPrestador}/{dataInicio}/{dataFim}
-
Descrição: Esse endpoint permite filtrar agendamentos por prestador e intervalo de tempo, retornando uma lista detalhada ou vazia caso nenhum agendamento seja encontrado.
-
Corpo da requisição::
Não é necessário.- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamentos obtidos com sucesso!", "count": 1, "totalRegistros": 1, "totalPaginas": 1, "currentPage": 1, "agendamentos": [ { "agendamento": { "id": 115, "data_agendamento": "2024-11-08T03:00:00.000Z", "hora_inicio": "12:00:00", "hora_fim": "12:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-11-12T21:12:26.824Z", "atualizado_em": "2024-11-12T21:12:26.824Z" }, "cliente": { "id": 334, "nome": "Jorge", "email": null, "telefone": "51999999997" }, "prestador": { "id": 74, "nome": "João Rosa", "email": "joao.rosa@example.com", "telefone": "51999999991", "cpf_cnpj": "60000000001", "atividade": "Professora", "services": "Aulas particulares", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br" } } ] } -
-
Inserir agendamento no banco:
-
Endpoint: POST /agendamentos
-
Descrição: Esse endpoint permite inserir no banco de dados um agendamento de horário.
-
Corpo da requisição::
{ "cliente_id": 300, "prestador_id": 62, "data_agendamento": "2024-11-07", "hora_inicio": "12:00", "hora_fim": "12:30", "assunto": "Consulta de rotina", "status": "pendente" }-
Resposta Esperada em Caso de Sucesso – HTTP Status 201 (CREATED)
{ "message": "Agendamento inserido com sucesso!", "agendamento": { "agendamento": { "data_agendamento": "2024-11-07T00:00:00.000Z", "hora_inicio": "12:00:00", "hora_fim": "12:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-11-10T14:09:16.945Z", "atualizado_em": "2024-11-10T14:09:16.945Z" }, "cliente": { "id": 300 }, "prestador": { "id": 62 } } }
-
-
Obter disponibilidade de um prestador para um dia da semana:
-
Endpoint: GET /disponibilidade/{idPrestador}/{diaSemana}
-
Descrição: Esse endpoint permite consultar os horários disponíveis para um prestador em um determinado dia da semana.
-
Corpo da requisição::
Não é necessário- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Disponibilidade do dia obtida com sucesso!", "count": 1, "disponibilidade": [ { "prestador": { "id": 62, "cpf_cnpj": "1234429923423401", "atividade": "Professora", "services": "Aulas particulares", "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...base64string", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br", "usuario_id": 335 }, "usuario": { "nome": "Rosi Cardoso", "email": "rosi.cardoso99@example.com", "telefone": "11999999999c" }, "disponibilidade": { "dia_semana": "segunda ", "hora_inicio": "08:00:00", "hora_fim": "18:00:00" } } ] }
-
-
Obter disponibilidade de um prestador para um dia da semana:
-
Endpoint: PUT /agendamentos/{idAgendamento}
-
Descrição: Esse endpoint permite atualizar os dados de um agendamento.
-
Corpo da requisição::
{ "cliente_id": 300, "prestador_id": 62, "data_agendamento": "2024-10-28", "hora_inicio": "08:00", "hora_fim": "08:30", "assunto": "Consulta de rotina", "status": "pendente" }- Resposta Esperada em Caso de Sucesso – HTTP Status 201 (CREATED)
{ "message": "Agendamento inserido com sucesso!", "agendamento": { "agendamento": { "data_agendamento": "2024-10-28T00:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-11-10T14:35:56.516Z", "atualizado_em": "2024-11-10T14:35:56.516Z" }, "cliente": { "id": 300 }, "prestador": { "id": 62 } } }
-
-
Obter agendamentos por id de prestador das proximas duas horas:
-
Endpoint: GET /agendamentosNextHours/{idPrestador}
-
Descrição: Esse endpoint permite consultar os agendamentos do prestador para as próximas duas horas seguintes ao momento da requisição.
-
Corpo da requisição::
Não é necessário- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamento obtido com sucesso!", "count": 0, "agendamentos": [] }
-
-
Obter categorias de serviços:
-
Endpoint: GET /categorias/getall
-
Descrição: Esse endpoint permite obter uma lista de todas categorias de serviço cadastradas no sistema.
-
Corpo da requisição::
Não é necessário- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Categorias obtidas com sucesso!", "count": 12, "categorias": [ { "id": 10, "nome": "Administração e Imóveis", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 9, "nome": "Animais de Estimação", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 8, "nome": "Consultoria e Assessoria", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 6, "nome": "Educação e Cursos", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 7, "nome": "Eventos e Festas", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 11, "nome": "Financeiro e Jurídico", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 12, "nome": "Marketing e Comunicação", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 1, "nome": "Reformas e Construção", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 3, "nome": "Saúde e Bem-Estar", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 2, "nome": "Serviços Domésticos", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 4, "nome": "Tecnologia e Informática", "criado_em": "2024-10-26T18:50:37.331Z" }, { "id": 5, "nome": "Transporte e Mudanças", "criado_em": "2024-10-26T18:50:37.331Z" } ] }
-
-
Obter prestadores por categoria de serviços:
-
Endpoint: GET /categorias/prestadores/{idCategoria}
-
Descrição: Esse endpoint permite obter uma lista de todos prestadores cadastrados em uma determinada categoria de serviço cadastrada no sistema.
-
Corpo da requisição::
Não é necessário- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Prestadores da categoria obtidos com sucesso!", "count": 20, "prestadores": [ { "prestador": { "id": 53, "nome": "Marcelo Pereira", "categoria": "Reformas e Construção", "email": "marcelo@example.com", "telefone": "51981838118", "cidade": "Porto Alegre", "estado": "Rio Grande do Sul", "cpf_cnpj": "1234423923423402", "atividade": "Desenvolvedor de Software", "services": "Criação de sites e aplicações", "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...base64string", "instagram": "https://www.linkedin.com/in/marcelopoars/", "website": "https://www.marcelopereira.dev/", "usuario_id": 313 } }, { "prestador": { "id": 55, "nome": "Gleisson", "categoria": "Reformas e Construção", "email": "gleisson@example.com", "telefone": "51999303193", "cidade": "São Paulo", "estado": "São Paulo", "cpf_cnpj": "1234423923523402", "atividade": "Professora", "services": "Aulas particulares", "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA...base64string", "instagram": "https://instagram.com/RosiRosi", "website": "https://Rosi.com.br", "usuario_id": 316 } } ] }
-
-
Atualizar agendamento no banco:
-
Endpoint: PUT /agendamentos/{idAgendamento}
-
Descrição: Este endpoint permite atualizar os dados de um agendamento.
-
Corpo da requisição::
{ "cliente_id": 300, "prestador_id": 74, "data_agendamento": "2024-11-18", "hora_inicio": "08:00", "hora_fim": "08:30", "assunto": "Consulta de rotina", "status": "pendente" }- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamento atualizado com sucesso!", "agendamento": { "agendamento": { "data_agendamento": "2024-11-18T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "Consulta de rotina", "status": "pendente ", "criado_em": "2024-11-17T00:09:40.821Z", "atualizado_em": "2024-11-17T00:10:47.574Z" } } } -
-
Soft delete de agendamentos:
-
Endpoint: DEL /agendamentos/{idAgendamento}
-
Descrição: Este endpoint permite atualizar os dados de um agendamento.
-
Corpo da requisição::
Não é necessário.- Resposta Esperada em Caso de Sucesso – HTTP Status 200 (OK)
{ "message": "Agendamento cancelado com sucesso!", "agendamento": { "agendamento": { "id": 163, "data_agendamento": "2024-11-18T03:00:00.000Z", "hora_inicio": "08:00:00", "hora_fim": "08:30:00", "assunto": "Consulta de rotina", "status": "cancelado ", "criado_em": "2024-11-17T00:09:40.821Z", "atualizado_em": "2024-11-17T00:14:32.746Z" }, "cliente": { "id": 300 }, "prestador": { "id": 74 } } } -
Contato
Para quaisquer dúvidas ou sugestões, sinta-se à vontade para entrar em contato através de:
- E-mail: sbardelottopedro97@gmail.com
- E-mail: jonatasdavi.ads@gmail.com