6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php

127 lines
3.6 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\ShoppingCartItemResource;
use App\Exceptions\ProductNotEnoughException;
use App\Exceptions\ProductOfflineException;
use App\Models\ProductSku;
use Illuminate\Http\Request;
class ShoppingCartItemController extends Controller
{
/**
* 购物车商品列表
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
$items = $request->user()->shoppingCartItems()->latest('id')->get();
$items->load('sku:id,name,cover,sell_price,vip_price,specs,stock,release_at')->load('sku.spu');
return ShoppingCartItemResource::collection($items);
}
/**
* 添加购物车商品
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->validate([
'sku_id' => ['bail', 'required', 'int'],
'quantity' => ['bail', 'required', 'int', 'min:1'],
]);
if (is_null($sku = ProductSku::online()->find($input['sku_id']))) {
throw new ProductOfflineException();
}
if ($input['quantity'] > $sku->saleable_stock) {
throw new ProductNotEnoughException();
}
$shoppingCartItem = $request->user()->shoppingCartItems()->firstOrCreate([
'sku_id' => $sku->id,
], [
'name' => $sku->name,
'cover' => $sku->cover,
'sell_price' => $sku->sell_price,
'vip_price' => $sku->vip_price,
'specs' => $sku->specs,
'quantity' => $input['quantity'],
]);
$shoppingCartItem->setRelation('sku', $sku);
if (! $shoppingCartItem->wasRecentlyCreated) {
if ($shoppingCartItem->quantity + $input['quantity'] > $sku->saleable_stock) {
throw new ProductNotEnoughException();
}
$shoppingCartItem->increment('quantity', $input['quantity']);
}
return ShoppingCartItemResource::make($shoppingCartItem);
}
/**
* 修改购物车商品
*
* @param int $id
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update($id, Request $request)
{
$input = $request->validate([
'quantity' => ['bail', 'required', 'int', 'min:1'],
]);
$shoppingCartItem = $request->user()->shoppingCartItems()->findOrFail($id);
if (is_null($sku = $shoppingCartItem->sku()->online()->first())) {
throw new ProductOfflineException();
}
$sku->load('spu');
if ($input['quantity'] > $sku->saleable_stock) {
throw new ProductNotEnoughException();
}
$shoppingCartItem->setRelation('sku', $sku);
$shoppingCartItem->update(array_merge($input, [
'name' => $sku->name,
'cover' => $sku->cover,
'sell_price' => $sku->sell_price,
'vip_price' => $sku->vip_price,
'specs' => $sku->specs,
]));
return ShoppingCartItemResource::make($shoppingCartItem);
}
/**
* 删除购物车商品
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function delete(Request $request)
{
$input = $request->validate([
'ids' => ['bail', 'required', 'array'],
]);
$request->user()->shoppingCartItems()->whereIn('id', $input['ids'])->delete();
return response()->noContent();
}
}