{"version":3,"file":"file-eWFbMirr.mjs","names":["createServerFn","serverEnv","getAccessToken","authenticationMiddleware","getFileUploadToken","method","middleware","handler","token","endpoint","FILE_BASE_URL","mutationOptions","queryOptions","Upload","uuidv7","z","FileSchema","GetFileMetasSchema","UpdateFileMetaSchema","UploadFileMetaSchema","UploadFileResult","batchDeleteFiles","deleteFile","downloadFile","getFile","getFileMetas","getFileThumbnail","updateFileMeta","QueryClientParam","getFileUploadToken","QUERY_KEY","HOUR","baseOptions","staleTime","gcTime","refetchOnWindowFocus","responseToObjectUrl","response","Response","Promise","blob","URL","createObjectURL","saveBlob","Blob","fileName","url","anchor","document","createElement","href","download","click","revokeObjectURL","fileMetasQueryOptions","params","input","queryKey","appName","subId","queryFn","data","fileThumbnailQueryOptions","id","enabled","fileQueryOptions","downloadFileMutationOptions","mutationFn","fileExtension","openFileMutationOptions","target","current","Window","Error","onSuccess","source","popup","opener","location","window","open","onError","close","updateFileMetaMutationOptions","queryClient","onSettled","invalidateQueries","exact","deleteFileMutationOptions","batchDeleteFilesMutationOptions","uploadFileMutationOptions","file","setProgress","progress","token","endpoint","resolve","reject","upload","chunkSize","metadata","filename","name","filetype","type","headers","Authorization","onProgress","bytesUploaded","bytesTotal","start","result"],"sources":["../src/server/actions/file.ts","../src/data/client/file.ts"],"sourcesContent":["import { createServerFn } from \"@tanstack/react-start\";\nimport { serverEnv } from \"~/env\";\nimport { getAccessToken } from \"~/lib/auth/user\";\nimport { authenticationMiddleware } from \"~/middleware/authMiddleware\";\n\nexport const getFileUploadToken = createServerFn({ method: \"GET\" })\n  .middleware([authenticationMiddleware()])\n  .handler(async () => ({\n    token: await getAccessToken(\"file\"),\n    endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`,\n  }));\n","import { mutationOptions, queryOptions } from \"@tanstack/react-query\";\r\nimport { Upload } from \"tus-js-client\";\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport type { z } from \"zod\";\r\nimport type {\r\n  FileSchema,\r\n  GetFileMetasSchema,\r\n  UpdateFileMetaSchema,\r\n  UploadFileMetaSchema,\r\n  UploadFileResult,\r\n} from \"~/data/server/file\";\r\nimport {\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 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: () => getFileMetas({ 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 getFileThumbnail({ 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 downloadFile({ 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 downloadFile({ 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 getFile({ 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>) => updateFileMeta({ 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>) => deleteFile({ 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>) => batchDeleteFiles({ 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      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      const id = uuidv7();\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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"}