126 lines
4.1 KiB
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]);
|
|
}
|
|
}
|