payload-plugin-newsletter 0.22.0 → 0.23.0

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 CHANGED
@@ -1,3 +1,16 @@
1
+ ## [0.23.0] - 2025-08-07
2
+
3
+ ### Added
4
+ - **Complete webhook sync for Broadcast subscribers**: Added support for three new webhook events
5
+ - `subscriber.created`: Syncs new subscribers created in Broadcast interface to Payload
6
+ - `subscriber.updated`: Syncs subscriber updates from Broadcast to Payload
7
+ - `subscriber.deleted`: Removes subscribers from Payload when deleted in Broadcast
8
+ - **Bidirectional sync**: Now provides complete two-way synchronization between Broadcast and Payload
9
+
10
+ ### Changed
11
+ - Enhanced webhook event handling to support all subscriber lifecycle events
12
+ - Improved logging for better webhook debugging
13
+
1
14
  ## [0.22.0] - 2025-08-07
2
15
 
3
16
  ### Changed
package/dist/server.js CHANGED
@@ -2442,6 +2442,9 @@ function verifyBroadcastWebhookSignature(payload, signature, timestamp, secret)
2442
2442
  // src/types/webhooks.ts
2443
2443
  var WEBHOOK_EVENT_TYPES = {
2444
2444
  // Subscriber events
2445
+ SUBSCRIBER_CREATED: "subscriber.created",
2446
+ SUBSCRIBER_UPDATED: "subscriber.updated",
2447
+ SUBSCRIBER_DELETED: "subscriber.deleted",
2445
2448
  SUBSCRIBER_SUBSCRIBED: "subscriber.subscribed",
2446
2449
  SUBSCRIBER_UNSUBSCRIBED: "subscriber.unsubscribed",
2447
2450
  // Broadcast events
@@ -2469,6 +2472,15 @@ async function handleSubscriberEvent(event, req, config) {
2469
2472
  const { payload } = req;
2470
2473
  const subscribersSlug = config.subscribersSlug || "subscribers";
2471
2474
  switch (event.type) {
2475
+ case WEBHOOK_EVENT_TYPES.SUBSCRIBER_CREATED:
2476
+ await handleSubscriberCreated(event, payload, subscribersSlug);
2477
+ break;
2478
+ case WEBHOOK_EVENT_TYPES.SUBSCRIBER_UPDATED:
2479
+ await handleSubscriberUpdated(event, payload, subscribersSlug);
2480
+ break;
2481
+ case WEBHOOK_EVENT_TYPES.SUBSCRIBER_DELETED:
2482
+ await handleSubscriberDeleted(event, payload, subscribersSlug);
2483
+ break;
2472
2484
  case WEBHOOK_EVENT_TYPES.SUBSCRIBER_SUBSCRIBED:
2473
2485
  await handleSubscriberSubscribed(event, payload, subscribersSlug);
2474
2486
  break;
@@ -2557,6 +2569,110 @@ async function handleSubscriberUnsubscribed(event, payload, subscribersSlug) {
2557
2569
  throw error;
2558
2570
  }
2559
2571
  }
2572
+ async function handleSubscriberCreated(event, payload, subscribersSlug) {
2573
+ const { data } = event;
2574
+ try {
2575
+ const existing = await payload.find({
2576
+ collection: subscribersSlug,
2577
+ where: {
2578
+ email: {
2579
+ equals: data.email
2580
+ }
2581
+ },
2582
+ limit: 1
2583
+ });
2584
+ if (existing.docs.length > 0) {
2585
+ const subscriber = existing.docs[0];
2586
+ await payload.update({
2587
+ collection: subscribersSlug,
2588
+ id: subscriber.id,
2589
+ data: {
2590
+ name: data.name || subscriber.name,
2591
+ externalId: data.id,
2592
+ source: data.source || subscriber.source,
2593
+ // Don't change subscription status on created event
2594
+ ...data.attributes && { attributes: data.attributes }
2595
+ }
2596
+ });
2597
+ console.log("[Subscriber Handler] Updated existing subscriber on created event:", data.email);
2598
+ } else {
2599
+ await payload.create({
2600
+ collection: subscribersSlug,
2601
+ data: {
2602
+ email: data.email,
2603
+ name: data.name,
2604
+ subscriptionStatus: "pending",
2605
+ // New subscribers start as pending
2606
+ externalId: data.id,
2607
+ source: data.source,
2608
+ attributes: data.attributes || {}
2609
+ }
2610
+ });
2611
+ console.log("[Subscriber Handler] Created new subscriber:", data.email);
2612
+ }
2613
+ } catch (error) {
2614
+ console.error("[Subscriber Handler] Error handling created event:", error);
2615
+ throw error;
2616
+ }
2617
+ }
2618
+ async function handleSubscriberUpdated(event, payload, subscribersSlug) {
2619
+ const { data } = event;
2620
+ try {
2621
+ const existing = await payload.find({
2622
+ collection: subscribersSlug,
2623
+ where: {
2624
+ email: {
2625
+ equals: data.email
2626
+ }
2627
+ },
2628
+ limit: 1
2629
+ });
2630
+ if (existing.docs.length > 0) {
2631
+ const subscriber = existing.docs[0];
2632
+ await payload.update({
2633
+ collection: subscribersSlug,
2634
+ id: subscriber.id,
2635
+ data: {
2636
+ name: data.name || subscriber.name,
2637
+ ...data.attributes && { attributes: data.attributes }
2638
+ }
2639
+ });
2640
+ console.log("[Subscriber Handler] Updated subscriber:", data.email);
2641
+ } else {
2642
+ console.warn("[Subscriber Handler] Subscriber not found for update:", data.email);
2643
+ }
2644
+ } catch (error) {
2645
+ console.error("[Subscriber Handler] Error handling updated event:", error);
2646
+ throw error;
2647
+ }
2648
+ }
2649
+ async function handleSubscriberDeleted(event, payload, subscribersSlug) {
2650
+ const { data } = event;
2651
+ try {
2652
+ const existing = await payload.find({
2653
+ collection: subscribersSlug,
2654
+ where: {
2655
+ email: {
2656
+ equals: data.email
2657
+ }
2658
+ },
2659
+ limit: 1
2660
+ });
2661
+ if (existing.docs.length > 0) {
2662
+ const subscriber = existing.docs[0];
2663
+ await payload.delete({
2664
+ collection: subscribersSlug,
2665
+ id: subscriber.id
2666
+ });
2667
+ console.log("[Subscriber Handler] Deleted subscriber:", data.email);
2668
+ } else {
2669
+ console.warn("[Subscriber Handler] Subscriber not found for deletion:", data.email);
2670
+ }
2671
+ } catch (error) {
2672
+ console.error("[Subscriber Handler] Error handling deleted event:", error);
2673
+ throw error;
2674
+ }
2675
+ }
2560
2676
 
2561
2677
  // src/webhooks/handlers/broadcast.ts
2562
2678
  var STATUS_MAP = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-plugin-newsletter",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "Complete newsletter management plugin for Payload CMS with subscriber management, magic link authentication, and email service integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",