%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
Current File : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/v1/DoctorController.php

<?php

namespace App\Http\Controllers\Api\v1;

use App\Http\Controllers\Api\ApiController;
use App\Http\Requests\Api\v1\Doctor\CreateDoctorRequest;
use App\Http\Requests\Api\v1\Doctor\UpdateDoctorRequest;
use App\Models\Doctor;
use App\Models\ResetPassword;
use App\Models\Role;
use App\Models\User;
use App\Transformers\DoctorTransformer;
use App\Transformers\RoleTransformer;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class DoctorController extends ApiController
{
    /**
     * @param Request $request
     * @return \Spatie\Fractal\Fractal
     */
    public function index(Request $request)
    {
        $result = $this->filterDoctors($request)
                       ->paginate($request->get('perPage'));
        return $this->withPaginated($result, new DoctorTransformer());
    }

    /**
     * @param Request $request
     * @return \Illuminate\Database\Eloquent\Builder
     */
    private function filterDoctors(Request $request)
    {
        $result = Doctor::query()
                        ->whereHas('roles', function ($q) {
                            $q->whereIn('name', [
                                'doctor',
                            ]);
                        });

        if ($name = $request->get('name')) {
            $result = $result->where('name', 'like', "$name%");
        }
        if ($surname = $request->get('surname')) {
            $result = $result->where('surname', 'like', "$surname%");
        }
        if ($email = $request->get('email')) {
            $result = $result->where('email', 'like', "$email%");
        }
        return $result;
    }

    /**
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function show($id)
    {
        $doctor = Doctor::query()
                        ->where('id', '=', $id)
                        ->whereHas('roles', function ($q) {
                            $q->whereIn('name', [
                                Role::DOCTOR,
                            ]);
                        })
                        ->firstOrFail();
        return $this->item($doctor, new DoctorTransformer());
    }

    /**
     * @param CreateDoctorRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(CreateDoctorRequest $request)
    {
        DB::beginTransaction();
        try {
            /** @var User $user */
            $doctor = Doctor::query()
                            ->create([
                                'name'       => $request->get('name'),
                                'surname'    => $request->get('surname'),
                                'email'      => $request->get('email'),
                                'password'   => 'password',
                                'is_enabled' => true,
                            ]);
            $role = Role::findByName(Role::DOCTOR);

            $doctor->roles()
                   ->attach($role);

            $doctor->hospitals()
                   ->sync($request->get('hospitalIds'));

            $doctor->protocols()
                   ->sync($request->get('protocolIds'));

            $token = ResetPassword::generateToken($doctor->email);
            DB::commit();
            $doctor->sendPasswordResetNotificationEmail($token, $request->header('department'));
            return $this->item($doctor, new DoctorTransformer());
        } catch (\Exception $e) {
            DB::rollBack();
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    /**
     * @param UpdateDoctorRequest $request
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function update(UpdateDoctorRequest $request, $id)
    {
        DB::beginTransaction();
        try {
            $doctor = Doctor::query()
                            ->where('id', '=', $id)
                            ->whereHas('roles', function ($q) {
                                $q->whereIn('name', [
                                    Role::DOCTOR,
                                ]);
                            })
                            ->firstOrFail();
            $doctor->update($request->only(['name', 'surname']));

            $doctor->hospitals()
                   ->sync($request->get('hospitalIds'));

            $doctor->protocols()
                   ->sync($request->get('protocolIds'));

            DB::commit();
            return $this->item($doctor, new DoctorTransformer());
        } catch (\Exception $e) {
            DB::rollBack();
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    /**
     * @param $id
     * @return array|\Illuminate\Http\JsonResponse
     */
    public function destroy($id)
    {
        /** @var User $user */
        $user = User::query()
                    ->findOrFail($id);
        try {
            $user->delete();
        } catch (\Exception $e) {
            return $this->wrongArguments([
                'message' => 'Not possible to delete this user for the moment, please contact your system admin!',
            ]);
        }
        return [];
    }

    /**
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function enable($id)
    {
        /** @var User $user */
        $doctor = Doctor::query()
                        ->where('id', '=', $id)
                        ->whereHas('roles', function ($q) {
                            $q->whereIn('name', [
                                Role::DOCTOR,
                            ]);
                        })
                        ->firstOrFail();;
        $doctor->enable();
        return $this->item($doctor, new DoctorTransformer());
    }

    /**
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function disable($id)
    {
        /** @var User $user */
        $doctor = Doctor::query()
                        ->where('id', '=', $id)
                        ->whereHas('roles', function ($q) {
                            $q->whereIn('name', [
                                Role::DOCTOR,
                            ]);
                        })
                        ->firstOrFail();
        $doctor->disable();
        return $this->item($doctor, new DoctorTransformer());
    }

    /**
     * @return \Illuminate\Http\JsonResponse
     */
    public function getRoles()
    {
        return $this->collection(Role::query()
                                     ->whereIn('name', [
                                         'admin',
                                         'doctor',
                                     ])
                                     ->get(), new RoleTransformer());
    }
}

Zerion Mini Shell 1.0