diff --git a/app/Domains/Cart/Middleware/MergeGuestCartMiddleware.php b/app/Domains/Cart/Middleware/MergeGuestCartMiddleware.php new file mode 100644 index 0000000..e36a265 --- /dev/null +++ b/app/Domains/Cart/Middleware/MergeGuestCartMiddleware.php @@ -0,0 +1,73 @@ +cookie('guest_token'); + + // Resolve authenticated user optionally (from default guard or sanctum guard) + $user = $request->user() ?? Auth::guard('sanctum')->user(); + $userId = $user?->getKey(); + + \Illuminate\Support\Facades\Log::info('MergeGuestCartMiddleware processed', [ + 'user_id' => $userId, + 'guest_token' => $guestToken, + ]); + + if ($user !== null && is_string($guestToken) && $guestToken !== '') { + $tenantParam = $request->route('tenant'); + $tenantCodigo = null; + + if ($tenantParam instanceof Tenant) { + $tenantCodigo = $tenantParam->codigo; + } elseif (is_string($tenantParam)) { + $tenantCodigo = $tenantParam; + } + + if ($tenantCodigo !== null) { + $guestCart = Cart::query() + ->where('tenant_codigo', $tenantCodigo) + ->where('guest_token', $guestToken) + ->first(); + + if ($guestCart !== null && $guestCart->items()->exists()) { + $userCart = Cart::query() + ->where('tenant_codigo', $tenantCodigo) + ->where('user_id', $userId) + ->first(); + + if ($userCart !== null) { + $userCart->delete(); + } + + $guestCart->update([ + 'user_id' => $userId, + 'guest_token' => null, + ]); + } + } + } + + $response = $next($request); + + if ($user !== null && is_string($guestToken) && $guestToken !== '') { + // Remove the cookie from the response since the user is authenticated. + if (method_exists($response, 'withCookie')) { + $response->withCookie(Cookie::forget('guest_token')); + } + } + + return $response; + } +} diff --git a/app/Domains/Cart/Services/CartService.php b/app/Domains/Cart/Services/CartService.php index 3bacb13..a814fcf 100644 --- a/app/Domains/Cart/Services/CartService.php +++ b/app/Domains/Cart/Services/CartService.php @@ -104,7 +104,7 @@ class CartService */ protected function resolveIdentity(Request $request, bool $generateGuestToken = false): ?array { - $user = $request->user(); + $user = $request->user() ?? \Illuminate\Support\Facades\Auth::guard('sanctum')->user(); if ($user instanceof User) { return [ diff --git a/app/Domains/Cart/routes/api.php b/app/Domains/Cart/routes/api.php index 20300ae..910a331 100644 --- a/app/Domains/Cart/routes/api.php +++ b/app/Domains/Cart/routes/api.php @@ -3,9 +3,11 @@ use App\Domains\Cart\Controllers\CartController; use Illuminate\Support\Facades\Route; -Route::prefix('tenants/{tenant:codigo}')->group(function (): void { - Route::get('cart', [CartController::class, 'show']); - Route::post('cart/items', [CartController::class, 'addItem']); - Route::patch('cart/items/{productVariant}', [CartController::class, 'updateItemQuantity']); - Route::delete('cart/items/{productVariant}', [CartController::class, 'removeItem']); -}); +Route::prefix('tenants/{tenant:codigo}') + ->middleware(\App\Domains\Cart\Middleware\MergeGuestCartMiddleware::class) + ->group(function (): void { + Route::get('cart', [CartController::class, 'show']); + Route::post('cart/items', [CartController::class, 'addItem']); + Route::patch('cart/items/{productVariant}', [CartController::class, 'updateItemQuantity']); + Route::delete('cart/items/{productVariant}', [CartController::class, 'removeItem']); + });