/
home
/
obinna
/
html
/
cravings
/
app
/
Http
/
Controllers
/
API
/
Upload File
HOME
<?php namespace App\Http\Controllers\API; use App\Food; use App\Jobs\ProcessReviewImage; use App\Place; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; use App\Mail\NewReview; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Validator; class ReviewsController extends Controller { public function review($slug) { $place = Place::where('slug', $slug)->first(); if($place){ $food = Food::where('place_slug', $place->slug)->get()->toArray(); return response()->json(['place' => $place->toArray(), 'food' => $food]); } } /** * Get a validator for a review request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function reviewValidator(array $data) { return Validator::make($data, [ 'rate' => 'required|integer|max:5|min:1', 'placename' => 'required|string' ]); } private function getImageUrl($data) { $images = array(); if(isset($data['image']) && $data['image']) { foreach ($data['image'] as $key => $image) { $imagePath = "/reviews/images/" . uniqid('review_') . ".jpg"; $images[] = env('S3_BASE_URL') . $imagePath; ProcessReviewImage::dispatchNow($image, $imagePath); } } return $images; } private function prepareReviewData($data, $user) { $now = new \DateTime(); return array( "rate" => intval($data['rate']), 'comment' => $data['comment'] ?? "", 'image' => $this->getImageUrl($data), 'place_slug' => $data['place'] ?? "", 'place_name' => $data['placename'], 'food_name' => $data['foodname'] ?? "", 'food_id' => $data['id'] ?? "", 'user_id' => (string) $user->id, 'avatar' => $user->avatar, 'nickname' => $user->username ?: $user->name, 'created' => $now->format('Y-m-d H:i:s') ); } public function transformReviewImage() { $db = DB::getMongoDB(); $reviews = $db->reviews->find(['image' => ['$exists' => true]])->toArray(); foreach ($reviews as $review) { $db->reviews->updateOne(['_id' => $review['_id']], ['$set' => ['image' => [$review['image']]]]); } return response()->json(['success' => true]); } public function postReview(Request $request) { $data = $request->ajax() ? json_decode($request->getContent(), true) : $_POST; // var_dump($data);die; $db = DB::getMongoDB(); $user = $request->user(); $id = $data['id'] ?? ""; $place_slug = $data['place'] ?? ""; $foodname = $data['foodname'] ?? ""; // validate review data $validator = $this->reviewValidator($data); if ($validator->fails()) { return response()->json(['status' => 'failed', 'errors' => $validator->errors()]); } if(isset($data['placename']) && $data['placename']){ $review = $this->prepareReviewData($data, $user); // save review $updated = $db->reviews->insertOne($review); $flashMessage = 'Review successful for ' . $data['placename']; // If place/food is not in database if(!$place_slug && $request->ajax()) return response()->json(['status' => 'success', 'message' => $flashMessage]); // if food is not in database if($place_slug && !$id && $foodname) { if ($request->ajax()) { return response()->json(['status' => 'success', 'message' => $flashMessage]); }else { $request->session()->flash('status', $flashMessage); return redirect()->route('places.show', ['place' => $place_slug]); } } $match = $id ? ['$match' => ['place_slug' => $place_slug, 'food_id' => $data['id']]] : ['$match' => ['place_name' => $data['placename']]]; $avgRate = $db->reviews->aggregate([ $match, ['$project' => ['_id' => 0, 'rate' => 1, 'place_name' => 1]], ['$group' => [ '_id' => '$place_name', 'avgRate' => ['$avg' => '$rate'] ]] ])->toArray(); if(count($avgRate)){ $update = ['$set' => ['avg_rate' => $avgRate[0]['avgRate']]]; if($id) $db->fooding->updateOne(['place_slug' => $place_slug, '_id' => new \MongoDB\BSON\ObjectId($data['id'])], $update); else $db->places->updateOne(['name' => $data['placename']], $update); } if($request->ajax()) { return response()->json(['status' => 'success', 'message' => $flashMessage]); } $request->session()->flash('status', $flashMessage); Mail::to(getenv('ADMIN_EMAIL'))->send(new NewReview($review)); return redirect()->route('places.show', ['place' => $place_slug]); }else { return $request->ajax() ? response()->json(['status' => 'error', 'message' => 'Incorrect details']) : redirect()->back()->withErrors(['error' => trans('Incorrect details')]); } } public function fixReviewImages() { $db = DB::getMongoDB(); $reviews = $db->reviews->find(['image' => ['$regex' => "https://cravingsapp"]])->toArray(); foreach ($reviews as $review) { $images = array(); foreach ($review['image'] as $image) { $images[] = str_replace("https://cravingsapp", "https://cravvingsapp", $image); } $db->reviews->updateOne(['_id' => $review['_id']], ['$set' => ['image' => $images]]); } } }