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 +13 -0
- package/dist/server.js +116 -0
- package/package.json +1 -1
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.
|
|
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",
|