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.
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.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.{ "email" : "lorem@email.com", "password" : "1234567890" }{ "token": "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJQb3dlcktSIFRlc3QgQVBJIiwic3ViIjoibG9yZW1AZW1haWwuY29tIiwiaWF0IjoxNjgzNDYwNjkxLCJleHAiOjE2ODM1NDcwOTF9.P6eDc2gizVNUvXE6B-6wYvC4hmK4ffQHTSwKdnlgaTM", "type": "Bearer" }
-
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" }
-
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.
A descrição de cada API e recursos estĆ” disponĆvel na interface grĆ”fica gerada pelo Swagger.
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.
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.
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 š.
- Implementar os testes automatizados (Unidade e Integração).