dishplanner/src/DishPlanner/Schedule/Controllers/ScheduleController.php

91 lines
2.8 KiB
PHP
Raw Normal View History

2025-10-13 14:57:11 +02:00
<?php
namespace DishPlanner\Schedule\Controllers;
use App\Http\Controllers\Api\ApiController;
use App\Models\Planner;
use App\Models\Schedule;
use Carbon\CarbonPeriod;
use DishPlanner\Schedule\Actions\DraftScheduleForPeriodAction;
use DishPlanner\Schedule\Actions\GenerateScheduleForPeriodAction;
use DishPlanner\Schedule\Actions\UpdateScheduleAction;
use DishPlanner\Schedule\Repositories\ScheduleRepository;
use DishPlanner\Schedule\Requests\GenerateScheduleRequest;
use DishPlanner\Schedule\Requests\UpdateScheduleRequest;
use DishPlanner\Schedule\Resources\ScheduleResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Gate;
class ScheduleController extends ApiController
{
public function index(Request $request): JsonResponse
{
Gate::authorize('viewAny', Schedule::class);
/** @var Planner $planner */
$planner = auth()->user();
$startDate = $request->get('start', now()->format('Y-m-d'));
$endDate = $request->get('end', now()->addWeeks(2)->format('Y-m-d'));
$schedule = Schedule::query()
->where('planner_id', $planner->id)
->where('date', '>=', $startDate)
->where('date', '<=', $endDate)
->orderBy('date', 'asc')->get()->values();
return $this->success([
'schedule' => ScheduleResource::collection($schedule),
]);
}
public function show(Carbon $date): JsonResponse
{
/** @var Planner $planner */
$planner = auth()->user();
/** @var ScheduleRepository $scheduleRepository */
$scheduleRepository = resolve(ScheduleRepository::class);
$schedule = $scheduleRepository->findOrCreate($planner, $date);
Gate::authorize('view', $schedule);
return $this->success([
'schedule' => new ScheduleResource($schedule),
]);
}
public function update(UpdateScheduleRequest $request, Carbon $date): JsonResponse
{
/** @var Planner $planner */
$planner = auth()->user();
/** @var ScheduleRepository $scheduleRepository */
$scheduleRepository = resolve(ScheduleRepository::class);
$schedule = $scheduleRepository->findOrCreate($planner, $date);
Gate::authorize('update', $schedule);
resolve(UpdateScheduleAction::class)->execute(
schedule: $schedule,
isSkipped: $request->is_skipped
);
return $this->success([
'schedule' => new ScheduleResource($schedule->refresh()),
]);
}
public function generate(GenerateScheduleRequest $request): JsonResponse
{
/** @var Planner $planner */
$planner = auth()->user();
(new GenerateScheduleForPeriodAction())->execute($planner, $request->get('overwrite', false));
return $this->success(null);
}
}