orderByRaw("FIELD(priority,'high','med','low')") ->orderBy('created_at') ->get(); return view('tasks.index', compact('tasks')); } /** GET /api/tasks/pending -> JSON para el ESP32 */ public function pending(): JsonResponse { $tasks = Task::active() ->orderByRaw("FIELD(priority,'high','med','low')") ->orderBy('created_at') ->limit(20) ->get(); return response()->json($tasks->map(fn ($t) => [ 'id' => $t->id, 'title' => $t->title, 'priority' => $t->priority, 'next_due_in' => $t->next_due_in, ])); } /** POST /api/tasks -> crear (tambiƩn desde la web) */ public function store(Request $request): JsonResponse|\Illuminate\Http\RedirectResponse { $data = $request->validate([ 'title' => 'required|string|max:120', 'priority' => 'nullable|in:low,med,high', ]); $task = Task::create([ 'title' => $data['title'], 'priority' => $data['priority'] ?? 'med', ]); if ($request->wantsJson()) { return response()->json($task, 201); } return redirect()->route('tasks.index'); } /** POST /api/tasks/{task}/done -> marcar como hecha */ public function done(Task $task): JsonResponse { $task->update([ 'done' => true, 'done_at' => now(), ]); return response()->json(['ok' => true, 'id' => $task->id]); } /** POST /api/tasks/{task}/snooze -> posponer X minutos */ public function snooze(Request $request, Task $task): JsonResponse { $minutes = (int) $request->input('minutes', 5); $minutes = max(1, min(120, $minutes)); $task->update([ 'snooze_until' => now()->addMinutes($minutes), ]); return response()->json(['ok' => true, 'id' => $task->id, 'minutes' => $minutes]); } /** DELETE /api/tasks/{task} -> borrar */ public function destroy(Task $task): JsonResponse|\Illuminate\Http\RedirectResponse { $task->delete(); if (request()->wantsJson()) { return response()->json(['ok' => true]); } return redirect()->route('tasks.index'); } /** POST /tasks/{task}/restore -> reabrir */ public function restore(Task $task): \Illuminate\Http\RedirectResponse { $task->update(['done' => false, 'done_at' => null, 'snooze_until' => null]); return redirect()->route('tasks.index'); } }