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/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 || operation !== "create") return doc;
4379
- try {
4380
- const providerConfig = await getBroadcastConfig(req, pluginConfig);
4381
- if (!providerConfig || !providerConfig.token) {
4382
- req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
4383
- return doc;
4384
- }
4385
- const { BroadcastApiProvider: BroadcastApiProvider2 } = await Promise.resolve().then(() => (init_broadcast2(), broadcast_exports));
4386
- const provider = new BroadcastApiProvider2(providerConfig);
4387
- const htmlContent = await convertToEmailSafeHtml(doc.contentSection?.content);
4388
- const providerBroadcast = await provider.create({
4389
- name: doc.subject,
4390
- // Use subject as name since we removed the name field
4391
- subject: doc.subject,
4392
- preheader: doc.contentSection?.preheader,
4393
- content: htmlContent,
4394
- trackOpens: doc.settings?.trackOpens,
4395
- trackClicks: doc.settings?.trackClicks,
4396
- replyTo: doc.settings?.replyTo || providerConfig.replyTo,
4397
- audienceIds: doc.audienceIds?.map((a) => a.audienceId)
4398
- });
4399
- await req.payload.update({
4400
- collection: "broadcasts",
4401
- id: doc.id,
4402
- data: {
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
- req
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
- return {
4409
- ...doc,
4410
- providerId: providerBroadcast.id,
4411
- providerData: providerBroadcast.providerData
4412
- };
4413
- } catch (error) {
4414
- if (error instanceof Error) {
4415
- req.payload.logger.error("Failed to create broadcast in provider:", {
4416
- message: error.message,
4417
- stack: error.stack,
4418
- name: error.name,
4419
- // If it's a BroadcastProviderError, it might have additional details
4420
- ...error.details
4421
- });
4422
- } else {
4423
- req.payload.logger.error("Failed to create broadcast in provider:", error);
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
- // Sync updates with provider
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 }) => {