From 816355be0c20af1365ac2ba557b3dbb60550f94e Mon Sep 17 00:00:00 2001 From: DecDuck Date: Fri, 6 Jun 2025 10:00:16 +1000 Subject: [PATCH] chore: refactor into new task system --- server/internal/tasks/group.ts | 3 +++ server/internal/tasks/index.ts | 2 ++ .../tasks/registry}/ludusavi.ts | 24 +++++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) rename server/{tasks => internal/tasks/registry}/ludusavi.ts (85%) diff --git a/server/internal/tasks/group.ts b/server/internal/tasks/group.ts index d95db5e..a7d9f7f 100644 --- a/server/internal/tasks/group.ts +++ b/server/internal/tasks/group.ts @@ -14,6 +14,9 @@ export const taskGroups = { "import:game": { concurrency: true, }, + "ludusavi:import": { + concurrency: false, + }, } as const; export type TaskGroup = keyof typeof taskGroups; diff --git a/server/internal/tasks/index.ts b/server/internal/tasks/index.ts index 83a3446..e87d0a4 100644 --- a/server/internal/tasks/index.ts +++ b/server/internal/tasks/index.ts @@ -10,6 +10,7 @@ import cleanupObjects from "./registry/objects"; import { taskGroups, type TaskGroup } from "./group"; import prisma from "../db/database"; import { type } from "arktype"; +import ludusavi from "./registry/ludusavi"; // a task that has been run type FinishedTask = { @@ -59,6 +60,7 @@ class TaskHandler { this.saveScheduledTask(cleanupSessions); this.saveScheduledTask(checkUpdate); this.saveScheduledTask(cleanupObjects); + this.saveScheduledTask(ludusavi) } /** diff --git a/server/tasks/ludusavi.ts b/server/internal/tasks/registry/ludusavi.ts similarity index 85% rename from server/tasks/ludusavi.ts rename to server/internal/tasks/registry/ludusavi.ts index 343edfa..5c0c18c 100644 --- a/server/tasks/ludusavi.ts +++ b/server/internal/tasks/registry/ludusavi.ts @@ -1,7 +1,8 @@ +import { defineDropTask } from ".."; import yaml from "js-yaml"; -import prisma from "../internal/db/database"; import { Platform } from "~/prisma/client"; import type { LudusaviPlatformEntryCreateOrConnectWithoutLudusaviEntryInput } from "~/prisma/client/models"; +import prisma from "../../db/database"; type ConnectOrCreateShorthand = LudusaviPlatformEntryCreateOrConnectWithoutLudusaviEntryInput; @@ -19,17 +20,25 @@ type LudusaviModel = { }; }; -export default defineTask({ - async run(_event) { +export default defineDropTask({ + buildId: () => `ludusavi:import:${new Date().toISOString()}`, + name: "Import Ludusavi", + acls: [], + taskGroup: "ludusavi:import", + async run({ log, progress }) { const manifest = yaml.load( await $fetch( "https://raw.githubusercontent.com/mtkennerly/ludusavi-manifest/refs/heads/master/data/manifest.yaml", ), ) as LudusaviModel; + let currentProgress = 10; - for (const [name, data] of Object.entries(manifest)) { + progress(currentProgress); + + const entries = Object.entries(manifest); + const increment = (1 / entries.length) * 0.9; + for (const [name, data] of entries) { if (!data.files && !data.registry) continue; - console.log(name); const iterableFiles = data.files ? Object.entries(data.files) : undefined; @@ -126,8 +135,9 @@ export default defineTask({ entries: { connectOrCreate }, }, }); - } - return { result: true }; + currentProgress += increment; + log(`Imported game "${name}"`); + } }, });