feat: add scrape import functionality with status messages and logs
All checks were successful
Build Docker Image / build (push) Successful in 1m22s
All checks were successful
Build Docker Image / build (push) Successful in 1m22s
This commit is contained in:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user