Edit File: ReviewController.php
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Http\Requests\Api\Review\ReportRequest; use App\Http\Requests\Api\Review\ReviewStoreRequest; use App\Http\Requests\Api\Review\ReviewUserRequest; use App\Http\Requests\Api\Review\ReviewOrderRequest; use App\Http\Resources\ReviewsResource; use App\Jobs\NewReviewNotify; use App\Models\Order; use App\Models\Review; use App\Models\ReviewReport; use App\Models\Store; use App\Models\User; use App\Models\Product; use App\Traits\ApiTrait; use Illuminate\Http\Request; class ReviewController extends Controller { use ApiTrait; public function reviewUser(ReviewUserRequest $request) { $user = auth('api')->user(); $order = Order::where('id', $request['order_id'])->where('user_id', $user->id)->orwhere('id', $request['order_id'])->where('delegate_id', $user->id)->first(); if (!$order) { $msg = trans('order.not_available'); return $this->failMsg($msg); } // delete old review at the same order Review::where(['seconduser_id' => $request['seconduser_id'], 'order_id' => $order->id, 'user_id' => $user->id])->delete(); // find seconduser $seconduser = User::where('id', '!=', $user->id)->where('id', $request['seconduser_id'])->first(); if (!$seconduser) { $msg = trans('user.not_available'); return $this->failMsg($msg); } // insert review Review::create($request->validated() + ['user_id' => $user->id]); // update second user rating $seconduser->num_rating = $seconduser->reviews()->count(); $seconduser->rate = $seconduser->rating(); $seconduser->update(); // notify dispatch(new NewReviewNotify($seconduser)); //succeeded $msg = trans('review.successfully_sent'); return $this->successMsg($msg); } public function reviewStore(ReviewStoreRequest $request) { $user = auth('api')->user(); $order = Order::where('id', $request['order_id'])->where('user_id', $user->id)->first(); if (!$order) { $msg = trans('order.not_available'); return $this->failMsg($msg); } // delete old review at the same order Review::where(['store_id' => $request['store_id'], 'order_id' => $order->id, 'user_id' => $user->id])->delete(); // find user $store = Store::find($request['store_id']); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } // insert review Review::create($request->validated() + ['user_id' => $user->id]); // update second user rating $store->num_rating = $store->reviews()->count(); $store->rate = $store->rating(); $store->update(); // notify dispatch(new NewReviewNotify($store->user)); //order finally succeeded $msg = trans('review.successfully_sent'); return $this->successMsg($msg); } public function reviewOrder(ReviewOrderRequest $request) { $user = auth('api')->user(); $order = Order::where('id', $request['order_id'])->where('user_id', $user->id)->first(); if (!$order) { $msg = trans('order.not_available'); return $this->failMsg($msg); } // delete old review at the same order Review::where(['store_id' => $request['store_id'], 'order_id' => $order->id, 'user_id' => $user->id])->delete(); // find user $store = Store::find($request['store_id']); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } // find seconduser $seconduser = User::where('id','!=',$user->id)->where('id',$request['seconduser_id'])->first(); if(!$seconduser){ $msg = trans('user.not_available'); return $this->failMsg($msg); } // insert review Review::create( [ 'user_id' => $user->id, 'store_id' => $store->id, 'comment' => $request->store_comment, 'rate' => $request->store_rate, 'order_id' => $order->id, ]); // update second user rating $store->num_rating = $store->reviews()->count(); $store->rate = $store->rating(); $store->update(); // notify dispatch(new NewReviewNotify($store->user)); // insert review Review::create([ 'user_id' => $user->id, 'seconduser_id' => $seconduser->id, 'comment' => $request->seconduser_comment, 'rate' => $request->seconduser_rate, 'order_id' => $order->id, ]); // update second user rating $seconduser->num_rating = $seconduser->reviews()->count(); $seconduser->rate = $seconduser->rating(); $seconduser->update(); dispatch(new NewReviewNotify($seconduser)); if ($request['products']) { foreach (json_decode($request['products']) as $product_) { $product = Product::find($product_->id); if(! $product) { continue; } // insert review Review::create([ 'user_id' => $user->id, 'product_id' => $product->id, 'comment' => $product_->comment ?? '', 'rate' => $product_->rate ?? '', 'order_id' => $order->id, ]); // update second user rating $product->num_rating = $product->reviews()->count(); $product->rate = $product->rating(); $product->update(); } } //order finally succeeded $msg = trans('review.successfully_sent'); return $this->successMsg($msg); } public function storeReviews(Request $request) { $store = Store::find($request['store_id']); if (!$store) { $msg = trans('stores.not_available'); return $this->failMsg($msg); } $reviews = $store->reviews()->orderBy('created_at', 'desc')->get(); $data['rate_avg'] = $store->rate; $data['reviews'] = ReviewsResource::collection($reviews); return $this->dataReturn($data); } public function userReviews(Request $request) { $delegate = auth('api')->user(); $reviews = $delegate->reviews()->orderBy('created_at', 'desc')->get(); $data['rate'] = $delegate->rate ?? '0.0'; $data['num_rating'] = (string)$delegate->num_rating ?? '0'; $data['reviews'] = ReviewsResource::collection($reviews); return $this->dataReturn($data); } public function store_reviews(Request $request) { $user = auth('api')->user(); $store = $user->store; $reviews = $store->reviews()->orderBy('created_at', 'desc')->get(); $data['rate'] = $store->rate ?? '0.0'; $data['num_rating'] = (string) $store->num_rating ?? '0'; $data['reviews'] = ReviewsResource::collection($reviews); return $this->dataReturn($data); } public function reportReview(ReportRequest $request) { $user = auth('api')->user(); $review = $user->myReviews()->where('id', $request['review_id'])->first(); if (!$review) { $msg = trans('review.not_available'); return $this->failMsg($msg); } // insert report ReviewReport::create($request->validated() + ['user_id' => $user->id, 'review_id' => $review]); //succeeded $msg = trans('review.successfully_reported'); return $this->successMsg($msg); } }
Back to File Manager