payload-plugin-newsletter 0.22.0 → 0.24.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 +21 -0
- package/dist/client.d.ts +1 -0
- package/dist/collections.cjs +11 -0
- package/dist/collections.cjs.map +1 -1
- package/dist/collections.js +11 -0
- package/dist/collections.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.js +129 -0
- package/dist/types.d.cts +1 -0
- package/dist/types.d.ts +1 -0
- package/package.json +1 -1
package/dist/server.d.ts
CHANGED
package/dist/server.js
CHANGED
|
@@ -454,6 +454,17 @@ var createSubscribersCollection = (pluginConfig) => {
|
|
|
454
454
|
admin: {
|
|
455
455
|
description: "Where the subscriber signed up from"
|
|
456
456
|
}
|
|
457
|
+
},
|
|
458
|
+
// Import tracking
|
|
459
|
+
{
|
|
460
|
+
name: "importedFromProvider",
|
|
461
|
+
type: "checkbox",
|
|
462
|
+
defaultValue: false,
|
|
463
|
+
admin: {
|
|
464
|
+
description: "Indicates this subscriber was imported from an external provider via webhook",
|
|
465
|
+
position: "sidebar",
|
|
466
|
+
readOnly: true
|
|
467
|
+
}
|
|
457
468
|
}
|
|
458
469
|
];
|
|
459
470
|
if (pluginConfig.features?.utmTracking?.enabled) {
|
|
@@ -2442,6 +2453,9 @@ function verifyBroadcastWebhookSignature(payload, signature, timestamp, secret)
|
|
|
2442
2453
|
// src/types/webhooks.ts
|
|
2443
2454
|
var WEBHOOK_EVENT_TYPES = {
|
|
2444
2455
|
// Subscriber events
|
|
2456
|
+
SUBSCRIBER_CREATED: "subscriber.created",
|
|
2457
|
+
SUBSCRIBER_UPDATED: "subscriber.updated",
|
|
2458
|
+
SUBSCRIBER_DELETED: "subscriber.deleted",
|
|
2445
2459
|
SUBSCRIBER_SUBSCRIBED: "subscriber.subscribed",
|
|
2446
2460
|
SUBSCRIBER_UNSUBSCRIBED: "subscriber.unsubscribed",
|
|
2447
2461
|
// Broadcast events
|
|
@@ -2469,6 +2483,15 @@ async function handleSubscriberEvent(event, req, config) {
|
|
|
2469
2483
|
const { payload } = req;
|
|
2470
2484
|
const subscribersSlug = config.subscribersSlug || "subscribers";
|
|
2471
2485
|
switch (event.type) {
|
|
2486
|
+
case WEBHOOK_EVENT_TYPES.SUBSCRIBER_CREATED:
|
|
2487
|
+
await handleSubscriberCreated(event, payload, subscribersSlug);
|
|
2488
|
+
break;
|
|
2489
|
+
case WEBHOOK_EVENT_TYPES.SUBSCRIBER_UPDATED:
|
|
2490
|
+
await handleSubscriberUpdated(event, payload, subscribersSlug);
|
|
2491
|
+
break;
|
|
2492
|
+
case WEBHOOK_EVENT_TYPES.SUBSCRIBER_DELETED:
|
|
2493
|
+
await handleSubscriberDeleted(event, payload, subscribersSlug);
|
|
2494
|
+
break;
|
|
2472
2495
|
case WEBHOOK_EVENT_TYPES.SUBSCRIBER_SUBSCRIBED:
|
|
2473
2496
|
await handleSubscriberSubscribed(event, payload, subscribersSlug);
|
|
2474
2497
|
break;
|
|
@@ -2515,6 +2538,7 @@ async function handleSubscriberSubscribed(event, payload, subscribersSlug) {
|
|
|
2515
2538
|
subscriptionStatus: "active",
|
|
2516
2539
|
subscribedAt: data.subscribed_at,
|
|
2517
2540
|
externalId: data.id,
|
|
2541
|
+
importedFromProvider: true,
|
|
2518
2542
|
attributes: data.attributes || {}
|
|
2519
2543
|
}
|
|
2520
2544
|
});
|
|
@@ -2557,6 +2581,111 @@ async function handleSubscriberUnsubscribed(event, payload, subscribersSlug) {
|
|
|
2557
2581
|
throw error;
|
|
2558
2582
|
}
|
|
2559
2583
|
}
|
|
2584
|
+
async function handleSubscriberCreated(event, payload, subscribersSlug) {
|
|
2585
|
+
const { data } = event;
|
|
2586
|
+
try {
|
|
2587
|
+
const existing = await payload.find({
|
|
2588
|
+
collection: subscribersSlug,
|
|
2589
|
+
where: {
|
|
2590
|
+
email: {
|
|
2591
|
+
equals: data.email
|
|
2592
|
+
}
|
|
2593
|
+
},
|
|
2594
|
+
limit: 1
|
|
2595
|
+
});
|
|
2596
|
+
if (existing.docs.length > 0) {
|
|
2597
|
+
const subscriber = existing.docs[0];
|
|
2598
|
+
await payload.update({
|
|
2599
|
+
collection: subscribersSlug,
|
|
2600
|
+
id: subscriber.id,
|
|
2601
|
+
data: {
|
|
2602
|
+
name: data.name || subscriber.name,
|
|
2603
|
+
externalId: data.id,
|
|
2604
|
+
source: data.source || subscriber.source,
|
|
2605
|
+
// Don't change subscription status on created event
|
|
2606
|
+
...data.attributes && { attributes: data.attributes }
|
|
2607
|
+
}
|
|
2608
|
+
});
|
|
2609
|
+
console.log("[Subscriber Handler] Updated existing subscriber on created event:", data.email);
|
|
2610
|
+
} else {
|
|
2611
|
+
await payload.create({
|
|
2612
|
+
collection: subscribersSlug,
|
|
2613
|
+
data: {
|
|
2614
|
+
email: data.email,
|
|
2615
|
+
name: data.name,
|
|
2616
|
+
subscriptionStatus: "pending",
|
|
2617
|
+
// New subscribers start as pending
|
|
2618
|
+
externalId: data.id,
|
|
2619
|
+
source: data.source,
|
|
2620
|
+
importedFromProvider: true,
|
|
2621
|
+
attributes: data.attributes || {}
|
|
2622
|
+
}
|
|
2623
|
+
});
|
|
2624
|
+
console.log("[Subscriber Handler] Created new subscriber:", data.email);
|
|
2625
|
+
}
|
|
2626
|
+
} catch (error) {
|
|
2627
|
+
console.error("[Subscriber Handler] Error handling created event:", error);
|
|
2628
|
+
throw error;
|
|
2629
|
+
}
|
|
2630
|
+
}
|
|
2631
|
+
async function handleSubscriberUpdated(event, payload, subscribersSlug) {
|
|
2632
|
+
const { data } = event;
|
|
2633
|
+
try {
|
|
2634
|
+
const existing = await payload.find({
|
|
2635
|
+
collection: subscribersSlug,
|
|
2636
|
+
where: {
|
|
2637
|
+
email: {
|
|
2638
|
+
equals: data.email
|
|
2639
|
+
}
|
|
2640
|
+
},
|
|
2641
|
+
limit: 1
|
|
2642
|
+
});
|
|
2643
|
+
if (existing.docs.length > 0) {
|
|
2644
|
+
const subscriber = existing.docs[0];
|
|
2645
|
+
await payload.update({
|
|
2646
|
+
collection: subscribersSlug,
|
|
2647
|
+
id: subscriber.id,
|
|
2648
|
+
data: {
|
|
2649
|
+
name: data.name || subscriber.name,
|
|
2650
|
+
...data.attributes && { attributes: data.attributes }
|
|
2651
|
+
}
|
|
2652
|
+
});
|
|
2653
|
+
console.log("[Subscriber Handler] Updated subscriber:", data.email);
|
|
2654
|
+
} else {
|
|
2655
|
+
console.warn("[Subscriber Handler] Subscriber not found for update:", data.email);
|
|
2656
|
+
}
|
|
2657
|
+
} catch (error) {
|
|
2658
|
+
console.error("[Subscriber Handler] Error handling updated event:", error);
|
|
2659
|
+
throw error;
|
|
2660
|
+
}
|
|
2661
|
+
}
|
|
2662
|
+
async function handleSubscriberDeleted(event, payload, subscribersSlug) {
|
|
2663
|
+
const { data } = event;
|
|
2664
|
+
try {
|
|
2665
|
+
const existing = await payload.find({
|
|
2666
|
+
collection: subscribersSlug,
|
|
2667
|
+
where: {
|
|
2668
|
+
email: {
|
|
2669
|
+
equals: data.email
|
|
2670
|
+
}
|
|
2671
|
+
},
|
|
2672
|
+
limit: 1
|
|
2673
|
+
});
|
|
2674
|
+
if (existing.docs.length > 0) {
|
|
2675
|
+
const subscriber = existing.docs[0];
|
|
2676
|
+
await payload.delete({
|
|
2677
|
+
collection: subscribersSlug,
|
|
2678
|
+
id: subscriber.id
|
|
2679
|
+
});
|
|
2680
|
+
console.log("[Subscriber Handler] Deleted subscriber:", data.email);
|
|
2681
|
+
} else {
|
|
2682
|
+
console.warn("[Subscriber Handler] Subscriber not found for deletion:", data.email);
|
|
2683
|
+
}
|
|
2684
|
+
} catch (error) {
|
|
2685
|
+
console.error("[Subscriber Handler] Error handling deleted event:", error);
|
|
2686
|
+
throw error;
|
|
2687
|
+
}
|
|
2688
|
+
}
|
|
2560
2689
|
|
|
2561
2690
|
// src/webhooks/handlers/broadcast.ts
|
|
2562
2691
|
var STATUS_MAP = {
|
package/dist/types.d.cts
CHANGED
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "payload-plugin-newsletter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.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",
|