feat: implement MergeGuestCartMiddleware to merge guest cart with user cart upon authentication
This commit is contained in:
73
app/Domains/Cart/Middleware/MergeGuestCartMiddleware.php
Normal file
73
app/Domains/Cart/Middleware/MergeGuestCartMiddleware.php
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domains\Cart\Middleware;
|
||||||
|
|
||||||
|
use App\Domains\Cart\Models\Cart;
|
||||||
|
use App\Domains\Tenant\Models\Tenant;
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\Cookie;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
class MergeGuestCartMiddleware
|
||||||
|
{
|
||||||
|
public function handle(Request $request, Closure $next): Response
|
||||||
|
{
|
||||||
|
$guestToken = $request->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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -104,7 +104,7 @@ class CartService
|
|||||||
*/
|
*/
|
||||||
protected function resolveIdentity(Request $request, bool $generateGuestToken = false): ?array
|
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) {
|
if ($user instanceof User) {
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
use App\Domains\Cart\Controllers\CartController;
|
use App\Domains\Cart\Controllers\CartController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::prefix('tenants/{tenant:codigo}')->group(function (): void {
|
Route::prefix('tenants/{tenant:codigo}')
|
||||||
|
->middleware(\App\Domains\Cart\Middleware\MergeGuestCartMiddleware::class)
|
||||||
|
->group(function (): void {
|
||||||
Route::get('cart', [CartController::class, 'show']);
|
Route::get('cart', [CartController::class, 'show']);
|
||||||
Route::post('cart/items', [CartController::class, 'addItem']);
|
Route::post('cart/items', [CartController::class, 'addItem']);
|
||||||
Route::patch('cart/items/{productVariant}', [CartController::class, 'updateItemQuantity']);
|
Route::patch('cart/items/{productVariant}', [CartController::class, 'updateItemQuantity']);
|
||||||
|
|||||||
Reference in New Issue
Block a user