API REST para gerenciamento de produtos com Laravel 11.
- PHP 8.2+
- Composer
- SQLite (padrão) ou MySQL (opcional)
# 1. Clone o repositório
git clone https://github.com/GusAlberto/product_management_api.git
cd product_management_api
# 2. Instale as dependências
composer install
# 3. Configure o arquivo de ambiente
cp .env.example .env
# 4. Gere a chave da aplicação
php artisan key:generate
# 5. Configure o banco (veja seção abaixo)
# 6. Execute as migrações
php artisan migrate
# 7. Inicie o servidor
php artisan serveA aplicação estará disponível em http://localhost:8000.
Padrão: O projeto já está configurado para usar SQLite. Só precisa criar o arquivo de banco:
# Criar o arquivo SQLite
touch database/database.sqlite
# Executar as migrações
php artisan migrateVerificar se PHP suporta SQLite:
php -m | grep -i sqliteSe não aparecer pdo_sqlite, instale (Debian/Ubuntu):
sudo apt update && sudo apt install -y php8.3-sqlite3 sqlite3Se preferir usar MySQL localmente, há um arquivo docker-compose.yml de conveniência.
Opção 1: Usar Docker Compose
# Inicie o MySQL
docker compose up -d
# Configure o .env
cat > .env << EOF
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=desafio_produtos
DB_USERNAME=root
DB_PASSWORD=root
EOF
# Execute as migrações
php artisan migrateOpção 2: Usar docker run (sem plugin compose)
# Inicie o container MySQL
docker run -d --name desafio_produtos_db \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=desafio_produtos \
-p 3306:3306 \
mysql:8.0
# Configure o .env (como acima)
# Execute as migrações
php artisan migrate# Todos os testes
php artisan test
# Apenas os testes de produto (use o filtro por padrão 'Product')
php artisan test --filter Product
# Executar a pasta de feature diretamente
./vendor/bin/phpunit tests/Feature Este projeto usa o gerador OpenAPI do Laravel via dedoc/scramble.
- UI interativa:
/docs/api - Especificação JSON:
/docs/api.json
Para executar Try it out sem erro 401 Unauthorized:
- Abra
/docs/api. - Clique em
Authorize. - Informe
Bearer local-demo-token. - Execute o endpoint
POST /api/products.
Opcionalmente, você pode abrir /login-temporario para testar o fluxo por sessão no navegador.
Os endpoints de produto já incluem exemplos de parâmetros e payloads, além de códigos de status documentados na especificação gerada.
GET /api/products?name=mouse&min_price=50&max_price=200&min_stock=1&page=1&per_page=10POST /api/products
Content-Type: application/json
{
"name": "Mouse Gamer",
"description": "Mouse com 6 botões",
"price": 199.90,
"stock": 25
}GET /api/products/{id}PUT /api/products/{id}
Content-Type: application/json
{
"name": "Mouse Gamer RGB",
"description": "Mouse com 6 botões RGB",
"price": 249.90,
"stock": 15
}DELETE /api/products/{id}/home/engineer/Projetos/product_management_api/
├── app/
│ ├── Http/Controllers/ # Controllers da API
│ ├── Models/ # Modelos Eloquent
│ └── Traits/ # Traits reutilizáveis
├── database/
│ ├── migrations/ # Migrações do banco
│ ├── factories/ # Factories para testes
│ └── database.sqlite # Arquivo SQLite (criado automaticamente)
├── routes/
│ ├── api.php # Rotas da API
│ ├── web.php # Rotas web
│ └── console.php # Comandos console
├── tests/
│ ├── Feature/ # Testes de funcionalidade
│ └── Unit/ # Testes unitários
├── .env # Variáveis de ambiente
├── artisan # CLI do Laravel
├── composer.json # Dependências PHP
└── README.md # Este arquivoA endpoint GET /api/products aceita os seguintes filtros:
name: Filtro por nome do produtomin_price: Preço mínimomax_price: Preço máximomin_stock: Estoque mínimomax_stock: Estoque máximopage: Número da página (padrão: 1)per_page: Itens por página (padrão: 10)
Exemplo:
GET /api/products?name=mouse&min_price=100&max_price=300&page=1&per_page=5