Viewing File: /home/ubuntu/vedadeals-backend-base/app/Http/Controllers/Admin/ReviewController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

use App\Helpers\Helper;

use App\Models\{ User, Product, Review, ReviewFile };

use App\Http\Requests\Admin\Review\{ ReviewGetRequest, ReviewPostRequest };

use DB, Exception, Setting;

class ReviewController extends Controller
{
    public function __construct(Request $request) {

        $this->middleware('auth:admin');

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

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

    /**
     * @method reviews_index()
     *
     * @uses to list the reviews
     *
     * @created Karthick
     *
     * @updated  
     *
     * @param
     *
     * @return to reviews index page
     */

    public function reviews_index(Request $request) {

        $base_query = Review::with(['user:id,name', 'product:id,name'])->orderBy('created_at','DESC');

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

                $base_query = $base_query->when($request->filled('status'), function ($query) use ($request) {
                                        $query->where('status', $request->status);
                                    })->where(function($query) use ($request) {
                                        $query->Where('review', "LIKE", "%". $request->search_key . "%");
                                    })->orWhereHas('user', function($query) use($request) {
                                        $query->Where('name', "LIKE", "%". $request->search_key . "%");
                                    })->orWhereHas('product', function($query) use($request) {
                                        $query->Where('name', "LIKE", "%". $request->search_key . "%");
                                    });
            }

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

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

        $reviews = $base_query->paginate($this->take);
        
        return view('admin.reviews.index')
                    ->with('page', 'reviews')
                    ->with('sub_page', 'reviews-view')
                    ->with(compact(['reviews']));
    }

    /**
     * @method reviews_edit()
     *
     * @uses to edit review details based on the review_id
     *
     * @created Karthick
     *
     * @updated
     *
     * @param object $request - review_id
     *
     * @return to edit review page
     *
     */
    public function reviews_edit(ReviewGetRequest $request) {

        try {

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

            $users = User::orderBy('name')->get(['id', 'name']);

            $products = Product::orderBy('name')->get(['id', 'name']);

            return view('admin.reviews.edit')
                    ->with('page' , 'reviews')
                    ->with('sub_page','reviews-edit')
                    ->with(compact(['review', 'users', 'products']));

        } catch(Exception $e) {

            return redirect()->route('admin.products.index')->with('flash_error', $e->getMessage());
        }

    }

    /**
     * @method reviews_save()
     *
     * @uses to save the review details of existing object based on review_id
     *
     * @created Karthick
     *
     * @updated
     *
     * @param object $request - review_id
     *
     * @return view review page
     *
     */
    public function reviews_save(ReviewPostRequest $request) {

        try {

            DB::begintransaction();

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

            if($review) {

                if($request->has('review_files')) {

                    $is_default_file = ReviewFile::where(['review_id' => $review->id, 'is_default' => YES])->exists();

                    foreach($request->review_files as $key => $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(['review_id' => $review->id, 'file' => $file_url, 'file_type' => $file_type]);

                        if(!$is_default_file && $key == 0) {

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

                            $review->update(['file' => $file_url]);
                        }
                    }
                }

                DB::commit();

                return redirect(route('admin.reviews.view', ['review_id' => $review->id ]))->with('flash_success', tr('review_updated_success'));

            }

            throw new Exception(tr('review_save_failed'));

        } catch(Exception $e){

            DB::rollback();

            return back()->withInput()->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method reviews_view()
     *
     * @uses to view the review details based on review_id
     *
     * @created Karthick 
     *
     * @updated 
     *
     * @param object $request - review_id
     * 
     * @return View page
     *
     */
    public function reviews_view(ReviewGetRequest $request) {
       
        try {
      
            $review = Review::find($request->review_id);  

            $review_files = ReviewFile::where(['review_id' => $review->id])->get(['id', 'file']);

            return view('admin.reviews.view')
                        ->with('page', 'reviews')
                        ->with('sub_page', 'reviews-view')
                        ->with(compact(['review','review_files']));
            
        } catch (Exception $e) {

            return redirect()->route('admin.reviews.index')->with('flash_error', $e->getMessage());
        }
    
    }


    /**
     * @method reviews_status
     *
     * @uses to change review status as DECLINED/APPROVED based on review_id
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param object $request - review_id
     * 
     * @return response success/failure message
     *
     **/
    public function reviews_status(ReviewGetRequest $request) {

        try {

            DB::beginTransaction();

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

            $result = $review->update(['status' => $review->status ? DECLINED : APPROVED]);

            if($result) {

                DB::commit();

                $message = $review->status ? tr('review_approved_success') : tr('review_declined_success');

                return back()->with('flash_success', $message);
            }
            
            throw new Exception(tr('review_status_change_failed'));

        } catch(Exception $e) {

            DB::rollback();

            return redirect()->route('admin.reviews.index')->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method reviews_delete()
     *
     * @uses to delete the review details based on review_id
     *
     * @created Karthick 
     *
     * @updated  
     *
     * @param object $request - review_id
     * 
     * @return response of success/failure details with view page
     *
     */
    public function reviews_delete(ReviewGetRequest $request) {

        try {

            DB::begintransaction();

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

            if($review->delete()) {

                DB::commit();

                return redirect()->route('admin.reviews.index')->with('flash_success', tr('review_deleted_success'));   

            } 
            
            throw new Exception(tr('review_delete_failed'));
            
        } catch(Exception $e){

            DB::rollback();

            return back()->with('flash_error', $e->getMessage());

        }       
         
    }

    /**
     * @method review_file_delete()
     *
     * @uses to delete the a review file based on review_file_id
     *
     * @created Karthick
     *
     * @updated
     *
     * @param object $request - review_file_id
     *
     * @return response of success/failure details with view page
     *
     */
    public function review_file_delete(Request $request) {

        try {

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

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

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

            $review_files_count = ReviewFile::where(['review_id' => $review_file->review_id])->count();

            if($review_files_count == 1) {

                throw new Exception(tr('file_delete_error_only_one_file_exists'));
            }

            $result = false;

            DB::begintransaction();

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

                $new_default_file = ReviewFile::firstWhere(['review_id' => $review_file->review_id, 'is_default' => NO]);

                if(!$new_default_file) {

                    throw new Exception(tr('file_delete_error_only_one_file_exists'));
                }

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

            }

            if($review_file->delete()) {

                DB::commit();

                return back()->with('flash_success', tr('file_deleted_success'));

            }

            throw new Exception(tr('file_delete_failed'));

        } catch(Exception $e){

            DB::rollback();

            return back()->with('flash_error', $e->getMessage());

        }
    }
}
Back to Directory File Manager