UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 6.99 kB
{"version":3,"file":"create.mjs","names":["getCollection","getClientDocument","constants"],"sources":["../../../src/services/preview-sessions/create.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport constants from \"../../constants/constants.js\";\nimport { copy } from \"../../libs/i18n/index.js\";\nimport { PreviewSessionsRepository } from \"../../libs/repositories/index.js\";\nimport type {\n\tDocumentVersionType,\n\tLucidAuth,\n\tPreviewMode,\n\tPreviewSessionURLResponse,\n} from \"../../types.js\";\nimport {\n\thashPreviewToken,\n\tnormalizePreviewUrl,\n} from \"../../utils/helpers/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport getCollection from \"../collections/get-single-instance.js\";\nimport getClientDocument from \"../documents/client/get-single.js\";\nimport validateClientVersionTarget from \"../documents/helpers/validate-client-version-target.js\";\nimport resolvePreviewMode, {\n\trequiresPinnedPreviewVersion,\n} from \"./helpers/resolve-preview-mode.js\";\n\nconst create: ServiceFn<\n\t[\n\t\t{\n\t\t\tcollectionKey: string;\n\t\t\tdocumentId: number;\n\t\t\tversionType: DocumentVersionType;\n\t\t\tversionId?: number;\n\t\t\tmode?: PreviewMode;\n\t\t\tlocale?: string;\n\t\t\tcreator: LucidAuth;\n\t\t},\n\t],\n\tPreviewSessionURLResponse\n> = async (context, data) => {\n\tconst versionTargetRes = await validateClientVersionTarget({\n\t\tversionType: data.versionType,\n\t\tversionId: data.versionId,\n\t});\n\tif (versionTargetRes.error) return versionTargetRes;\n\n\tconst modeRes = await resolvePreviewMode({\n\t\tversionType: data.versionType,\n\t\tmode: data.mode,\n\t});\n\tif (modeRes.error) return modeRes;\n\n\tconst collectionRes = getCollection(context, { key: data.collectionKey });\n\tif (collectionRes.error) return collectionRes;\n\n\tconst preview = collectionRes.data.config.preview;\n\tif (!preview) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.documents.preview.not.configured.message\"),\n\t\t\t\tstatus: 404,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst documentRes = await getClientDocument(context, {\n\t\tcollectionKey: data.collectionKey,\n\t\tversionType: data.versionType,\n\t\tversionId: versionTargetRes.data.versionId,\n\t\tquery: {\n\t\t\tfilter: { id: { value: data.documentId } },\n\t\t\tinclude: [\"bricks\", \"refs\", \"meta\"],\n\t\t},\n\t});\n\tif (documentRes.error) return documentRes;\n\n\tconst sourceVersionId = documentRes.data.meta?.versionId;\n\tif (\n\t\ttypeof sourceVersionId !== \"number\" ||\n\t\t!Number.isInteger(sourceVersionId)\n\t) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.documents.version.not.found.message\"),\n\t\t\t\tstatus: 404,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst canonicalDocument = {\n\t\t...documentRes.data,\n\t\tid: data.documentId,\n\t\tcollectionKey: data.collectionKey,\n\t\tversion: data.versionType,\n\t};\n\tconst locale =\n\t\tdata.locale?.trim() || context.config.localization.defaultLocale;\n\tconst token = randomBytes(32).toString(\"base64url\");\n\n\tlet resolvedUrl: string | URL | null;\n\ttry {\n\t\tresolvedUrl = await preview.url({\n\t\t\tdocument: canonicalDocument,\n\t\t\tenv: context.env,\n\t\t\tlocale,\n\t\t\ttenantKey: context.request.tenantKey ?? null,\n\t\t});\n\t} catch {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.documents.preview.url.invalid.message\"),\n\t\t\t\tstatus: 400,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tif (resolvedUrl === null) {\n\t\treturn { error: undefined, data: { url: null, expiresAt: null } };\n\t}\n\n\tconst expiresAt = new Date(\n\t\tDate.now() +\n\t\t\t(preview.expiresIn ??\n\t\t\t\tconstants.collectionBuilder.previewExpirationSeconds) *\n\t\t\t\t1000,\n\t).toISOString();\n\tconst normalizedUrlRes = await normalizePreviewUrl(resolvedUrl, token);\n\tif (normalizedUrlRes.error) return normalizedUrlRes;\n\tif (normalizedUrlRes.data === null) {\n\t\treturn { error: undefined, data: { url: null, expiresAt: null } };\n\t}\n\n\tconst PreviewSessions = new PreviewSessionsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst createRes = await PreviewSessions.createSingle({\n\t\tdata: {\n\t\t\ttoken_hash: hashPreviewToken(token),\n\t\t\tentry_collection_key: data.collectionKey,\n\t\t\tentry_document_id: data.documentId,\n\t\t\tentry_version_type: data.versionType,\n\t\t\tmode: modeRes.data,\n\t\t\tentry_version_id: requiresPinnedPreviewVersion(data.versionType)\n\t\t\t\t? sourceVersionId\n\t\t\t\t: null,\n\t\t\texpires_at: expiresAt,\n\t\t\tcreated_by: data.creator.id,\n\t\t\tcreated_at: new Date().toISOString(),\n\t\t},\n\t\treturning: [\"id\"],\n\t\tvalidation: { enabled: true },\n\t});\n\tif (createRes.error) return createRes;\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: { url: normalizedUrlRes.data, expiresAt },\n\t};\n};\n\nexport default create;\n"],"mappings":"8jBAsBA,MAAM,EAaF,MAAO,EAAS,IAAS,CAC5B,IAAM,EAAmB,MAAM,EAA4B,CAC1D,YAAa,EAAK,YAClB,UAAW,EAAK,SACjB,CAAC,EACD,GAAI,EAAiB,MAAO,OAAO,EAEnC,IAAM,EAAU,MAAM,EAAmB,CACxC,YAAa,EAAK,YAClB,KAAM,EAAK,IACZ,CAAC,EACD,GAAI,EAAQ,MAAO,OAAO,EAE1B,IAAM,EAAgBA,EAAc,EAAS,CAAE,IAAK,EAAK,aAAc,CAAC,EACxE,GAAI,EAAc,MAAO,OAAO,EAEhC,IAAM,EAAU,EAAc,KAAK,OAAO,QAC1C,GAAI,CAAC,EACJ,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,sDAAsD,EACpE,OAAQ,GACT,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAc,MAAMC,EAAkB,EAAS,CACpD,cAAe,EAAK,cACpB,YAAa,EAAK,YAClB,UAAW,EAAiB,KAAK,UACjC,MAAO,CACN,OAAQ,CAAE,GAAI,CAAE,MAAO,EAAK,UAAW,CAAE,EACzC,QAAS,CAAC,SAAU,OAAQ,MAAM,CACnC,CACD,CAAC,EACD,GAAI,EAAY,MAAO,OAAO,EAE9B,IAAM,EAAkB,EAAY,KAAK,MAAM,UAC/C,GACC,OAAO,GAAoB,UAC3B,CAAC,OAAO,UAAU,CAAe,EAEjC,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,iDAAiD,EAC/D,OAAQ,GACT,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAoB,CACzB,GAAG,EAAY,KACf,GAAI,EAAK,WACT,cAAe,EAAK,cACpB,QAAS,EAAK,WACf,EACM,EACL,EAAK,QAAQ,KAAK,GAAK,EAAQ,OAAO,aAAa,cAC9C,EAAQ,EAAY,EAAE,CAAC,CAAC,SAAS,WAAW,EAE9C,EACJ,GAAI,CACH,EAAc,MAAM,EAAQ,IAAI,CAC/B,SAAU,EACV,IAAK,EAAQ,IACb,SACA,UAAW,EAAQ,QAAQ,WAAa,IACzC,CAAC,CACF,MAAQ,CACP,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,mDAAmD,EACjE,OAAQ,GACT,EACA,KAAM,IAAA,EACP,CACD,CACA,GAAI,IAAgB,KACnB,MAAO,CAAE,MAAO,IAAA,GAAW,KAAM,CAAE,IAAK,KAAM,UAAW,IAAK,CAAE,EAGjE,IAAM,EAAY,IAAI,KACrB,KAAK,IAAI,GACP,EAAQ,WACRC,EAAU,kBAAkB,0BAC5B,GACH,CAAC,CAAC,YAAY,EACR,EAAmB,MAAM,EAAoB,EAAa,CAAK,EACrE,GAAI,EAAiB,MAAO,OAAO,EACnC,GAAI,EAAiB,OAAS,KAC7B,MAAO,CAAE,MAAO,IAAA,GAAW,KAAM,CAAE,IAAK,KAAM,UAAW,IAAK,CAAE,EAOjE,IAAM,EAAY,MAAM,IAJI,EAC3B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAEsB,CAAC,CAAC,aAAa,CACpD,KAAM,CACL,WAAY,EAAiB,CAAK,EAClC,qBAAsB,EAAK,cAC3B,kBAAmB,EAAK,WACxB,mBAAoB,EAAK,YACzB,KAAM,EAAQ,KACd,iBAAkB,EAA6B,EAAK,WAAW,EAC5D,EACA,KACH,WAAY,EACZ,WAAY,EAAK,QAAQ,GACzB,WAAY,IAAI,KAAK,CAAA,CAAE,YAAY,CACpC,EACA,UAAW,CAAC,IAAI,EAChB,WAAY,CAAE,QAAS,EAAK,CAC7B,CAAC,EAGD,OAFI,EAAU,MAAc,EAErB,CACN,MAAO,IAAA,GACP,KAAM,CAAE,IAAK,EAAiB,KAAM,WAAU,CAC/C,CACD"}