{"version":3,"file":"create-upload-session.mjs","names":["constants"],"sources":["../../../src/services/media/create-upload-session.ts"],"sourcesContent":["import type { UploadSessionResponse } from \"@lucidcms/types\";\nimport { addMilliseconds } from \"date-fns\";\nimport mime from \"mime-types\";\nimport constants from \"../../constants/constants.js\";\nimport { copy } from \"../../libs/i18n/index.js\";\nimport {\n\tMediaAwaitingSyncRepository,\n\tMediaUploadSessionsRepository,\n} from \"../../libs/repositories/index.js\";\nimport { getBaseUrl } from \"../../utils/helpers/index.js\";\nimport { generateKey, resolveMediaTenant } from \"../../utils/media/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport checkCanStoreMedia from \"./checks/check-can-store-media.js\";\n\nconst createSessionId = () => {\n\treturn globalThis.crypto.randomUUID();\n};\n\nconst createUploadSession: ServiceFn<\n\t[\n\t\t{\n\t\t\tfileName: string;\n\t\t\tmimeType: string;\n\t\t\tsize: number;\n\t\t\tpublic: boolean;\n\t\t\ttemporary?: boolean;\n\t\t\tuserId: number;\n\t\t},\n\t],\n\tUploadSessionResponse\n> = async (context, data) => {\n\tif (!context.media) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tstatus: 400,\n\t\t\t\tmessage: copy(\"server:core.media.adapters.not.enabled\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst sizeRes = await checkCanStoreMedia(context, {\n\t\tsize: data.size,\n\t});\n\tif (sizeRes.error) return sizeRes;\n\n\tconst extension = mime.extension(data.mimeType);\n\n\tconst keyRes = generateKey({\n\t\tname: data.fileName,\n\t\tpublic: data.public,\n\t\ttenantKey: context.request.tenantKey ?? null,\n\t\ttemporary: data.temporary,\n\t});\n\tif (keyRes.error) return keyRes;\n\n\tconst tenant = resolveMediaTenant(\n\t\tcontext.config,\n\t\tcontext.request.tenantKey ?? null,\n\t);\n\n\tconst sessionRes = await context.media.createUploadSession(context, {\n\t\tkey: keyRes.data,\n\t\thost: getBaseUrl(context),\n\t\tsecretKey: context.config.secrets.cookie,\n\t\tmimeType: data.mimeType,\n\t\textension: extension || undefined,\n\t\tsize: data.size,\n\t\ttenant,\n\t});\n\tif (sessionRes.error) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: sessionRes.error.message,\n\t\t\t\tstatus: 500,\n\t\t\t\terrors: {\n\t\t\t\t\tfile: {\n\t\t\t\t\t\tcode: \"media_error\",\n\t\t\t\t\t\tmessage: sessionRes.error.message,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tconst uploadKey = sessionRes.data.key;\n\n\tif (sessionRes.data.mode === \"single\") {\n\t\tconst MediaAwaitingSync = new MediaAwaitingSyncRepository(\n\t\t\tcontext.db.client,\n\t\t\tcontext.config.db,\n\t\t);\n\t\tconst awaitingSyncRes = await MediaAwaitingSync.createSingle({\n\t\t\tdata: {\n\t\t\t\tkey: uploadKey,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t},\n\t\t\treturning: [\"key\"],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t});\n\t\tif (awaitingSyncRes.error) return awaitingSyncRes;\n\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: {\n\t\t\t\tmode: \"single\",\n\t\t\t\tkey: uploadKey,\n\t\t\t\turl: sessionRes.data.url,\n\t\t\t\theaders: sessionRes.data.headers,\n\t\t\t},\n\t\t};\n\t}\n\n\tconst MediaUploadSessions = new MediaUploadSessionsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst sessionId = createSessionId();\n\tconst now = new Date().toISOString();\n\tconst expiresAt =\n\t\tsessionRes.data.expiresAt ??\n\t\taddMilliseconds(\n\t\t\tnew Date(),\n\t\t\tconstants.uploadSessionExpiration,\n\t\t).toISOString();\n\n\tconst createRes = await MediaUploadSessions.createSingle({\n\t\tdata: {\n\t\t\tsession_id: sessionId,\n\t\t\tkey: uploadKey,\n\t\t\tadapter_key: context.media.key,\n\t\t\tadapter_upload_id: sessionRes.data.uploadId,\n\t\t\tmode: \"resumable\",\n\t\t\tstatus: \"active\",\n\t\t\tfile_name: data.fileName,\n\t\t\tmime_type: data.mimeType,\n\t\t\tfile_extension: extension || null,\n\t\t\tfile_size: data.size,\n\t\t\tpart_size: sessionRes.data.partSize,\n\t\t\tcreated_by: data.userId,\n\t\t\tcreated_at: now,\n\t\t\tupdated_at: now,\n\t\t\texpires_at: expiresAt,\n\t\t},\n\t\treturning: [\"session_id\"],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t},\n\t});\n\tif (createRes.error) return createRes;\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: {\n\t\t\tmode: \"resumable\",\n\t\t\tkey: uploadKey,\n\t\t\tsessionId,\n\t\t\tpartSize: sessionRes.data.partSize,\n\t\t\texpiresAt,\n\t\t\tuploadedParts: sessionRes.data.uploadedParts,\n\t\t},\n\t};\n};\n\nexport default createUploadSession;\n"],"mappings":"sgBAcA,MAAM,MACE,WAAW,OAAO,WAAW,EAG/B,EAYF,MAAO,EAAS,IAAS,CAC5B,GAAI,CAAC,EAAQ,MACZ,MAAO,CACN,MAAO,CACN,KAAM,QACN,OAAQ,IACR,QAAS,EAAK,wCAAwC,CACvD,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAU,MAAM,EAAmB,EAAS,CACjD,KAAM,EAAK,IACZ,CAAC,EACD,GAAI,EAAQ,MAAO,OAAO,EAE1B,IAAM,EAAY,EAAK,UAAU,EAAK,QAAQ,EAExC,EAAS,EAAY,CAC1B,KAAM,EAAK,SACX,OAAQ,EAAK,OACb,UAAW,EAAQ,QAAQ,WAAa,KACxC,UAAW,EAAK,SACjB,CAAC,EACD,GAAI,EAAO,MAAO,OAAO,EAEzB,IAAM,EAAS,EACd,EAAQ,OACR,EAAQ,QAAQ,WAAa,IAC9B,EAEM,EAAa,MAAM,EAAQ,MAAM,oBAAoB,EAAS,CACnE,IAAK,EAAO,KACZ,KAAM,EAAW,CAAO,EACxB,UAAW,EAAQ,OAAO,QAAQ,OAClC,SAAU,EAAK,SACf,UAAW,GAAa,IAAA,GACxB,KAAM,EAAK,KACX,QACD,CAAC,EACD,GAAI,EAAW,MACd,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAW,MAAM,QAC1B,OAAQ,IACR,OAAQ,CACP,KAAM,CACL,KAAM,cACN,QAAS,EAAW,MAAM,OAC3B,CACD,CACD,EACA,KAAM,IAAA,EACP,EAED,IAAM,EAAY,EAAW,KAAK,IAElC,GAAI,EAAW,KAAK,OAAS,SAAU,CAKtC,IAAM,EAAkB,MAAM,IAJA,EAC7B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAE8B,CAAC,CAAC,aAAa,CAC5D,KAAM,CACL,IAAK,EACL,UAAW,IAAI,KAAK,CAAA,CAAE,YAAY,CACnC,EACA,UAAW,CAAC,KAAK,EACjB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EAGD,OAFI,EAAgB,MAAc,EAE3B,CACN,MAAO,IAAA,GACP,KAAM,CACL,KAAM,SACN,IAAK,EACL,IAAK,EAAW,KAAK,IACrB,QAAS,EAAW,KAAK,OAC1B,CACD,CACD,CAEA,IAAM,EAAsB,IAAI,EAC/B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EACM,EAAY,EAAgB,EAC5B,EAAM,IAAI,KAAK,CAAA,CAAE,YAAY,EAC7B,EACL,EAAW,KAAK,WAChB,EACC,IAAI,KACJA,EAAU,uBACX,CAAC,CAAC,YAAY,EAET,EAAY,MAAM,EAAoB,aAAa,CACxD,KAAM,CACL,WAAY,EACZ,IAAK,EACL,YAAa,EAAQ,MAAM,IAC3B,kBAAmB,EAAW,KAAK,SACnC,KAAM,YACN,OAAQ,SACR,UAAW,EAAK,SAChB,UAAW,EAAK,SAChB,eAAgB,GAAa,KAC7B,UAAW,EAAK,KAChB,UAAW,EAAW,KAAK,SAC3B,WAAY,EAAK,OACjB,WAAY,EACZ,WAAY,EACZ,WAAY,CACb,EACA,UAAW,CAAC,YAAY,EACxB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EAGD,OAFI,EAAU,MAAc,EAErB,CACN,MAAO,IAAA,GACP,KAAM,CACL,KAAM,YACN,IAAK,EACL,YACA,SAAU,EAAW,KAAK,SAC1B,YACA,cAAe,EAAW,KAAK,aAChC,CACD,CACD"}