DeveloperGuide/step-0-sample-apps/sample-php-app-rest/app/Http/Controllers/CartController.php (141 lines of code) (raw):
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Schema;
use App\Helpers\AppHelper;
use App\Helpers\ItemApiService;
use App\Helpers\CartApiService;
use App\Helpers\CartItemApiService;
use App\Helpers\OrderApiService;
use App\Models\Cart;
use App\Models\CartItem;
use App\Models\Order;
use App\Models\Item;
use GuzzleHttp\Exception\RequestException;
class CartController extends Controller
{
// pages:
public function checkout()
{
$user = session('user');
$cart = session('cart');
$item_list = [];
if ($cart) $item_list = array_keys($cart);
try
{
$items = ItemApiService::instance()->getItemsInCart($item_list);
}
catch (RequestException $e)
{
// if there's no database connection, use a helper and JSON data
$items = AppHelper::instance()->itemJson('items',$item_list);
// set a flag so we can display a warning if JSON data is used
$json_warning = 1;
}
$cart_total = 0;
$cart_data = [];
foreach($items as $item) {
$qty = $cart[$item->id];
$item->qty = $qty;
// set price to 0 in the event there is bad data
$price = is_numeric($item->price) ? $item->price : 0;
// set item subtotal
$item->sub = $qty * number_format($price, 2);
// increment cart total
$cart_total += $item->sub;
// add item to cart array
$cart_data[$item->id] = $item;
}
try
{
$cart = CartApiService::instance()->openCart($user->id);
// Batch cart items and then save them using the API
$cartItems = [];
foreach($cart_data as $id => $item) {
array_push($cartItems, array('cartId' => $cart->id, 'itemId' => $id, 'qty' => $item->qty));
}
CartItemApiService::instance()->addCartItems($cartItems);
session(['cart_id' => $cart->id]);
}
catch (RequestException $e)
{
session(['cart_id' => 'session']);
$json_warning = 1;
}
return view('checkout', ['header'=>1, 'user'=>$user, 'cart_data'=>$cart_data, 'cart_total'=>$cart_total, 'json_warning'=>($json_warning ?? 0)]);
}
public function processOrder(Request $request)
{
$user = session('user');
$cart = session('cart');
$cart_id = session('cart_id');
if (!$user || !$cart || !$cart_id) {
// something is missing, bounce back to the checkout page
return redirect()->route('checkout');
}
if ($cart) {
$item_list = array_keys($cart);
try
{
$item = ItemApiService::instance()->getItemsInCart($item_list);
}
catch (RequestException $e)
{
$item = AppHelper::instance()->itemJson('items',$item_list,'cooktime');
}
// show a semi-random delivery time to make it more fun
$cooktime = 0;
// start with a random prep/drive time
$time = rand(5,20);
foreach($item as $i) {
// get the longest cooktime of all items in the cart
if ($cooktime < $i->cooktime) {
$cooktime = $i->cooktime;
}
}
// add the cooktime to the random prep/drive time
$time+=$cooktime;
// turn it into minutes from *right now*
$delivery = strtotime(now())+($time*60);
$name = $request->name ?? $user->name;
$address = $request->address ?? $user->address;
try
{
CartApiService::instance()->closeCart($cart_id);
OrderApiService::instance()->createOrder($user->id, $cart_id, $name, $address, $request->special_instructions, $time);
}
catch (RequestException $e) {}
// clear all the sessions
session()->forget('cart');
session()->forget('cart_id');
session()->forget('receipt');
session([ 'receipt' => ['created_at'=>strtotime(now()), 'delivery'=>$delivery] ]);
}
// redirect to the receipt page
return redirect()->route('receipt');
}
public function receipt()
{
$time_left = 0;
// use the receipt session or display a generic message
$receipt = session('receipt');
if ($receipt) {
// figure out how many minutes are left before food arrives
$time_left = floor( ($receipt['delivery'] - strtotime(now()) )/60 );
}
return view('receipt', ['header'=>1, 'receipt'=>$receipt, 'time_left'=>$time_left]);
}
// ajax:
public function addToCart(Request $request)
{
// Item ID
$id = $request->item;
if (!session('cart')) {
session([ 'cart' => [] ]);
}
$cart = session('cart');
if (isset($cart[$id])) {
$cart[$id]++;
} else {
$cart[$id] = 1;
}
session(['cart' => $cart]);
// update the floating cart
$global_cart = AppHelper::instance()->globalCart();
return $global_cart;
}
public function updateCart(Request $request)
{
$item = $request->cart_items;
$cart = session('cart');
foreach ($item as $id => $qty) {
if (isset($cart[$id]) && $qty<1) {
unset($cart[$id]);
} else {
$cart[$id] = $qty;
}
}
session(['cart' => $cart]);
// update the floating cart
$global_cart = AppHelper::instance()->globalCart('show');
return $global_cart;
}
}