Desafio Backend para a empresa TradeMap.
"Precisamos de uma API que sirva o Back-end de um blog. Essa API precisa ser capaz de:
- Criar um Post
- Editar um Post
- Deletar um Post
- Listar os Posts de maneira paginada, permitindo filtro por data.
- Obter informações de um Post por ID.
A entidade Post
, deve ter os seguintes campos:
- id -> Identificador do Post.
- title -> Título do Post.
- description -> Descrição do Post.
- body -> Corpo do Post.
- created_at -> Data de criação do Post.
- updated_at -> Data de atualização do Post."
-
Java 17
-
Spring Boot 3.x.x
-
Maven
-
PostgreSQL 16
-
Docker
-
FlyWay (Migrattions)
-
Junit5
-
Swagger (Documentação da API)
O PostMap é um projeto criado por mim para a vaga back-end da TradeMap
-
Caso não saiba como instalar e configurar o Docker, siga a documentação: https://docs.docker.com/engine/install/
Com o Docker instalado, utilize o comando para iniciar o projeto:
Lembre-se de navegar até a pasta que contém o docker-compose.yaml
docker compose up -d --build
Desta forma, provavelmente seu projeto já terá sido iniciado!
Caso queira parar o projeto, utilize:
docker compose down
Caso ocorra algum problema de "port already in use", o projeto PostMap utiliza a porta 8080 para executar a API e a 5432 para o banco de dados (Padrão do PostgreSQL).
Lembre-se de fechar qualquer serviço que esteja utilizando essas portasUtilize o comando:
sudo systemctl stop postgres
Isso pausará o postgres do seu host, mas não se preocupe, após testar a API, poderá ativar seu postgres novamente com o comando:
sudo systemctl start postgres
- O Projeto PostMap seguiu os requisitos do desafio, foi utilizado o princípio SOLID para criar a arquitetura MVC com Services.
- Realizado o desenvolvimento do CRUD de Posts
- A aplicação foi dockerizada com Multi-staging no Dockerfile para disponibilizar uma imagem mais leve e também automatizada com Docker-compose para fácil inicialização.
Caso já esteja com o projeto rodando e queira acompanhar a leitura e testes dos end-points,
há a opção realizar a leitura via Swagger API, no navegador digite:http://localhost:8080/swagger-ui/index.html
- Endpoint:
/post
- Método:
GET
- Código:
200 OK
- Descrição: Busca todos os posts.
- Permite filtro por data: O filtro por data é enviado como parâmetro na URL do recurso,
a initialDate (Data Inicial) e finalDate(dataFinal), caso não seja informado o filtro,
será retornado todos os objetos persistidos. As Datas devem ser enviadas no padrão ISO 8601, sem o timezone. (yyyy-MM-dd)
Disponibilizado também a personalização da quantidade de itens por página e seleção de página, que foi realizado através do Objeto Pageable do Spring Framework. A seleção é feita via URL com os parâmetros page e size
Os dados retornados como size e page, identificam quantas páginas existes na lista de itens, qual página atual e se é ou não a primeira ou última página, facilitando assim a produção de compenentes front-end para integração.Exemplo de URL com filtro por data:
localhost:8080/post?initialDate=2024-01-01&finalDate=2024-01-02
Exemplo de URL sem filtro por data:
localhost:8080/post
Exemplo de URL com filtro por data e paginção:
localhost:8080/post?initialDate=2024-01-01&finalDate=2024-01-02&size=5&page=0
Exemplo de URL sem filtro por data e paginção:
localhost:8080/post?size=5&page=0
Exemplo de JSON retornado
{ "postContent": [ { "id": "b9fa43da-b2ef-4213-bafe-7069c753d6f3", "title": "POST TESTE", "description": "POST DE TESTE", "body": "Este é o POST de teste", "createdAt": "2024-12-05T15:32:41.008858Z", "updatedAt": "2024-12-05T15:32:41.008858Z" } ], "number": 0, "size": 5, "totalPages": 1, "totalElements": 1, "numberOfElements": 1, "last": true, "first": true, "empty": false, "sorted": false, "unsorted": true
- Endpoint:
/post/id
- Método:
GET
- Código:
200 OK
- Descrição: Busca um post por UUID.
-
Exemplo de URL com busca por UUID
localhost:8080/post/b9fa43da-b2ef-4213-bafe-7069c753d6f3
Exemplo de JSON Retornado
{
"id": "b9fa43da-b2ef-4213-bafe-7069c753d6f3",
"title": "POST TESTE",
"description": "POST DE TESTE",
"body": "Este é o POST de teste",
"createdAt": "2024-12-05T15:32:41.008858Z",
"updatedAt": "2024-12-05T15:32:41.008858Z"
}
- Endpoint:
/post
- Método:
POST
- Código:
201 CREATED
- Descrição: Cria um novo Post com os dados enviados
- title
- description (descrição), não obrigatório
- body
- URI: Locale /post/{id}
Exemplo de URL para criar o POST
localhost:8080/post
Exemplo de JSON enviado
{
"title": "POST DE TESTE",
"description": "TESTE",
"body": "ESTE É UM POST DE TESTE"
}
Exemplo de JSON Retornado
```
{
"id": "9ca1bcd4-835e-4b47-b274-e0268fdb9ac7",
"title": "POST DE TESTE",
"description": "TESTE",
"body": "ESTE É UM POST DE TESTE"",
"createdAt": "2024-12-05T18:38:05.775401163Z",
"updatedAt": "2024-12-05T18:38:05.775401163Z"
}```
URI: localhost:8080/post/9ca1bcd4-835e-4b47-b274-e0268fdb9ac7
- Endpoint:
/post/{id}
- Método:
PUT
- Código:
200 OK
- Descrição: Atualiza um Post, selecionando o post via UUID no URL e enviando um JSON com os campos
- title
- description
- body
Exemplo de URL com UUID
localhost:8080/post/9ca1bcd4-835e-4b47-b274-e0268fdb9ac7
Exemplo de JSON enviado
{
"title": "POST DE TESTE ATUALIZADO",
"description": "TESTE ATUALIZADO ",
"body": "ESTE É UM POST DE TESTE ATUALIZADO"
}
Exemplo de JSON Retornado
{
"id": "9ca1bcd4-835e-4b47-b274-e0268fdb9ac7",
"title": "POST ATUALIZADO",
"description": "POSTO DE TESTE ATUALIZADO",
"body": "ESTE É UM POST DE TESTE ATUALIZADO",
"createdAt": "2024-12-05T18:38:05.775401Z",
"updatedAt": "2024-12-05T18:45:05.219877287Z"
}
- Endpoint:
/post/{id}
- Método:
DELETE
- Código:
200 OK
- Descrição: Apaga um Post do Banco de Dados
Exemplo de URL com UUID
localhost:8080/post/9ca1bcd4-835e-4b47-b274-e0268fdb9ac7
O padrão de retorno da API segue o padrão Restful, retornando os campos:
- timestamp
- nameStatus
- code
- error
JSON de erro:
{
"timestamp": "2024-12-05T18:53:12.631344509Z",
"name": "NOT_FOUND",
"code": 404,
"error": "Post not found"
}
Para os padrões de erros, é utilizado um builder para construir um objeto de resposta de erros