https://github.com/playeredlc/codigocerto-trilha-backend
API RESTful para o gerenciamento de Tarefas. Projeto implementado como solução para o desafio técnico Backend da Código Certo.
https://github.com/playeredlc/codigocerto-trilha-backend
api-rest ci-cd docker java spring sqlite
Last synced: 2 months ago
JSON representation
API RESTful para o gerenciamento de Tarefas. Projeto implementado como solução para o desafio técnico Backend da Código Certo.
- Host: GitHub
- URL: https://github.com/playeredlc/codigocerto-trilha-backend
- Owner: playeredlc
- License: apache-2.0
- Created: 2024-10-07T04:27:31.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-10-17T17:47:19.000Z (over 1 year ago)
- Last Synced: 2025-02-13T01:36:11.318Z (over 1 year ago)
- Topics: api-rest, ci-cd, docker, java, spring, sqlite
- Language: Java
- Homepage: https://codigocerto-task-api.onrender.com/swagger-ui/index.html
- Size: 130 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Código Certo - Trilha Backend - Task API
Projeto implementado como solução para o [desafio](https://github.com/codigocerto/TrilhaBackEndJR-JUN15) técnico Backend da [Código Certo](https://www.codigocertocoders.com.br/).
Implementação de uma API RESTful para o gerenciamento de Tarefas.



---
[](https://github.com/playeredlc/CodigoCerto-Trilha-Backend/actions/workflows/continuous-integration.yml)


Acesse: [codigocerto-task-api.onrender.com/swagger-ui](https://codigocerto-task-api.onrender.com/swagger-ui/index.html)
[Sobre](#sobre) |
[Tecnologias](#tecnologias) |
[Utilização](#utilização) |
[Endpoints](#endpoints) |
[Estrutura do Projeto](#estrutura-do-projeto)
---
## Sobre
Este projeto é a implementação de uma API RESTful para o gerenciamento de Tarefas, a implementação foi realizada utilizando Java, Spring e SQLite.
A aplicação permite que um usuário, após cadastrar-se e autenticar-se, possa Criar, Visualizar, Editar e Excluir suas Tarefas.
```mermaid
---
config:
theme: dark
---
graph TD
A[Usuário] -->|realiza cadastro| B[Registro]
A -->|faz o login| C[Login]
C -->|gera JWT| D[Autenticação]
A -->|cria nova| E[Criar Tarefa]
A -->|lista uma| F[Listar Tarefa]
A -->|lista todas| F[Listar Tarefa]
A -->|edita existente| G[Editar Tarefa]
A -->|deleta| H[Delete Task]
```
O projeto possui um pipeline de CI/CD que após realizar os testes, atualiza a versão da [imagem Docker](https://hub.docker.com/r/edlcorrea/taskapi) hospedada no DockerHub e aciona um novo Deploy do serviço no Render.
## Tecnologias
### Back-end
* Java
* Spring Framework:
* Boot; Data JPA; Security; Hateoas; Docs.
* SQLite; Flyway
* JUnit; Mockito; REST-Assured
* Autenticação JWT
### Deploy
* Render
* Docker
* GitHub Actions
## Utilização
O projeto está documentado com a especificação OpenAPI e pode ser utilizado por meio da [interface gráfica do Swagger](https://codigocerto-task-api.onrender.com/swagger-ui/index.html). Utilize a ferramenta de Autorização da interface para inserir o seu `accessToken` recebido como resposta ao realizar o login. Assim, ele será enviado a todas as requisições que necessitam de autenticação.
Outra opção é utilizar a ferramenta Postman, para facilitar esse processo, existe uma Collection pública pré-configurada que pode ser acessada pelo link:
[CodigoCerto-Task-API - Postman Collection](https://www.postman.com/edlcorrea/workspace/codigocerto-task-api/collection/14050047-3116af82-c751-408c-ad9a-3eb505dd8bf9?action=share&creator=14050047)
## Endpoints
[Usuário](#usuário) |
[Autenticação](#autenticação) |
[Tarefas](#tarefas)
Breve explicação dos possíveis retornos:
`200 Success` - O request foi atendido com sucesso.
`204 No Content` - O request foi atendido com sucesso, porém, não há retorno.
`400 Bad Request` - Faltando informação obrigatória, ou, informação em formato não aceito.
`401 Unauthorized` - Authorization Header não foi informado, ou o Token não é válido.
`404 Forbidden` - Autenticação correta, porém, o usuário não tem permissão para acessar o recurso.
`404 Not Found` - Recurso não encontrado.
`409 Conflict` - Recurso único já cadastrado (username).
`500 Internal Server Error` - Ocorreu um erro inesperado no servidor.
---
###
USUÁRIO
[Criar](#criar) |
[Excluir](#excluir)
---
#### CRIAR
> POST - /user
* Request:
* Body
`name: required` `username: required` `password: required`
```json
{
"name": "Eduardo",
"username": "edlc",
"password": "edlc123"
}
```
* Response 200:
```json
{
"id": 1,
"name": "Eduardo",
"username": "edlc"
}
```
---
#### EXCLUIR
> DELETE - /user/:id
* Request
* Headers `Authorization: Bearer [accessToken]`
* Response 204
`No Content`
---
###
AUTENTICAÇÃO
[Login](#login) |
[Refresh Token](#refresh-token)
---
#### LOGIN
> POST - /auth/login
* Request:
* Body
`username: required` `password: required`
```json
{
"username": "edlc",
"password": "edlc123"
}
```
* Response 200:
```json
{
"username": "edlc",
"isAuthenticated": true,
"createdAt": "2024-10-17T10:58:58.386+00:00",
"expiration": "2024-10-17T11:58:58.386+00:00",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjoxNzI5MTY2MzM4LCJzdWIiOiJlZGxjIiwiaXNzIjoiaHR0cHM6Ly9jb2RpZ29jZXJ0by10YXNrLWFwaS5vbnJlbmRlci5jb20ifQ.Klw8lQTooJh0E6Zh-eqzUjC-bLs4odR2KxNhAVN7EYY",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjo1MTg3NDk5MDE1LCJzdWIiOiJlZGxjIn0.dXDjGFrJ-Ff8JpDvbdwwCQQ4EHKUo37qzC7SSMmd09k"
}
```
---
#### REFRESH TOKEN
> POST - /auth/refresh/:username
* Request
* Headers `Authorization: Bearer [accessToken]`
* Response 200:
```json
{
"username": "edlc",
"isAuthenticated": true,
"createdAt": "2024-10-17T10:58:58.386+00:00",
"expiration": "2024-10-17T11:58:58.386+00:00",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjoxNzI5MTY2MzM4LCJzdWIiOiJlZGxjIiwiaXNzIjoiaHR0cHM6Ly9jb2RpZ29jZXJ0by10YXNrLWFwaS5vbnJlbmRlci5jb20ifQ.Klw8lQTooJh0E6Zh-eqzUjC-bLs4odR2KxNhAVN7EYY",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6WyJVU0VSIl0sImlhdCI6MTcyOTE2MjczOCwiZXhwIjo1MTg3NDk5MDE1LCJzdWIiOiJlZGxjIn0.dXDjGFrJ-Ff8JpDvbdwwCQQ4EHKUo37qzC7SSMmd09k"
}
```
---
###
TAREFAS
[Criar](#criar-1) |
[Editar](#editar) |
[Buscar Todas](#buscar-todas) |
[Buscar Uma](#buscar-uma) |
[Excluir](#excluir-1)
---
#### CRIAR
> POST - /api/task/v1
* Request
* Headers `Authorization: Bearer [accessToken]`
* Body
`title: required` `priority: low | medium | high` `status: pending | completed`
```json
{
"title": "Estudar JAVA",
"description": "Ler o livro Effective Java",
"priority": "medium",
"status": "pending",
"deadline": "2025-01-01"
}
```
* Response 200
```json
{
"id": 1,
"title": "Estudar JAVA",
"description": "Ler o livro Effective Java",
"priority": "MEDIUM",
"deadline": "2025-01-01T00:00:00.000+00:00",
"status": "PENDING",
"_links": {
"self": {
"href": "https://codigocerto-task-api.onrender.com/api/task/v1/1"
}
}
}
```
---
#### EDITAR
> PUT - /api/task/v1
* Request
* Headers
`Authorization: Bearer [accessToken]`
* Body
`id: required` `title: required` `priority: low | medium | high` `status: pending | completed`
```json
{
"id": 1,
"title": "Estudar JAVA",
"description": "Ler os livros Effective Java e Thinking in Java",
"priority": "low",
"status": "pending",
"deadline": "2025-02-02"
}
```
* Response 200
```json
{
"id": 1,
"title": "Estudar JAVA",
"description": "Ler os livros Effective Java e Thinking in Java",
"priority": "LOW",
"deadline": "2025-02-02T00:00:00.000+00:00",
"status": "PENDING",
"_links": {
"self": {
"href": "https://codigocerto-task-api.onrender.com/api/task/v1/1"
}
}
}
```
---
#### BUSCAR TODAS
> GET - /api/task/v1
* Request
* Headers
`Authorization: Bearer [accessToken]`
* Response 200
```json
[
{
"id": 1,
"title": "Estudar JAVA",
"description": "Ler os livros Effective Java e Thinking in Java",
"priority": "LOW",
"deadline": "2025-02-02T00:00:00.000+00:00",
"status": "PENDING",
"links": [
{
"rel": "self",
"href": "https://codigocerto-task-api.onrender.com/api/task/v1/1"
}
]
},
{
"id": 2,
"title": "Finalizar Projeto",
"description": "Escrever o README e adicionar ao repositório",
"priority": "HIGH",
"deadline": "2024-10-20T00:00:00.000+00:00",
"status": "PENDING",
"links": [
{
"rel": "self",
"href": "https://codigocerto-task-api.onrender.com/api/task/v1/2"
}
]
}
]
```
---
#### BUSCAR UMA
> GET - /api/task/v1/:id
* Request
* Headers
`Authorization: Bearer [accessToken]`
* Response 200
```json
{
"id": 1,
"title": "Estudar JAVA",
"description": "Ler os livros Effective Java e Thinking in Java",
"priority": "LOW",
"deadline": "2025-02-02T00:00:00.000+00:00",
"status": "PENDING",
"_links": {
"self": {
"href": "https://codigocerto-task-api.onrender.com/api/task/v1/1"
}
}
}
```
---
#### EXCLUIR
> DELETE - /api/task/v1/:id
* Request
* Headers
`Authorization: Bearer [accessToken]`
* Response 204
`No Content`
## Estrutura do Projeto
Optei por estruturar os diretórios e arquivos do projeto em módulos, ao invés da organização tradicional, na qual agrupam-se os arquivos por camadas (Controllers, Services, Repositories, etc).
Cada recurso ou funcionalidade está organizado em seu próprio pacote (Autenticação, JWT, User, Task, etc), ainda assim, respeitando a arquitetura onde cada camada possui suas responsabilidades.
Essa organização facilita a manutenção e mantém o projeto organizado conforme novas funcionalidades são adicionadas.
```plaintext
project-root/
|
├── src
| ├── main
| | ├── java
| | | └── app/edlc/taskapi
| | | ├── exception/
| | | ├── configuration/
| | | | ├── OpenApiConfig.java
| | | | └── WebConfig.java
| | | ├── security/
| | | | ├── exception/
| | | | ├── data/
| | | | | ├── AccountCredentialsDto.java
| | | | | └── TokenDto.java
| | | | ├── authentication/
| | | | | ├── AuthController.java
| | | | | └── AuthService.java
| | | | ├── jwt/
| | | | | ├── JwtTokenFilter.java
| | | | | └── JwtTokenProvider.java
| | | | └── SecurityConfig.java
| | | ├── task/
| | | | ├── exception/
| | | | ├── data/
| | | | | ├── mapper/
| | | | | ├── enums/
| | | | | ├── Task.java
| | | | | └── TaskDto.java
| | | | ├── TaskController.java
| | | | ├── TaskService.java
| | | | └── TaskRepository.java
| | | ├── user/
| | | | ├── exception/
| | | | ├── data/
| | | | | ├── mapper/
| | | | | ├── Permission.java
| | | | | ├── User.java
| | | | | ├── UserRequestDto.java
| | | | | └── UserResponseDto.java
| | | | ├── UserController.java
| | | | ├── UserService.java
| | | | └── UserRepository.java
| | | └── Startup.java
| | └── resources
| | ├── db/
| | | ├── migration/
| | | └── task-api-codigo-certo.db
| | └── application.yml
| └── test
| ├── java
| | ├── app/edlc/taskapi
| | | ├── authentication/
| | | | └── integrationtests/
| | | ├── task/
| | | | ├── integrationtests/
| | | | └── unittests/
| | | ├── user/
| | | | └── unittests/
| | | └── configuration/
| └── resources
| ├── db/
| | ├── migration/
| └── application-test.yml
|
├── .env.example
├── pom.xml
├── Dockerfile
├── docker-compose.yml
└── README.md
```
> Developed by edlcorrea. [Get in touch!](https://www.linkedin.com/in/edlcorrea/) :metal: