diff --git a/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php b/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php index b46a2c85..112aa77d 100644 --- a/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php +++ b/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php @@ -17,7 +17,8 @@ class ShoppingCartItemController extends Controller */ public function index(Request $request) { - $items = $request->user()->shoppingCartItems()->with(['sku'])->has('sku')->latest('id')->get(); + $items = $request->user()->shoppingCartItems()->latest('id')->get(); + $items->load('sku:id,name,cover,sell_price,vip_price,specs,stock,release_at'); return ShoppingCartItemResource::collection($items); } @@ -31,19 +32,22 @@ class ShoppingCartItemController extends Controller public function store(Request $request) { $input = $request->validate([ - 'sku_id' => ['bail', 'required'], + 'sku_id' => ['bail', 'required', 'int'], 'quantity' => ['bail', 'required', 'int', 'min:1'], ]); - $sku = ProductSku::whereRelation('category', 'is_show', true)->online()->find($input['sku_id']); - - if ($sku === null) { + if (is_null($sku = ProductSku::online()->find($input['sku_id']))) { throw new ProductOfflineException(); } $item = $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'], ]); @@ -69,7 +73,17 @@ class ShoppingCartItemController extends Controller $item = $request->user()->shoppingCartItems()->findOrFail($id); - $item->update($input); + if (is_null($sku = $item->sku()->online()->first())) { + throw new ProductOfflineException(); + } + + $item->update(array_merge($input, [ + 'name' => $sku->name, + 'cover' => $sku->cover, + 'sell_price' => $sku->sell_price, + 'vip_price' => $sku->vip_price, + 'specs' => $sku->specs, + ])); return response()->noContent(); } diff --git a/app/Endpoint/Api/Http/Resources/ProductSku/ProductSkuShoppingCartResource.php b/app/Endpoint/Api/Http/Resources/ProductSku/ProductSkuShoppingCartResource.php new file mode 100644 index 00000000..626b89ca --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/ProductSku/ProductSkuShoppingCartResource.php @@ -0,0 +1,28 @@ + $this->id, + 'name' => $this->name, + 'cover' => (string) $this->cover, + 'sell_price' => $this->sell_price, + 'vip_price' => (string) $this->vip_price, + 'specs' => array_values((array) $this->specs), + 'stock' => (int) $this->saleable_stock, + 'is_online' => $this->isOnline(), + ]; + } +} diff --git a/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php b/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php index 0cb31037..17961846 100644 --- a/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php +++ b/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php @@ -2,7 +2,7 @@ namespace App\Endpoint\Api\Http\Resources; -use App\Endpoint\Api\Http\Resources\ProductSku\ProductSkuSimpleResource; +use App\Endpoint\Api\Http\Resources\ProductSku\ProductSkuShoppingCartResource; use Illuminate\Http\Resources\Json\JsonResource; class ShoppingCartItemResource extends JsonResource @@ -17,7 +17,7 @@ class ShoppingCartItemResource extends JsonResource { return [ 'id' => $this->id, - 'sku' => ProductSkuSimpleResource::make($this->whenLoaded('sku')), + 'sku' => ProductSkuShoppingCartResource::make($this->whenLoaded('sku')), 'quantity' => $this->quantity, ]; } diff --git a/app/Models/ShoppingCartItem.php b/app/Models/ShoppingCartItem.php index ab4ec52a..d775ac92 100644 --- a/app/Models/ShoppingCartItem.php +++ b/app/Models/ShoppingCartItem.php @@ -40,6 +40,8 @@ class ShoppingCartItem extends Model $sku->sell_price = $item->sell_price; $sku->vip_price = $item->vip_price; $sku->specs = $item->specs; + $sku->stock = 0; + $sku->release_at = null; }); } }