@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 5.86 kB
Source Map (JSON)
{"version":3,"file":"complete-upload-session.mjs","names":[],"sources":["../../../src/services/media/complete-upload-session.ts"],"sourcesContent":["import { copy } from \"../../libs/i18n/index.js\";\nimport { hasResumableUploadSessions } from \"../../libs/media/resumable-upload-sessions.js\";\nimport {\n\tMediaAwaitingSyncRepository,\n\tMediaUploadSessionsRepository,\n} from \"../../libs/repositories/index.js\";\nimport { resolveMediaKeyTenant } from \"../../utils/media/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport checkMediaKeyAccess from \"./checks/check-media-key-access.js\";\n\nconst completeUploadSession: ServiceFn<\n\t[\n\t\t{\n\t\t\tsessionId: string;\n\t\t\tparts: Array<{\n\t\t\t\tpartNumber: number;\n\t\t\t\tetag: string;\n\t\t\t\tsize?: number;\n\t\t\t}>;\n\t\t},\n\t],\n\t{\n\t\tkey: string;\n\t}\n> = async (context, data) => {\n\tconst MediaUploadSessions = new MediaUploadSessionsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst MediaAwaitingSync = new MediaAwaitingSyncRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tconst sessionRes = await MediaUploadSessions.selectSingle({\n\t\tselect: [\"session_id\", \"key\", \"adapter_key\", \"adapter_upload_id\", \"status\"],\n\t\twhere: [\n\t\t\t{ key: \"session_id\", operator: \"=\", value: data.sessionId },\n\t\t\t{ key: \"status\", operator: \"=\", value: \"active\" },\n\t\t],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t\tdefaultError: {\n\t\t\t\tstatus: 404,\n\t\t\t},\n\t\t},\n\t});\n\tif (sessionRes.error) return sessionRes;\n\n\tconst keyAccessRes = await checkMediaKeyAccess(context, {\n\t\tkey: sessionRes.data.key,\n\t});\n\tif (keyAccessRes.error) return keyAccessRes;\n\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\tif (sessionRes.data.adapter_key !== context.media.key) {\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.upload.sessions.adapter.changed\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tif (!hasResumableUploadSessions(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(\n\t\t\t\t\t\"server:core.media.upload.sessions.resumable.not.supported\",\n\t\t\t\t),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tif (!sessionRes.data.adapter_upload_id) {\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(\n\t\t\t\t\t\"server:core.media.upload.sessions.missing.adapter.upload.id\",\n\t\t\t\t),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst completeRes = await context.media.completeUploadSession(context, {\n\t\tkey: sessionRes.data.key,\n\t\tuploadId: sessionRes.data.adapter_upload_id,\n\t\tparts: data.parts,\n\t\ttenant: resolveMediaKeyTenant(context.config, sessionRes.data.key),\n\t});\n\tif (completeRes.error) return completeRes;\n\n\tawait MediaAwaitingSync.deleteSingle({\n\t\twhere: [{ key: \"key\", operator: \"=\", value: sessionRes.data.key }],\n\t});\n\n\tconst now = new Date().toISOString();\n\tconst [awaitingSyncRes, updateSessionRes] = await Promise.all([\n\t\tMediaAwaitingSync.createSingle({\n\t\t\tdata: {\n\t\t\t\tkey: sessionRes.data.key,\n\t\t\t\ttimestamp: now,\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\tMediaUploadSessions.updateSingle({\n\t\t\twhere: [{ key: \"session_id\", operator: \"=\", value: data.sessionId }],\n\t\t\tdata: {\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tupdated_at: now,\n\t\t\t},\n\t\t\treturning: [\"session_id\"],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t}),\n\t]);\n\tif (awaitingSyncRes.error) return awaitingSyncRes;\n\tif (updateSessionRes.error) return updateSessionRes;\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: {\n\t\t\tkey: sessionRes.data.key,\n\t\t},\n\t};\n};\n\nexport default completeUploadSession;\n"],"mappings":"8YAUA,MAAM,EAcF,MAAO,EAAS,IAAS,CAC5B,IAAM,EAAsB,IAAI,EAC/B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EACM,EAAoB,IAAI,EAC7B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EAEM,EAAa,MAAM,EAAoB,aAAa,CACzD,OAAQ,CAAC,aAAc,MAAO,cAAe,oBAAqB,QAAQ,EAC1E,MAAO,CACN,CAAE,IAAK,aAAc,SAAU,IAAK,MAAO,EAAK,SAAU,EAC1D,CAAE,IAAK,SAAU,SAAU,IAAK,MAAO,QAAS,CACjD,EACA,WAAY,CACX,QAAS,GACT,aAAc,CACb,OAAQ,GACT,CACD,CACD,CAAC,EACD,GAAI,EAAW,MAAO,OAAO,EAE7B,IAAM,EAAe,MAAM,EAAoB,EAAS,CACvD,IAAK,EAAW,KAAK,GACtB,CAAC,EACD,GAAI,EAAa,MAAO,OAAO,EAE/B,GAAI,CAAC,EAAQ,MACZ,MAAO,CACN,MAAO,CACN,KAAM,QACN,OAAQ,IACR,QAAS,EAAK,wCAAwC,CACvD,EACA,KAAM,IAAA,EACP,EAED,GAAI,EAAW,KAAK,cAAgB,EAAQ,MAAM,IACjD,MAAO,CACN,MAAO,CACN,KAAM,QACN,OAAQ,IACR,QAAS,EAAK,mDAAmD,CAClE,EACA,KAAM,IAAA,EACP,EAED,GAAI,CAAC,EAA2B,EAAQ,KAAK,EAC5C,MAAO,CACN,MAAO,CACN,KAAM,QACN,OAAQ,IACR,QAAS,EACR,2DACD,CACD,EACA,KAAM,IAAA,EACP,EAED,GAAI,CAAC,EAAW,KAAK,kBACpB,MAAO,CACN,MAAO,CACN,KAAM,QACN,OAAQ,IACR,QAAS,EACR,6DACD,CACD,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAc,MAAM,EAAQ,MAAM,sBAAsB,EAAS,CACtE,IAAK,EAAW,KAAK,IACrB,SAAU,EAAW,KAAK,kBAC1B,MAAO,EAAK,MACZ,OAAQ,EAAsB,EAAQ,OAAQ,EAAW,KAAK,GAAG,CAClE,CAAC,EACD,GAAI,EAAY,MAAO,OAAO,EAE9B,MAAM,EAAkB,aAAa,CACpC,MAAO,CAAC,CAAE,IAAK,MAAO,SAAU,IAAK,MAAO,EAAW,KAAK,GAAI,CAAC,CAClE,CAAC,EAED,IAAM,EAAM,IAAI,KAAK,CAAA,CAAE,YAAY,EAC7B,CAAC,EAAiB,GAAoB,MAAM,QAAQ,IAAI,CAC7D,EAAkB,aAAa,CAC9B,KAAM,CACL,IAAK,EAAW,KAAK,IACrB,UAAW,CACZ,EACA,UAAW,CAAC,KAAK,EACjB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,EAAoB,aAAa,CAChC,MAAO,CAAC,CAAE,IAAK,aAAc,SAAU,IAAK,MAAO,EAAK,SAAU,CAAC,EACnE,KAAM,CACL,OAAQ,YACR,WAAY,CACb,EACA,UAAW,CAAC,YAAY,EACxB,WAAY,CACX,QAAS,EACV,CACD,CAAC,CACF,CAAC,EAID,OAHI,EAAgB,MAAc,EAC9B,EAAiB,MAAc,EAE5B,CACN,MAAO,IAAA,GACP,KAAM,CACL,IAAK,EAAW,KAAK,GACtB,CACD,CACD"}