From 99a60b8fa02b8e8ec28ed97521894fcb80e41c6c Mon Sep 17 00:00:00 2001 From: DecDuck Date: Thu, 15 Jan 2026 15:34:17 +1100 Subject: [PATCH] Fix MFA superlevel redirect & ViewTransition (#314) * feat: fix mfa superlevel & viewtransition * fix: lint --- .vscode/settings.json | 2 +- nuxt.config.ts | 2 +- pages/account/tokens.vue | 1 - server/api/v1/client/depots/index.get.ts | 8 ++ server/api/v1/client/game/versions.get.ts | 105 ++++++++++++++++++++-- server/internal/session/index.ts | 8 +- 6 files changed, 113 insertions(+), 13 deletions(-) create mode 100644 server/api/v1/client/depots/index.get.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 0d0624e..0570fe3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,7 +33,7 @@ "username": "drop" } ], - "typescript.experimental.useTsgo": true, + "typescript.experimental.useTsgo": false, // prioritize ArkType's "type" for autoimports "typescript.preferences.autoImportSpecifierExcludeRegexes": ["^(node:)?os$"] } diff --git a/nuxt.config.ts b/nuxt.config.ts index 2ebb756..3e18c65 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -63,7 +63,7 @@ export default defineNuxtConfig({ experimental: { buildCache: true, - viewTransition: true, + viewTransition: false, componentIslands: true, }, diff --git a/pages/account/tokens.vue b/pages/account/tokens.vue index 4f9ee48..cc58ad6 100644 --- a/pages/account/tokens.vue +++ b/pages/account/tokens.vue @@ -202,7 +202,6 @@ async function createToken( }, failTitle: "Failed to create API token.", }); - console.log(result); newToken.value = result.token; tokens.value.push(result); } finally { diff --git a/server/api/v1/client/depots/index.get.ts b/server/api/v1/client/depots/index.get.ts new file mode 100644 index 0000000..3741d14 --- /dev/null +++ b/server/api/v1/client/depots/index.get.ts @@ -0,0 +1,8 @@ +import prisma from "~/server/internal/db/database"; +import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; + +export default defineClientEventHandler(async () => { + const depots = await prisma.depot.findMany({ select: { endpoint: true } }); + + return depots; +}); diff --git a/server/api/v1/client/game/versions.get.ts b/server/api/v1/client/game/versions.get.ts index 6219a6e..8dd7e9c 100644 --- a/server/api/v1/client/game/versions.get.ts +++ b/server/api/v1/client/game/versions.get.ts @@ -1,5 +1,23 @@ +import type { Platform } from "~/prisma/client/enums"; import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; import prisma from "~/server/internal/db/database"; +import gameSizeManager from "~/server/internal/gamesize"; + +type VersionDownloadOption = { + versionId: string; + displayName?: string; + versionPath: string; + platform: Platform; + size: number; + requiredContent: Array<{ + gameId: string; + versionId: string; + name: string; + iconObjectId: string; + shortDescription: string; + size: number; + }>; +}; export default defineClientEventHandler(async (h3) => { const query = getQuery(h3); @@ -10,21 +28,94 @@ export default defineClientEventHandler(async (h3) => { statusMessage: "No ID in request query", }); - const versions = await prisma.gameVersion.findMany({ + const rawVersions = await prisma.gameVersion.findMany({ where: { gameId: id, }, orderBy: { versionIndex: "desc", // Latest one first }, - omit: { - dropletManifest: true, - }, - include: { - launches: true, - setups: true, + select: { + versionId: true, + displayName: true, + versionPath: true, + gameId: true, + launches: { + select: { + platform: true, + executor: { + select: { + gameVersion: { + select: { + game: { + select: { + mName: true, + mShortDescription: true, + mIconObjectId: true, + id: true, + }, + }, + versionId: true, + }, + }, + }, + }, + }, + }, }, }); + const versions: Array = ( + await Promise.all( + rawVersions.map(async (v) => { + const platformOptions: Map< + Platform, + VersionDownloadOption["requiredContent"] + > = new Map(); + + for (const launch of v.launches) { + if (!platformOptions.has(launch.platform)) + platformOptions.set(launch.platform, []); + + if (launch.executor) { + const old = platformOptions.get(launch.platform)!; + old.push({ + gameId: launch.executor.gameVersion.game.id, + versionId: launch.executor.gameVersion.versionId, + name: launch.executor.gameVersion.game.mName, + iconObjectId: launch.executor.gameVersion.game.mIconObjectId, + shortDescription: + launch.executor.gameVersion.game.mShortDescription, + size: + (await gameSizeManager.getGameVersionSize( + launch.executor.gameVersion.game.id, + launch.executor.gameVersion.versionId, + )) ?? 0, + }); + } + } + + const size = await gameSizeManager.getGameVersionSize( + v.gameId, + v.versionId, + ); + + return platformOptions + .entries() + .map( + ([platform, requiredContent]) => + ({ + versionId: v.versionId, + versionPath: v.versionPath, + platform, + requiredContent, + size: size!, + }) satisfies VersionDownloadOption, + ) + .toArray(); + }), + ) + ).flat(); + return versions; }); diff --git a/server/internal/session/index.ts b/server/internal/session/index.ts index 74e0bd5..6e79ce5 100644 --- a/server/internal/session/index.ts +++ b/server/internal/session/index.ts @@ -55,17 +55,20 @@ export class SessionHandler { data: {}, }; const wasAuthenticated = !!session.authenticated; + session.authenticated = { userId, level: session.authenticated?.level ?? 10, requiredLevel: mfaCount > 0 ? 20 : 10, superleveledExpiry: undefined, }; + if ( - !wasAuthenticated && + wasAuthenticated && session.authenticated.level >= session.authenticated.requiredLevel - ) + ) { session.authenticated.superleveledExpiry = Date.now() + SUPERLEVEL_LENGTH; + } const success = await this.sessionProvider.setSession(token, session); if (!success) return "fail"; @@ -123,7 +126,6 @@ export class SessionHandler { expiresAt, data: {}, }; - console.log(session); session.data[key] = value; await this.sessionProvider.setSession(token, session); return true;