Skip to content

Latest commit

Ā 

History

38 Commits

Folders and files

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).

Releases

Packages

Contributors

Languages