UNPKG

@lucidcms/core

Version:

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

2 lines 9.47 kB
import{copy as e}from"../../libs/i18n/copy.mjs";import t from"../../libs/repositories/document-publish-operation-assignees.mjs";import n from"../../libs/repositories/document-publish-operations.mjs";import r from"../../libs/repositories/document-versions.mjs";import i from"../../libs/repositories/documents.mjs";import a from"../../libs/repositories/queue-jobs.mjs";import{getTableNames as o}from"../../libs/collection/schema/runtime/runtime-schema-selectors.mjs";import s from"../collections/get-single-instance.mjs";import{activePublishOperationStatuses as c,canUsePublishOperationsForTarget as l,collectionTargetSupportsScheduling as u,getReleaseRequirementTargets as d,getUnmetReleaseRequirementTargets as ee,hasCollectionPermission as f,parseScheduleInput as p,snapshotVersionType as m,unresolvedPublishOperationExecutionStatuses as h}from"./helpers/index.mjs";import g from"./helpers/create-event.mjs";import _ from"./helpers/normalize-comment.mjs";import v from"./notifications.mjs";import y from"./approve.mjs";import b from"./get-reviewers.mjs";import x from"../document-workflows/can-publish-target.mjs";import S from"../documents-versions/clone-version.mjs";const C=async(C,w)=>{let T=s(C,{key:w.collectionKey});if(T.error)return T;let E=T.data,D=E.getData.review,O=E.getData.environments.some(e=>e.key===w.target),k=l({collection:E,target:w.target}),A=k?`request`:`direct`,j=_(w.comment),M=w.autoAccept===!0,N=!k||M,P=p({scheduledAt:w.scheduledAt,scheduledTimezone:w.scheduledTimezone});if(P.error)return{error:P.error,data:void 0};let F=P.data;if(!O)return{error:{type:`basic`,message:e(`server:core.publish.requests.target.not.enabled`),status:400},data:void 0};if(!f({user:w.user,collection:E,action:`publish`}))return{error:{type:`basic`,name:e(`server:core.collections.permission.error.name`),message:e(`server:core.collections.permission.error.message`,{data:{collection:w.collectionKey,action:`publish`}}),status:403},data:void 0};if(F?.scheduledAt&&!u({collection:E,target:w.target,queueSupportsScheduling:C.queue.support.scheduling}))return{error:{type:`basic`,message:e(`server:core.publish.operations.schedule.not.supported`),status:400},data:void 0};if(k&&D?.comments.request===`required`&&!j.text)return{error:{type:`basic`,message:e(`server:core.publish.requests.request.comment.required`),status:400},data:void 0};if(k&&M&&D?.allowSelfApproval!==!0)return{error:{type:`basic`,message:e(`server:core.publish.requests.auto.accept.not.allowed`),status:403},data:void 0};if(k&&M&&!f({user:w.user,collection:E,action:`review`}))return{error:{type:`basic`,name:e(`server:core.collections.permission.error.name`),message:e(`server:core.collections.permission.error.message`,{data:{collection:w.collectionKey,action:`review`}}),status:403},data:void 0};if(k&&M&&D?.comments.decision===`required`&&!j.text)return{error:{type:`basic`,message:e(`server:core.publish.requests.decision.comment.required`),status:400},data:void 0};let I=await x(C,{collectionKey:w.collectionKey,documentId:w.documentId,target:w.target});if(I.error)return I;let L=k?await b(C,{collectionKey:w.collectionKey,target:w.target}):void 0;if(L?.error)return L;let R=new Map((L?.data??[]).map(e=>[e.id,e])),z=Array.from(new Set(w.assigneeIds??[]));if((k?z.find(e=>!R.has(e)):void 0)!==void 0)return{error:{type:`basic`,message:e(`server:core.publish.requests.invalid.assignees`),status:400},data:void 0};let B=new r(C.db.client,C.config.db),V=new i(C.db.client,C.config.db),H=new n(C.db.client,C.config.db),U=new t(C.db.client,C.config.db),W=new a(C.db.client,C.config.db),G=await o(C,w.collectionKey);if(G.error)return G;let[K,q,J]=await Promise.all([V.selectSingle({select:[`id`,`tenant_key`],where:[{key:`id`,operator:`=`,value:w.documentId},{key:`collection_key`,operator:`=`,value:w.collectionKey},{key:`is_deleted`,operator:`=`,value:C.config.db.getDefault(`boolean`,`false`)}],validation:{enabled:!0,defaultError:{message:e(`server:core.documents.not.found.message`),status:404}}},{tableName:G.data.document}),B.selectSingle({select:[`id`,`content_id`],where:[{key:`collection_key`,operator:`=`,value:w.collectionKey},{key:`document_id`,operator:`=`,value:w.documentId},{key:`type`,operator:`=`,value:`latest`}],validation:{enabled:!0,defaultError:{message:e(`server:core.documents.version.not.found.message`),status:404}}},{tableName:G.data.version}),H.selectSingle({select:[`id`,`collection_key`,`document_id`,`target`,`source_content_id`,`scheduled_job_id`],where:[{key:`collection_key`,operator:`=`,value:w.collectionKey},{key:`document_id`,operator:`=`,value:w.documentId},{key:`target`,operator:`=`,value:w.target},{key:`status`,operator:`in`,value:c},{key:`execution_status`,operator:`in`,value:h}]})]);if(K.error)return K;if(q.error)return q;if(J.error)return J;if(K.data.tenant_key&&C.request.tenantKey&&K.data.tenant_key!==C.request.tenantKey)return{error:{type:`basic`,message:e(`server:core.documents.not.found.message`),status:404},data:void 0};let Y=d({collection:E,target:w.target});if(Y.length>0){let t=await B.selectMultiple({select:[`type`,`content_id`],where:[{key:`collection_key`,operator:`=`,value:w.collectionKey},{key:`document_id`,operator:`=`,value:w.documentId},{key:`type`,operator:`in`,value:Y}]},{tableName:G.data.version});if(t.error)return t;let n=ee({collection:E,target:w.target,sourceContentId:q.data.content_id,contentIdsByTarget:new Map((t.data??[]).map(e=>[e.type,e.content_id]))});if(n.length>0)return{error:{type:`basic`,message:e(`server:core.publish.requests.requires.not.current`,{data:{target:w.target,required:n.join(`, `)}}),status:403},data:void 0}}if(J.data){let t=new Date().toISOString();if(J.data.scheduled_job_id){let e=await W.updateSingle({where:[{key:`job_id`,operator:`=`,value:J.data.scheduled_job_id}],data:{status:`cancelled`,updated_at:t}});if(e.error)return e}let[n,r]=await Promise.all([H.selectSingleDetailed({tenantKey:C.request.tenantKey,where:[{key:`lucid_document_publish_operations.id`,operator:`=`,value:J.data.id}]}),H.updateSingle({where:[{key:`id`,operator:`=`,value:J.data.id}],data:{status:`superseded`,execution_status:`cancelled`,scheduled_job_id:null,updated_at:t}})]);if(n.error)return n;if(r.error)return r;let i=await g(C,{operation:n.data??J.data,collectionInstance:E,event:{type:`superseded`,userId:w.user.id,comment:j.text,metadata:{sourceContentId:q.data.content_id}}});if(i.error)return i;if(n.data){let t=n.data.requested_by,r=n.data.requested_by_email,i=t!==null&&r!=null&&t!==w.user.id?[{id:t,email:r}]:[],a=[...n.data.assignees.map(e=>({id:e.user_id,email:e.email??null})),...i],o=await v(C,{operationId:n.data.id,collectionKey:n.data.collection_key,documentId:n.data.document_id,recipients:a,title:e(`server:core.publish.requests.replaced.title`),message:e(`server:core.publish.requests.replaced.message`,{data:{collection:w.collectionKey,documentId:w.documentId,target:w.target}}),dedupeAction:`superseded`});if(o.error)return o}}let X=await S(C,{fromVersionId:q.data.id,toVersionType:m,collectionKey:w.collectionKey,documentId:w.documentId,userId:w.user.id});if(X.error)return X;if(X.data.sourceVersionType!==`latest`)return{error:{type:`basic`,message:e(`server:core.publish.requests.snapshot.latest.only`),status:400},data:void 0};let Z=await H.createSingle({data:{collection_key:w.collectionKey,tenant_key:K.data.tenant_key,document_id:w.documentId,target:w.target,operation_type:A,status:`pending`,source_version_id:q.data.id,source_content_id:q.data.content_id,snapshot_version_id:X.data.versionId,requested_by:w.user.id,request_comment:j.value,scheduled_at:F?.scheduledAt??void 0,scheduled_timezone:F?.scheduledTimezone??null,execution_status:`awaiting_approval`},returning:[`id`],validation:{enabled:!0}});if(Z.error)return Z;if(k&&!M&&z.length>0){let e=await U.createMultiple({data:z.map(e=>({operation_id:Z.data.id,user_id:e,assigned_by:w.user.id}))});if(e.error)return e}let Q=await g(C,{operation:{id:Z.data.id,collection_key:w.collectionKey,document_id:w.documentId,target:w.target},collectionInstance:E,event:{type:`created`,userId:w.user.id,comment:j.text,metadata:{}}});if(Q.error)return Q;if(N)return await y(C,{id:Z.data.id,comment:j.value??void 0,user:w.user,bypassReviewChecks:!k,suppressRequesterNotification:!k});let te=z.map(e=>R.get(e)).filter(e=>e!==void 0).map(e=>({id:e.id,email:e.email})),$=await v(C,{operationId:Z.data.id,collectionKey:w.collectionKey,documentId:w.documentId,recipients:te,title:e(`server:core.publish.requests.created.title`),message:e(`server:core.publish.requests.created.message`,{data:{user:w.user.email,collection:w.collectionKey,documentId:w.documentId,target:w.target}}),dedupeAction:`created`,comment:{label:e(`server:core.publish.requests.email.request.comment`),value:j.text,html:j.html},details:[{label:e(`server:core.publish.requests.email.detail.release`),value:`#${Z.data.id}`},{label:e(`server:core.publish.requests.email.detail.collection`),value:w.collectionKey},{label:e(`server:core.publish.requests.email.detail.document`),value:`#${w.documentId}`},{label:e(`server:core.publish.requests.email.detail.target`),value:w.target},{label:e(`server:core.publish.requests.email.detail.requested.by`),value:w.user.email},{label:e(`server:core.publish.requests.email.detail.scheduled.for`),value:F?.scheduledAt},{label:e(`server:core.publish.requests.email.detail.scheduled.timezone`),value:F?.scheduledTimezone}]});return $.error?$:{error:void 0,data:void 0}};export{C as default}; //# sourceMappingURL=create-single.mjs.map