wcz-layout
Version:
1 lines • 10.8 kB
Source Map (JSON)
{"version":3,"file":"file-DimNsRly.mjs","names":[],"sources":["../src/server/actions/file.ts","../src/data/client/file.ts"],"sourcesContent":["import { createServerFn } from \"@tanstack/react-start\";\nimport { serverEnv } from \"~/env\";\nimport { getAppToken } from \"~/lib/auth/msalServer\";\nimport { getAccessToken } from \"~/lib/auth/user\";\nimport { authenticationMiddleware } from \"~/middleware/authMiddleware\";\n\nexport const getFileUploadToken = createServerFn({ method: \"GET\" })\n .middleware([authenticationMiddleware({ optional: true })])\n .handler(async ({ context }) => ({\n token: context.user ? await getAccessToken(\"file\") : await getAppToken(\"file\"),\n endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`,\n }));\n","import { mutationOptions, queryOptions } from \"@tanstack/react-query\";\r\nimport { createServerFn } from \"@tanstack/react-start\";\r\nimport { Upload } from \"tus-js-client\";\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport type { z } from \"zod\";\r\nimport type { UploadFileMetaSchema, UploadFileResult } from \"~/data/server/file\";\r\nimport {\r\n FileSchema,\r\n GetFileMetasSchema,\r\n UpdateFileMetaSchema,\r\n batchDeleteFiles,\r\n deleteFile,\r\n downloadFile,\r\n getFile,\r\n getFileMetas,\r\n getFileThumbnail,\r\n updateFileMeta,\r\n} from \"~/data/server/file\";\r\nimport type { QueryClientParam } from \"~/models/QueryClientParam\";\r\nimport { getFileUploadToken } from \"~/server/actions/file\";\r\n\r\nconst QUERY_KEY = \"file\";\r\nconst HOUR = 1000 * 60 * 60;\r\n\r\nconst getFileMetasRpc = createServerFn({ method: \"GET\" })\r\n .validator(GetFileMetasSchema)\r\n .handler(({ data }) => getFileMetas({ data }));\r\n\r\nconst getFileThumbnailRpc = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => getFileThumbnail({ data }));\r\n\r\nconst getFileRpc = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => getFile({ data }));\r\n\r\nconst downloadFileRpc = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => downloadFile({ data }));\r\n\r\nconst updateFileMetaRpc = createServerFn({ method: \"POST\" })\r\n .validator(UpdateFileMetaSchema)\r\n .handler(({ data }) => updateFileMeta({ data }));\r\n\r\nconst deleteFileRpc = createServerFn({ method: \"POST\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => deleteFile({ data }));\r\n\r\nconst batchDeleteFilesRpc = createServerFn({ method: \"POST\" })\r\n .validator(GetFileMetasSchema)\r\n .handler(({ data }) => batchDeleteFiles({ data }));\r\n\r\nconst baseOptions = {\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n};\r\n\r\nasync function responseToObjectUrl(response: Response): Promise<string> {\r\n const blob = await response.blob();\r\n return URL.createObjectURL(blob);\r\n}\r\n\r\nfunction saveBlob(blob: Blob, fileName: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement(\"a\");\r\n anchor.href = url;\r\n anchor.download = fileName;\r\n anchor.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nexport const fileMetasQueryOptions = (params: z.input<typeof GetFileMetasSchema>) =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"meta\", params.appName, params.subId],\r\n queryFn: () => getFileMetasRpc({ data: params }),\r\n ...baseOptions,\r\n });\r\n\r\nexport const fileThumbnailQueryOptions = (params: z.input<typeof FileSchema>) =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"thumbnail\", params.appName, params.id],\r\n queryFn: async () => responseToObjectUrl(await getFileThumbnailRpc({ data: params })),\r\n enabled: !!params.id,\r\n ...baseOptions,\r\n });\r\n\r\nexport const fileQueryOptions = (params: z.input<typeof FileSchema>) =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, params.appName, params.id],\r\n queryFn: async () => responseToObjectUrl(await downloadFileRpc({ data: params })),\r\n enabled: !!params.id,\r\n ...baseOptions,\r\n });\r\n\r\nexport const downloadFileMutationOptions = () =>\r\n mutationOptions({\r\n mutationFn: async (\r\n data: z.input<typeof FileSchema> & { fileName: string; fileExtension: string },\r\n ) => {\r\n const response = await downloadFileRpc({ data });\r\n saveBlob(await response.blob(), `${data.fileName}.${data.fileExtension}`);\r\n },\r\n });\r\n\r\nexport const openFileMutationOptions = ({ target }: { target: { current: Window | null } }) =>\r\n mutationOptions<string, Error, z.input<typeof FileSchema>>({\r\n mutationFn: async (data) => responseToObjectUrl(await getFileRpc({ data })),\r\n onSuccess: (source) => {\r\n const popup = target.current;\r\n target.current = null;\r\n\r\n if (popup) {\r\n popup.opener = null;\r\n popup.location.href = source;\r\n } else {\r\n window.open(source, \"_blank\");\r\n }\r\n },\r\n onError: () => {\r\n target.current?.close();\r\n target.current = null;\r\n },\r\n });\r\n\r\nexport const updateFileMetaMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: (data: z.input<typeof UpdateFileMetaSchema>) => updateFileMetaRpc({ data }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n\r\nexport const deleteFileMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: (data: z.input<typeof FileSchema>) => deleteFileRpc({ data }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n\r\nexport const batchDeleteFilesMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: (data: z.input<typeof GetFileMetasSchema>) => batchDeleteFilesRpc({ data }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n\r\nexport const uploadFileMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: async ({\r\n id = uuidv7(),\r\n appName,\r\n subId,\r\n file,\r\n setProgress,\r\n }: z.input<typeof UploadFileMetaSchema> & {\r\n setProgress?: (progress: number) => void;\r\n }): Promise<UploadFileResult> => {\r\n const { token, endpoint } = await getFileUploadToken();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const upload = new Upload(file, {\r\n endpoint,\r\n chunkSize: 1_048_576,\r\n metadata: {\r\n id,\r\n appName: appName,\r\n subId: subId,\r\n filename: file.name,\r\n filetype: file.type,\r\n },\r\n headers: { Authorization: `Bearer ${token}` },\r\n onProgress: (bytesUploaded, bytesTotal) =>\r\n setProgress?.((bytesUploaded / bytesTotal) * 100),\r\n onError: reject,\r\n onSuccess: () => resolve(),\r\n });\r\n upload.start();\r\n });\r\n\r\n return { id, appName, subId, fileName: file.name };\r\n },\r\n onSuccess: (result) =>\r\n queryClient.invalidateQueries({\r\n queryKey: [QUERY_KEY, \"meta\", result.appName, result.subId],\r\n exact: false,\r\n }),\r\n });\r\n"],"mappings":"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"}