diff --git a/apps/infoalloggi/src/pages/api/storage/get/[id].ts b/apps/infoalloggi/src/pages/api/storage/get/[id].ts index 53fef15..e40a47f 100644 --- a/apps/infoalloggi/src/pages/api/storage/get/[id].ts +++ b/apps/infoalloggi/src/pages/api/storage/get/[id].ts @@ -1,10 +1,14 @@ import fs from "node:fs"; import path from "node:path"; import type { NextApiRequest, NextApiResponse } from "next"; -import { storageId } from "~/schemas/public/Storage"; +import { + type MediaStorage, + mediaStorageId, +} from "~/schemas/public/MediaStorage"; +import { type Storage, storageId } from "~/schemas/public/Storage"; import { TOKEN_CONFIG } from "~/server/auth/configs"; import { verifyToken } from "~/server/auth/jwt"; -import { getFile } from "~/server/services/storage.service"; +import { getFile, getMediaFile } from "~/server/services/storage.service"; export default async function handler( req: NextApiRequest, res: NextApiResponse, @@ -55,19 +59,33 @@ export default async function handler( return res.status(401); } } - const parsedId = storageId.safeParse(id); - if (!parsedId.success) { - if (isImageRequest || isNextImageRequest) { - return getFallback("fallback-image.png", req, res); + let file: Storage | MediaStorage | undefined; + if (isImageRequest || isNextImageRequest || isVideoRequest) { + const parsedId = mediaStorageId.safeParse(id); + if (!parsedId.success) { + if (isImageRequest || isNextImageRequest) { + return getFallback("fallback-image.png", req, res); + } + if (isVideoRequest) { + return getFallback("fallback-video.png", req, res); + } + return res.status(404).json({ error: "Invalid input id" }); } - if (isVideoRequest) { - return getFallback("fallback-video.png", req, res); + file = await getMediaFile(parsedId.data); + } else { + const parsedId = storageId.safeParse(id); + if (!parsedId.success) { + if (isImageRequest || isNextImageRequest) { + return getFallback("fallback-image.png", req, res); + } + if (isVideoRequest) { + return getFallback("fallback-video.png", req, res); + } + return res.status(404).json({ error: "Invalid input id" }); } - return res.status(404).json({ error: "Invalid input id" }); + + file = await getFile(parsedId.data); } - - const file = await getFile(parsedId.data); - if (!file) { if (isImageRequest || isNextImageRequest) { return getFallback("fallback-image.png", req, res); diff --git a/apps/infoalloggi/src/server/services/storage.service.ts b/apps/infoalloggi/src/server/services/storage.service.ts index d87de4f..ac774a7 100644 --- a/apps/infoalloggi/src/server/services/storage.service.ts +++ b/apps/infoalloggi/src/server/services/storage.service.ts @@ -1,4 +1,5 @@ import { TRPCError } from "@trpc/server"; +import type { MediaStorageId } from "~/schemas/public/MediaStorage"; import type { Storage, StorageId, @@ -108,6 +109,22 @@ export const getFile = async (fileId: StorageId) => { } }; +export const getMediaFile = async (fileId: MediaStorageId) => { + try { + return await db + .$pickTables<"media_storage">() + .selectFrom("media_storage") + .selectAll() + .where("id", "=", fileId) + .executeTakeFirst(); + } catch (e) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Failed to get media_file: ${(e as Error).message}`, + }); + } +}; + export const editFile = async (fileId: StorageId, data: StorageUpdate) => { try { await db