From 37fa9537d0b0e80e2dd42845ce55fc83d5ae2d1b Mon Sep 17 00:00:00 2001 From: Huskydog9988 <39809509+Huskydog9988@users.noreply.github.com> Date: Thu, 29 May 2025 16:55:24 -0400 Subject: [PATCH] feat: object cleanup is finally here --- server/tasks/cleanup/objects.ts | 50 +++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/server/tasks/cleanup/objects.ts b/server/tasks/cleanup/objects.ts index 62955dc..d43f08f 100644 --- a/server/tasks/cleanup/objects.ts +++ b/server/tasks/cleanup/objects.ts @@ -1,5 +1,6 @@ import prisma from "~/server/internal/db/database"; import objectHandler from "~/server/internal/objects"; +import type { TaskReturn } from "../../h3"; type FieldReferenceMap = { [modelName: string]: { @@ -9,29 +10,54 @@ type FieldReferenceMap = { }; }; -export default defineTask({ +export default defineTask({ meta: { name: "cleanup:objects", }, async run() { console.log("[Task cleanup:objects]: Cleaning unreferenced objects"); + // get all objects const objects = await objectHandler.listAll(); console.log( `[Task cleanup:objects]: searching for ${objects.length} objects`, ); - console.log(objects); - const results = await findUnreferencedStrings(objects, buildRefMap()); + + // find unreferenced objects + const refMap = buildRefMap(); + console.log("[Task cleanup:objects]: Building reference map"); console.log( - `[Task cleanup:objects]: found ${results.length} Unreferenced objects`, + `[Task cleanup:objects]: Found ${Object.keys(refMap).length} models with reference fields`, ); - console.log(results); + console.log("[Task cleanup:objects]: Searching for unreferenced objects"); + const unrefedObjects = await findUnreferencedStrings(objects, refMap); + console.log( + `[Task cleanup:objects]: found ${unrefedObjects.length} Unreferenced objects`, + ); + // console.log(unrefedObjects); + + // remove objects + const deletePromises: Promise[] = []; + for (const obj of unrefedObjects) { + console.log(`[Task cleanup:objects]: Deleting object ${obj}`); + deletePromises.push(objectHandler.deleteAsSystem(obj)); + } + await Promise.all(deletePromises); console.log("[Task cleanup:objects]: Done"); - return { result: true }; + return { + result: { + success: true, + data: unrefedObjects, + }, + }; }, }); +/** + * Builds a map of Prisma models and their fields that may contain object IDs + * @returns + */ function buildRefMap(): FieldReferenceMap { const tables = Object.keys(prisma).filter( (v) => !(v.startsWith("$") || v.startsWith("_") || v === "constructor"), @@ -59,6 +85,12 @@ function buildRefMap(): FieldReferenceMap { return result; } +/** + * Searches all models for a given id in their fields + * @param id + * @param fieldRefMap + * @returns + */ async function isReferencedInModelFields( id: string, fieldRefMap: FieldReferenceMap, @@ -111,6 +143,12 @@ async function isReferencedInModelFields( return false; } +/** + * Takes a list of objects and checks if they are referenced in any model fields + * @param objects + * @param fieldRefMap + * @returns + */ async function findUnreferencedStrings( objects: string[], fieldRefMap: FieldReferenceMap,