%PDF- %PDF-
Direktori : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/ |
Current File : //var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/ClassroomChatController.php |
<?php /** * Created by PhpStorm. * User: giovannibisconti * Date: 12/12/18 * Time: 11:20 */ namespace App\Http\Controllers\Api\v1; use App\Enums\UsertypeEnum; use App\Http\Controllers\Controller; use App\Http\Resources\MinorRelativeResource; use App\Models\Classroom; use App\Models\Usertype; use App\Traits\ApiUser; use App\User; use Chatkit\Chatkit; use Symfony\Component\HttpKernel\Exception\HttpException; use Illuminate\Http\Request; use Illuminate\Http\Response; class ClassroomChatController extends Controller { use ApiUser; /** * @param \Illuminate\Http\Request $request * @param $classroom * * @return \Illuminate\Http\JsonResponse * @throws \Chatkit\Exceptions\MissingArgumentException * @throws \Chatkit\Exceptions\TypeMismatchException */ public function store(Request $request, $classroom) { /** @var User $user */ $user = $this->getLoggedUser(); /** @var Classroom $classroom */ $classroom = Classroom::findOrFail($classroom); $minor = $classroom->minors()->wherePivot('active', true)->whereHas('individuals', function ($i) use ($user) { $i->where('user_id', $user->id); })->exists(); if (!$user->active) { throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("Utente non attivo")); } if (!$minor && $user->usertype->role !== UsertypeEnum::TEACHER) { throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("classroom not associated with user")); } if (!$user->individual->show_contacts) { throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __("no permission to show user contacts")); } $chatkit = new Chatkit([ 'instance_locator' => env('PUSHER_APP_KEY'), 'key' => env('PUSHER_APP_SECRET'), ]); $chatkitUsers = $chatkit->getUsersByID([ 'user_ids' => [$user->email] ]); if (count($chatkitUsers['body']) === 0) { $chatkitUser = $chatkit->createUser([ 'id' => $user->email, 'name' => $user->individual->name . ' ' . $user->individual->surname ]); $chatkit->assignGlobalRoleToUser([ 'user_id' => $user->email, 'name' => $user->usertype->role === UsertypeEnum::TEACHER ? 'teacher' : 'user' ]); $user->update([ 'pusher_id' => $chatkitUser['body']['id'] ]); } if ($classroom->pusher_id) { $room = $chatkit->getRoom(['id' => $classroom->pusher_id]); } if (!isset($room) || isset($room['body']['deleted_at'])) { $admin = User::whereHas('usertype', function($u) { $u->where('role', 'admin'); })->first(); $room = $chatkit->createRoom([ 'creator_id' => $admin->email, 'name' => $classroom->class_name . '-' . $classroom->schoolyear->description, 'user_ids' => [$user->pusher_id], 'private' => true, 'custom_data' => [ 'start_date' => $classroom->schoolyear->start_date, 'end_date' => $classroom->schoolyear->end_date ], ]); $classroom->update([ 'pusher_id' => $room['body']['id'] ]); } else { if (!in_array($user->email, $room['body']['member_user_ids'])) { $chatkit->addUsersToRoom([ 'user_ids' => [$user->pusher_id], 'room_id' => $classroom->pusher_id ]); } } $room = $chatkit->getRoom(['id' => $classroom->pusher_id]); $data = [ 'pusher_id' => $user->pusher_id, 'room_name' => $classroom->class_name, 'room' => $room['body'], 'participants' => collect() ]; foreach ($room['body']['member_user_ids'] as $memberUserId) { /** @var \App\User $participant */ $participant = User::where('pusher_id', $memberUserId)->first(); if ($participant && $participant->usertype->role !== 'admin') { $data['participants']->push([ 'name' => $participant->individual->name, 'surname' => $participant->individual->surname, 'role' => $participant->usertype->role, 'relatives' => MinorRelativeResource::collection($participant->individual->minors()->whereHas('classrooms', function ($c) use ($classroom) { $c->where('classroom_id', $classroom->id); $c->where('active', true); })->get()) ]); } } return response()->json($data, Response::HTTP_OK); } }