user() ->timeTrackers() ->with('toDo') ->orderBy('start_at', 'desc') ->paginate(); return response()->json(TimeTrackerResource::collection($timeTrackers)); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $data = $request->validate([ 'todo_id' => 'exists:to_dos,id', ]); $user = $request->user(); TimeTracker::whereHas('toDo', fn ($q) => $q->where('user_id', $request->user()->id)) ->whereNull('end_at') ->update(['end_at' => now()]); $toDo = $user ->toDos() ->where('id', $data['todo_id']) ->first(); $timeTracker = $toDo->timeTrackers() ->create(['start_at' => now()]); $user->time_tracker_id = $timeTracker->id; $user->save(); return response()->json(new TimeTrackerResource($timeTracker->load('toDo')), 201); } /** * Display the specified resource. */ public function show(TimeTracker $timeTracker) { return response()->json(new TimeTrackerResource($timeTracker->load('toDo'))); } /** * Update the specified resource in storage. */ public function update(Request $request, TimeTracker $timeTracker) { abort_if($timeTracker->toDo->user_id !== $request->user()->id, 401, __('auth.unauthorized')); $beforeDelay = $timeTracker->end_at->diffInSeconds($timeTracker->start_at); $data = $request->validate([ 'start_at' => ['required', 'date'], 'end_at' => ['nullable', 'date', 'after_or_equal:start_at'], ]); $timeTracker->update($data); $timeTracker->fresh(); $afterDelay = $timeTracker->end_at->diffInSeconds($timeTracker->start_at); $timeTracker->toDo->increment('duration', $afterDelay - $beforeDelay); return response()->json(new TimeTrackerResource($timeTracker)); } /** * Remove the specified resource from storage. */ public function destroy(Request $request, TimeTracker $timeTracker) { abort_if($timeTracker->toDo->user_id !== $request->user()->id, 401, __('auth.unauthorized')); $delay = $timeTracker->end_at->diffInSeconds($timeTracker->start_at); $timeTracker->toDo->decrement('duration', $delay); $timeTracker->delete(); return response()->noContent(); } public function userTimeTracker(Request $request) { if (! $request->user()->currentTimeTracker) { return response()->noContent(); } return response()->json(new TimeTrackerResource($request->user()->currentTimeTracker?->load('toDo'))); } public function stopUserTimeTracker(Request $request) { $request->user()->stopCurrentTimeTracker(); return response()->json([], 204); } public function toDoTimeTrackers(Request $request, ToDo $toDo) { abort_if($toDo->user_id !== $request->user()->id, 401, __('auth.unauthorized')); return response()->json(TimeTrackerResource::collection($toDo->timeTrackers->sortByDesc('start_at'))); } }