UNPKG

wcz-layout

Version:

170 lines (169 loc) 6.3 kB
import { l as getAccessToken } from "./utils-uByKcwM2.mjs"; import { t as serverEnv } from "./env-CoveIivr.mjs"; import { i as uuidv7 } from "./utils-D39-w_ij.mjs"; import { t as getAppToken } from "./msalServer-B3iBsafS.mjs"; import { r as apiMiddleware, t as authenticationMiddleware } from "./authMiddleware-D8zGrrHP.mjs"; import { t as FileMetaSchema } from "./FileMeta-DDqUju1Y.mjs"; import { z as z$1 } from "zod"; import { createServerFn } from "@tanstack/react-start"; import { DefaultHttpStack, Upload } from "tus-js-client"; import https from "node:https"; import { Readable } from "node:stream"; //#region src/data/server/file.ts const GetFileMetasSchema = z$1.object({ appName: z$1.string().min(1).max(255), subId: z$1.uuid() }); const FileSchema = z$1.object({ appName: z$1.string().min(1).max(255), id: z$1.uuid() }); const UpdateFileMetaSchema = FileMetaSchema.extend({ fileName: z$1.string().min(1).max(255) }); const DeleteFileSchema = FileSchema; const BatchDeleteFilesSchema = GetFileMetasSchema; const UploadFileMetaSchema = z$1.object({ appName: z$1.string().min(1).max(255), subId: z$1.uuid(), file: z$1.instanceof(File) }); function toFileResponse(response, disposition) { const headers = new Headers({ "Cache-Control": "private, max-age=3600, immutable", "Content-Type": String(response.headers["content-type"] ?? "application/octet-stream") }); const contentLength = response.headers["content-length"]; if (contentLength) headers.set("Content-Length", String(contentLength)); if (disposition) headers.set("Content-Disposition", disposition); return new Response(Readable.toWeb(response.data), { headers }); } const getFileMetas = createServerFn({ method: "GET" }).validator(GetFileMetasSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("subId", data.subId); const { data: fileMetas } = await context.api.request({ url: `/v1/meta?${queryParams.toString()}`, method: "GET" }); return fileMetas; }); const getFileThumbnail = createServerFn({ method: "GET" }).validator(FileSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("id", data.id); return toFileResponse(await context.api.request({ url: `/v1/thumbnail?${queryParams.toString()}`, method: "GET", responseType: "stream" })); }); const getFile = createServerFn({ method: "GET" }).validator(FileSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("id", data.id); return toFileResponse(await context.api.request({ url: `/v1?${queryParams.toString()}`, method: "GET", responseType: "stream" }), "inline"); }); const downloadFile = createServerFn({ method: "GET" }).validator(FileSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("id", data.id); return toFileResponse(await context.api.request({ url: `/v1/download?${queryParams.toString()}`, method: "GET", responseType: "stream" })); }); const updateFileMeta = createServerFn({ method: "POST" }).validator(UpdateFileMetaSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("id", data.id); await context.api.request({ url: `/v1/meta?${queryParams.toString()}`, method: "PUT", data }); }); const deleteFile = createServerFn({ method: "POST" }).validator(DeleteFileSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("id", data.id); await context.api.request({ url: `/v1?${queryParams.toString()}`, method: "DELETE" }); }); const batchDeleteFiles = createServerFn({ method: "POST" }).validator(BatchDeleteFilesSchema).middleware([apiMiddleware({ baseURL: "FILE_BASE_URL", scopeKey: "file" })]).handler(async ({ data, context }) => { const queryParams = new URLSearchParams(); queryParams.append("appName", data.appName); queryParams.append("subId", data.subId); await context.api.request({ url: `/v1?${queryParams.toString()}`, method: "DELETE" }); }); const insecureHttpsAgent = new https.Agent({ rejectUnauthorized: false }); const uploadFile = createServerFn({ method: "POST" }).validator((data) => UploadFileMetaSchema.parse({ appName: data.get("appName"), subId: data.get("subId"), file: data.get("file") })).middleware([authenticationMiddleware()]).handler(async ({ data }) => { let accessToken; try { accessToken = await getAccessToken("file"); } catch { accessToken = await getAppToken("file"); } const stream = Readable.fromWeb(data.file.stream()); const id = uuidv7(); await new Promise((resolve, reject) => { new Upload(stream, { endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`, httpStack: new DefaultHttpStack({ agent: insecureHttpsAgent }), uploadSize: data.file.size, chunkSize: 1048576, metadata: { id, appName: data.appName, subId: data.subId, filename: data.file.name, filetype: data.file.type }, headers: { Authorization: `Bearer ${accessToken}` }, onError: reject, onSuccess: () => resolve() }).start(); }); return { id, appName: data.appName, subId: data.subId, fileName: data.file.name }; }); //#endregion export { batchDeleteFiles as a, getFile as c, updateFileMeta as d, uploadFile as f, UploadFileMetaSchema as i, getFileMetas as l, GetFileMetasSchema as n, deleteFile as o, UpdateFileMetaSchema as r, downloadFile as s, FileSchema as t, getFileThumbnail as u }; //# sourceMappingURL=file-BdW8lbKO.mjs.map