O projeto foi desenvolvido com foco nos princípios de Clean Code, performance e manutenibilidade, seguindo as melhores práticas do ecossistema Ruby on Rails. A aplicação está totalmente dockerizada para garantir um ambiente de desenvolvimento consistente e de fácil configuração.
Antes de começar, certifique-se de que você tem as seguintes ferramentas instaladas:
- Docker
- Docker Compose
- Um terminal Unix-like (Linux, macOS ou WSL no Windows).
O projeto foi configurado para ser executado de forma simples e rápida com Docker. Siga os passos abaixo:
1. Clone o Repositório
2. Configure as Variáveis de Ambiente
mv env.example .env3. Instale o Script Auxiliar
(talvez precise rodar chmod +x ./rd)
./rd setup
source ~/.bashrc
rdteste! Deve exibir uma interface com os comandos disponíveis.
rd4. Construa as Imagens Docker
docker build --build-arg UID=$UID -t rd-commerce .docker compose build5. Instale as gems
rd run bundle installrd run_test bundle install6. Crie o banco de dados
rd db:setup7. Inicie a Aplicação
rd startPronto! A API estará rodando em http://localhost:3000.
Para executar os testes:
rd testAs escolhas de arquitetura foram focadas em criar uma solução limpa, performática e de fácil manutenção.
-
Arquitetura MVC com Service Layer Adotei uma Service Layer (
CartService) para isolar a lógica de negócio, seguindo o princípio de Skinny Controllers. Isso mantém as controllers focadas no fluxo HTTP, resultando em um código mais organizado e fácil de testar. -
Redis O Redis foi utilizado como peça central de alta performance em três frentes: como Cache Store para reduzir a carga no banco de dados, como backend para o Sidekiq garantindo a execução confiável de jobs, e como Session Store para permitir escalabilidade futura da aplicação.
-
Cache Inteligente com Invalidação Automática Implementei o cache do carrinho da sessão com invalidação automática e segura. Usando
touch: truenas associações e um callbackafter_commitno modelCart, garantimos que o cache seja invalidado imediatamente após qualquer modificação ser confirmada no banco de dados, evitando dados desatualizados. -
Jobs Concisos com Scopes no ActiveRecord A lógica do Sidekiq Job foi simplificada e tornada mais legível com o uso de Scopes no model
Cart(ex:Cart.abandonable). Isso limpa o código do worker e segue o princípio DRY. Otouch: truenos itens do carrinho também é fundamental aqui, pois ele atualiza o timestamp de inatividade (last_interaction_at) que alimenta a lógica do job.