Skip to content

Edson-Mendes/schedule-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Ā 

History

38 Commits
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 

Repository files navigation

Schedule API

Badge ConcluĆ­do Badge Java Badge Springboot Badge Heroku

šŸ“– Resumo do projeto

REST API para gerenciamento de agenda pessoal.

Projeto com o objetivo de por em prĆ”tica meus estudos sobre programaĆ§Ć£o reativa com Project Reactor e Spring WebFlux. A aplicaĆ§Ć£o possui endpoints para criaƧao e login de usuĆ”rios, endpoints para gerenciar e manipular o recurso Evento (Event), que sĆ£o protegidos e requerem autenticaƧao por JWT (Json Web Token) para serem manipulados.

OBS 1: Realizei o deploy da aplicaĆ§Ć£o com banco de dados em memĆ³ria (H2) por se tratar de um projeto para estudo.

OBS 2: NĆ£o criei testes automatizados pois eu queria partir para o prĆ³ximo estudo, assim que sobrar tempo eu irei implementa-los.

šŸ§° Tecnologias e ferramentas

Funcionalidades

API de gerenciamento de AutenticaĆ§Ć£o

  • Login de usuĆ”rio - POST /api/auth: O login Ć© realizado enviando as credenciais do usuĆ”rio (email e password) em um JSON no corpo da requisiĆ§Ć£o. Segue abaixo um exemplo do corpo da requisiĆ§Ć£o.
    {
      "email" : "lorem@email.com",
      "password" : "1234567890"
    }
    Em caso de sucesso a resposta tem status 200 com um JSON no corpo da resposta contendo token e type, em que token Ć© um JWT que deve ser enviado no header Authorization em requisiƧƵes que requerem usuĆ”rio autenticado, e type Ć© o tipo do token, no caso dessa aplicaĆ§Ć£o Ć© o tipo bearer. Segue abaixo um exemplo de corpo da resposta.
    {
      "token": "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJQb3dlcktSIFRlc3QgQVBJIiwic3ViIjoibG9yZW1AZW1haWwuY29tIiwiaWF0IjoxNjgzNDYwNjkxLCJleHAiOjE2ODM1NDcwOTF9.P6eDc2gizVNUvXE6B-6wYvC4hmK4ffQHTSwKdnlgaTM",
      "type": "Bearer"
    }

API de gerenciamento de UsuƔrio

  • Criar UsuĆ”rio - POST /api/users: Criar usuĆ”rio enviando as informaƧƵes name, email, password e confirmPassword em um JSON no corpo da requisiĆ§Ć£o.
    NĆ£o Ć© necessĆ”rio estar autenticado.
    O password Ć© salvo criptografado no banco de dados usando BCryp. Segue abaixo um exemplo do corpo da requisiĆ§Ć£o.

    {
      "name" : "Lorem Ipsum",
      "email" : "lorem@email.com",
      "password" : "1234567890",
      "confirmPassword": "1234567890"
    }

    Em caso de sucesso a resposta tem status 201 com um JSON no corpo da resposta contendo id, name e email do usuƔrio cadastrado. Segue abaixo um exemplo do corpo da resposta.

    {
      "id" : 150,
      "name" : "Lorem Ipsum",
      "email" : "lorem@email.com"
    }
  • Buscar UsuĆ”rios - GET /api/users?page={PAGE}&size={SIZE}: Busca paginada de usuĆ”rios cadastrados no sistema. O cliente pode enviar os parĆ¢metros page e size na URL, os valores padrĆ£o sĆ£o 0 e 10, respectivamente.
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o', e ser usuĆ”rio ADMIN.

    Em caso de sucesso a resposta tem status 200 com um JSON no corpo da resposta contendo uma lista de informaƧƵes dos usuƔrios cadastrados id, name e email. Segue abaixo um exemplo do corpo da resposta.

    {
      "content": [
        {
          "id": 1,
          "name": "Administrator",
          "email": "admin@email.com"
        },
        {
          "id": 2,
          "name": "Lorem Ipsum",
          "email": "lorem@email.com"
        },
      ],
      "pageable": {
        "sort": {
          "empty": true,
          "unsorted": true,
          "sorted": false
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 10,
        "paged": true,
        "unpaged": false
      },
      "totalPages": 1,
      "totalElements": 2,
      "last": true,
      "size": 10,
      "number": 0,
      "sort": {
        "empty": true,
        "unsorted": true,
        "sorted": false
      },
      "numberOfElements": 2,
      "first": true,
      "empty": false
    }
  • Buscar UsuĆ”rio por ID - GET /api/users/{ID}: Buscar usuĆ”rio por ID. Onde ID Ć© o identificador do usuĆ”rio.
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o'. UsuĆ”rio ADMIN podem buscar qualquer outro usuĆ”rio por ID, enquanto que usuĆ”rios comuns conseguem buscar apenas a si mesmos.

    Em caso de sucesso a resposta tem status 200 com um JSON no corpo da resposta contendo id, name e email do usuƔrio buscado.
    Segue abaixo um exemplo do corpo da resposta.

    {
      "id" : 150,
      "name" : "Lorem Ipsum",
      "email" : "lorem@email.com"
    }

API de gerenciamento de Evento

  • Criar Evento - POST /api/events: Criar evento enviando as informaƧƵes title, description e date_time em um JSON no corpo da requisiĆ§Ć£o.
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o'.
    Segue abaixo um exemplo do corpo da requisiĆ§Ć£o.

    {
      "title" : "Evento XPTO",
      "description" : "DescriĆ§Ć£o do evento xpto",
      "date_time" : "2023-06-22T10:30:00"
    }

    Em caso de sucesso a resposta tem status 201 com um JSON no corpo da resposta contendo id, title, description e date_time do evento cadastrado. Segue abaixo um exemplo do corpo da resposta.

    {
      "id" : 97,
      "title" : "Evento XPTO",
      "description" : "DescriĆ§Ć£o do evento xpto",
      "date_time" : "2023-06-22T10:30:00"
    }
  • Buscar Eventos - GET /api/events?page={PAGE}&size={SIZE}&date={DATE}: Busca paginada dos eventos relacionados com o usuĆ”rio logado, opcional busca por date (yyyy-MM-dd). O cliente pode enviar os parĆ¢metros page e size na URL, os valores padrĆ£o sĆ£o 0 e 10, respectivamente, e pode enviar o parĆ¢metro date no formato yyyy-MM-dd para buscar por data
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o'.

    Em caso de sucesso a resposta tem status 200 com um JSON no corpo da resposta contendo uma lista de informaƧƵes dos eventos cadastrados id, title, description, e date_time.
    Segue abaixo um exemplo do corpo da resposta.

    {
      "content": [
        {
          "id" : 97,
          "title" : "Evento XPTO",
          "description" : "DescriĆ§Ć£o do evento xpto",
          "date_time" : "2023-06-22T10:30:00"
        },
        {
          "id" : 98,
          "title" : "Outro Event XPTO",
          "description" : "DescriĆ§Ć£o do outro evento xpto",
          "date_time" : "2023-06-22T12:30:00"
        },
      ],
      "pageable": {
        "sort": {
          "empty": true,
          "unsorted": true,
          "sorted": false
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 10,
        "paged": true,
        "unpaged": false
      },
      "totalPages": 1,
      "totalElements": 2,
      "last": true,
      "size": 10,
      "number": 0,
      "sort": {
        "empty": true,
        "unsorted": true,
        "sorted": false
      },
      "numberOfElements": 2,
      "first": true,
      "empty": false
    }
  • Buscar Evento por ID - GET /api/events/{ID}: Buscar evento por ID. Onde ID Ć© o identificador do evento. O cliente consegue buscar apenas eventos que estĆ£o relacionados Ć” ele.
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o'.

    Em caso de sucesso a resposta tem status 200 com um JSON no corpo da resposta contendo id, title, description, e date_time. Segue abaixo um exemplo do corpo da resposta.

    {
      "id" : 97,
      "title" : "Evento XPTO",
      "description" : "DescriĆ§Ć£o do evento xpto",
      "date_time" : "2023-06-22T10:30:00"
    }
  • Atualizar Evento - PUT /api/events/{ID}: Atualizar tarefa por ID. Onde ID Ć© o identificador da tarefa e enviar as novas informaƧƵes da tarefa title, description, e date_time em um JSON no corpo da requisiĆ§Ć£o. O cliente consegue atualizar apenas eventos que estĆ£o relacionados Ć” ele.
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o'.
    Segue abaixo um exemplo do corpo da requisiĆ§Ć£o.

    {
      "title" : "Evento XPTO atualizado",
      "description" : "DescriĆ§Ć£o do evento xpto atualizado",
      "date_time" : "2023-06-22T10:30:00"
    }

    Em caso de sucesso a resposta tem status 204.

  • Deletar Tarefa - DELETE /api/events/ID: Deletar tarefa por ID. Onde ID Ć© o identificador da tarefa a ser deletada. O cliente consegue deletar apenas eventos que estĆ£o relacionados Ć” ele.
    Ɖ necessĆ”rio enviar token de autenticaĆ§Ć£o no header da requisiĆ§Ć£o, exemplo: 'Authorization: Bearer token.exemplo.de-autenticaĆ§Ć£o'.

    Em caso de sucesso a resposta tem status 204.

DocumentaĆ§Ć£o

A descriĆ§Ć£o de cada API e recursos estĆ” disponĆ­vel na interface grĆ”fica gerada pelo Swagger.

Acesso a recursos que requerem usuƔrio autenticado

Endpoints que requerem usuĆ”rio autenticado devem receber um token no header Authorization da requisiĆ§Ć£o, exemplo:

  'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJQb3dlcktSIFRlc3QgQVBJIiwic3ViIjoiZWRzb25AZW1haWwuY29tIiwiaWF0IjoxNjgzNDcxMzY3LCJleHAiOjE2ODM0NzQ5Njd9.RZ0rKo6LcLWlGj0vqfl9_AHCmDJXy9vJ4FS7C6_vRFg'

O token expira em 24 horas e pode ser gerado atravĆ©s do endpoint de autenticaĆ§Ć£o.
Caso o header nĆ£o seja enviado, ou um token invĆ”lido seja enviado, uma resposta com status 401 (Unauthorized) serĆ” devolvida.

Swagger

Para enviar requisiƧƵes atravĆ©s do Swagger, basta clicar no recurso desejado, clicar no botĆ£o Try it out, adicionar ParĆ¢metros (se necessĆ”rio), adicionar corpo da requisiĆ§Ć£o (se necessĆ”rio) e clicar em Execute.

Para enviar token no header Authorization, realize o login atravĆ©s do recurso AutenticaĆ§Ć£o, copie o token que foi devolvido no corpo da resposta, sem as aspas, clique no botĆ£o Authorize, que abrirĆ” um pop-up, cole o token no campo value e clique em Authorize. Feche o pop-up e pronto, suas requisiƧƵes serĆ£o enviadas com o header Authorization e o token informado.

OBS: Em breve colocarei imagens ilustrativas para as etapas acima.

Deploy

Realizei o deploy da aplicaĆ§Ć£o no Heroku, vocĆŖ pode testar atravĆ©s da interface grĆ”fica gerada pelo swagger swagger-ui.

OBS: O plano que eu uso do Heroku adormece a aplicaĆ§Ć£o depois de certo tempo inativo, entĆ£o pode ser que a primeira requisiĆ§Ć£o demore um pouco (atĆ© uns 60 segundos), apenas seja paciente šŸ˜‰.

AtualizaƧƵes futuras

  • Implementar os testes automatizados (Unidade e IntegraĆ§Ć£o).