97 lines
3.0 KiB
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');
|
|
}
|
|
}
|