API RESTful completa para e-commerce construĆda com Ruby on Rails.
| Recurso | URL |
|---|---|
| š Landing Page | Ver Site |
| š Documentação | Acessar Docs |
| š Demo App | Testar Loja |
- Sobre o Projeto
- Demo Online
- Tecnologias
- Estrutura do Projeto
- Instalação
- Autenticação
- Endpoints
- Exemplos de Uso
- Modelos de Dados
Esta API fornece funcionalidades completas para um e-commerce, incluindo:
- ā Autenticação JWT via Devise Token Auth
- ā GestĆ£o de Produtos com categorias hierĆ”rquicas
- ā GestĆ£o de Pedidos com controle de estoque automĆ”tico
- ā Ćrea Administrativa para gerenciamento completo
- ā Ćrea do Cliente (Storefront) para navegação e compras
- ā Paginação em todas as listagens
- ā Frontend Demo para testar a API
O projeto inclui um frontend demo completo que pode ser hospedado no GitHub Pages:
docs/
āāā index.html # Landing page com mĆ©tricas e features
āāā documentation.html # Documentação tĆ©cnica completa
āāā app.html # Frontend demo funcional
- šļø CatĆ”logo de Produtos - Navegue, filtre e busque
- š Carrinho de Compras - Adicione, remova e altere quantidades
- š¤ Autenticação - Login/Registro com tokens
- š¦ Pedidos - Crie e acompanhe seus pedidos
- š Modo Demo - Funciona mesmo sem a API (dados mockados)
- Faça push do repositório para o GitHub
- VĆ” em Settings > Pages
- Selecione branch
maine pasta/docs - Acesse:
https://seu-usuario.github.io/ecommerce-api/
| Tecnologia | Versão | Descrição |
|---|---|---|
| Ruby | 3.2.2 | Linguagem de programação |
| Rails | 7.0.x | Framework web (API mode) |
| SQLite3 | 1.6.x | Banco de dados |
| Devise Token Auth | 1.2.x | Autenticação JWT |
| Kaminari | 1.2.x | Paginação |
| Rack CORS | 2.0.x | Cross-Origin Resource Sharing |
app/
āāā controllers/
ā āāā admin/v1/ # Controllers administrativos
ā ā āāā api_controller.rb # Base com auth + verificação admin
ā ā āāā categories_controller.rb
ā ā āāā home_controller.rb # Dashboard
ā ā āāā orders_controller.rb
ā ā āāā products_controller.rb
ā ā āāā users_controller.rb
ā āāā storefront/v1/ # Controllers da loja
ā ā āāā api_controller.rb # Base com auth opcional
ā ā āāā categories_controller.rb
ā ā āāā home_controller.rb # PĆ”gina inicial
ā ā āāā orders_controller.rb # Pedidos do cliente
ā ā āāā products_controller.rb # CatĆ”logo
ā ā āāā profile_controller.rb # Perfil do usuĆ”rio
ā āāā concerns/
ā ā āāā authenticable.rb # Concern de autenticação
ā āāā application_controller.rb
āāā models/
ā āāā category.rb # Categorias (hierĆ”rquicas)
ā āāā order.rb # Pedidos
ā āāā order_item.rb # Itens do pedido
ā āāā product.rb # Produtos
ā āāā user.rb # UsuĆ”rios (admin/client)
config/
āāā database.yml # Configuração SQLite
āāā routes.rb # Rotas da API
āāā initializers/
āāā cors.rb # Configuração CORS
āāā devise_token_auth.rb # Configuração auth
db/
āāā migrate/ # Migrations
āāā schema.rb # Schema do banco
āāā seeds.rb # Dados iniciais
- Ruby 3.2.x
- Bundler
- SQLite3
# 1. Clonar repositório
git clone <repo-url>
cd Ecommerce-API
# 2. Instalar dependĆŖncias
bundle install
# 3. Criar banco de dados
rails db:create
# 4. Executar migrations
rails db:migrate
# 5. Popular com dados de exemplo
rails db:seed
# 6. Iniciar servidor
rails server# Construir imagem
docker build -t ecommerce-api .
# Executar
docker run -p 3000:3000 ecommerce-apiA API usa Devise Token Auth para autenticação baseada em tokens.
POST /auth/v1/user
Content-Type: application/json
{
"name": "Seu Nome",
"email": "email@exemplo.com",
"password": "senha123",
"password_confirmation": "senha123"
}POST /auth/v1/user/sign_in
Content-Type: application/json
{
"email": "email@exemplo.com",
"password": "senha123"
}Após login, a resposta inclui headers que devem ser enviados em requisições autenticadas:
access-token: <token>
client: <client_id>
uid: <email>
| Método | Endpoint | Descrição |
|---|---|---|
POST |
/auth/v1/user |
Registrar usuƔrio |
POST |
/auth/v1/user/sign_in |
Login |
DELETE |
/auth/v1/user/sign_out |
Logout |
PUT |
/auth/v1/user |
Atualizar conta |
DELETE |
/auth/v1/user |
Deletar conta |
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/home |
Dashboard com estatĆsticas |
GET |
/categories |
Listar categorias |
POST |
/categories |
Criar categoria |
GET |
/categories/:id |
Ver categoria |
PUT |
/categories/:id |
Atualizar categoria |
DELETE |
/categories/:id |
Remover categoria |
GET |
/products |
Listar produtos |
POST |
/products |
Criar produto |
GET |
/products/:id |
Ver produto |
PUT |
/products/:id |
Atualizar produto |
DELETE |
/products/:id |
Remover produto |
GET |
/orders |
Listar todos pedidos |
GET |
/orders/:id |
Ver pedido |
PUT |
/orders/:id |
Atualizar status |
POST |
/orders/:id/cancel |
Cancelar pedido |
GET |
/users |
Listar usuƔrios |
GET |
/users/:id |
Ver usuƔrio |
PUT |
/users/:id |
Atualizar usuƔrio |
DELETE |
/users/:id |
Remover usuƔrio |
| Método | Endpoint | Auth | Descrição |
|---|---|---|---|
GET |
/home |
ā | PĆ”gina inicial (destaques) |
GET |
/products |
ā | CatĆ”logo de produtos |
GET |
/products/:id |
ā | Detalhes do produto |
GET |
/categories |
ā | Listar categorias |
GET |
/categories/:id |
ā | Categoria com produtos |
GET |
/profile |
ā | Ver perfil |
PATCH |
/profile |
ā | Atualizar perfil |
GET |
/orders |
ā | Meus pedidos |
GET |
/orders/:id |
ā | Ver meu pedido |
POST |
/orders |
ā | Criar pedido |
POST |
/orders/:id/cancel |
ā | Cancelar pedido |
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/health |
Health check |
curl -X POST http://localhost:3000/admin/v1/products \
-H "Content-Type: application/json" \
-H "access-token: <token>" \
-H "client: <client>" \
-H "uid: <email>" \
-d '{
"product": {
"name": "Notebook Gamer",
"description": "Notebook para jogos com RTX 4060",
"price": 5999.90,
"stock_quantity": 25,
"sku": "NB-GAMER-01",
"category_id": 1,
"active": true
}
}'curl -X POST http://localhost:3000/storefront/v1/orders \
-H "Content-Type: application/json" \
-H "access-token: <token>" \
-H "client: <client>" \
-H "uid: <email>" \
-d '{
"items": [
{"product_id": 1, "quantity": 2},
{"product_id": 3, "quantity": 1}
]
}'# Busca por nome
curl "http://localhost:3000/storefront/v1/products?search=notebook"
# Filtrar por categoria
curl "http://localhost:3000/storefront/v1/products?category_id=1"
# Apenas disponĆveis
curl "http://localhost:3000/storefront/v1/products?available=true"Após rails db:seed:
| Tipo | Senha | |
|---|---|---|
| Admin | admin@ecommerce.com | password123 |
| Cliente | cliente@teste.com | password123 |
| Código | Status | Descrição |
|---|---|---|
| 0 | pending |
Aguardando pagamento |
| 1 | paid |
Pago |
| 2 | processing |
Em processamento |
| 3 | shipped |
Enviado |
| 4 | delivered |
Entregue |
| 5 | cancelled |
Cancelado |
# Perfis disponĆveis
enum profile: { admin: 0, client: 1 }
# AssociaƧƵes
has_many :orders
# ValidaƧƵes
validates :name, presence: true
validates :email, presence: true, uniqueness: true# Hierarquia
belongs_to :parent, class_name: 'Category', optional: true
has_many :subcategories, class_name: 'Category'
has_many :products
# Scopes
scope :active, -> { where(active: true) }
scope :root_categories, -> { where(parent_id: nil) }# AssociaƧƵes
belongs_to :category
has_many :order_items
# Scopes
scope :active, -> { where(active: true) }
scope :in_stock, -> { where('stock_quantity > 0') }
scope :by_category, ->(id) { where(category_id: id) }
scope :search, ->(term) { where('name LIKE ?', "%#{term}%") }
# MƩtodos
def available?
def reduce_stock!(quantity)
def formatted_price# Status
enum status: { pending: 0, paid: 1, processing: 2, shipped: 3, delivered: 4, cancelled: 5 }
# AssociaƧƵes
belongs_to :user
has_many :order_items
has_many :products, through: :order_items
# MƩtodos
def calculate_total
def cancel!# AssociaƧƵes
belongs_to :order
belongs_to :product
# MƩtodos
def subtotalEste projeto estƔ sob a licenƧa MIT.
-
Deployment instructions
-
...