dishplanner/src/DishPlanner/ScheduledUserDish/Controllers/ScheduledUserDishController.php

86 lines
2.9 KiB
PHP
Raw Normal View History

2025-10-13 14:57:11 +02:00
<?php
namespace DishPlanner\ScheduledUserDish\Controllers;
use App\Http\Controllers\Api\ApiController;
use App\Http\Resources\ScheduledUserDishResource;
use App\Models\Planner;
use App\Models\ScheduledUserDish;
use App\Models\UserDish;
use Carbon\Carbon;
use DishPlanner\Auth\Exceptions\InvalidPlannerException;
use DishPlanner\Schedule\Repositories\ScheduleRepository;
use DishPlanner\Schedule\Requests\CreateScheduleRequest;
use DishPlanner\ScheduledUserDish\Actions\CreateScheduledUserDishAction;
use DishPlanner\ScheduledUserDish\Actions\DeleteScheduledUserDishAction;
use DishPlanner\ScheduledUserDish\Actions\UpdateScheduledUserDishAction;
use DishPlanner\ScheduledUserDish\Requests\UpdateScheduledUserDishRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Gate;
class ScheduledUserDishController extends ApiController
{
public function create(CreateScheduleRequest $request): JsonResponse
{
Gate::authorize('create', ScheduledUserDish::class);
$userDish = UserDish::findOrFail($request->user_dish_id);
Gate::authorize('assign', $userDish);
$date = Carbon::createFromFormat('Y-m-d', $request->date);
/** @var Planner $planner */
$planner = auth()->user();
$schedule = resolve(ScheduleRepository::class)->findOrCreate($planner, $date);
try {
$scheduledUserDish = (new CreateScheduledUserDishAction())->execute(
planner: $planner,
schedule: $schedule,
userDish: $userDish,
);
} catch (InvalidPlannerException $e) {
return $this->error($e->getMessage(), 404);
}
return $this->success([
'scheduled_user_dish' => new ScheduledUserDishResource($scheduledUserDish)
]);
}
public function read(ScheduledUserDish $scheduledUserDish): JsonResponse
{
Gate::authorize('view', $scheduledUserDish);
return $this->success([
'scheduled_user_dish' => new ScheduledUserDishResource($scheduledUserDish->refresh()),
]);
}
public function update(UpdateScheduledUserDishRequest $request, ScheduledUserDish $scheduledUserDish): JsonResponse
{
Gate::authorize('update', $scheduledUserDish);
(new UpdateScheduledUserDishAction())->execute(
scheduledUserDish: $scheduledUserDish,
userDish: UserDish::find($request->user_dish_id),
isSkipped: $request->is_skipped ?? null,
);
return $this->success([
'scheduled_user_dish' => new ScheduledUserDishResource($scheduledUserDish->refresh()),
]);
}
public function delete(ScheduledUserDish $scheduledUserDish): JsonResponse
{
Gate::authorize('delete', $scheduledUserDish);
(new DeleteScheduledUserDishAction())->execute($scheduledUserDish);
return $this->success(null);
}
}