API backend para um e-commerce de moda feminina, com foco em catálogo de roupas, gestão de estoque, vendas por pedido e integrações de pagamento. Este projeto entrega uma arquitetura corporativa com autenticação JWT, integração externa com Asaas e Firebase, suporte a upload de mídia e uma camada de serviços bem definida.
A Fashion Store API foi desenvolvida para ser o núcleo de um sistema de varejo de moda feminina.
Ela expõe endpoints REST para gestão de produtos, clientes, pedidos e controle financeiro, além de suportar:
- catálogo de produtos com categorias, imagens e variações
- fluxo de pedidos com alteração de status e integração de pagamento
- upload de fotos de produtos via arquivo ou URL remota
- notificações push via Firebase e WebSocket para painel de administração
- webhook Asaas para confirmação automatizada de pagamentos
- ferramentas de busca, filtro e ranking de vendas
- Persistência JPA de domínio relacional (
Pedido,Cliente,Peca,ItemPedido,CategoriaPeca,PecaImagem) - Validação de autenticação com JWT e filtro de requisição customizado
- Configuração de CORS segura para frontend Angular / administração
- Exposição de API documentada com Springdoc OpenAPI
- Upload e ingestão de imagens de produto via
RestTemplateou multipart - Notificações reativas: WebSocket + Firebase topics
- Integração com serviço de pagamento externo (Asaas)
- Java 21
- Spring Boot 3.4.3
- Spring Web + Spring WebFlux
- Spring Data JPA
- Spring Security
- Spring WebSocket / STOMP
- Thymeleaf
- Firebase Admin SDK
- JWT (
java-jwt+jjwt) - MapStruct
- Lombok
- Springdoc OpenAPI
- MySQL / PostgreSQL
- Apache HttpClient
- Caelum Stella (validação de CPF/CNPJ e formatação)
A aplicação segue um padrão clássico em camadas:
controller/— adaptadores HTTP REST e webhooksservice/— lógica de negócio e regras de domíniodao/— acesso direto a repositórios e consultas customizadasmodel/— entidades JPA e relacionamento de dadosdto/— contratos de API e payloads específicosintegration/— integração com serviços externos, como Asaassecurity/— configuração de segurança, JWT e filtro de autenticaçãoconfig/— configuração de WebSocket e CORS
O pacote base é com.gabriel_nunez.oficina_mecanica por legado de projeto, mas o domínio atual é e-commerce de moda feminina.
- a arquitetura em camadas ajuda a deixar o projeto mais organizado e facilita manutenção
- a separação de
controller,service,daoeintegrationestá clara, embora seja possível melhorar a centralização das regras de upload e mídia - o uso de JWT e
SecurityFilterChainatende à necessidade de autenticação, mas a configuração de CORS merece atenção em ambientes de produção spring.jpa.hibernate.ddl-auto=updateé conveniente para desenvolvimento; em produção, um fluxo de migração de banco é mais seguro- o suporte a notificações em tempo real e processamento de webhook agrega valor ao e-commerce
- alguns nomes como
PecaeCategoriaPecaainda carregam o histórico do projeto e podem ser revisitados em refatorações futuras
- há credenciais e URLs no
application.properties; para produção, o ideal é externalizar esses segredos - o
UploadServiceImplusa caminho de arquivo local fixo, o que pode dificultar deploy em contêineres ou nuvem - capturas genéricas de
Exceptionnos controllers podem ser melhoradas com tratamento de erros mais consistente RestTemplatee Spring WebFlux coexistem, então há oportunidade de alinhar a comunicação externa com uma única abordagem- o uso de inteiros para status de pedido pode ser simplificado com enums para mais clareza
- revisar nomes de domínio para refletir melhor produtos de moda
- adicionar validação de entrada com
@Valid,@NotNull,@Size - aplicar tratamento global de exceções com
@ControllerAdvice - preparar configuração separada para
deveprod - ampliar testes de integração para fluxos críticos, especialmente pagamento e webhook
- considerar um armazenamento de mídia configurável para uploads
- histórico de status:
NOVO_PEDIDO,PAGO,EM_TRANSPORTE,ENTREGUE,POS_VENDA,FINALIZADO,CANCELADO - relacionamento
@ManyToOnecomCliente - relacionamento
@OneToManycomItemPedido - campos de
valorTotal,valorFrete,linkPagamento,asaasPaymentId
- catálogo de produtos que representa roupas e acessórios femininos
- busca por palavra-chave, paginação e destaque de itens
- upload de imagens por arquivo ou URL externa
- múltiplas imagens por produto e definição de imagem principal
- busca por telefone, nome, palavra-chave e aniversariantes
- histórico de compras e relacionamento com pedido
MyWebApplicationSecurityConfigconfigura filtros JWT e autorizações- endpoints públicos autorizados para login, busca de produtos, documentação e webhook
- CORS habilitado para origens confiáveis incluindo
localhost:4200,localhost:4222,projetoreal.dev.br
WebSocketConfigexpõe endpoint STOMP em/ws- mensagens são publicadas em
/topic - usado para eventos de pagamento e atualizações em tempo real
NotificationServicegera notificações com payload de dados- tópicos são usados para alertas de estoque e confirmação de pagamento
- mensagens são construídas para evitar duplicação de notificações automáticas
- webhook em
/webhook/asaas - eventos processados:
PAYMENT_CONFIRMED,PAYMENT_RECEIVED - pedido atualizado para
PAGOe notificado via Firebase/WebSocket
POST /login— autentica usuário e retorna token JWT
GET /usuarioGET /usuario/{id}POST /usuarioPUT /usuario/{id}
GET /cliente/{telefone}GET /cliente/nome/{letra}GET /cliente/busca/{keyword}GET /cliente/compras/{id}GET /cliente/aniversario/{mes}POST /clientePUT /cliente
POST /pecaPUT /peca/{idPeca}GET /peca— lista paginada de destaquesGET /peca/todosGET /peca/categoria/{id}GET /peca/{id}GET /peca/busca?key={texto}POST /peca/upload— upload de arquivoPOST /peca/{id}/imagem— upload de imagem para produtoPOST /peca/{id}/imagem/url— adiciona imagem via URL externaGET /peca/{idPeca}/imagensPATCH /peca/{idPeca}/imagem/{idImagem}/principalPATCH /peca/{id}/imagens/reordenarDELETE /peca/imagem/{idImagem}POST /produtos_mais_pedidos
POST /pedidoPUT /pedidoPATCH /pedido/{id}?status={status}GET /pedido/search/{id}POST /pedido/filtrarGET /pedido/recentes?inicio={yyyy-MM-dd}&fim={yyyy-MM-dd}
POST /api/notifications/subscribePOST /api/notifications/unsubscribe
POST /webhook/asaas
- Java 21
- Maven 3.x ou wrapper
./mvnw - Banco de dados MySQL ou PostgreSQL
./mvnw clean package
./mvnw spring-boot:run./mvnw clean package
java -jar target/java-0.0.1-SNAPSHOT.jarserver.portspring.datasource.urlspring.datasource.usernamespring.datasource.passwordspring.datasource.driver-class-namespring.jpa.hibernate.ddl-autoapp.frontend.urltelegrambot_url,telegrambot_chat_id,telegrambot_msgasaas.url,asaas.apikeyspringdoc.packagesToScan
- Swagger UI:
http://localhost:8080/swagger-ui.html - Testes:
./mvnw test
- use
spring.jpa.hibernate.ddl-auto=validateounoneem produção - remova credenciais e tokens do
application.properties - centralize segredos via variáveis de ambiente ou vault
- habilite logs e tracing apenas em ambientes controlados
- configure CORS estritamente para domínios conhecidos
- monitore status do webhook Asaas e falhas de entrega
NotificationServiceenvia notificações via topic com payload customizadoPecaControllersuporta upload de imagens e ingestão a partir de URL externaAsaasWebhookControllernão reprocessa pedidos já confirmadosMyWebApplicationSecurityConfigabre endpoints públicos necessários para frontend e documentaçãoWebSocketConfigexpõe/wscom SockJS para clientes de dashboard
- a arquitetura em camadas e o uso de padrões Spring facilitam a manutenção
- notificações em tempo real são um diferencial para o painel administrativo
- integração com Asaas e Firebase traz automação de pagamento e alertas de estoque
- externalizar segredos e credenciais fora do repositório
- adotar migrações de banco de dados mais previsíveis
- adicionar tratamento global de exceções e melhores códigos HTTP
- padronizar logs e reduzir
System.out.println - tornar upload de mídia configurável e menos dependente do filesystem local
- separar módulos de checkout e carrinho para maior desacoplamento
- adicionar uma camada de aplicação para orquestração de fluxos de negócio
- avaliar search full-text para catálogo de produtos
pom.xmlsrc/main/java/com/gabriel_nunez/oficina_mecanica/OficinaMecanicaApplication.javasrc/main/java/com/gabriel_nunez/oficina_mecanica/security/MyWebApplicationSecurityConfig.javasrc/main/java/com/gabriel_nunez/oficina_mecanica/controller/PedidoController.javasrc/main/java/com/gabriel_nunez/oficina_mecanica/controller/PecaController.javasrc/main/java/com/gabriel_nunez/oficina_mecanica/controller/AsaasWebhookController.javasrc/main/resources/application.properties