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