more client routes to support Drop app update

This commit is contained in:
DecDuck
2024-10-15 20:05:38 +11:00
parent 329c74d3ce
commit 91b7e1071c
4 changed files with 69 additions and 1 deletions

View File

@ -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;
});

View File

@ -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;
});

View File

@ -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;
});

View File

@ -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();