%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/CommunicationsController.php

<?php

namespace App\Http\Controllers\Api\v1;

use App\Enums\UsertypeEnum;
use App\Http\Controllers\Controller;
use App\Http\Requests\CommunicationRequest;
use App\Http\Resources\CommunicationResource;
use App\Http\Resources\CommunicationSentResource;
use App\Http\Resources\MinorCollectionResource;
use App\Http\Resources\MinorResource;
use App\Models\Classroom;
use App\Models\Communication;
use App\Models\Minor;
use App\Services\SmsService;
use App\Traits\ApiUser;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Symfony\Component\HttpKernel\Exception\HttpException;

class CommunicationsController extends Controller
{
    use ApiUser;

    public function index(Request $request) {
        /** @var User $user */
        $user = $this->getLoggedUser();
        $communications = $user->communicationsReceived()->where('classroom_id', $request->classroom_id)->get();
        return response()->json(CommunicationResource::collection($communications), Response::HTTP_OK);
    }

    public function count(Request $request) {
        /** @var User $user */
        $user = $this->getLoggedUser();
        $communications = $user->communicationsReceived()->where('is_read', false)->where('classroom_id', $request->classroom_id)->get();
        return response($communications->count(), Response::HTTP_OK);
    }

    public function messagesSent(Request $request) {
        /** @var User $user */
        $user = $this->getLoggedUser();
        $communications = $user->communicationsSent()->where('classroom_id', $request->classroom_id)->with('sender.individual', 'classroom.institute', 'minor', 'receiver.individual')->get()->groupBy(['uuid']);
        return response()->json(CommunicationSentResource::collection($communications->values()), Response::HTTP_OK);
    }

    public function store(CommunicationRequest $request) {
        $sender = $this->getLoggedUser();
        /** @var \App\Models\Classroom $classroom */
        $classroom = Classroom::findOrFail($request->classroom_id);
        $schoolyear = $classroom->schoolyear;
        $minors = $request->receivers;
        if (count($minors) === 0) {
            $minors = $classroom->minors()->wherePivot('active', true)->whereHas('individuals', function($i){
                $i->where('is_admin', true);
            })->get();
        }
        else {
            $minors = $classroom->minors()->whereIn('minor_id', $minors)->get();
        }
        $communicationData = [
            'subject' => $request->subject,
            'content' => $request->message,
            'notify' => $request->notify,
            'uuid' => (string) Str::orderedUuid()
        ];
        foreach ($minors as $minor) {
            $individuals = $minor->individuals()->where('is_admin', true)->get();
            foreach ($individuals as $individual) {
                $receivers = $individual->user()->whereHas('usertype', function ($u) {
                    $u->where('role', UsertypeEnum::TUTOR);
                })->get();
                foreach ($receivers as $receiver) {
                    $communication = new Communication($communicationData);
                    $communication->sender()->associate($sender);
                    $communication->receiver()->associate($receiver);
                    $communication->minor()->associate($minor);
                    $communication->classroom()->associate($classroom);
                    $communication->schoolyear()->associate($schoolyear);
                    $communication->save();
                    if ($communication->notify) {
                        $type = "communication_sent";
                        $url = env("WEBAPP_BASE_URL","https://app-staging.camillo.online"). "/minors/$minor->id/communications";
                        $sms = new SmsService($receiver->individual, $type, $url, $communication);
                        $sms->send_invitation();
                    }
                }
            }
        }
        return response([], Response::HTTP_NO_CONTENT);
    }
    /**
     * @param Request $request
     * @param Minor $minor
     * @return \Illuminate\Http\JsonResponse
     */
    public function show(Request $request, $id)
    {
        $user = $this->getLoggedUser();
        $communication = Communication::findOrFail($id);
        if ($user->id !== $communication->receiver->id) {
            throw new HttpException(Response::HTTP_UNAUTHORIZED, __('user_not_allowed'));
        }
        return response()->json(new CommunicationResource($communication), Response::HTTP_OK);
    }

    /**
     * @param Request $request
     * @param Minor $minor
     * @return \Illuminate\Http\JsonResponse
     */
    public function showSent(Request $request, $uuid)
    {
        $user = $this->getLoggedUser();
        $communications = Communication::where('uuid', $uuid)->with('sender.individual', 'classroom.institute', 'minor', 'receiver.individual')->get();
        if ($communications->count() > 0 && $user->id !== $communications->first()->sender_id) {
            throw new HttpException(Response::HTTP_UNAUTHORIZED, __('user_not_allowed'));
        }
        return response()->json(new CommunicationSentResource($communications->groupBy(['uuid'])->first()->values()), Response::HTTP_OK);
    }

    /**
     * @param Request $request
     * @param Minor $minor
     * @return \Illuminate\Http\JsonResponse
     */
    public function update(Request $request, $id)
    {
        $user = $this->getLoggedUser();

        $communication = Communication::findOrFail($id);
        if ($user->id !== $communication->receiver->id) {
            throw new HttpException(Response::HTTP_UNAUTHORIZED, __('user_not_allowed'));
        }

        $communication->update(['is_read' => true]);

        return response()->json(new CommunicationResource($communication->fresh()), Response::HTTP_OK);
    }

    public function receivers(Request $request, $classroomId)
    {
        $user = $this->getLoggedUser();

        $classroom = Classroom::findOrFail($classroomId);
        $minors = $classroom->minors()->wherePivot('active', true)->whereHas('individuals', function($i){
            $i->where('is_admin', true);
            $i->whereHas('user', function ($u) {
                $u->whereHas('usertype', function ($ut) {
                    $ut->where('role', UsertypeEnum::TUTOR);
                });
            });
        })->get();
        return response()->json((new MinorCollectionResource($minors, MinorResource::class))->setClassroom($classroom), Response::HTTP_OK);
    }

    public function destroy(Request $request, $id)
    {
        $user = $this->getLoggedUser();

        $communication = Communication::findOrFail($id);
        if ($user->id !== $communication->receiver->id) {
            throw new HttpException(Response::HTTP_UNAUTHORIZED, __('user_not_allowed'));
        }

        $communication->delete();

        return response([], 204);
    }

}

Zerion Mini Shell 1.0