Skip to content

acmesquita/franksinatra

Repository files navigation

Franksinatra

Uma aplicação web Sinatra usando Ruby 3.4.4 com arquitetura limpa e princípios de Clean Architecture.

🏗️ Arquitetura

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

🚀 Início Rápido

Pré-requisitos

  • Ruby 3.4.4
  • PostgreSQL
  • Docker e Docker Compose (opcional)

1. Instalação Local

# 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 setup

2. Configuração do Banco de Dados

Edite 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"

3. Executar a Aplicação

# Iniciar o servidor
rake server
# ou
rake s

# A aplicação estará disponível em http://localhost:3000

🐳 Executando com Docker

Configuração Rápida com Resque

# 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 6379

Comandos Docker Disponíveis

make 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

Usando Docker Compose Diretamente

# 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 Manual

# Build da imagem
docker build -t sinatra-bootstrap .

# Execute o container
docker run -p 3000:3000 sinatra-bootstrap

🚀 Background Jobs com Resque

O 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.

🧪 Testes

# Executar todos os testes
rake test
# ou
rake t

# Executar testes com coverage
bundle exec rspec

🔧 Desenvolvimento

Comandos Úteis

# 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 banco

Estrutura de Rotas

A aplicação utiliza um sistema de roteamento modular. As rotas são definidas em app/infra/routes/ e carregadas automaticamente.

Adicionando Novas Funcionalidades

  1. Controller: Crie em app/adapters/controllers/
  2. Serializer: Crie em app/adapters/serializers/
  3. Use Case: Crie em app/core/usecases/
  4. Model: Crie em app/core/models/
  5. Routes: Defina em app/infra/routes/

Sistema de Background Jobs

O projeto inclui um sistema completo de background jobs com Resque:

Estrutura de Jobs

app/core/jobs/
├── base_job.rb      # Classe base com validação e logging
└── email_job.rb     # Exemplo de job para envio de emails

Criando um Novo Job

  1. 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
  1. 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)
  1. Monitorar execução:
# Ver logs do worker
make logs-resque

# Status das filas
make resque-status

📦 Dependências Principais

  • 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

🔒 Variáveis de Ambiente

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"

📝 API

Endpoint Principal

GET /

Resposta:

{
  "data": {
    "msg": "Hello",
    "system_name": "MY APP"
  }
}

Health Check

GET /health

Resposta:

{
  "data": {
    "status": "OK"
  }
}

Email Endpoints (Background Jobs)

Enviar Email de Boas-vindas

POST /emails/welcome
Content-Type: application/json

{
  "user_id": 123,
  "user_data": {
    "name": "João",
    "email": "[email protected]"
  }
}

Enviar Email de Notificação

POST /emails/notification
Content-Type: application/json

{
  "user_id": 123,
  "notification_data": {
    "message": "Nova notificação",
    "type": "info"
  }
}

Enviar Email de Reset de Senha

POST /emails/password-reset
Content-Type: application/json

{
  "user_id": 123,
  "reset_data": {
    "token": "abc123",
    "expires_at": "2024-01-01T00:00:00Z"
  }
}

Status das Filas

GET /emails/queue-status

Resposta:

{
  "status": "success",
  "data": {
    "message": "Status das filas obtido com sucesso",
    "queues": {
      "emails": {
        "pending": 5,
        "processing": 1,
        "failed": 0
      }
    }
  }
}

Tratamento de Erros

Para erros 500 (Internal Server Error), a aplicação retorna:

{
  "error": "Try again."
}

🤝 Contribuição

  1. Faça um fork do projeto
  2. Crie uma branch para sua feature (git checkout -b feature/nova-feature)
  3. Commit suas mudanças (git commit -am 'Adiciona nova feature')
  4. Push para a branch (git push origin feature/nova-feature)
  5. Abra um Pull Request

📄 Licença

Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.

🧪 Testando a API

Usando o arquivo doc.http

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ção

O arquivo contém exemplos de todas as requisições e respostas esperadas, facilitando o teste manual da API.

Usando cURL

Você também pode testar os endpoints usando cURL conforme documentado nas seções anteriores.

🆘 Troubleshooting

Problemas comuns:

  1. Erro de conexão com banco: Verifique se o PostgreSQL está rodando e as credenciais estão corretas
  2. Erro de dependências: Execute bundle install
  3. Erro de migração: Execute rake db:migrate
  4. Porta já em uso: Mude a porta no comando de execução

Logs:

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/

About

Bootstrap sinatra com Clean Arch

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors