%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/forge/api-takeaseat.eco-n-tech.co.uk/app/Http/Controllers/Account/
Upload File :
Create Path :
Current File : //home/forge/api-takeaseat.eco-n-tech.co.uk/app/Http/Controllers/Account/AvailabilityController.php

<?php

namespace App\Http\Controllers\Account;

use Carbon\Carbon;
use App\Models\Session;
use App\Models\Availability;
use Illuminate\Http\Request;
use App\Http\Requests\StoreAvailability;
use App\Repositories\AvailabilityRepository;
use App\Http\Resources\Account\AvailabilityResource;
use App\Http\Resources\SessionResource;
use App\Http\Resources\Account\UserAddressResource;
use App\Http\Controllers\Controller;

class AvailabilityController extends Controller
{
    /**
     * Get the therapists availability in the specific calendar format
     * 
     * @param Request $request
     * @return \Illuminate\Http\Response $availability
     */
    public function index(Request $request)
    {
        $user = auth()->user();
        $therapist = $user->therapist;
        $availability = $therapist->availability;
        $slot_increments = Availability::INCREMENTS;

        return response()->json([
            'availability' => AvailabilityResource::collection($availability),
            'slot_increments' => $slot_increments,
            'session_types' => SessionResource::collection($therapist->sessions),
            'addresses' => UserAddressResource::collection($user->addresses)
        ]);
    }

    /**
     * Create availability for the therapist
     * 
     * @param StoreAvailability $request
     * @return AvailabilityResource $availability
     */
    public function create(StoreAvailability $request)
    {
        $therapist = auth()->user()->therapist;

        $availableFrom = $request->get('date') .' '. $request->get('available_from');
        $availableTo = $request->get('date') .' '. $request->get('available_to');

        $existingAvailability = Availability::where(function($query) use($availableFrom, $therapist) {
                $query->where('available_from', '<=', $availableFrom)
                    ->where('available_to', '>=', $availableFrom)
                    ->where('therapist_id', $therapist->id);
            })->where(function($query) use($availableTo, $therapist) {
                $query->where('available_from', '<=', $availableTo)
                    ->where('available_to', '>=', $availableTo)
                    ->where('therapist_id', $therapist->id);
            })->orWhere(function($query) use($availableFrom, $availableTo, $therapist) {
                $query->where('available_from', '>=', $availableFrom)
                    ->where('available_to', '<=', $availableTo)
                    ->where('therapist_id', $therapist->id);
            })->first();

        if($existingAvailability !== null) {
            return response()->json(__('This availability already exists.'), 422);
        }

        $availability = Availability::create([
            'therapist_id' => $therapist->id,
            'available_from' => Carbon::parse($availableFrom),
            'available_to' => Carbon::parse($availableTo),
            'increment_id' => 1,
            'address_id' => $request->get('address_id')
        ]);

        $availability->sessions()->sync($request->get('session_types'));

        return new AvailabilityResource($availability);
    }

    /**
     * Create availability for the therapist
     * 
     * @param Request $request
     * @return AvailabilityResource $availability
     */
    public function delete($id, Request $request)
    {
        $therapist = auth()->user()->therapist;
        $availability = Availability::findOrFail($id);
        $availability->sessions()->detach();
        $availability->delete();

        return AvailabilityResource::collection($therapist->availability);
    }
}

Zerion Mini Shell 1.0