From 93bc143dac1ba6e29cef5c8d77f1818fec27483c Mon Sep 17 00:00:00 2001 From: DecDuck Date: Tue, 22 Oct 2024 09:43:00 +1100 Subject: [PATCH] additional polish and QoL features --- error.vue | 157 +++---- pages/admin/library/[id]/index.vue | 412 ++++++++++-------- server/api/v1/admin/game/index.get.ts | 9 +- .../api/v1/admin/import/version/index.post.ts | 4 +- server/api/v1/client/http/chunk.get.ts | 9 + server/internal/metadata/index.ts | 24 +- server/internal/utils/types.d.ts | 7 + 7 files changed, 353 insertions(+), 269 deletions(-) create mode 100644 server/api/v1/client/http/chunk.get.ts create mode 100644 server/internal/utils/types.d.ts diff --git a/error.vue b/error.vue index ce28c37..abe12b5 100644 --- a/error.vue +++ b/error.vue @@ -2,94 +2,103 @@ import type { NuxtError } from "#app"; const props = defineProps({ - error: Object as () => NuxtError, + error: Object as () => NuxtError, }); const route = useRoute(); const user = useUser(); async function signIn() { - clearError({ - redirect: `/signin?redirect=${encodeURIComponent(route.fullPath)}`, - }); + clearError({ + redirect: `/signin?redirect=${encodeURIComponent(route.fullPath)}`, + }); } useHead({ - title: `${props.error?.statusCode ?? "An unknown error occurred"} | Drop`, + title: `${props.error?.statusCode ?? "An unknown error occurred"} | Drop`, }); -console.log(props.error); + +const errorCode = props.error?.statusCode; +if (errorCode != undefined) { + switch (errorCode) { + case 403: + case 401: + if (!user.value) signIn(); + break; + } +} diff --git a/pages/admin/library/[id]/index.vue b/pages/admin/library/[id]/index.vue index 60317b5..90dce0b 100644 --- a/pages/admin/library/[id]/index.vue +++ b/pages/admin/library/[id]/index.vue @@ -1,144 +1,199 @@ diff --git a/server/api/v1/admin/game/index.get.ts b/server/api/v1/admin/game/index.get.ts index 06c7984..7ff78c1 100644 --- a/server/api/v1/admin/game/index.get.ts +++ b/server/api/v1/admin/game/index.get.ts @@ -1,4 +1,5 @@ import prisma from "~/server/internal/db/database"; +import libraryManager from "~/server/internal/library"; export default defineEventHandler(async (h3) => { const user = await h3.context.session.getAdminUser(h3); @@ -26,7 +27,7 @@ export default defineEventHandler(async (h3) => { versionName: true, platform: true, delta: true, - } + }, }, }, }); @@ -34,5 +35,9 @@ export default defineEventHandler(async (h3) => { if (!game) throw createError({ statusCode: 404, statusMessage: "Game ID not found" }); - return game; + const unimportedVersions = await libraryManager.fetchUnimportedVersions( + game.id, + ); + + return { game, unimportedVersions }; }); diff --git a/server/api/v1/admin/import/version/index.post.ts b/server/api/v1/admin/import/version/index.post.ts index a107ea6..24cb67a 100644 --- a/server/api/v1/admin/import/version/index.post.ts +++ b/server/api/v1/admin/import/version/index.post.ts @@ -15,7 +15,7 @@ export default defineEventHandler(async (h3) => { throw createError({ statusCode: 400, statusMessage: - "Missing id, version, platform, setup or startup from body", + "ID, version, platform, setup and startup (if not in upgrade mode) are required. ", }); const taskId = await libraryManager.importVersion( @@ -26,7 +26,7 @@ export default defineEventHandler(async (h3) => { startup, setup, }, - delta + delta, ); if (!taskId) throw createError({ diff --git a/server/api/v1/client/http/chunk.get.ts b/server/api/v1/client/http/chunk.get.ts new file mode 100644 index 0000000..be3618e --- /dev/null +++ b/server/api/v1/client/http/chunk.get.ts @@ -0,0 +1,9 @@ +import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; + +export default defineClientEventHandler(async (h3) => { + const query = getQuery(h3); + + const gameId = query.game; + const versionName = query.version; + const chunkId = query.chunk; +}); diff --git a/server/internal/metadata/index.ts b/server/internal/metadata/index.ts index fbe0098..7a5a769 100644 --- a/server/internal/metadata/index.ts +++ b/server/internal/metadata/index.ts @@ -26,10 +26,10 @@ export abstract class MetadataProvider { abstract search(query: string): Promise; abstract fetchGame(params: _FetchGameMetadataParams): Promise; abstract fetchPublisher( - params: _FetchPublisherMetadataParams + params: _FetchPublisherMetadataParams, ): Promise; abstract fetchDeveloper( - params: _FetchDeveloperMetadataParams + params: _FetchDeveloperMetadataParams, ): Promise; } @@ -56,7 +56,7 @@ export class MetadataHandler { Object.assign({}, result, { sourceId: provider.id(), sourceName: provider.name(), - }) + }), ); resolve(mappedResults); }); @@ -74,7 +74,7 @@ export class MetadataHandler { async createGame( result: InternalGameMetadataResult, - libraryBasePath: string + libraryBasePath: string, ) { const provider = this.providers.get(result.sourceId); if (!provider) @@ -92,7 +92,7 @@ export class MetadataHandler { const [createObject, pullObjects, dumpObjects] = this.objectHandler.new( {}, - ["internal:read"] + ["internal:read"], ); let metadata; @@ -144,7 +144,7 @@ export class MetadataHandler { return (await this.fetchDeveloperPublisher( query, "fetchDeveloper", - "developer" + "developer", )) as Developer; } @@ -152,16 +152,16 @@ export class MetadataHandler { return (await this.fetchDeveloperPublisher( query, "fetchPublisher", - "publisher" + "publisher", )) as Publisher; } // Careful with this function, it has no typechecking - // TODO: fix typechecking + // Type-checking this thing is impossible private async fetchDeveloperPublisher( query: string, functionName: any, - databaseName: any + databaseName: any, ) { const existing = await (prisma as any)[databaseName].findFirst({ where: { @@ -173,12 +173,12 @@ export class MetadataHandler { for (const provider of this.providers.values() as any) { const [createObject, pullObjects, dumpObjects] = this.objectHandler.new( {}, - ["internal:read"] + ["internal:read"], ); let result; try { result = await provider[functionName]({ query, createObject }); - } catch(e) { + } catch (e) { console.warn(e); dumpObjects(); continue; @@ -206,7 +206,7 @@ export class MetadataHandler { } throw new Error( - `No metadata provider found a ${databaseName} for "${query}"` + `No metadata provider found a ${databaseName} for "${query}"`, ); } } diff --git a/server/internal/utils/types.d.ts b/server/internal/utils/types.d.ts new file mode 100644 index 0000000..8a91c79 --- /dev/null +++ b/server/internal/utils/types.d.ts @@ -0,0 +1,7 @@ +export type FilterConditionally = Pick< + Source, + { [K in keyof Source]: Source[K] extends Condition ? K : never }[keyof Source] +>; +export type KeyOfType = keyof { + [P in keyof T as T[P] extends V ? P : never]: any; +};