AI-markdown/laravel-app/app/Http/Controllers/BatchJobController.php

126 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Spatie\RouteAttributes\Attributes\Delete;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Patch;
use Spatie\RouteAttributes\Attributes\Post;
#[Middleware('web')]
class BatchJobController extends Controller
{
private function db()
{
return DB::connection('db_markitdown');
}
#[Get('/batch-jobs')]
public function index()
{
$jobs = $this->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]);
}
}