Files
drop/server/api/v1/admin/depot/upload.post.ts
DecDuck 00adab21c2 Game specialisation & delta versions (#323)
* feat: game specialisation, auto-guess extensions

* fix: enforce specialisation specific schema at API level

* fix: lint

* feat: partial work on depot endpoints

* feat: bump torrential

* feat: dummy version creation for depot uploads

* fix: lint

* fix: types

* fix: lint

* feat: depot version import

* fix: lint

* fix: remove any type

* fix: lint

* fix: push update interval

* fix: cpu usage calculation

* feat: delta version support

* feat: style tweaks for selectlaunch.vue

* fix: lint
2026-01-23 16:04:38 +11:00

52 lines
1.2 KiB
TypeScript

import { type } from "arktype";
import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
const UploadManifest = type({
gameId: "string",
versionName: "string",
manifest: type({
version: "'2'",
size: "number",
key: "16 <= number[] <= 16",
chunks: type({
["string"]: {
checksum: "string",
iv: "16 <= number[] <= 16",
files: type({
filename: "string",
start: "number",
length: "number",
permissions: "number",
}).array(),
},
}),
}),
fileList: "string[]",
}).configure(throwingArktype);
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["depot:upload:new"]);
if (!allowed) throw createError({ statusCode: 403 });
const { gameId, versionName, manifest, fileList } =
await readDropValidatedBody(h3, UploadManifest);
const version = await prisma.unimportedGameVersion.create({
data: {
game: {
connect: {
id: gameId,
},
},
versionName,
manifest,
fileList,
},
});
return { id: version.id };
});