From 8c21d4dc7c9ee2cfd5526dc1c1b18b2da0bf63c6 Mon Sep 17 00:00:00 2001 From: Bayu Lukman Yusuf Date: Wed, 21 Jan 2026 15:20:35 +0700 Subject: [PATCH] cart --- app/Http/Controllers/CartController.php | 82 +++ app/Http/Controllers/ProductController.php | 60 +- .../Member/Cart/MemberCartRequest.php | 30 + .../Member/Cart/UpdateMemberCartRequest.php | 30 + app/Models/Cart.php | 39 ++ app/Models/Categories.php | 29 + app/Models/ItemVariant.php | 5 +- .../Member/Cart/MemberCartRepository.php | 88 +++ resources/views/checkout/v1-cart.blade.php | 542 +++++++----------- .../components/layout/header-v2.blade.php | 151 +++++ .../views/components/layout/header.blade.php | 6 +- .../components/shop/add-to-cart.blade.php | 139 +++++ .../views/shop/product-fashion.blade.php | 268 ++++----- routes/web.php | 28 +- 14 files changed, 1000 insertions(+), 497 deletions(-) create mode 100644 app/Http/Controllers/CartController.php create mode 100644 app/Http/Requests/Member/Cart/MemberCartRequest.php create mode 100644 app/Http/Requests/Member/Cart/UpdateMemberCartRequest.php create mode 100644 app/Models/Cart.php create mode 100644 app/Models/Categories.php create mode 100644 app/Repositories/Member/Cart/MemberCartRepository.php create mode 100644 resources/views/components/layout/header-v2.blade.php create mode 100644 resources/views/components/shop/add-to-cart.blade.php diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php new file mode 100644 index 0000000..eb073c6 --- /dev/null +++ b/app/Http/Controllers/CartController.php @@ -0,0 +1,82 @@ +getCount($request->input('location_id')); + + return response()->json([ + 'count' => $count + ]); + } + + public function index(Request $request, MemberCartRepository $repository) + { + + $request->merge(['location_id' => $request->input('location_id', session('location_id', 22))]); + + $carts = $repository->getList($request); + + // Log::info($items); + return view('checkout.v1-cart',[ + 'carts' => $carts + ]); + } + + public function add(MemberCartRequest $request, MemberCartRepository $repository) + { + Log::info($request->all()); + $data = $request->validated(); + $item = $repository->create($data); + + if ($request->expectsJson()) { + return response()->json([ + 'success' => true, + 'message' => 'Item added to cart successfully', + 'item' => $item + ]); + } + + return redirect()->route('cart.index'); + } + + public function update($cart_id, UpdateMemberCartRequest $request, MemberCartRepository $repository) + { + $data = $request->validated(); + $item = $repository->update($cart_id, $data); + + if ($request->expectsJson()) { + return response()->json([ + 'success' => true, + 'message' => 'Cart updated successfully', + 'item' => $item + ]); + } + + return redirect()->route('cart.index'); + } + + public function delete($cart_id, MemberCartRepository $repository) + { + $repository->delete($cart_id); + + if (request()->expectsJson()) { + return response()->json([ + 'success' => true, + 'message' => 'Item removed from cart successfully' + ]); + } + + return redirect()->route('cart.index'); + } +} diff --git a/app/Http/Controllers/ProductController.php b/app/Http/Controllers/ProductController.php index 420cc51..5d72687 100644 --- a/app/Http/Controllers/ProductController.php +++ b/app/Http/Controllers/ProductController.php @@ -16,23 +16,23 @@ class ProductController extends Controller { $genderRepository = new GenderRepository; $genders = $genderRepository->getList([]); - + // Render gender links HTML $genderHtml = ''; $currentGenderId = $request->input('current_gender'); - + foreach ($genders as $gender) { $isActive = $currentGenderId == $gender->id; $genderHtml .= ''; } - + return response()->json([ 'success' => true, - 'genders' => $genderHtml + 'genders' => $genderHtml, ]); } @@ -40,23 +40,23 @@ class ProductController extends Controller { $categoryRepository = new CategoryRepository; $categories = $categoryRepository->getList([]); - + // Render category links HTML $categoryHtml = ''; $currentCategoryId = $request->input('current_category'); - + foreach ($categories as $category) { $isActive = $currentCategoryId == $category->id; $categoryHtml .= ''; } - + return response()->json([ 'success' => true, - 'categories' => $categoryHtml + 'categories' => $categoryHtml, ]); } @@ -123,7 +123,7 @@ class ProductController extends Controller // filter $filter = $request->filter ?? []; - if (isset($filter['category']) && $filter['category']){ + if (isset($filter['category']) && $filter['category']) { $category = StoreCategory::find($filter['category']); if ($category) { @@ -161,7 +161,7 @@ class ProductController extends Controller 'products' => $productHtml, 'count' => count($products), 'has_more' => $hasMore, - 'current_page' => $page + 'current_page' => $page, ]); } @@ -170,15 +170,11 @@ class ProductController extends Controller $productRepository = new ProductRepository; $products = []; - - $filters = []; $min_max_price = $productRepository->getMinMaxPrice(); - return view('shop.catalog-fashion', [ - 'products' => $products, 'min_max_price' => $min_max_price, @@ -189,23 +185,23 @@ class ProductController extends Controller { $brandRepository = new \App\Repositories\Catalog\BrandRepository; $brands = $brandRepository->getList([]); - + // Render brand links HTML $brandHtml = ''; $currentBrandId = $request->input('current_brand'); - + foreach ($brands as $brand) { $isActive = $currentBrandId == $brand->id; $brandHtml .= ''; } - + return response()->json([ 'success' => true, - 'brands' => $brandHtml + 'brands' => $brandHtml, ]); } @@ -216,31 +212,31 @@ class ProductController extends Controller [ 'icon' => '🎉', 'message' => 'Free Shipping on orders over $250', - 'detail' => "Don't miss a discount!" + 'detail' => "Don't miss a discount!", ], [ 'icon' => '💰', 'message' => 'Money back guarantee', - 'detail' => 'We return money within 30 days' + 'detail' => 'We return money within 30 days', ], [ 'icon' => '💪', 'message' => 'Friendly 24/7 customer support', - 'detail' => "We've got you covered!" - ] + 'detail' => "We've got you covered!", + ], ]; // Render announcement slides HTML $announcementHtml = ''; foreach ($announcements as $announcement) { $announcementHtml .= '
'; - $announcementHtml .= $announcement['icon'] . ' ' . $announcement['message'] . ' ' . $announcement['detail'] . ''; + $announcementHtml .= $announcement['icon'].' '.$announcement['message'].' '.$announcement['detail'].''; $announcementHtml .= '
'; } return response()->json([ 'success' => true, - 'announcements' => $announcementHtml + 'announcements' => $announcementHtml, ]); } @@ -267,7 +263,7 @@ class ProductController extends Controller }); $productRepository = new ProductRepository; - + // Set parameters based on type $params = [ 'limit' => $limit, @@ -313,7 +309,7 @@ class ProductController extends Controller 'success' => true, 'products' => $productHtml, 'count' => count($products), - 'type' => $type + 'type' => $type, ]); } diff --git a/app/Http/Requests/Member/Cart/MemberCartRequest.php b/app/Http/Requests/Member/Cart/MemberCartRequest.php new file mode 100644 index 0000000..746f27a --- /dev/null +++ b/app/Http/Requests/Member/Cart/MemberCartRequest.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'item_reference_id' => 'required|integer|exists:item_reference,id', + 'qty' => 'required|numeric|min:0', + 'location_id' => 'required|numeric', + ]; + } +} diff --git a/app/Http/Requests/Member/Cart/UpdateMemberCartRequest.php b/app/Http/Requests/Member/Cart/UpdateMemberCartRequest.php new file mode 100644 index 0000000..f6a2171 --- /dev/null +++ b/app/Http/Requests/Member/Cart/UpdateMemberCartRequest.php @@ -0,0 +1,30 @@ + 'required|numeric|min:0' + ]; + } +} diff --git a/app/Models/Cart.php b/app/Models/Cart.php new file mode 100644 index 0000000..6c22899 --- /dev/null +++ b/app/Models/Cart.php @@ -0,0 +1,39 @@ +belongsTo(Items::class,"item_id"); + } + + public function itemVariant() + { + return $this->belongsTo(ItemVariant::class, 'item_variant_id', 'id'); + } + + public function itemReference() + { + return $this->belongsTo(ItemReference::class, 'item_reference_id', 'id'); + } + + public function user() + { + return $this->belongsTo(User::class, 'user_id', 'id'); + } + + + public function getDisplayPriceAttribute() + { + return $this->itemVariant->reference->item->display_price; + } +} diff --git a/app/Models/Categories.php b/app/Models/Categories.php new file mode 100644 index 0000000..35b1e19 --- /dev/null +++ b/app/Models/Categories.php @@ -0,0 +1,29 @@ +belongsTo(Items::class, 'item_id'); } - + public function getDisplayPriceAttribute() + { + return $this->reference->item->display_price; + } } diff --git a/app/Repositories/Member/Cart/MemberCartRepository.php b/app/Repositories/Member/Cart/MemberCartRepository.php new file mode 100644 index 0000000..62c1b9a --- /dev/null +++ b/app/Repositories/Member/Cart/MemberCartRepository.php @@ -0,0 +1,88 @@ +user()->id) + ->where('location_id', $location) + ->count(); + } + + public function getList($request) + { + $location = (int) $request->input("location_id"); + $cart = Cart::where('user_id', auth()->user()->id) + ->where("location_id", $location) + ->orderBy('created_at','desc') + ->paginate($request->limit ?? 1000); + + return $cart; + } + + public function create($data) + { + $model = DB::transaction(function () use ($data) { + $location = (int) @$data["location_id"]; + $itemreference = ItemReference::findOrfail($data['item_reference_id']); + + $model = Cart::where('item_reference_id', $data['item_reference_id']) + ->where('location_id', $location) + ->where('user_id', auth()->user()->id)->first(); + if ($model) { + $model->qty = $model->qty + $data['qty']; + $model->save(); + } else { + $model = Cart::create([ + 'item_id' => $itemreference->item_id, + 'item_variant_id' => $itemreference->item_variant_id, + 'location_id' => $data['location_id'], + 'item_reference_id' => $data['item_reference_id'], + 'user_id' => auth()->user()->id, + 'qty' => $data['qty'] + ]); + } + + return $model; + }); + + return $model; + } + + public function update($cartId, $data) + { + $cart = DB::transaction(function () use ($cartId, $data) { + $cart = Cart::find($cartId); + + if (!$cart) { + throw new \Exception('Cart item not found'); + } + + $cart->qty = $data['qty'] ?? $cart->qty; + $cart->save(); + + return $cart; + }); + + return $cart; + } + + public function delete($cartId) + { + $cart = DB::transaction(function () use ($cartId) { + $cart = Cart::find($cartId); + $cart->delete(); + return $cart; + }); + + return $cart; + } + +} diff --git a/resources/views/checkout/v1-cart.blade.php b/resources/views/checkout/v1-cart.blade.php index c4d6448..e5dbab5 100644 --- a/resources/views/checkout/v1-cart.blade.php +++ b/resources/views/checkout/v1-cart.blade.php @@ -2,151 +2,10 @@ @section('content') -
-
-
-

Login to continue

- -
- -
-
- -
-
-
- - -
Enter a valid email address!
-
-
- -
- -
Password is incorrect!
- -
-
-
-
- - -
- -
- -
-
- -
-
-
- - -
Enter a valid email address!
-
-
- -
- -
Password does not meet the required criteria! -
- -
-
-
-
- - -
-
- - -
-
- -
-
AsiaGolf account benefits
-
    -
  • -
    - -
    -
    Subscribe to your favorite products
    -
  • -
  • -
    - -
    -
    View and manage your orders and withlist
    -
  • -
  • -
    - -
    -
    Earn rewards for future purchases
    -
  • -
  • -
    - -
    -
    Receive exclusive offers and discounts
    -
  • -
  • -
    - -
    -
    Create multiple wishlists
    -
  • -
-
-
-
-
-
- @include('layouts.partials/offcanvas') - - @include('layouts.partials/navbar', ['wishlist' => true]) +
@@ -168,7 +27,7 @@
-

Buy $183 more to get Buy $183 more to get Free Shipping

-
+ --}} @@ -205,193 +64,80 @@ - - - + - - - - - + + + + + + + @endforeach - - - - - - - - - - - - - - - - -
-
- - iPhone 14 - -
-
- Apple iPhone 14 - 128GB -
-
    -
  • Color: White
  • -
  • Model: 128GB
  • -
  • Price: - $899.00
  • -
-
- - - + @foreach ($carts as $key => $cart) +
+
+ + {{ $cart->name ?? 'Product' }} + +
+
+ {{ $cart->itemVariant->display_name ?? $cart->itemVariant->description ?? 'Product Name' }} +
+ {{--
    +
  • Color: {{ $cart->color ?? 'N/A' }}
  • +
  • Model: {{ $cart->model ?? 'N/A' }}
  • +
  • Price: + ${{ number_format($cart->itemReference->display_price ?? 0, 2) }} +
  • +
--}} +
+ + + +
- -
$899.00 -
- - - -
-
$899.00 - -
+ + Rp {{ number_format($cart->itemVariant->display_price ?? 0, 0,",",".") }} +
+ + + +
+
Rp {{ number_format(($cart->display_price ?? 0) * ($cart->qty ?? 1), 0,",",".") }} +
+ @csrf + @method('DELETE') + +
+
-
- - -10% - iPad Pro - -
-
- Tablet Apple iPad Pro - M2 -
-
    -
  • Color: Black
  • -
  • Model: 256GB
  • -
  • Price: - $989.00 $1,099.00 -
  • -
-
- - - -
-
-
-
$989.00 $1,099.00 -
- - - -
-
$989.00 - -
-
- - Smart Watch - -
-
- Smart Watch Series - 7 -
-
    -
  • Color: White
  • -
  • Model: 44 mm
  • -
  • Price: - $429.00
  • -
-
- - - -
-
-
-
$429.00 -
- - - -
-
$429.00 - -
- + Proceed to checkout @@ -985,4 +732,149 @@ @endsection @section('scripts') + @endsection diff --git a/resources/views/components/layout/header-v2.blade.php b/resources/views/components/layout/header-v2.blade.php new file mode 100644 index 0000000..8730a37 --- /dev/null +++ b/resources/views/components/layout/header-v2.blade.php @@ -0,0 +1,151 @@ +
+ +
+
+
+

Login to continue

+ +
+ +
+
+ + +
+
+
+ + +
Enter a valid email address!
+
+
+ +
+ +
Password is incorrect!
+ +
+
+
+
+ + +
+ +
+ +
+
+ + +
+
+
+ + +
Enter a valid email address!
+
+
+ +
+ +
Password does not meet the required + criteria! +
+ +
+
+
+
+ + +
+
+ + +
+
+ +
+
AsiaGolf account benefits
+
    +
  • +
    + +
    +
    Subscribe to your favorite products
    +
  • +
  • +
    + +
    +
    View and manage your orders and withlist
    +
  • +
  • +
    + +
    +
    Earn rewards for future purchases
    +
  • +
  • +
    + +
    +
    Receive exclusive offers and discounts
    +
  • +
  • +
    + +
    +
    Create multiple wishlists
    +
  • +
+
+
+
+
+
+ + @include('layouts.partials/offcanvas') + + @include('layouts.partials/navbar', ['wishlist' => true]) +
diff --git a/resources/views/components/layout/header.blade.php b/resources/views/components/layout/header.blade.php index f7f8d55..4bf6b22 100644 --- a/resources/views/components/layout/header.blade.php +++ b/resources/views/components/layout/header.blade.php @@ -124,7 +124,7 @@ $197.00 @@ -253,8 +253,8 @@ data-bs-toggle="offcanvas" data-bs-target="#shoppingCart" aria-controls="shoppingCart" aria-label="Shopping cart"> 3 + class="position-absolute top-0 start-100 badge fs-xs text-bg-primary rounded-pill mt-1 ms-n4 z-2 cart-count" + style="--cz-badge-padding-y: .25em; --cz-badge-padding-x: .42em">{{ auth()->check() ? \App\Repositories\Member\Cart\MemberCartRepository::getCount() : 0 }} diff --git a/resources/views/components/shop/add-to-cart.blade.php b/resources/views/components/shop/add-to-cart.blade.php new file mode 100644 index 0000000..8737158 --- /dev/null +++ b/resources/views/components/shop/add-to-cart.blade.php @@ -0,0 +1,139 @@ +@props([ + 'quantity' => 1, + 'item_reference_id' => null, + 'locationId' => session('location_id', 22), + 'buttonText' => 'Add to cart', + 'buttonClass' => 'btn-dark', +]) + +
+
+ + + +
+ +
+ + diff --git a/resources/views/shop/product-fashion.blade.php b/resources/views/shop/product-fashion.blade.php index 8776680..ffd8aec 100644 --- a/resources/views/shop/product-fashion.blade.php +++ b/resources/views/shop/product-fashion.blade.php @@ -403,7 +403,7 @@ - + @@ -425,14 +425,14 @@
- +
@if ($product->display_discount_price > 0) - Sale - @endif -
- +
- @foreach ($product->image_urls as $key => $url) + @foreach ($product->image_urls as $key => $url) + @if ($key == 0) + @continue + @endif + + @endforeach - @if ($key == 0) - @continue - @endif - - @endforeach -
@@ -580,21 +581,7 @@ --}} -
-
- - - -
- -
+ {{--
    @@ -636,7 +623,7 @@ -
    Rp {{ number_format($product->display_price,0,",",".") }} Rp {{ number_format($product->display_discount_price,0,",",".") }}
    +
    Rp + {{ number_format($product->display_price, 0, ',', '.') }} Rp + {{ number_format($product->display_discount_price, 0, ',', '.') }}
    {{--
    @@ -760,8 +756,7 @@ Pesanan masuk pukul 18.00 Wib ke atas kemungkinan akan kami proses kirim dan iku
    -
    +

    Following below washing instructions can help prolong the life of your denim skirt and keep it looking its best for longer.

    @@ -802,46 +797,61 @@ Pesanan masuk pukul 18.00 Wib ke atas kemungkinan akan kami proses kirim dan iku
    -
    +
    Pengiriman
    -

    Kami bekerja sama dengan berbagai penyedia jasa pengiriman terpercaya untuk memastikan proses pengiriman pesanan berjalan dengan aman dan efisien. +

    Kami bekerja sama dengan berbagai penyedia jasa pengiriman terpercaya untuk memastikan + proses pengiriman pesanan berjalan dengan aman dan efisien.

    - Pelanggan diberikan kebebasan untuk memilih layanan pengiriman yang paling sesuai dengan kebutuhan, baik dari segi kecepatan maupun biaya. + Pelanggan diberikan kebebasan untuk memilih layanan pengiriman yang paling sesuai dengan + kebutuhan, baik dari segi kecepatan maupun biaya.

    - Estimasi waktu pengiriman dapat berbeda-beda tergantung pada jenis layanan yang dipilih, lokasi tujuan, serta kebijakan dan kondisi operasional dari masing-masing penyedia jasa pengiriman. + Estimasi waktu pengiriman dapat berbeda-beda tergantung pada jenis layanan yang dipilih, + lokasi tujuan, serta kebijakan dan kondisi operasional dari masing-masing penyedia jasa + pengiriman.

    - Perlu diperhatikan bahwa keterlambatan yang disebabkan oleh faktor di luar kendali kami merupakan tanggung jawab penyedia jasa terkait. + Perlu diperhatikan bahwa keterlambatan yang disebabkan oleh faktor di luar kendali kami + merupakan tanggung jawab penyedia jasa terkait.

    - Meskipun demikian, kami akan senantiasa membantu memantau status pengiriman guna memastikan pesanan sampai ke tangan pelanggan dengan baik.

    + Meskipun demikian, kami akan senantiasa membantu memantau status pengiriman guna + memastikan pesanan sampai ke tangan pelanggan dengan baik. +

    Return Barang
    -

    Kami memberikan kesempatan kepada pelanggan untuk mengajukan permohonan retur atas produk yang diterima apabila terdapat ketidaksesuaian atau kendala tertentu. Proses pengajuan retur dapat dilakukan dengan menghubungi customer service resmi kami melalui WhatsApp. +

    Kami memberikan kesempatan kepada pelanggan untuk mengajukan permohonan retur atas produk + yang diterima apabila terdapat ketidaksesuaian atau kendala tertentu. Proses pengajuan + retur dapat dilakukan dengan menghubungi customer service resmi kami melalui WhatsApp.

    - Untuk keperluan verifikasi, pelanggan diwajibkan mengirimkan informasi detail transaksi pembelian, foto produk yang diterima, serta bukti video unboxing yang jelas dan tidak terputus. + Untuk keperluan verifikasi, pelanggan diwajibkan mengirimkan informasi detail transaksi + pembelian, foto produk yang diterima, serta bukti video unboxing yang jelas dan tidak + terputus.

    - Permohonan retur akan ditinjau sesuai dengan ketentuan dan kebijakan yang berlaku. + Permohonan retur akan ditinjau sesuai dengan ketentuan dan kebijakan yang berlaku.

    - Setelah proses verifikasi selesai dan disetujui, kami akan memberikan informasi lebih lanjut terkait tahapan pengembalian barang maupun solusi yang dapat diberikan kepada pelanggan. + Setelah proses verifikasi selesai dan disetujui, kami akan memberikan informasi lebih + lanjut terkait tahapan pengembalian barang maupun solusi yang dapat diberikan kepada + pelanggan.

    - Kami berkomitmen untuk menyelesaikan setiap permohonan retur dengan cepat dan profesional sesuai dengan standar pelayanan kami. + Kami berkomitmen untuk menyelesaikan setiap permohonan retur dengan cepat dan + profesional sesuai dengan standar pelayanan kami.

    - Untuk informasi lebih lanjut, pelanggan dapat menghubungi customer service kami melalui WhatsApp.

    + Untuk informasi lebih lanjut, pelanggan dapat menghubungi customer service kami melalui + WhatsApp. +

    @@ -1103,8 +1113,8 @@ Pesanan masuk pukul 18.00 Wib ke atas kemungkinan akan kami proses kirim dan iku
    - @endforeach - +
    - Image + Image
    @@ -1242,8 +1250,8 @@ Pesanan masuk pukul 18.00 Wib ke atas kemungkinan akan kami proses kirim dan iku
    Categories + data-bs-toggle="collapse" data-bs-target="#categoriesLinks" aria-expanded="false" + aria-controls="categoriesLinks">Categories
    - @endsection @section('scripts') - + @endsection diff --git a/routes/web.php b/routes/web.php index 3ad177c..05656e8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,6 +13,7 @@ use App\Http\Controllers\ProductController; use App\Http\Controllers\SearchController; use App\Http\Controllers\ComponentController; use App\Http\Controllers\Auth\ProfileController; +use App\Http\Controllers\CartController; Route::group(['prefix' => '/dummy'], function () { Route::get('', [RoutingController::class, 'index'])->name('root'); @@ -74,11 +75,22 @@ Route::post('/profile', [ProfileController::class, 'update'])->name('profile.upd Route::put('/profile/password', [ProfileController::class, 'updatePassword'])->name('profile.password.update'); -Route::get('/addresses', [AddressController::class, 'index'])->name('addresses'); -Route::post('/addresses', [AddressController::class, 'store'])->name('addresses.store'); -Route::put('/addresses/{id}', [AddressController::class, 'update'])->name('addresses.update'); -Route::delete('/addresses/{id}', [AddressController::class, 'destroy'])->name('addresses.destroy'); -Route::get('/addresses/provinces', [AddressController::class, 'provinces'])->name('addresses.provinces'); -Route::get('/addresses/cities/{provinceId}', [AddressController::class, 'cities'])->name('addresses.cities'); -Route::get('/addresses/districts/{provinceId}', [AddressController::class, 'districts'])->name('addresses.districts'); -Route::get('/addresses/villages/{districtId}', [AddressController::class, 'villages'])->name('addresses.villages'); +Route::middleware(['auth'])->prefix('/addresses')->group(function () { + Route::get('/', [AddressController::class, 'index'])->name('addresses'); + Route::post('/', [AddressController::class, 'store'])->name('addresses.store'); + Route::put('/{id}', [AddressController::class, 'update'])->name('addresses.update'); + Route::delete('/{id}', [AddressController::class, 'destroy'])->name('addresses.destroy'); + Route::get('/provinces', [AddressController::class, 'provinces'])->name('addresses.provinces'); + Route::get('/cities/{provinceId}', [AddressController::class, 'cities'])->name('addresses.cities'); + Route::get('/districts/{provinceId}', [AddressController::class, 'districts'])->name('addresses.districts'); + Route::get('/villages/{districtId}', [AddressController::class, 'villages'])->name('addresses.villages'); +}); + + +Route::middleware(['auth'])->prefix('/cart')->group(function () { + Route::get('/', [CartController::class, 'index'])->name('cart.index'); + Route::post('/', [CartController::class, 'add'])->name('cart.add'); + Route::put('/{id}', [CartController::class, 'update'])->name('cart.update'); + Route::delete('/{id}', [CartController::class, 'delete'])->name('cart.delete'); + Route::get('/count', [CartController::class, 'count'])->name('cart.count'); +}); \ No newline at end of file