ShopVerde
Arquitetura Backend para E-commerce Sustentável.
Uma API RESTful altamente escalável, desenhada com padrões rigorosos (MVC, Repositories, Services). Inclui autenticação segura, transações complexas em base de dados relacional e WebSockets para tracking em tempo real.
A Arquitetura na Prática
- Design de API & Policies: Endpoints RESTful estritos. Implementação de Laravel Sanctum para autenticação stateless e Gates/Policies para controlo de permissões granulares (Admin vs Cliente).
- Gateways de Pagamento Assíncronos: Integração com Stripe e PayPal. Implementação de Webhooks para confirmar pagamentos de forma assíncrona, protegendo o sistema contra falhas de rede no lado do cliente.
- Transações Seguras em MySQL: Utilização pesada de
DB::transactione pessimistic locking (bloqueio pessimista) para evitar race conditions na atualização de stock durante o checkout. - Notificações Real-Time: Uso do Laravel Broadcasting com WebSockets para enviar eventos instantâneos para o frontend sempre que o status de uma encomenda muda (ex: "Em Processamento" para "Enviado").
Trechos de Código (Padrões de Engenharia)
Demonstração da aplicação do padrão Service Layer e Transações de Base de Dados para garantir a integridade da loja.
Exemplo: Criação de Encomenda com DB Transactions
namespace App\Services;
use Illuminate\Support\Facades\DB;
use App\Models\Order;
use App\Exceptions\OutOfStockException;
class OrderService
{
public function createSecureOrder(User $user, array $cartItems)
{
// Garante que ou TUDO é guardado na BD, ou NADA é guardado em caso de erro
return DB::transaction(function () use ($user, $cartItems) {
$order = Order::create(['user_id' => $user->id, 'status' => 'pending']);
$totalAmount = 0;
foreach ($cartItems as $item) {
// Lock pessimista: Impede outras compras de acederem a este stock
$product = Product::where('id', $item['id'])->lockForUpdate()->first();
if ($product->stock < $item['quantity']) {
throw new OutOfStockException("Stock insuficiente para: {$product->name}");
}
$product->decrement('stock', $item['quantity']);
$order->items()->create([
'product_id' => $product->id,
'quantity' => $item['quantity'],
'price' => $product->price
]);
$totalAmount += ($product->price * $item['quantity']);
}
$order->update(['total' => $totalAmount]);
return $order;
});
}
}