Viewing File: /home/ubuntu/vedadeals-backend-base/app/Http/Controllers/Api/HomeApiController.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;

use Carbon\Carbon;

use App\Models\{ User, Product, Banner, Category, Order, Faq, Review };

use App\Http\Resources\{ ProductResource, CategoryResource, ProductPreviewResource, FaqResource, BannerResource, ReviewResource };

use Illuminate\Validation\Rule;

class HomeApiController 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 banners_list()
     *
     * @uses to get all banners for home page
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function banners_list(Request $request) {

        try {

            $base_query = Banner::with(['product.category:id,name'])->Approved()->orderBy('updated_at', 'desc');

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

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

            $data['banners'] = BannerResource::collection($banners);

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

        } catch (Exception $e) {

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

    /**
     * @method categories_list()
     *
     * @uses to get all category products for home page
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function categories_list(Request $request) {

        try {

            $base_query = Category::has('availableProducts')->withCount(['availableProducts'])->with(['subCategories'])->Approved()->orderBy('updated_at', 'desc');

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

            $categories = $base_query->get();

            $data['categories'] = CategoryResource::collection($categories);

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

        } catch (Exception $e) {

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

    /**
     * @method top_products_list()
     *
     * @uses to get all top selling products list for home page
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function top_products_list(Request $request) {

        try {

            $base_query = Product::Available()->withCount(['orderProducts'])
                        ->has('orderProducts', '>=' , TOP_PRODUCTS_FILTER_COUNT)
                        ->with(['discount', 'category'])
                        ->orderBy('order_products_count', 'desc');

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

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

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

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

        } catch (Exception $e) {

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

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

        try {

            $base_query = Faq::Approved()->orderBy('updated_at', 'desc');

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

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

            $data['faqs'] = FaqResource::collection($faqs);

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

        } catch (Exception $e) {

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

    /**
     * @method customer_reviews_list()
     *
     * @uses to get random reviews list
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param 
     * 
     * @return
     */
    public function customer_reviews_list(Request $request) {

        try {

            $rules = ['order_by' => ['required', Rule::in(ORDER_BY_HIGHEST, ORDER_BY_LOWEST, ORDER_BY_NEWEST, ORDER_BY_OLDEST)]];

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

            $base_query = Review::has('user')->has('product')
                            ->when(in_array($request->order_by, [ORDER_BY_HIGHEST, ORDER_BY_LOWEST]), function($query) use ($request) {
                                $query->where(['star' => $request->order_by == ORDER_BY_HIGHEST ? 5 : 1]);
                            })
                            ->with(['user', 'product.category:id,name', 'product.discount:id,discount_type,discount'])
                            ->whereNotNull('review')->inRandomOrder();

            switch($request->order_by) {

                case ORDER_BY_HIGHEST:
                    $base_query->orderBy('star', 'desc');
                    break;

                case ORDER_BY_LOWEST:
                    $base_query->orderBy('star', 'asc');
                    break;

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

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

            $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());
        }
    }
}
Back to Directory File Manager