An open API service indexing awesome lists of open source software.

https://github.com/didifive/quickcup-api

Quickcup Backend API made with Java, Spring Boot, Thymeleaf and Postgres
https://github.com/didifive/quickcup-api

api api-rest apikey-authentication basic-authentication flyway java postgresql spring-boot spring-data-jpa spring-security thymeleaf thymeleaf-layout

Last synced: 5 months ago
JSON representation

Quickcup Backend API made with Java, Spring Boot, Thymeleaf and Postgres

Awesome Lists containing this project

README

          

![Repository language count](https://img.shields.io/github/languages/count/didifive/quickcup-api)
![Repository code size](https://img.shields.io/github/languages/code-size/didifive/quickcup-api)
[![GitHub last commit](https://img.shields.io/github/last-commit/didifive/quickcup-api?color=blue)](https://github.com/didifive/quickcup-api/commits/main)

[![Made by Didi](https://img.shields.io/badge/made%20by-Didi-green)](https://luiszancanela.dev.br/)

![Repository license](https://img.shields.io/github/license/didifive/quickcup-api)

[![IntelliJ IDEA](https://img.shields.io/badge/IntelliJIDEA-000000.svg?logo=intellij-idea&logoColor=white)](https://www.jetbrains.com/idea/)

![technology Java](https://img.shields.io/static/v1?color=red&label=Technology&message=Java&style=for-the-badge&logo=data:image/png;base64,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)
![technology Spring](https://img.shields.io/static/v1?color=6DB33F&label=Technology&message=Spring&style=for-the-badge&logo=spring)

# QuickCup API ā˜•

API Back-end com Java e Spring Boot e Front-end Administrativo com Thymeleaf para delivery de uma cafeteria.

## šŸŽÆ Objetivo

Este aplicativo foi criado atravƩs da oportunidade do desafio do trabalho semestral da
faculdade UNIFRAN / Cruzeiro do Sul, Projeto Integrador Transdisciplinar, do segundo
semestre de 2024. Todo o conteĆŗdo Ć© fictĆ­cio.

O defasio consistia em desenvolver um sistema para gerenciamento de delivery para uma cafeteria.

Para a solução, foi criado o sistema QuickCup com dois módulos:

- QuickCup API e ADMIN: O QuickCup API e Admin é essa aplicação e interface desenvolvida para o acesso da loja poder cadastrar os produtos e visualizar os pedidos realizados pelo consumidor. Nessa aplicação foram criados endpoints API REST para que o QuickCup App possa interagir com o QuickCup API.
O QuickCup Admin foi produzido para ser responsivo, mas para uma melhor experiência é ideal acessar com notebook ou computador. (Esse repositório contém o QuickCup API e Admin)
- QuickCup APP: O QuickCup App foi desenvolvido com React e Bootstrap CSS para trazer experiência de responsividade para acesso por via de diversos dispositivos mobiles ou notebooks e computadores. Link para o repositório do APP: [didifive/quickcup-app](https://github.com/didifive/quickcup-app)

## šŸ”§ Principais Tecnologias

- Java 17
- Maven
- Spring Boot 3.3.5
- Spring Web
- Spring Data JPA
- PostgreSQL
- Flyway
- Thymeleaf
- Docker e Docker Compose 3 para desenvolvimento local com postgres
- IntelliJ IDEA

## šŸ”£ Diagramas

Os diagramas foram criados na sintaxe [Mermaid](https://mermaid.live/).

### Diagrama de Classes

```mermaid
classDiagram
class BasicEntity {
<>
- Long id
+ getId()
+ setId()
}

class Empresa {
- Short id
- String nome
- String email
- String telefone
- BigDecimal valorEntrega
- Time tempoEntrega
- String cep
- String logradouro
- Integer numero
- String complemento
- String bairro
- String cidade
- String estado
- BigDecimal longitude
- BigDecimal latitude
+ Getters() and Setters()
}

class Cliente {
- String nome
- String telefone
- List~Endereco~ enderecos
+ Getters() and Setters()
}

class Endereco {
- Long clienteId
- String nome
- String cep
- String logradouro
- Integer numero
- String complemento
- String bairro
- String cidade
- String estado
- BigDecimal longitude
- BigDecimal latitude
+ Getters() and Setters()
}

class Grupo {
- String nome
- String descricao
- List~Produto~ produtos
+ Getters() and Setters()
}

class Produto {
- String codigo
- String nome
- String descricao
- String imagem
- BigDecimal valorOriginal
- BigDecimal valorDesconto
- boolean enabled
- Grupo grupo
+ Getters() and Setters()
}

class PedidoStatus {
<>
NOVO
CONFIRMADO
CANCELADO
EM_PREPARO
EM_ENTREGA
FINALIZADO
}

class FormaPagamento {
<>
DINHEIRO
CARTAO_CREDITO
CARTAO_DEBITO
PIX
}

class Pedido {
- Cliente cliente
- PedidoStatus status
- BigDecimal valorEntrega
- boolean retira
- String endereco
- FormaPagamento formaPagamento
- String observacoes
- Instant dataHoraPedido
- List~ItemPedido~ itens
+ Getters() and Setters()
}

class ItemPedidoId {
<>
- Pedido pedido
- Produto produto
+ ItemPedidoId()
+ ItemPedidoId(Pedido, Produto)
+ Getters() and Setters()
+ hashCode()
+ equals()
}

class ItemPedido {
- ItemPedidoId id
- Integer quantidade
- BigDecimal valorUnitarioOriginal
- BigDecimal valorUnitarioDesconto
+ Getters() and Setters()
}

class DiaSemana {
<>
DOMINGO
SEGUNDA
TERCA
QUARTA
QUINTA
SEXTA
SABADO
+ from(DayOfWeek)
}

class Funcionamento {
- DiaSemana diaSemana
- Time horaInicio
- Time horaFim
+ Getters() and Setters()
}

class FuncionamentoEspecialTipo {
<>
ABERTO
FECHADO
}

class FuncionamentoEspecial {
- String nome
- Instant dataInicio
- Instant dataFim
- FuncionamentoEspecialTipo tipo
+ Getters() and Setters()
}

Cliente -- BasicEntity : herda
Endereco -- BasicEntity : herda
Grupo -- BasicEntity : herda
Produto -- BasicEntity : herda
Pedido -- BasicEntity : herda
FuncionamentoEspecial -- BasicEntity : herda
Pedido -- PedidoStatus : contƩm
Pedido -- FormaPagamento : contƩm
Cliente "1" -- "0..*" Endereco : possui
Grupo "1" -- "0..*" Produto : contƩm
Pedido "1" -- "0..*" Cliente : pertence
ItemPedidoId "1" -- "1" ItemPedido : inclui
ItemPedido "1" -- "0..*" Pedido : inclui
Funcionamento -- DiaSemana : possui
FuncionamentoEspecial -- FuncionamentoEspecialTipo : possui

```

### Diagrama de Sequencia

```mermaid
sequenceDiagram
actor Cliente
participant Aplicativo
participant API
actor Atendente
Cliente->>+Aplicativo: Cliente acessa aplicativo
Aplicativo->>+Cliente: Loja em funcionamento disponibiliza menu
Cliente->>+Aplicativo: Escolhe item do menu
Cliente->>+Aplicativo: Adiciona produto com quantidade ao carrinho
Aplicativo->>+Cliente: Retorna tela do carrinho
Cliente->>+Aplicativo: Informa nome e telefone
Cliente->>+Aplicativo: Informa opção de entrega e endereço
Cliente->>+Aplicativo: Informa modo de pagamento
Cliente->>+Aplicativo: Faz o pedido
Aplicativo->>+API: Encaminha o pedido
API->>+Aplicativo: Retorna pedido efetuado
API->>+Atendente: Informa pedido novo
Atendente->>+API: Atualiza status pedido
Cliente->>+Aplicativo: Consulta pedido
Aplicativo->>+API: Consulta Status Pedido
API->>+Aplicativo: Retorna Status Pedido
Aplicativo->>+Cliente: Informa status pedido

```

### Diagrama de Entidade e Relacionamento

```mermaid
erDiagram
EMPRESA {
SMALLINT id PK
VARCHAR nome
VARCHAR email
VARCHAR telefone
DECIMAL valor_entrega
TIME tempo_entrega
VARCHAR cep
VARCHAR logradouro
INTEGER numero
VARCHAR complemento
VARCHAR bairro
VARCHAR cidade
VARCHAR estado
DECIMAL longitude
DECIMAL latitude
}

CLIENTE {
BIGINT id PK
VARCHAR nome
VARCHAR telefone
}

ENDERECO {
BIGINT id PK
BIGINT cliente_id FK
VARCHAR nome
VARCHAR cep
VARCHAR logradouro
INTEGER numero
VARCHAR complemento
VARCHAR bairro
VARCHAR cidade
VARCHAR estado
DECIMAL longitude
DECIMAL latitude
}

GRUPO {
BIGINT id PK
VARCHAR nome
VARCHAR descricao
}

PRODUTO {
BIGINT id PK
VARCHAR codigo
VARCHAR nome
VARCHAR descricao
VARCHAR imagem
DECIMAL valor_original
DECIMAL valor_desconto
BOOLEAN enabled
BIGINT grupo_id FK
}

PEDIDO {
BIGINT id PK
BIGINT cliente_id FK
VARCHAR status
DECIMAL valor_entrega
BOOLEAN retira
VARCHAR endereco
VARCHAR forma_pagamento
VARCHAR observacoes
TIMESTAMP data_hora_pedido
}

ITEM_PEDIDO {
BIGINT pedido_id PK
BIGINT produto_id PK
INTEGER quantidade
DECIMAL valor_unitario_original
DECIMAL valor_unitario_desconto
}

FUNCIONAMENTO {
VARCHAR dia_semana PK
TIME hora_inicio
TIME hora_fim
}

FUNCIONAMENTO_ESPECIAL {
BIGINT id PK
VARCHAR nome
TIMESTAMP data_inicio
TIMESTAMP data_fim
VARCHAR tipo
}

CLIENTE ||--|{ ENDERECO : possui
GRUPO ||--o{ PRODUTO : "contƩm"
PEDIDO ||--o| CLIENTE : pertence
ITEM_PEDIDO ||--o| PEDIDO : inclui
ITEM_PEDIDO ||--|{ PRODUTO : "contƩm"

%% Triggers
ITEM_PEDIDO ||--|{ prevent_delete_or_update_item_pedido_trigger : "prevenção de delete/update"
PEDIDO ||--|{ prevent_delete_pedido_trigger : "prevenção de delete"
PEDIDO ||--|{ allow_update_status_only_trigger : "permitir update apenas no status"

```

-----

## šŸ“· Prints do Projeto

### šŸŽ„ Demonstração de Telas e Funcionamento
![Demonstração de Telas e Funcionamento](docs/QuickCup-Demo.gif)

### Spring banner personalizado
![Spring banner personalizado](docs/Spring-Banner-Personalizado.png)

### Tela Inicial do QuickCup Admin
![Tela Inicial do QuickCup Admin](docs/QuickCup-Admin.png)

### Tela Atendimento Pedidos
![Tela Atendimento Pedidos](docs/Atendimento-Pedidos.png)

### Menu e InstruƧƵes conforme nƭvel de acesso

#### Menu sem logar
![Menu sem Logar](docs/Menu-sem-Logar.png)

#### Tela de Login
![Tela de Login](docs/Tela-Login.png)

#### Perfil Admin
![Perfil Admin - Menu](docs/Perfil-Admin-Menu.png)
![Perfil Admin - InstruƧƵes](docs/Perfil-Admin-Instrucoes.png)

#### Perfil Atendente
![Perfil Atendente - Menu](docs/Perfil-Atendente-Menu.png)
![Perfil Atendente - InstruƧƵes](docs/Perfil-Atendente-Instrucoes.png)

#### Perfil Dev
![Perfil Dev - Menu](docs/Perfil-Dev-Menu.png)
![Perfil Dev - InstruƧƵes](docs/Perfil-Dev-Instrucoes.png)

### Swagger QuickCup API
![Swagger QuickCup API](docs/Swagger-QuickCup-API.png)
![Swagger QuickCup API Authorization With ApiKey](docs/Swagger-QuickCup-API-Authorization-ApiKey.png)

### JaCoCo Coverage
![JaCoCo Coverage](docs/JaCoCo-Coverage.png)

### VariƔveis de Ambiente configuradas no Railway:
![Railway Environments Variables](docs/Railway-Environments-Variables.png)

-----

## āœ”ļø Testes
Os testes foram feitos utilizando JUnit 5, Mockito e MockMVC com Hamcrest.

Para executar os testes pode executar sua IDE ou

Utilizando o terminal (PowerShell, Bash ou similiar), basta executar na pasta do projeto o comando abaixo:

```
./mvnw clean verify -Dspring.profiles.active=test
```

-----

## āš™ Executando o projeto localmente
Antes de mais nada, Ʃ preciso possuir no mƭnimo JDK 21 LTS instalado na mƔquina em que
irÔ executar. A execução do projeto pode ser feita utilizando recurso de sua IDE ou
com comando (demonstrado no próximo item).

### šŸŒ VariĆ”veis de Ambiente

Antes de executar é preciso ter atenção e configurar as variÔveis de ambiente:

- `SPRING_PROFILES_ACTIVE`: Ambiente de desenvolvimento ou produção
- `PGHOST`: Host Postgres
- `PGPORT`: Porta Postgres
- `PGDATABASE`: Nome do database Postgres
- `POSTGRES_USER`: UsuƔrio Postgres
- `POSTGRES_PASSWORD`: Senha Postgres
- `QUICKCUP_API_KEY`: Chave de acesso da API
- `QUICKCUP_USERS_DEFAULT_PASSWORD`: Senha padrão para os usuÔrios do painel administrativo
- `CROSS_ORIGIN_URLS`: URLs para configurar o CORS para acesso de aplicativos externos aos endpoints REST API
- `LINK_FORMULARIO_TESTES`: URL para acessar o formulÔrio de testes (para carregar no index do painel administrativo, não afeta o funcionamento da aplicação)
- `LINK_APLICACAO_CLIENTE`: URL para acessar a aplicação do cliente (para carregar no index do painel administrativo, não afeta o funcionamento da aplicação)

Para facilitar eu deixei o arquivo `.env.sample` com as variÔveis de ambiente. Basta renomear para `.env` para que a aplicação
carregue as informaƧƵes das variƔveis de ambiente.

#### šŸŒ VariĆ”veis de Ambiente no Railway

Para a aplicação hospedada no Railway, além de definir as variÔveis de ambiente mínimas para a aplicação
Ʃ necessƔrio definir a variƔvel de ambiente abaixo:

- `NIXPACKS_JDK_VERSION`: VariÔvel de ambiente para definir a versão do JDK, no caso desse projeto é `21`.

### 🐘 Postgres Docker Compose

Essa aplicação depende do Postgres para funcionar, acima existem variÔveis de ambiente para configurar o acesso ao banco de dados.
Caso jƔ possua um banco de dados Postgres, basta ajustar as variƔveis de ambiente para acessƔ-lo.
Nesse projeto utilizamos o Postgres Docker Compose para facilitar a execução do projeto localmente sem necessitar de ter o Postgres instalado
ou configurado. Para executar o Postgres Docker Compose, basta executar na pasta do projeto o comando abaixo:

```
docker compose up
```

O docker compose também estÔ preparado para ler as informações do arquivo `.env` mencionado no item anterior, isso facilita a integração da
aplicação com o banco de dados jÔ que ambas utilizando variÔveis de ambiente em comum.
No docker compose `docker-compose.yml` tambƩm foi configurado para subir uma instancia do pgadmin para que se possa
ter acesso visual ao banco Postgres.

### ⚔ Executando

Depois de configurar as variƔveis de ambiente e executar o Postgres Docker Compose (ou ter considerado as configuraƧƵes de seu Postgres), digite no terminal:

- PowerShell: `./mvnw spring-boot:run`
- Bash: `./mvnw spring-boot:run`
- CMD: `mvnw spring-boot:run`

## šŸ“š OpenApi / Swagger
Quando a aplicação estiver no ar, é possível acessar a documentação da API com endpoints REST utilizando o Swagger OpenAPI v3.1 através do link: http://localhost:8080/swagger-ui/index.html

## šŸ‘Ŗ Populate
Para popular dados bƔsicos no banco de dados ao iniciar o projeto, foi criada a migration do FlyWay V999__Initial_Inserts.sql.

## ā˜ļø Deploy na Nuvem
Esse projeto foi implantado no Railway que faz integração com o repositório do GitHub.
URL da aplicação: https://quickcup-api.zancanela.dev.br

-----

Feito com ā¤ļø e dedicação por [Luis Zancanela](https://github.com/didifive)