diff --git a/server/api/v1/client/metadata/manifest.get.ts b/server/api/v1/client/metadata/manifest.get.ts index bc3df5b..70b4c7c 100644 --- a/server/api/v1/client/metadata/manifest.get.ts +++ b/server/api/v1/client/metadata/manifest.get.ts @@ -1,4 +1,5 @@ import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; +import manifestGenerator from "~/server/internal/downloads/manifest"; export default defineClientEventHandler(async (h3) => { const query = getQuery(h3); @@ -9,4 +10,7 @@ export default defineClientEventHandler(async (h3) => { statusCode: 400, statusMessage: "Missing id or version in query", }); + + const manifest = await manifestGenerator.generateManifest(id, version); + return manifest; }); diff --git a/server/api/v1/client/object/[id]/index.get.ts b/server/api/v1/client/object/[id]/index.get.ts new file mode 100644 index 0000000..5793b69 --- /dev/null +++ b/server/api/v1/client/object/[id]/index.get.ts @@ -0,0 +1,15 @@ +import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; + +export default defineClientEventHandler(async (h3, utils) => { + const id = getRouterParam(h3, "id"); + if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" }); + + const user = await utils.fetchUser(); + + const object = await h3.context.objects.fetchWithPermissions(id, user.id); + if (!object) + throw createError({ statusCode: 404, statusMessage: "Object not found" }); + + setHeader(h3, "Content-Type", object.mime); + return object.data; +}); diff --git a/server/api/v1/client/user/library.get.ts b/server/api/v1/client/user/library.get.ts new file mode 100644 index 0000000..543e87c --- /dev/null +++ b/server/api/v1/client/user/library.get.ts @@ -0,0 +1,8 @@ +import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; +import prisma from "~/server/internal/db/database"; + +export default defineClientEventHandler(async (h3) => { + // TODO return the user's library + const games = await prisma.game.findMany({}); + return games; +}); \ No newline at end of file diff --git a/server/internal/downloads/manifest.ts b/server/internal/downloads/manifest.ts index d646d58..66d0a63 100644 --- a/server/internal/downloads/manifest.ts +++ b/server/internal/downloads/manifest.ts @@ -1,3 +1,6 @@ +import { GameVersion } from "@prisma/client"; +import prisma from "../db/database"; + export type DropChunk = { permissions: number; ids: string[]; @@ -19,7 +22,7 @@ export type DropGeneratedManifest = DropManifest & { }; class ManifestGenerator { - static generateManifest( + private static generateManifestFromMetadata( rootManifest: DropManifestMetadata, ...overlays: DropManifestMetadata[] ): DropGeneratedManifest { @@ -46,6 +49,44 @@ class ManifestGenerator { return manifest; } + + // Local function because eventual caching + async generateManifest(gameId: string, versionName: string) { + const versions: GameVersion[] = []; + + for (let i = 0; true; i++) { + const currentVersion = ( + await prisma.gameVersion.findMany({ + where: { + gameId: gameId, + versionName: versionName, + }, + orderBy: { + versionIndex: "desc", // Get highest priority first + }, + skip: i, + take: 1, + }) + )[0]; + versions.push(currentVersion); + if (!currentVersion.delta) break; + } + + const leastToMost = versions.reverse(); + const metadata: DropManifestMetadata[] = leastToMost.map((e) => { + return { + manifest: e.dropletManifest as DropManifest, + versionName: e.versionName, + }; + }); + + const manifest = ManifestGenerator.generateManifestFromMetadata( + metadata[0], + ...metadata.slice(1) + ); + + return manifest; + } } export const manifestGenerator = new ManifestGenerator();