payload-plugin-newsletter 0.16.5 → 0.16.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/collections.cjs +120 -119
- package/dist/collections.cjs.map +1 -1
- package/dist/collections.js +120 -119
- package/dist/collections.js.map +1 -1
- package/dist/index.cjs +120 -119
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +120 -119
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4372,58 +4372,130 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
4372
4372
|
}
|
|
4373
4373
|
],
|
|
4374
4374
|
hooks: {
|
|
4375
|
-
// Sync with provider on create
|
|
4375
|
+
// Sync with provider on create and update
|
|
4376
4376
|
afterChange: [
|
|
4377
|
-
async ({ doc, operation, req }) => {
|
|
4378
|
-
if (!hasProviders
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4377
|
+
async ({ doc, operation, req, previousDoc }) => {
|
|
4378
|
+
if (!hasProviders) return doc;
|
|
4379
|
+
if (operation === "create") {
|
|
4380
|
+
try {
|
|
4381
|
+
const providerConfig = await getBroadcastConfig(req, pluginConfig);
|
|
4382
|
+
if (!providerConfig || !providerConfig.token) {
|
|
4383
|
+
req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
|
|
4384
|
+
return doc;
|
|
4385
|
+
}
|
|
4386
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await Promise.resolve().then(() => (init_broadcast2(), broadcast_exports));
|
|
4387
|
+
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4388
|
+
const htmlContent = await convertToEmailSafeHtml(doc.contentSection?.content);
|
|
4389
|
+
const providerBroadcast = await provider.create({
|
|
4390
|
+
name: doc.subject,
|
|
4391
|
+
// Use subject as name since we removed the name field
|
|
4392
|
+
subject: doc.subject,
|
|
4393
|
+
preheader: doc.contentSection?.preheader,
|
|
4394
|
+
content: htmlContent,
|
|
4395
|
+
trackOpens: doc.settings?.trackOpens,
|
|
4396
|
+
trackClicks: doc.settings?.trackClicks,
|
|
4397
|
+
replyTo: doc.settings?.replyTo || providerConfig.replyTo,
|
|
4398
|
+
audienceIds: doc.audienceIds?.map((a) => a.audienceId)
|
|
4399
|
+
});
|
|
4400
|
+
await req.payload.update({
|
|
4401
|
+
collection: "broadcasts",
|
|
4402
|
+
id: doc.id,
|
|
4403
|
+
data: {
|
|
4404
|
+
providerId: providerBroadcast.id,
|
|
4405
|
+
providerData: providerBroadcast.providerData
|
|
4406
|
+
},
|
|
4407
|
+
req
|
|
4408
|
+
});
|
|
4409
|
+
return {
|
|
4410
|
+
...doc,
|
|
4403
4411
|
providerId: providerBroadcast.id,
|
|
4404
4412
|
providerData: providerBroadcast.providerData
|
|
4405
|
-
}
|
|
4406
|
-
|
|
4413
|
+
};
|
|
4414
|
+
} catch (error) {
|
|
4415
|
+
if (error instanceof Error) {
|
|
4416
|
+
req.payload.logger.error("Failed to create broadcast in provider:", {
|
|
4417
|
+
message: error.message,
|
|
4418
|
+
stack: error.stack,
|
|
4419
|
+
name: error.name,
|
|
4420
|
+
// If it's a BroadcastProviderError, it might have additional details
|
|
4421
|
+
...error.details
|
|
4422
|
+
});
|
|
4423
|
+
} else {
|
|
4424
|
+
req.payload.logger.error("Failed to create broadcast in provider:", error);
|
|
4425
|
+
}
|
|
4426
|
+
return doc;
|
|
4427
|
+
}
|
|
4428
|
+
}
|
|
4429
|
+
if (operation === "update" && doc.providerId) {
|
|
4430
|
+
req.payload.logger.info("Broadcast afterChange update hook triggered", {
|
|
4431
|
+
operation,
|
|
4432
|
+
hasProviderId: !!doc.providerId,
|
|
4433
|
+
sendStatus: doc.sendStatus,
|
|
4434
|
+
publishStatus: doc._status
|
|
4407
4435
|
});
|
|
4408
|
-
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
}
|
|
4422
|
-
|
|
4423
|
-
|
|
4436
|
+
try {
|
|
4437
|
+
const providerConfig = await getBroadcastConfig(req, pluginConfig);
|
|
4438
|
+
if (!providerConfig || !providerConfig.token) {
|
|
4439
|
+
req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
|
|
4440
|
+
return doc;
|
|
4441
|
+
}
|
|
4442
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await Promise.resolve().then(() => (init_broadcast2(), broadcast_exports));
|
|
4443
|
+
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4444
|
+
const capabilities = provider.getCapabilities();
|
|
4445
|
+
const sendStatus = doc.sendStatus || "draft" /* DRAFT */;
|
|
4446
|
+
if (!capabilities.editableStatuses.includes(sendStatus)) {
|
|
4447
|
+
req.payload.logger.info(`Skipping sync for broadcast in status: ${sendStatus}`);
|
|
4448
|
+
return doc;
|
|
4449
|
+
}
|
|
4450
|
+
const contentChanged = doc.subject !== previousDoc?.subject || doc.contentSection?.preheader !== previousDoc?.contentSection?.preheader || JSON.stringify(doc.contentSection?.content) !== JSON.stringify(previousDoc?.contentSection?.content) || doc.settings?.trackOpens !== previousDoc?.settings?.trackOpens || doc.settings?.trackClicks !== previousDoc?.settings?.trackClicks || doc.settings?.replyTo !== previousDoc?.settings?.replyTo || JSON.stringify(doc.audienceIds) !== JSON.stringify(previousDoc?.audienceIds);
|
|
4451
|
+
if (contentChanged) {
|
|
4452
|
+
const updates = {};
|
|
4453
|
+
if (doc.subject !== previousDoc?.subject) {
|
|
4454
|
+
updates.name = doc.subject;
|
|
4455
|
+
updates.subject = doc.subject;
|
|
4456
|
+
}
|
|
4457
|
+
if (doc.contentSection?.preheader !== previousDoc?.contentSection?.preheader) {
|
|
4458
|
+
updates.preheader = doc.contentSection?.preheader;
|
|
4459
|
+
}
|
|
4460
|
+
if (JSON.stringify(doc.contentSection?.content) !== JSON.stringify(previousDoc?.contentSection?.content)) {
|
|
4461
|
+
updates.content = await convertToEmailSafeHtml(doc.contentSection?.content);
|
|
4462
|
+
}
|
|
4463
|
+
if (doc.settings?.trackOpens !== previousDoc?.settings?.trackOpens) {
|
|
4464
|
+
updates.trackOpens = doc.settings.trackOpens;
|
|
4465
|
+
}
|
|
4466
|
+
if (doc.settings?.trackClicks !== previousDoc?.settings?.trackClicks) {
|
|
4467
|
+
updates.trackClicks = doc.settings.trackClicks;
|
|
4468
|
+
}
|
|
4469
|
+
if (doc.settings?.replyTo !== previousDoc?.settings?.replyTo) {
|
|
4470
|
+
updates.replyTo = doc.settings.replyTo || providerConfig.replyTo;
|
|
4471
|
+
}
|
|
4472
|
+
if (JSON.stringify(doc.audienceIds) !== JSON.stringify(previousDoc?.audienceIds)) {
|
|
4473
|
+
updates.audienceIds = doc.audienceIds?.map((a) => a.audienceId);
|
|
4474
|
+
}
|
|
4475
|
+
req.payload.logger.info("Syncing broadcast updates to provider", {
|
|
4476
|
+
providerId: doc.providerId,
|
|
4477
|
+
updates
|
|
4478
|
+
});
|
|
4479
|
+
await provider.update(doc.providerId, updates);
|
|
4480
|
+
req.payload.logger.info(`Broadcast ${doc.id} synced to provider successfully`);
|
|
4481
|
+
} else {
|
|
4482
|
+
req.payload.logger.info("No content changes to sync to provider");
|
|
4483
|
+
}
|
|
4484
|
+
} catch (error) {
|
|
4485
|
+
if (error instanceof Error) {
|
|
4486
|
+
req.payload.logger.error("Failed to sync broadcast update to provider:", {
|
|
4487
|
+
message: error.message,
|
|
4488
|
+
stack: error.stack,
|
|
4489
|
+
name: error.name,
|
|
4490
|
+
// If it's a BroadcastProviderError, it might have additional details
|
|
4491
|
+
...error.details
|
|
4492
|
+
});
|
|
4493
|
+
} else {
|
|
4494
|
+
req.payload.logger.error("Failed to sync broadcast update to provider:", error);
|
|
4495
|
+
}
|
|
4424
4496
|
}
|
|
4425
|
-
return doc;
|
|
4426
4497
|
}
|
|
4498
|
+
return doc;
|
|
4427
4499
|
},
|
|
4428
4500
|
// Hook to send when published
|
|
4429
4501
|
async ({ doc, operation, previousDoc, req }) => {
|
|
@@ -4481,79 +4553,8 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
4481
4553
|
return doc;
|
|
4482
4554
|
}
|
|
4483
4555
|
],
|
|
4484
|
-
//
|
|
4485
|
-
beforeChange: [
|
|
4486
|
-
async ({ data, originalDoc, operation, req }) => {
|
|
4487
|
-
if (!hasProviders || !originalDoc?.providerId || operation !== "update") return data;
|
|
4488
|
-
req.payload.logger.info("Broadcast beforeChange update hook triggered", {
|
|
4489
|
-
operation,
|
|
4490
|
-
hasProviderId: !!originalDoc?.providerId,
|
|
4491
|
-
originalSendStatus: originalDoc?.sendStatus,
|
|
4492
|
-
originalPublishStatus: originalDoc?._status,
|
|
4493
|
-
newSendStatus: data?.sendStatus,
|
|
4494
|
-
newPublishStatus: data?._status
|
|
4495
|
-
});
|
|
4496
|
-
try {
|
|
4497
|
-
const providerConfig = await getBroadcastConfig(req, pluginConfig);
|
|
4498
|
-
if (!providerConfig || !providerConfig.token) {
|
|
4499
|
-
req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
|
|
4500
|
-
return data;
|
|
4501
|
-
}
|
|
4502
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await Promise.resolve().then(() => (init_broadcast2(), broadcast_exports));
|
|
4503
|
-
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4504
|
-
const capabilities = provider.getCapabilities();
|
|
4505
|
-
const sendStatus = originalDoc.sendStatus || "draft" /* DRAFT */;
|
|
4506
|
-
if (!capabilities.editableStatuses.includes(sendStatus)) {
|
|
4507
|
-
req.payload.logger.info(`Skipping sync for broadcast in status: ${sendStatus}`);
|
|
4508
|
-
return data;
|
|
4509
|
-
}
|
|
4510
|
-
const updates = {};
|
|
4511
|
-
if (data.subject !== originalDoc.subject) {
|
|
4512
|
-
updates.name = data.subject;
|
|
4513
|
-
updates.subject = data.subject;
|
|
4514
|
-
}
|
|
4515
|
-
if (data.contentSection?.preheader !== originalDoc.contentSection?.preheader) updates.preheader = data.contentSection?.preheader;
|
|
4516
|
-
if (data.contentSection?.content !== originalDoc.contentSection?.content) {
|
|
4517
|
-
updates.content = await convertToEmailSafeHtml(data.contentSection?.content);
|
|
4518
|
-
}
|
|
4519
|
-
if (data.settings?.trackOpens !== originalDoc.settings?.trackOpens) {
|
|
4520
|
-
updates.trackOpens = data.settings.trackOpens;
|
|
4521
|
-
}
|
|
4522
|
-
if (data.settings?.trackClicks !== originalDoc.settings?.trackClicks) {
|
|
4523
|
-
updates.trackClicks = data.settings.trackClicks;
|
|
4524
|
-
}
|
|
4525
|
-
if (data.settings?.replyTo !== originalDoc.settings?.replyTo) {
|
|
4526
|
-
updates.replyTo = data.settings.replyTo || providerConfig.replyTo;
|
|
4527
|
-
}
|
|
4528
|
-
if (JSON.stringify(data.audienceIds) !== JSON.stringify(originalDoc.audienceIds)) {
|
|
4529
|
-
updates.audienceIds = data.audienceIds?.map((a) => a.audienceId);
|
|
4530
|
-
}
|
|
4531
|
-
if (Object.keys(updates).length > 0) {
|
|
4532
|
-
req.payload.logger.info("Syncing broadcast updates to provider", {
|
|
4533
|
-
providerId: originalDoc.providerId,
|
|
4534
|
-
updates
|
|
4535
|
-
});
|
|
4536
|
-
await provider.update(originalDoc.providerId, updates);
|
|
4537
|
-
req.payload.logger.info("Successfully synced broadcast updates to provider");
|
|
4538
|
-
} else {
|
|
4539
|
-
req.payload.logger.info("No broadcast updates to sync to provider");
|
|
4540
|
-
}
|
|
4541
|
-
} catch (error) {
|
|
4542
|
-
if (error instanceof Error) {
|
|
4543
|
-
req.payload.logger.error("Failed to update broadcast in provider:", {
|
|
4544
|
-
message: error.message,
|
|
4545
|
-
stack: error.stack,
|
|
4546
|
-
name: error.name,
|
|
4547
|
-
// If it's a BroadcastProviderError, it might have additional details
|
|
4548
|
-
...error.details
|
|
4549
|
-
});
|
|
4550
|
-
} else {
|
|
4551
|
-
req.payload.logger.error("Failed to update broadcast in provider:", error);
|
|
4552
|
-
}
|
|
4553
|
-
}
|
|
4554
|
-
return data;
|
|
4555
|
-
}
|
|
4556
|
-
],
|
|
4556
|
+
// beforeChange hooks can be added here if needed
|
|
4557
|
+
beforeChange: [],
|
|
4557
4558
|
// Handle deletion
|
|
4558
4559
|
afterDelete: [
|
|
4559
4560
|
async ({ doc, req }) => {
|