diff --git a/src/routes/(admin)/admin/character-changes/+page.server.ts b/src/routes/(admin)/admin/character-changes/+page.server.ts index f3e246b..edcc089 100644 --- a/src/routes/(admin)/admin/character-changes/+page.server.ts +++ b/src/routes/(admin)/admin/character-changes/+page.server.ts @@ -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 { 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'); diff --git a/src/routes/(admin)/admin/character-changes/+page.svelte b/src/routes/(admin)/admin/character-changes/+page.svelte index e877322..f555b18 100644 --- a/src/routes/(admin)/admin/character-changes/+page.svelte +++ b/src/routes/(admin)/admin/character-changes/+page.svelte @@ -1,7 +1,7 @@