db()->table('batch_jobs') ->orderByDesc('created_at') ->limit(20) ->get() ->map(fn($j) => [ 'id' => $j->id, 'dir_name' => $j->dir_name, 'dir_path' => $j->dir_path, 'output_base' => $j->output_base, 'total' => $j->total, 'done_count' => $j->done_count, 'finished' => (bool)$j->finished, 'settings' => json_decode($j->settings, true), 'created_at' => $j->created_at, ]); return response()->json($jobs); } #[Post('/batch-jobs')] public function store(Request $request) { $data = $request->validate([ 'dir_path' => 'required|string', 'dir_name' => 'required|string', 'output_base' => 'nullable|string', 'settings' => 'nullable|array', 'files' => 'required|array', ]); $id = $this->db()->table('batch_jobs')->insertGetId([ 'dir_path' => $data['dir_path'], 'dir_name' => $data['dir_name'], 'output_base' => $data['output_base'] ?? null, 'settings' => json_encode($data['settings'] ?? []), 'files' => json_encode($data['files']), 'results' => json_encode((object)[]), 'total' => \count($data['files']), 'done_count' => 0, 'finished' => false, 'created_at' => now(), 'updated_at' => now(), ]); return response()->json(['id' => $id]); } #[Get('/batch-jobs/{id}')] public function show(int $id) { $job = $this->db()->table('batch_jobs')->where('id', $id)->first(); if (!$job) return response()->json(['error' => 'Not found'], 404); return response()->json([ 'id' => $job->id, 'dir_path' => $job->dir_path, 'dir_name' => $job->dir_name, 'output_base' => $job->output_base, 'settings' => json_decode($job->settings, true), 'files' => json_decode($job->files, true), 'results' => json_decode($job->results, true), 'total' => $job->total, 'done_count' => $job->done_count, 'finished' => (bool)$job->finished, 'created_at' => $job->created_at, ]); } #[Patch('/batch-jobs/{id}')] public function update(Request $request, int $id) { $job = $this->db()->table('batch_jobs')->where('id', $id)->first(); if (!$job) return response()->json(['error' => 'Not found'], 404); $results = json_decode($job->results, true) ?? []; $path = $request->input('path'); $entry = $request->input('entry', []); $done = $request->boolean('finished', false); if ($path && $entry) { $results[$path] = $entry; } $doneCount = \count(array_filter($results, fn($r) => isset($r['md']) || isset($r['dl']))); $this->db()->table('batch_jobs')->where('id', $id)->update([ 'results' => json_encode($results), 'done_count' => $doneCount, 'finished' => $done, 'updated_at' => now(), ]); return response()->json(['ok' => true, 'done_count' => $doneCount]); } #[Delete('/batch-jobs/{id}')] public function destroy(int $id) { $this->db()->table('batch_jobs')->where('id', $id)->delete(); return response()->json(['ok' => true]); } }