Files

106 lines
3.1 KiB
PHP
Raw Permalink Normal View History

2026-08-10 19:18:25 +03:00
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\WorkoutSessionResource;
use App\Models\Workout;
use App\Models\WorkoutExercise;
use App\Models\WorkoutSession;
use App\Models\WorkoutSessionItem;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class WorkoutSessionController extends Controller
{
public function store(Request $request, Workout $workout): JsonResponse
{
$this->authorizeWorkout($workout);
$session = WorkoutSession::create([
'user_id' => Auth::id(),
'workout_id' => $workout->id,
'started_at' => now(),
]);
$workout->loadMissing('items');
foreach ($workout->items as $item) {
WorkoutSessionItem::create([
'session_id' => $session->id,
'workout_exercise_id' => $item->id,
'done' => false,
]);
}
$session->load(['workout.items.exercise', 'items']);
return response()->json(['session' => new WorkoutSessionResource($session)], 201);
}
public function show(WorkoutSession $session): JsonResponse
{
$this->authorizeSession($session);
$session->load(['workout.items.exercise', 'items']);
return response()->json(['session' => new WorkoutSessionResource($session)]);
}
public function toggleItem(Request $request, WorkoutSession $session, WorkoutExercise $item): JsonResponse
{
$this->authorizeSession($session);
if ($item->workout_id !== $session->workout_id) {
abort(404);
}
$data = $request->validate([
'actual_weight' => ['nullable', 'numeric', 'min:0', 'max:9999.99'],
'actual_reps' => ['nullable', 'integer', 'min:0', 'max:1000'],
]);
$si = WorkoutSessionItem::firstOrCreate([
'session_id' => $session->id,
'workout_exercise_id' => $item->id,
], [
'done' => false,
]);
$si->done = !$si->done;
if ($si->done) {
if (array_key_exists('actual_weight', $data) && $data['actual_weight'] !== null) {
$si->actual_weight = $data['actual_weight'];
}
if (array_key_exists('actual_reps', $data) && $data['actual_reps'] !== null) {
$si->actual_reps = $data['actual_reps'];
}
}
$si->save();
return response()->json(['item' => $si]);
}
public function complete(WorkoutSession $session): JsonResponse
{
$this->authorizeSession($session);
$session->completed_at = now();
$session->save();
$session->load(['workout.items.exercise', 'items']);
return response()->json(['session' => new WorkoutSessionResource($session)]);
}
protected function authorizeWorkout(Workout $workout): void
{
if ($workout->user_id !== Auth::id()) {
abort(403);
}
}
protected function authorizeSession(WorkoutSession $session): void
{
if ($session->user_id !== Auth::id()) {
abort(403);
}
}
}