Viewing File: /home/ubuntu/vedadeals-backend-base/app/Http/Controllers/Api/ProductApiController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

use App\Helpers\Helper;

use DB, Exception, Setting, stdClass, CountryState;

use Carbon\Carbon;

use App\Models\{ User, Product, Cart, Wishlist, DeliveryAddress, Review, ReviewFile, Country };

use Illuminate\Validation\Rule;

use App\Http\Resources\{ ProductResource, CartResource, DeliveryAddressResource, ReviewResource, ReviewFileResource, CountryResource };

use Illuminate\Support\Facades\Cache;

use App\Services\{ ProductService, OrderService, EmailService }; 

use Illuminate\Support\Str;

class ProductApiController extends Controller
{
    protected $loginUser;

    protected $skip, $take;

    public function __construct(Request $request) {

        info(url()->current());

        info("Request Data".print_r($request->all(), true));
        
        $this->loginUser = User::find($request->id);

        $this->skip = $request->skip ?: 0;

        $this->take = $request->take ?: (Setting::get('admin_take_count') ?: TAKE_COUNT);

        $this->timezone = $this->loginUser->timezone ?? "America/New_York";

        $request->request->add(['timezone' => $this->timezone ? : "America/New_York"]);

    }

    /**
     * @method products_list()
     *
     * @uses to get all available products list
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function products_list(Request $request) {

        try {

            $rules = [ 'from' => ['nullable', 'numeric'], 'to' => ['nullable', 'numeric', 'gt:'.$request->from] ];

            $custom_errors = ['to.gt' => api_error(137)];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            $base_query = Product::Available()->withCount(['orderProducts'])->withAvg('reviews', 'star')
                        ->with(['category:id,name', 'subCategory:id,name', 'discount']);

            if($request->filled('search_key')) {
                $base_query->where(function($query) use ($request) {
                    $query->where('name', "LIKE", "%{$request->search_key}%");
                });
            }

            if($request->filled('category_id')) {

                if(!Str::startsWith($request->category_id, '[') || !Str::endsWith($request->category_id, ']')) {

                    throw new Exception(api_error(130), 130);
                }

                $category_ids = json_decode($request->category_id, true);

                $base_query = $base_query->whereIn('category_id', $category_ids);
            }

            if($request->filled('sub_category_id')) {

                if(!Str::startsWith($request->sub_category_id, '[') || !Str::endsWith($request->sub_category_id, ']')) {

                    throw new Exception(api_error(130), 130);
                }

                $sub_category_ids = json_decode($request->sub_category_id, true);

                $base_query = $base_query->whereIn('sub_category_id', $sub_category_ids);
            }

            if($request->filled('stock_status')) {

                $base_query = $base_query->where('stock_status', $request->stock_status);
            }

            if($request->filled('from') && $request->filled('to')) {

                $base_query = $base_query->whereBetween('price', [$request->from, $request->to]);
            }

            switch($request->order_by) {

                case ORDER_BY_NEWEST:
                    $base_query->orderBy('updated_at', 'desc');
                    break;

                case ORDER_BY_OLDEST:
                    $base_query->orderBy('updated_at', 'asc');
                    break;

                case ORDER_BY_PRICE_HIGH_TO_LOW:
                    $base_query->orderBy('price', 'desc');
                    break;

                case ORDER_BY_PRICE_LOW_TO_HIGH:
                    $base_query->orderBy('price', 'asc');
                    break;

                default:
                    $base_query->orderBy('updated_at', 'desc');
                    break;
            }

            $data['total_products'] = $base_query->count();

            $data['total_out_of_stock_products'] = (clone $base_query)->where(['stock_status' => OUT_OF_STOCK])->count();

            $data['total_in_stock_products'] = $data['total_products'] - $data['total_out_of_stock_products'];

            $products = $base_query->skip($this->skip)->take($this->take)->get();

            $data['products'] = ProductResource::collection($products); 

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method products_view()
     *
     * @uses to view a product details based on product_unique_id
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function products_view(Request $request) {

        try {

            $rules = [ 'product_unique_id' => ['required', 'exists:products,unique_id'] ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('product')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            $product = Product::Available()->withAvg('reviews', 'star')
                        ->withCount(['orderProducts'])
                        ->with(['category:id,name', 'subCategory:id,name', 'productFiles.product:id,name', 'productInventory'])
                        ->firstWhere('unique_id', $request->product_unique_id);

            if(!$product) {

                throw new Exception(api_error(1009, strtolower(tr('product'))));
            }

            $request->request->add(['decimal' => 2]);

            $data['product'] = new ProductResource($product);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method wishlists_save()
     *
     * @uses to add / remove product from wishlists.
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param product_id
     * 
     * @return success / failure message
     */
    public function wishlists_save(Request $request) {

        try {

            $rules = [ 'product_unique_id' => ['required', 'exists:products,unique_id'] ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('product')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            $product = Product::Available()->firstWhere('unique_id', $request->product_unique_id);

            if(!$product) {

                throw new Exception(api_error(1009, strtolower(tr('product'))));
            }

            DB::beginTransaction();

            $wishlist = Wishlist::firstOrCreate(['user_id' => $request->id, 'product_id' => $product->id]);

            if($wishlist->wasRecentlyCreated) {

                $success_code = 137;

            } else {

                $wishlist->delete();

                $success_code = 138;
            }

            DB::commit();

            Helper::cache_update_for_products($request->id, WISHLIST);

            $data['is_wishlisted'] = $success_code == 137 ? YES : NO;

            $data['product_unique_id'] = $request->product_unique_id;

            return $this->sendResponse(api_success($success_code), $success_code , $data);

            throw new Exception(api_error(104), 104);

        } catch (Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method wishlists_list()
     *
     * @uses to get all Wishlist details of user
     *
     * @created Arun
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function wishlists_list(Request $request) {

        try {

            $product_ids = Wishlist::where('user_id', $request->id)->orderBy('updated_at', 'desc')->pluck('product_id');

            $base_query = Product::whereIn('id', $product_ids)->Available()->withCount(['orderProducts'])
                            ->withAvg('reviews', 'star')
                            ->with(['category:id,name', 'subCategory:id,name']);

            $data['total_products'] = $base_query->count();

            $products = $base_query->skip($this->skip)->take($this->take)->get();

            $data['products'] = ProductResource::collection($products); 

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /** 
     * @method delivery_addresses_save()
     *
     * @uses to create / update delivery address details
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param object $request
     *
     * @return JSON response with delivery address details
     */

    public function delivery_addresses_save(Request $request) {

        try {

            DB::beginTransaction();

            $request->request->add(['user_id' => $request->id]);

            $rules = [
                'delivery_address_id' => 'nullable|exists:delivery_addresses,id,user_id,'.$request->id.'|exclude',
                'user_id' => 'exists:users,id',
                'name' => 'required|max:250',
                'address' => 'required|max:250',
                'pincode' => 'required|regex:/^[1-9][0-9]{5}$/',
                'city' => 'required|max:250',
                'state' => 'required|max:50',
                'country' => 'required|max:50',
                'landmark' => 'required|max:250',
                'contact_number' => 'required|digits_between:6,13'
            ];

            $custom_errors = ['exists' => api_error(123), 123];

            $validated = Helper::custom_validator($request->all(), $rules, $custom_errors);

            $availability = ProductService::check_country_availability($request->state, $request->country, COUNTRY);

            if(!$availability['is_available']) {

                throw new Exception($availability['availability_msg']);

            }

            $delivery_addresses = DeliveryAddress::where(['user_id' => $request->id, 'is_default' => YES])->exists();

            $delivery_address = DeliveryAddress::updateOrCreate(['id' => $request->delivery_address_id], $validated);

            if($delivery_address) {

                !$delivery_addresses && $delivery_address->update(['is_default' => YES]);

                $delivery_address->refresh();

                DB::commit();
            }

            $success_code = $request->delivery_address_id ? 140 : 139;

            return $this->sendResponse(api_success($success_code), $success_code, new DeliveryAddressResource($delivery_address));

        } catch(Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());

        }
    
    }

    /**
     * @method delivery_addresses_list()
     *
     * @uses to get all delivery address details of user
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function delivery_addresses_list(Request $request) {

        try {

            $base_query = DeliveryAddress::where('user_id', $request->id)->latest('is_default')->latest('updated_at');

            $data['total_delivery_addresses'] = $base_query->count();

            $delivery_addresses = $base_query->skip($this->skip)->take($this->take)->get();

            $data['delivery_addresses'] = DeliveryAddressResource::collection($delivery_addresses);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method delivery_addresses_make_default()
     *
     * @uses to make an delivery address as default
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param delivery_address_id
     * 
     * @return success / failure message
     */
    public function delivery_addresses_make_default(Request $request) {

        try {

            $rules = ['delivery_address_id' => ['required', 'exists:delivery_addresses,id,user_id,'.$request->id]];

            $custom_errors = ['exists' => api_error(123)];

            $validated = Helper::custom_validator($request->all(), $rules, $custom_errors);

            DB::beginTransaction();

            $delivery_address = DeliveryAddress::find($request->delivery_address_id);

            Helper::check_model_exists($delivery_address->id ?? '', DELIVERY_ADDRESS);

            if($delivery_address->is_default == YES) {

                throw new Exception(api_error(124), 124);
            }

            $old_default_billing_account = DeliveryAddress::where(['user_id' => $request->id, 'is_default' => YES])->update(['is_default' => NO]);

            $result = $delivery_address->update(['is_default' => YES]);

            if($result && $old_default_billing_account) {

                DB::commit();

                $data['delivery_address'] = $delivery_address;

                return $this->sendResponse(api_success(141), 141 , $data);
            }

            throw new Exception(api_error(104), 104);

        } catch (Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method delivery_addresses_view()
     *
     * @uses to get the details of an delivery details based on delivery_address_unique_id
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param delivery_address_unique_id
     * 
     * @return delivery address details.
     */
    public function delivery_addresses_view(Request $request) {

        try {

            $rules = [ 'delivery_address_unique_id' => ['required', 'exists:delivery_addresses,unique_id,user_id,'.$request->id] ];

            $custom_errors = ['exists' => api_error(1009, tr('delivery_address'))];

            Helper::custom_validator($request->all(), $rules);

            $delivery_address = DeliveryAddress::firstWhere('unique_id', $request->delivery_address_unique_id);

            Helper::check_model_exists($delivery_address->id ?? '', DELIVERY_ADDRESS);

            $data['delivery_address'] = new DeliveryAddressResource($delivery_address);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method delivery_addresses_delete()
     *
     * @uses to delete a delivery address
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param delivery_address_id
     * 
     * @return success / failure message
     */
    public function delivery_addresses_delete(Request $request) {

        try {

            $rules = ['delivery_address_id' => ['required', 'exists:delivery_addresses,id,user_id,'.$request->id]];

            $custom_errors = ['exists' => api_error(123)];

            $validated = Helper::custom_validator($request->all(), $rules, $custom_errors);

            DB::beginTransaction();

            $delivery_address = DeliveryAddress::find($request->delivery_address_id);

            Helper::check_model_exists($delivery_address->id ?? '', DELIVERY_ADDRESS);

            if($delivery_address->is_default == YES) {

                $new_default_billing_account = DeliveryAddress::firstWhere(['user_id' => $request->id, 'is_default' => NO]);

                if($new_default_billing_account) {

                    $new_default_billing_account->update(['is_default' => YES]);
                }
            }

            $result = $delivery_address->delete();

            if($result) {

                DB::commit();

                return $this->sendResponse(api_success(142), 142, '');
            }

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method carts_list()
     *
     * @uses to get all carts details of user
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function carts_list(Request $request) {

        try {

            $base_query = Cart::has('product')->with(['product'])->where('user_id', $request->id)->orderBy('updated_at', 'desc');

            $data['total_carts'] = $base_query->count();

            $carts = $base_query->get();
            
            $data['carts'] = CartResource::collection($carts);

            $data['user_cart_amount'] = ProductService::get_user_cart_amount($request->id);

            $data['availability']  = ProductService::check_country_availability($request->state ? : $this->loginUser->state ?? '', $request->country_code ? : $this->loginUser->country_code ?? '', COUNTRY_CODE);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method carts_save()
     *
     * @uses to create / update product from user carts list.
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param product_id, quantity
     * 
     * @return success / failure message
     */
    public function carts_save(Request $request) {

        try {

            $rules = [ 
                'product_id' => [Rule::requiredIf(!$request->carts), 'exists:products,id'],
                'quantity' => [Rule::requiredIf(!$request->carts), 'numeric', 'min:1'],
            ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('product')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            if($request->product_id && $request->quantity) {

                $product = Product::Available()->find($request->product_id);

                ProductService::products_base_validations($product, $request->quantity);

                DB::beginTransaction();

                $cart = Cart::updateOrCreate(['user_id' => $request->id, 'product_id' => $product->id], [ 'quantity' => $request->quantity ]);

                $success_code = $cart->wasRecentlyCreated ? 135 : 136;

            } elseif($request->carts) {

                $carts_data = json_decode($request->carts);

                if(!$carts_data) {

                    throw new Exception(api_error(136), 136);
                }

                DB::beginTransaction();

                foreach($carts_data as $cart_data) {

                    $product = Product::Available()->find($cart_data->product_id);

                    ProductService::products_base_validations($product, $cart_data->quantity);

                    $cart = Cart::updateOrCreate(['user_id' => $request->id, 'product_id' => $product->id], [ 'quantity' => $cart_data->quantity ]);

                    $success_code = 135;

                }
            }

            if($cart) {

                DB::commit();

                Helper::cache_update_for_products($request->id, CART);

                $data['cart_count'] = Cart::has('product')->where('user_id', $request->id)->count();

                $data['cart'] = new CartResource($cart);

                $data['user_cart_amount'] = ProductService::get_user_cart_amount($request->id);

                return $this->sendResponse(api_success($success_code), $success_code , $data);
            }

            throw new Exception(api_error(104), 104);

        } catch (Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method carts_delete()
     *
     * @uses to delete a cart
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param product_id
     * 
     * @return success / failure message
     */
    public function carts_delete(Request $request) {

        try {

            $rules = [ 'product_id' => ['required', 'exists:products,id'] ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('product')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            $product = Product::Available()->find($request->product_id);

            if(!$product) {

                throw new Exception(api_error(1009, strtolower(tr('product'))));
            }

            $cart = Cart::firstWhere(['user_id' => $request->id, 'product_id' => $product->id]);

            if(!$cart) {

                throw new Exception(api_error(125), 125);
            }

            $result = $cart->delete();

            if($result) {

                DB::commit();

                Helper::cache_update_for_products($request->id, CART);

                $data['cart_count'] = Cart::has('product')->where('user_id', $request->id)->count();

                $data['user_cart_amount'] = ProductService::get_user_cart_amount($request->id);

                return $this->sendResponse(api_success(143), 143, $data);
            }

            throw new Exception(api_error(104), 104);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method reviews_save()
     *
     * @uses to post a review for an product
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param
     * 
     * @note review_file_ids format example : [1,2,3]
     * 
     * @return success / failure message
     */
    public function reviews_save(Request $request) {

        try {

            $request->request->add(['user_id' => $request->id]);

            $rules = [ 
                'review_id' => ['nullable', 'exists:reviews,id', 'exclude'],
                'product_id' => ['required', 'exists:products,id'],
                'user_id' => ['nullable', 'exists:users,id'],
                'review' => ['nullable'],
                'star' => ['required', 'numeric', 'min:0' ,'max:5'],
                'review_file_ids' => ['nullable', 'exclude']
            ];

            $custom_errors = [
                'product_id.exists' => api_error(1009, strtolower(tr('product'))),
                'user_id.exists' => api_error(1009, strtolower(tr('user')))
            ];

            $validated = Helper::custom_validator($request->all(), $rules, $custom_errors);

            DB::beginTransaction();

            $review = Review::updateOrCreate(['id' => $request->review_id], $validated);

            if(!$review) {

                throw new Exception(api_error(104), 104);
            }

            if($request->review_file_ids) {

                if(!Str::startsWith($request->review_file_ids, '[') || !Str::endsWith($request->review_file_ids, ']')) {

                    throw new Exception(api_error(130), 130);
                }

                $review_file_ids = json_decode($request->review_file_ids, true);

                foreach($review_file_ids as $review_file_id) {

                    $review_file = ReviewFile::find($review_file_id);

                    if(!$review_file) {

                        throw new Exception(api_error(132), 132);
                    }

                    if($review_file->review_id) {

                        throw new Exception(api_error(131), 131);
                    }

                    $review_file->update(['review_id' => $review->id]);
                }
            }

            DB::commit();

            $success_code = $review->wasRecentlyCreated ? 145 : 148;

            $review = Review::with(['reviewFiles', 'product', 'user'])->firstWhere(['id' => $review->id]);

            $data['review'] = new ReviewResource($review);

            $reviews_avg_star = Review::where(['product_id' => $review->product_id])->avg('star');

            $data['review_stars'] = number_format($reviews_avg_star, 1);

            return $this->sendResponse(api_success($success_code), $success_code , $data);

        } catch (Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method review_files_save()
     *
     * @uses to upload a file while adding review
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param
     * 
     * @return success / failure message
     */
    public function review_files_save(Request $request) {

        try {

            $rules = [ 'file' =>['required', 'mimes:jpg,png,jpeg,mp4'] ];

            $custom_errors = [ 'mimes' => 'The file must be a type of: :values.' ];

            $validated = Helper::custom_validator($request->all(), $rules, $custom_errors);

            DB::beginTransaction();

            $file = $request->file;

            $file_url = Helper::storage_upload_file($file, REVIEW_FILE_PATH);
                        
            $file_type = in_array($file->getClientOriginalExtension(), ['jpg', 'jpeg', 'png']) ? IMAGE : VIDEO;

            $review_file = ReviewFile::Create(['file' => $file_url, 'file_type' => $file_type]);

            if(!$review_file) {

                throw new Exception(api_error(104), 104);
            }

            DB::commit();

            return $this->sendResponse(api_success(146), 146 , $review_file);

        } catch (Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method review_files_delete()
     *
     * @uses to delete a reviews file.
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param
     * 
     * @return success / failure message
     */
    public function review_files_delete(Request $request) {

        try {

            $rules = [ 'review_file_id' => ['required', 'exists:review_files,id'] ];

            $validated = Helper::custom_validator($request->all(), $rules);

            DB::beginTransaction();

            $review_file = ReviewFile::find($request->review_file_id);

            if($review_file->delete()) {

                DB::commit();

                return $this->sendResponse(api_success(147), 147);
            }

            throw new Exception(api_error(104), 104);

        } catch (Exception $e) {

            DB::rollback();

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method product_reviews()
     *
     * @uses to get all the reviews of an product
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function product_reviews(Request $request) {

        try {

            $rules = [ 'product_unique_id' => ['required', 'exists:products,unique_id'] ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('product')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            $product = Product::Available()->firstWhere(['unique_id' => $request->product_unique_id]);

            if(!$product) {

                throw new Exception(api_error(1009, strtolower(tr('product'))));
            }

            $base_query = Review::with(['reviewFiles', 'user'])->where(['product_id' => $product->id])->orderBy('updated_at', 'desc');

            $data['total_reviews'] = $base_query->count();

            $reviews = $base_query->skip($this->skip)->take($this->take)->get();

            $data['reviews'] = ReviewResource::collection($reviews);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method product_review_files()
     *
     * @uses to get all the files of a reviews (Only Files)
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function product_review_files(Request $request) {

        try {

            $rules = [ 'product_unique_id' => ['required', 'exists:products,unique_id'] ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('product')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            $product = Product::Available()->firstWhere(['unique_id' => $request->product_unique_id]);

            if(!$product) {

                throw new Exception(api_error(1009, strtolower(tr('product'))));
            }

            $review_ids = Review::where(['product_id' => $product->id])->pluck('id');

            $base_query = ReviewFile::whereIn('review_id', $review_ids)->orderBy('updated_at', 'desc');

            $data['total_review_files'] = $base_query->count();

            $review_files = $base_query->skip($this->skip)->take($this->take)->get();

            $data['review_files'] = ReviewFileResource::collection($review_files);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method reviews_list()
     *
     * @uses to get all the reviews of an user
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function reviews_list(Request $request) {

        try {

            $base_query = Review::with(['reviewFiles', 'product.category:id,name', 'product.discount:id,discount_type,discount'])
                                ->where(['user_id' => $request->id])
                                ->orderBy('updated_at', 'desc');

            $data['total_reviews'] = $base_query->count();

            $reviews = $base_query->skip($this->skip)->take($this->take)->get();

            $data['reviews'] = ReviewResource::collection($reviews);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method reviews_delete()
     *
     * @uses to delete a review
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param review_id
     * 
     * @return success / failure message
     */
    public function reviews_delete(Request $request) {

        try {

            $rules = [ 'review_id' => ['sometimes', 'exists:reviews,id,user_id,'.$request->id] ];

            $custom_errors = ['exists' => api_error(1009, strtolower(tr('review')))];

            Helper::custom_validator($request->all(), $rules, $custom_errors);

            DB::beginTransaction();

            $review = Review::find($request->review_id);

            if(!$review) {

                throw new Exception(api_error(1009, strtolower(tr('review'))));
            }

            $result = $review->delete();

            if($result) {

                DB::commit();

                return $this->sendResponse(api_success(149), 149, '');
            }

            throw new Exception(api_error(104), 104);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method guest_carts_list()
     *
     * @uses to get the carts list, amount & product details when user not logged in (Guest User).
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function guest_carts_list(Request $request) {

        try {

            $rules = [ 'carts' => ['required'] ];

            Helper::custom_validator($request->all(), $rules, $custom_errors = []);

            $carts_data = json_decode($request->carts);

            if(!$carts_data) {

                throw new Exception(api_error(136), 136);
            }

            foreach($carts_data as $key => $cart_data) {

                $carts[$key] = new Cart;
                
                $carts[$key]->quantity = $cart_data->quantity;

                $carts[$key]->product_id = $cart_data->product_id;

                $carts[$key]->product = Product::firstWhere(['id' => $cart_data->product_id]) ?? [];
            }

            $data['carts'] = CartResource::collection($carts);

            $data['user_cart_amount'] = ProductService::get_guest_cart_amount($carts_data);

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method get_countries()
     *
     * @uses to get all countries list
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function get_countries(Request $request) {

        try {

            $rules = [ 'all_countries' => ['nullable', Rule::in(YES, NO)] ];

            Helper::custom_validator($request->all(), $rules, $custom_errors = []);

            if(request('all_countries') == YES) {

                $countries = CountryState::getCountries();

                $data['total_countries'] = count($countries);

                // $data['countries'] = $countries;

                foreach($countries as $key => $country) {

                    $data['countries'][] = [
                        'label' => $country,
                        'value' => $key
                    ];
                }

            } else {

                $request->request->add(['filter_by' => COUNTRY]);

                $countries = Country::Approved()->distinct('country_code')->orderBy('country')->get(['country', 'country_code']);

                $data['total_countries'] = $countries->count();

                $data['countries'] = CountryResource::collection($countries);
            }

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }

    /**
     * @method get_states()
     *
     * @uses to get all states list based on country code
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function get_states(Request $request) {

        try {

            $rules = [ 
                'country_code' => ['required'],
                'all_countries' => ['nullable', Rule::in(YES, NO)]
            ];

            Helper::custom_validator($request->all(), $rules, $custom_errors = []);

            if(request('all_countries') == YES) {

                $states = CountryState::getStates(request('country_code'));

                $data['total_states'] = count($states);

                // $data['states'] = $states;

                foreach($states as $key => $state) {

                    $data['states'][] = [
                        'label' => $state,
                        'value' => $key
                    ];
                }

            } else {

                $request->request->add(['filter_by' => STATE]);

                $states = Country::where(['country_code' => request('country_code')])->Approved()->orderBy('state')->get(['state']);

                $data['total_states'] = $states->count();

                $data['states'] = CountryResource::collection($states);
            }

            return $this->sendResponse("", "", $data);

        } catch (Exception $e) {

            return $this->sendError($e->getMessage(), $e->getCode());
        }
    }
}
Back to Directory File Manager