125 lines
3.6 KiB
PHP
125 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();
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|