@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 5.96 kB
Source Map (JSON)
{"version":3,"file":"notifications.mjs","names":["constants"],"sources":["../../../src/services/document-publish-operations/notifications.ts"],"sourcesContent":["import constants from \"../../constants/constants.js\";\nimport {\n\tAlertRecipientsRepository,\n\tAlertsRepository,\n} from \"../../libs/repositories/index.js\";\nimport type { ErrorCopy } from \"../../types/errors.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport sendEmail from \"../email/send-email.js\";\n\nexport type PublishOperationNotificationRecipient = {\n\tid: number;\n\temail: string | null;\n};\n\ntype PublishOperationNotificationDetail = {\n\tlabel: ErrorCopy;\n\tvalue: string | number | Date | null | undefined;\n};\n\nconst formatNotificationDetailValue = (\n\tvalue: PublishOperationNotificationDetail[\"value\"],\n) => {\n\tif (value instanceof Date) return value.toISOString();\n\treturn String(value);\n};\n\nconst notifyPublishOperationUsers: ServiceFn<\n\t[\n\t\t{\n\t\t\toperationId: number;\n\t\t\tcollectionKey: string;\n\t\t\tdocumentId: number;\n\t\t\trecipients: PublishOperationNotificationRecipient[];\n\t\t\ttitle: ErrorCopy;\n\t\t\tmessage: ErrorCopy;\n\t\t\tdedupeAction: string;\n\t\t\tcomment?: {\n\t\t\t\tlabel: ErrorCopy;\n\t\t\t\tvalue: string | null | undefined;\n\t\t\t\thtml: string | null | undefined;\n\t\t\t};\n\t\t\tdetails?: PublishOperationNotificationDetail[];\n\t\t},\n\t],\n\tundefined\n> = async (context, data) => {\n\tconst uniqueRecipients = Array.from(\n\t\tnew Map(\n\t\t\tdata.recipients.map((recipient) => [recipient.id, recipient]),\n\t\t).values(),\n\t);\n\tif (uniqueRecipients.length === 0) {\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst Alerts = new AlertsRepository(context.db.client, context.config.db);\n\tconst AlertRecipients = new AlertRecipientsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst title = context.translate(data.title) ?? \"\";\n\tconst message = context.translate(data.message);\n\tconst details = (data.details ?? [])\n\t\t.filter((detail) => detail.value !== null && detail.value !== undefined)\n\t\t.map((detail) => ({\n\t\t\tlabel: context.translate(detail.label) ?? \"\",\n\t\t\tvalue: formatNotificationDetailValue(detail.value),\n\t\t}));\n\tconst comment = data.comment?.value?.trim() || null;\n\tconst commentHtml = data.comment?.html?.trim() || null;\n\tconst commentLabel = data.comment\n\t\t? context.translate(data.comment.label)\n\t\t: undefined;\n\n\tconst alertRes = await Alerts.createSingle({\n\t\tdata: {\n\t\t\ttype: constants.alerts.publishRequest.type,\n\t\t\tlevel: \"info\",\n\t\t\tdedupe_key: `publish-request:${data.operationId}:${data.dedupeAction}`,\n\t\t\ttitle,\n\t\t\tmessage,\n\t\t\tmetadata: {\n\t\t\t\toperationId: data.operationId,\n\t\t\t\tcollectionKey: data.collectionKey,\n\t\t\t\tdocumentId: data.documentId,\n\t\t\t\taction: data.dedupeAction,\n\t\t\t\tcomment,\n\t\t\t\tdetails,\n\t\t\t},\n\t\t\temail_id: null,\n\t\t},\n\t\treturning: [\"id\"],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t},\n\t});\n\tif (alertRes.error) return alertRes;\n\n\tconst recipientRes = await AlertRecipients.createMultiple({\n\t\tdata: uniqueRecipients.map((recipient) => ({\n\t\t\talert_id: alertRes.data.id,\n\t\t\tuser_id: recipient.id,\n\t\t})),\n\t});\n\tif (recipientRes.error) return recipientRes;\n\n\tconst emailRecipients = uniqueRecipients.flatMap((recipient) =>\n\t\trecipient.email ? [recipient.email] : [],\n\t);\n\tif (emailRecipients.length > 0) {\n\t\tconst actionUrl = `/lucid/collections/${data.collectionKey}/${data.documentId}/release-requests/${data.operationId}`;\n\t\tconst emailRes = await sendEmail(context, {\n\t\t\ttype: \"internal\",\n\t\t\tto: emailRecipients,\n\t\t\tsubject: title,\n\t\t\ttemplate: constants.email.templates.publishRequest.key,\n\t\t\tdata: {\n\t\t\t\ttitle,\n\t\t\t\tmessage,\n\t\t\t\tactionUrl,\n\t\t\t\tdetails,\n\t\t\t\thasDetails: details.length > 0,\n\t\t\t\tcomment,\n\t\t\t\tcommentHtml,\n\t\t\t\tcommentLabel,\n\t\t\t},\n\t\t\tstorage: constants.email.templates.publishRequest.storage ?? undefined,\n\t\t});\n\t\tif (emailRes.error) return emailRes;\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: undefined,\n\t};\n};\n\nexport default notifyPublishOperationUsers;\n"],"mappings":"kMAmBA,MAAM,EACL,GAEI,aAAiB,KAAa,EAAM,YAAY,EAC7C,OAAO,CAAK,EAGd,EAmBF,MAAO,EAAS,IAAS,CAC5B,IAAM,EAAmB,MAAM,KAC9B,IAAI,IACH,EAAK,WAAW,IAAK,GAAc,CAAC,EAAU,GAAI,CAAS,CAAC,CAC7D,CAAC,CAAC,OAAO,CACV,EACA,GAAI,EAAiB,SAAW,EAC/B,MAAO,CACN,MAAO,IAAA,GACP,KAAM,IAAA,EACP,EAGD,IAAM,EAAS,IAAI,EAAiB,EAAQ,GAAG,OAAQ,EAAQ,OAAO,EAAE,EAClE,EAAkB,IAAI,EAC3B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EACM,EAAQ,EAAQ,UAAU,EAAK,KAAK,GAAK,GACzC,EAAU,EAAQ,UAAU,EAAK,OAAO,EACxC,GAAW,EAAK,SAAW,CAAC,EAAA,CAChC,OAAQ,GAAW,EAAO,QAAU,MAAQ,EAAO,QAAU,IAAA,EAAS,CAAC,CACvE,IAAK,IAAY,CACjB,MAAO,EAAQ,UAAU,EAAO,KAAK,GAAK,GAC1C,MAAO,EAA8B,EAAO,KAAK,CAClD,EAAE,EACG,EAAU,EAAK,SAAS,OAAO,KAAK,GAAK,KACzC,EAAc,EAAK,SAAS,MAAM,KAAK,GAAK,KAC5C,EAAe,EAAK,QACvB,EAAQ,UAAU,EAAK,QAAQ,KAAK,EACpC,IAAA,GAEG,EAAW,MAAM,EAAO,aAAa,CAC1C,KAAM,CACL,KAAMA,EAAU,OAAO,eAAe,KACtC,MAAO,OACP,WAAY,mBAAmB,EAAK,YAAY,GAAG,EAAK,eACxD,QACA,UACA,SAAU,CACT,YAAa,EAAK,YAClB,cAAe,EAAK,cACpB,WAAY,EAAK,WACjB,OAAQ,EAAK,aACb,UACA,SACD,EACA,SAAU,IACX,EACA,UAAW,CAAC,IAAI,EAChB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,GAAI,EAAS,MAAO,OAAO,EAE3B,IAAM,EAAe,MAAM,EAAgB,eAAe,CACzD,KAAM,EAAiB,IAAK,IAAe,CAC1C,SAAU,EAAS,KAAK,GACxB,QAAS,EAAU,EACpB,EAAE,CACH,CAAC,EACD,GAAI,EAAa,MAAO,OAAO,EAE/B,IAAM,EAAkB,EAAiB,QAAS,GACjD,EAAU,MAAQ,CAAC,EAAU,KAAK,EAAI,CAAC,CACxC,EACA,GAAI,EAAgB,OAAS,EAAG,CAC/B,IAAM,EAAY,sBAAsB,EAAK,cAAc,GAAG,EAAK,WAAW,oBAAoB,EAAK,cACjG,EAAW,MAAM,EAAU,EAAS,CACzC,KAAM,WACN,GAAI,EACJ,QAAS,EACT,SAAUA,EAAU,MAAM,UAAU,eAAe,IACnD,KAAM,CACL,QACA,UACA,YACA,UACA,WAAY,EAAQ,OAAS,EAC7B,UACA,cACA,cACD,EACA,QAASA,EAAU,MAAM,UAAU,eAAe,SAAW,IAAA,EAC9D,CAAC,EACD,GAAI,EAAS,MAAO,OAAO,CAC5B,CAEA,MAAO,CACN,MAAO,IAAA,GACP,KAAM,IAAA,EACP,CACD"}