File "CartApiController.php"

Full Path: /home/clickysoft/public_html/jmapi5.clickysoft.net/app/Http/Controllers/Api/V1/User/CartApiController.php
File size: 6.65 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Controllers\Api\V1\User;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Traits\MediaUploadingTrait;
use App\Http\Requests\User\StoreCartRequest;
use App\Http\Resources\User\CartResource;
use App\Models\Cart;
use Gate;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class CartApiController extends Controller
{
    use MediaUploadingTrait;

    public function index()
    {
        $cart_items = Cart::where('user_id', auth()->id())
            ->get();
        CartResource::withoutWrapping();
        return CartResource::collection($cart_items);
    }

    public function update_quantity(Request $request, Cart $cart)
    {
        abort_if(Gate::denies('update-record', $cart), Response::HTTP_FORBIDDEN, '403 Forbidden');
        $request->validate([
            'quantity' => 'required|integer|min:1',
        ]);
        $cart->quantity = $request->quantity;
        $cart->save();

        return (new CartResource($cart))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function update_quantity_bulk(Request $request)
    {
        $request->validate([
            'items' => 'required|array',
            'items.*.id' => 'required|exists:carts,id,user_id,'.auth()->id(),
            'items.*.quantity' => 'required|integer|gt:0',
        ],[
            'items.*.id.required' => 'Id for item #:position is required.',
            'items.*.id.exists' => 'Id for item #:position is invalid.',
            'items.*.quantity.required' => 'Quantity for item #:position is required.',
            'items.*.quantity.integer' => 'Quantity for item #:position must be an integer.',
            'items.*.quantity.gt' => 'Quantity for item #:position must be greater than 0.',
        ]);

        \DB::beginTransaction();
        try {

            foreach ($request->get('items', []) as $item){
                $cart = Cart::find($item['id']);
                $cart->quantity = $item['quantity'];
                $cart->save();
            }

            \DB::commit();
            return response()
                ->json(['message' => 'Cart items updated successfully'], Response::HTTP_OK);
        }catch (\Exception $e){
            \Log::channel('db_errors')->info('Record Update Error : Cart items bulk');
            \Log::channel('db_errors')->info($e->getMessage());

            \DB::rollBack();
            return response()
                ->json([
                    'message' => "Cart not updated.",
                    'errors' => ["error" => ["Unable to update cart items."]]
                ], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }

    public function store(StoreCartRequest $request)
    {
        if ($request->hasFile('attachment')){
            $attachment = $this->storePDF($request->file('attachment'), auth()->id(), 'order');
        }
        $cart = Cart::create(
            array_merge($request->validated(),
                ['user_id' => auth()->id(),
                    'attachment' => $attachment ?? null
                ])
        );

        return (new CartResource($cart))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function show(Cart $cart)
    {
        return new CartResource($cart);
    }

    /*public function update(StoreCartRequest $request, Cart $cart)
    {
        abort_if(Gate::denies('update-record', $cart), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $attachment = $cart->attachment;
        if ($request->hasFile('attachment')){
            if ($attachment){
                $this->deletePDF($attachment, 'order');
            }

            $attachment = $this->storePDF($request->file('attachment'), auth()->id(), 'order');
        }

        $cart->update(
            array_merge(
                $request->validated(),
                ['attachment' => $attachment]
            )
        );

        return (new CartResource($cart))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }*/

    public function destroy(Cart $cart)
    {
        abort_if(Gate::denies('update-record', $cart), Response::HTTP_FORBIDDEN, '403 Forbidden');

        try {
            $cart->delete();
            return response()
                ->json(['message' => 'Cart deleted successfully'], Response::HTTP_OK);
        }catch (\Exception $e){
            \Log::channel('db_errors')->info('Record Deletion Error : Cart -> '.$cart->id);
            \Log::channel('db_errors')->info($e->getMessage());
            return response()
                ->json([
                    'message' => "Record not deleted.",
                    'errors' => ["error" => ["Unable to delete cart."]]
                ], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }

    public function clearCart()
    {
        try {
            $items = Cart::where('user_id', auth()->id());
            if($items->count() == 0){
                return response()
                    ->json([
                        'message' => "Empty cart.",
                        'errors' => ["error" => ["Nothing to delete. Cart already empty."]]
                    ], Response::HTTP_NOT_FOUND);
            }else{
                $items->delete();
                return response()
                    ->json(['message' => 'Cart deleted successfully'], Response::HTTP_OK);
            }
        }catch (\Exception $e){
            \Log::channel('db_errors')->info('Record Deletion Error : Cart');
            \Log::channel('db_errors')->info($e->getMessage());
            return response()
                ->json([
                    'message' => "Record not deleted.",
                    'errors' => ["error" => ["Unable to delete cart."]]
                ], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }

    public function clearBulkCart(Request $request)
    {
        $request->validate([
            'ids' => 'required|array',
            'ids.*' => 'exists:carts,id,user_id,'.auth()->id(),
        ],
            [
                'ids.*.exists' => 'Id #:position is invalid.',
            ]
        );

        try {
            Cart::whereIn('id', $request->get('ids'))->delete();
            return response()
                ->json(['message' => 'Cart items deleted successfully'], Response::HTTP_OK);
        }catch (\Exception $e){
            \Log::channel('db_errors')->info('Record Deletion Error : Cart items');
            \Log::channel('db_errors')->info($e->getMessage());
            return response()
                ->json([
                    'message' => "Record not deleted.",
                    'errors' => ["error" => ["Unable to delete cart items."]]
                ], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
}