feat(cart): add cart and wishlist controllers

This commit is contained in:
dualfroz committed 2026-08-25 16:26:05 +02:00
1 parent 3c7288404c
commit 63768c66d5
2 files changed
+118

No files matched your search

+90
View File
@@ -0,0 +1,90 @@
<?php
namespace Bazaar\Controllers;
use Bazaar\Core\Response;
final class CartController extends Controller
{
public function index(): Response
{
return $this->view('cart.index', $this->cartViewData());
}
public function add(): Response
{
$productId = $this->ctx->request->integer('productId');
$quantity = max(1, $this->ctx->request->integer('quantity', 1));
$variantId = $this->ctx->request->integer('variantId', 0) ?: null;
$this->ctx->cart->add($productId, $quantity, $variantId);
$this->ctx->session->flash('success', 'Item added to your cart.');
return $this->redirect('/cart');
}
public function update(): Response
{
$productId = $this->ctx->request->integer('productId');
$quantity = $this->ctx->request->integer('quantity', 1);
$variantId = $this->ctx->request->integer('variantId', 0) ?: null;
$this->ctx->cart->update($productId, $quantity, $variantId);
return $this->redirect('/cart');
}
public function remove(): Response
{
$productId = $this->ctx->request->integer('productId');
$variantId = $this->ctx->request->integer('variantId', 0) ?: null;
$this->ctx->cart->remove($productId, $variantId);
$this->ctx->session->flash('success', 'Item removed from your cart.');
return $this->redirect('/cart');
}
public function applyCoupon(): Response
{
$code = trim((string) $this->ctx->request->input('code', ''));
$result = $this->ctx->couponService->evaluate($code, $this->ctx->cart->totalCents());
if ($result->isValid()) {
$this->ctx->session->put('couponCode', $result->coupon['code']);
$this->ctx->session->flash('success', $this->ctx->translator->get('cart.couponApplied', [
'code' => $result->coupon['code'],
]));
} else {
$this->ctx->session->forget('couponCode');
$this->ctx->session->flash('error', $result->message());
}
return $this->redirect('/cart');
}
public function removeCoupon(): Response
{
$this->ctx->session->forget('couponCode');
$this->ctx->session->flash('success', 'Coupon removed.');
return $this->redirect('/cart');
}
private function cartViewData(): array
{
$subtotalCents = $this->ctx->cart->totalCents();
$discountCents = 0;
$couponCode = (string) $this->ctx->session->get('couponCode', '');
if ($couponCode !== '') {
$result = $this->ctx->couponService->evaluate($couponCode, $subtotalCents);
if ($result->isValid()) {
$discountCents = $result->discountCents;
} else {
$this->ctx->session->forget('couponCode');
$couponCode = '';
}
}
return [
'lines' => $this->ctx->cart->lines(),
'subtotalCents' => $subtotalCents,
'discountCents' => $discountCents,
'totalCents' => $subtotalCents - $discountCents,
'couponCode' => $couponCode,
];
}
}