File app/Http/Controllers/OrderController.php
(link to Github)
use App\Services\CartService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
class OrderController extends Controller
{
public $cartService;
public function __construct(CartService $cartService)
{
$this->cartService = $cartService;
$this->middleware('auth');
}
//
public function store(Request $request)
{
return DB::transaction(function() use($request) {
$user = $request->user();
$order = $user->orders()->create([
'status' => 'pending',
]);
$cart = $this->cartService->getFromCookie();
$cartProductsWithQuantity = $cart
->products
->mapWithKeys(function ($product) {
$quantity = $product->pivot->quantity;
if ($product->stock < $quantity) {
throw ValidationException::withMessages([
'cart' => "There is not enough stock for the quantity you required of {$product->title}",
]);
}
$product->decrement('stock', $quantity);
$element[$product->id] = ['quantity' => $quantity];
return $element;
});
$order->products()->attach($cartProductsWithQuantity->toArray());
return redirect()->route('orders.payments.create', ['order' => $order->id]);
}, 5);
}
}