feat: add scrape import functionality with status messages and logs
All checks were successful
Build Docker Image / build (push) Successful in 1m22s

This commit is contained in:
2026-03-03 23:44:03 +01:00
parent de2c8cdc77
commit 7c9aef1aee
2 changed files with 71 additions and 1 deletions

View File

@@ -1,6 +1,15 @@
import { db } from '$lib/server/db';
import { character, characterScrapeValidation } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
import { exec } from 'node:child_process';
import { promisify } from 'node:util';
const execAsync = promisify(exec);
let isScrapeImportRunning = false;
const EXEC_OPTIONS = {
cwd: process.cwd(),
maxBuffer: 50 * 1024 * 1024
};
async function upsertCharacterFromScrapeValidation(characterId: string): Promise<boolean> {
const [scraped] = await db
@@ -147,6 +156,51 @@ export async function load() {
}
export const actions = {
runScrapeImport: async () => {
if (isScrapeImportRunning) {
return {
success: false,
message: 'A scrape is already running. Please wait for it to finish.',
logs: ''
};
}
isScrapeImportRunning = true;
try {
const scrapeResult = await execAsync('npm run scrape', EXEC_OPTIONS);
const importResult = await execAsync('npm run db:import', EXEC_OPTIONS);
const logs = [
'=== npm run scrape ===',
scrapeResult.stdout || '',
scrapeResult.stderr ? `\n[stderr]\n${scrapeResult.stderr}` : '',
'\n=== npm run db:import ===',
importResult.stdout || '',
importResult.stderr ? `\n[stderr]\n${importResult.stderr}` : ''
]
.filter(Boolean)
.join('\n');
return {
success: true,
message: 'Scrape and import completed successfully',
logs
};
} catch (error) {
const message = error instanceof Error ? error.message : 'Failed to run scripts';
const stdout = typeof error === 'object' && error && 'stdout' in error ? String((error as any).stdout || '') : '';
const stderr = typeof error === 'object' && error && 'stderr' in error ? String((error as any).stderr || '') : '';
const logs = [stdout, stderr ? `\n[stderr]\n${stderr}` : ''].filter(Boolean).join('\n');
return {
success: false,
message,
logs
};
} finally {
isScrapeImportRunning = false;
}
},
acceptOne: async ({ request }) => {
const formData = await request.formData();
const characterId = formData.get('characterId');