63ac2b8ffc
* feat: nginx + torrential basics & services system * fix: lint + i18n * fix: update torrential to remove openssl * feat: add torrential to Docker build * feat: move to self hosted runner * fix: move off self-hosted runner * fix: update nginx.conf * feat: torrential cache invalidation * fix: update torrential for cache invalidation * feat: integrity check task * fix: lint * feat: move to version ids * fix: client fixes and client-side checks * feat: new depot apis and version id fixes * feat: update torrential * feat: droplet bump and remove unsafe update functions * fix: lint * feat: v4 featureset: emulators, multi-launch commands * fix: lint * fix: mobile ui for game editor * feat: launch options * fix: lint * fix: remove axios, use $fetch * feat: metadata and task api improvements * feat: task actions * fix: slight styling issue * feat: fix style and lints * feat: totp backend routes * feat: oidc groups * fix: update drop-base * feat: creation of passkeys & totp * feat: totp signin * feat: webauthn mfa/signin * feat: launch selecting ui * fix: manually running tasks * feat: update add company game modal to use new SelectorGame * feat: executor selector * fix(docker): update rust to rust nightly for torrential build (#305) * feat: new version ui * feat: move package lookup to build time to allow for deno dev * fix: lint * feat: localisation cleanup * feat: apply localisation cleanup * feat: potential i18n refactor logic * feat: remove args from commands * fix: lint * fix: lockfile --------- Co-authored-by: Aden Lindsay <140392385+AdenMGB@users.noreply.github.com>
68 lines
2.0 KiB
TypeScript
68 lines
2.0 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 UpdateVersionOrder = type({
|
|
versions: "string[]",
|
|
}).configure(throwingArktype);
|
|
|
|
export default defineEventHandler(async (h3) => {
|
|
const allowed = await aclManager.allowSystemACL(h3, ["game:version:update"]);
|
|
if (!allowed) throw createError({ statusCode: 403 });
|
|
|
|
const body = await readDropValidatedBody(h3, UpdateVersionOrder);
|
|
const gameId = getRouterParam(h3, "id")!;
|
|
// We expect an array of the version names for this game
|
|
const unsortedVersions = await prisma.gameVersion.findMany({
|
|
where: {
|
|
versionId: { in: body.versions },
|
|
},
|
|
select: {
|
|
versionId: true,
|
|
versionIndex: true,
|
|
delta: true,
|
|
launches: { select: { platform: true } },
|
|
},
|
|
});
|
|
|
|
const versions = body.versions
|
|
.map((e) => unsortedVersions.find((v) => v.versionId === e))
|
|
.filter((e) => e !== undefined);
|
|
|
|
if (versions.length !== unsortedVersions.length)
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: "Sorting versions yielded less results, somehow.",
|
|
});
|
|
|
|
// Validate the new order
|
|
const has: { [key: string]: boolean } = {};
|
|
for (const version of versions) {
|
|
for (const versionPlatform of version.launches.map((v) => v.platform)) {
|
|
if (version.delta && !has[versionPlatform])
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: `"${version.versionId}" requires a base version to apply the delta to for platform ${versionPlatform}.`,
|
|
});
|
|
has[versionPlatform] = true;
|
|
}
|
|
}
|
|
|
|
await prisma.$transaction(
|
|
versions.map((version, versionIndex) =>
|
|
prisma.gameVersion.updateMany({
|
|
where: {
|
|
gameId: gameId,
|
|
versionId: version.versionId,
|
|
},
|
|
data: {
|
|
versionIndex: versionIndex,
|
|
},
|
|
}),
|
|
),
|
|
);
|
|
|
|
return versions.map((v) => v.versionId);
|
|
});
|