dummybot/app/Http/Controllers/TaskController.php

97 lines
3.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Task;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class TaskController extends Controller
{
/** UI web (lista + formulario). */
public function index(): View
{
$tasks = Task::orderBy('done')
->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');
}
}