Uma aplicação web Sinatra usando Ruby 3.4.4 com arquitetura limpa e princípios de Clean Architecture.
O projeto segue os princípios de Clean Architecture com as seguintes camadas:
app/
├── adapters/ # Controllers, serializers, repositories
│ ├── controllers/ # Controladores HTTP
│ ├── serializers/ # Serialização de dados
│ └── repositories/ # Acesso a dados
├── core/ # Lógica de negócio
│ ├── errors/ # Classes de erro personalizadas
│ ├── models/ # Modelos de domínio
│ └── usecases/ # Casos de uso
└── infra/ # Infraestrutura
└── routes/ # Definição de rotas
- Ruby 3.4.4
- PostgreSQL
- Docker e Docker Compose (opcional)
# Clone o repositório
git clone <repository-url> <name_project>
cd <name_project>
# Instale as dependências
bundle install
# Configure as variáveis de ambiente
cp .env_developer .env
# Crie e configure o banco de dados
rake setupEdite o arquivo .env com suas credenciais do PostgreSQL:
DATABASE_USER="postgres"
DATABASE_PASSWORD="postgres"
DATABASE_NAME="my_app_developer"
DATABASE_HOST="localhost"
DATABASE_PORT="5432"
DATABASE_URL="postgres://postgres:postgres@localhost:5432/my_app_developer"# Iniciar o servidor
rake server
# ou
rake s
# A aplicação estará disponível em http://localhost:3000# Configuração completa do ambiente (app + db + redis + resque-worker)
make setup
# A aplicação estará disponível em http://localhost:3000
# O banco PostgreSQL estará disponível na porta 5432
# O Redis estará disponível na porta 6379make start # Iniciar todos os serviços
make stop # Parar todos os serviços
make status # Ver status dos containers
make logs # Ver logs de todos os serviços
make logs-resque # Ver logs do worker do Resque
make resque-status # Status das filas do Resque
make shell # Abrir shell no container da aplicação# Execute com Docker Compose
docker-compose up
# A aplicação estará disponível em http://localhost:3000
# O banco PostgreSQL estará disponível na porta 5432
# O Redis estará disponível na porta 6379# Build da imagem
docker build -t sinatra-bootstrap .
# Execute o container
docker run -p 3000:3000 sinatra-bootstrapO projeto inclui um sistema completo de background jobs usando Resque:
- Redis: Armazena as filas de jobs
- Resque Worker: Processa os jobs em background
- Email Jobs: Exemplo de jobs para envio de emails
Para mais detalhes, consulte DOCKER_SETUP.md e RESQUE_SETUP.md.
# Executar todos os testes
rake test
# ou
rake t
# Executar testes com coverage
bundle exec rspec# Linting
rake lint # Verificar código
rake lint_fix # Corrigir automaticamente
# Banco de dados
rake db:create # Criar banco
rake db:migrate # Executar migrações
rake db:reset # Resetar banco
rake db:seed # Popular banco
# Setup completo
rake setup # Instalar dependências + configurar bancoA aplicação utiliza um sistema de roteamento modular. As rotas são definidas em app/infra/routes/ e carregadas automaticamente.
- Controller: Crie em
app/adapters/controllers/ - Serializer: Crie em
app/adapters/serializers/ - Use Case: Crie em
app/core/usecases/ - Model: Crie em
app/core/models/ - Routes: Defina em
app/infra/routes/
O projeto inclui um sistema completo de background jobs com Resque:
app/core/jobs/
├── base_job.rb # Classe base com validação e logging
└── email_job.rb # Exemplo de job para envio de emails
- Criar a classe do job herdando de
BaseJob:
class MeuJob < Core::Jobs::BaseJob
@queue = :minha_fila
def self.perform(parametro1, parametro2)
# Lógica do job aqui
logger.info "Processando job com #{parametro1}"
end
end- Enfileirar o job no controller:
# Método direto
Resque.enqueue(MeuJob, param1, param2)
# Ou usando validação
MeuJob.enqueue_with_validation(:minha_fila, param1, param2)- Monitorar execução:
# Ver logs do worker
make logs-resque
# Status das filas
make resque-status- Sinatra: Framework web
- ActiveRecord: ORM para banco de dados
- Zeitwerk: Autoloading
- Puma: Servidor web
- RSpec: Framework de testes
- RuboCop: Linter de código
- PostgreSQL: Banco de dados
- Resque: Sistema de background jobs
- Redis: Armazenamento de filas de jobs
Crie um arquivo .env baseado no .env_developer:
# Database
DATABASE_USER="seu_usuario"
DATABASE_PASSWORD="sua_senha"
DATABASE_NAME="nome_do_banco"
DATABASE_HOST="localhost"
DATABASE_PORT="5432"
DATABASE_URL="postgres://usuario:senha@host:porta/banco"
# Redis
REDIS_URL="redis://localhost:6379/0"
# Application
RACK_ENV="development"
# Resque
QUEUE="emails"
RESQUE_WORKERS="2"
RESQUE_LOG_LEVEL="DEBUG"GET /Resposta:
{
"data": {
"msg": "Hello",
"system_name": "MY APP"
}
}GET /healthResposta:
{
"data": {
"status": "OK"
}
}POST /emails/welcome
Content-Type: application/json
{
"user_id": 123,
"user_data": {
"name": "João",
"email": "[email protected]"
}
}POST /emails/notification
Content-Type: application/json
{
"user_id": 123,
"notification_data": {
"message": "Nova notificação",
"type": "info"
}
}POST /emails/password-reset
Content-Type: application/json
{
"user_id": 123,
"reset_data": {
"token": "abc123",
"expires_at": "2024-01-01T00:00:00Z"
}
}GET /emails/queue-statusResposta:
{
"status": "success",
"data": {
"message": "Status das filas obtido com sucesso",
"queues": {
"emails": {
"pending": 5,
"processing": 1,
"failed": 0
}
}
}
}Para erros 500 (Internal Server Error), a aplicação retorna:
{
"error": "Try again."
}- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
O projeto inclui um arquivo doc.http que pode ser usado com extensões REST Client do VS Code ou IntelliJ para testar rapidamente os endpoints:
# Instale a extensão REST Client no VS Code
# Abra o arquivo doc.http
# Clique em "Send Request" acima de cada requisiçãoO arquivo contém exemplos de todas as requisições e respostas esperadas, facilitando o teste manual da API.
Você também pode testar os endpoints usando cURL conforme documentado nas seções anteriores.
- Erro de conexão com banco: Verifique se o PostgreSQL está rodando e as credenciais estão corretas
- Erro de dependências: Execute
bundle install - Erro de migração: Execute
rake db:migrate - Porta já em uso: Mude a porta no comando de execução
Os logs da aplicação são exibidos no console. Para debug, use byebug no código.
Para mais informações, consulte a documentação do Sinatra: https://sinatrarb.com/