@coursebuilder/core
Version:
Core package for Course Builder
274 lines (272 loc) • 8.32 kB
JavaScript
import {
z
} from "./chunk-JLNB6NRA.js";
import {
__name
} from "./chunk-VLQXSCFN.js";
// src/providers/convertkit.ts
import { find, isEmpty } from "@coursebuilder/nodash";
function ConvertkitProvider(options) {
return {
id: "convertkit",
name: "Convertkit",
type: "email-list",
defaultListType: "form",
options,
apiKey: options.apiKey,
apiSecret: options.apiSecret,
tagSubscriber: async ({ tag, subscriberId }) => {
const subscriber = await fetchSubscriber({
convertkitId: subscriberId,
convertkitApiSecret: options.apiSecret,
convertkitApiKey: options.apiKey
});
},
getSubscriberByEmail: async (email) => {
console.log({
email
});
if (!email)
return null;
return await fetchSubscriber({
subscriberEmail: email,
convertkitApiSecret: options.apiSecret,
convertkitApiKey: options.apiKey
});
},
getSubscriber: async (subscriberId) => {
if (!subscriberId)
return null;
return await fetchSubscriber({
convertkitId: subscriberId,
convertkitApiSecret: options.apiSecret,
convertkitApiKey: options.apiKey
});
},
subscribeToList: async (subscribeOptions) => {
const { listId, user, listType, fields } = subscribeOptions;
if (!listId) {
throw new Error("No listId provided");
}
const getEndpoint = /* @__PURE__ */ __name(() => {
switch (listType) {
case "form":
return `/forms/${listId}/subscribe`;
case "sequence":
return `/sequences/${listId}/subscribe`;
case "tag":
return `/tags/${listId}/subscribe`;
}
}, "getEndpoint");
const subscriber = await subscribeToEndpoint({
endPoint: getEndpoint(),
params: {
email: user.email,
first_name: user.name,
fields: subscribeOptions.fields
},
convertkitApiKey: options.apiKey
});
const fullSubscriber = await fetchSubscriber({
convertkitId: subscriber.id.toString(),
convertkitApiKey: options.apiKey,
convertkitApiSecret: options.apiSecret
});
const fullSubscriberWithoutEmptyFields = filterNullFields(fullSubscriber);
if (fields) {
await setConvertkitSubscriberFields({
fields,
subscriber: fullSubscriber,
convertkitApiSecret: options.apiSecret,
convertkitApiKey: options.apiKey
});
}
return await fetchSubscriber({
convertkitId: subscriber.id.toString(),
convertkitApiKey: options.apiKey,
convertkitApiSecret: options.apiSecret
});
},
async updateSubscriberFields({ subscriberId, subscriberEmail, fields }) {
const subscriber = await fetchSubscriber({
convertkitId: subscriberId,
subscriberEmail,
convertkitApiKey: options.apiKey,
convertkitApiSecret: options.apiSecret
});
await setConvertkitSubscriberFields({
subscriber,
fields,
convertkitApiKey: options.apiKey,
convertkitApiSecret: options.apiSecret
});
return await fetchSubscriber({
convertkitId: subscriberId,
subscriberEmail,
convertkitApiKey: options.apiKey,
convertkitApiSecret: options.apiSecret
});
}
};
}
__name(ConvertkitProvider, "ConvertkitProvider");
var hour = 36e5;
var oneYear = 365 * 24 * hour;
var TagSubscriberResponseSchema = z.object({
subscription: z.object({
subscriber: z.object({
id: z.string(),
fields: z.record(z.string().nullable()).optional()
})
})
});
function getConvertkitSubscriberCookie(subscriber) {
return subscriber ? [
{
name: "ck_subscriber",
value: JSON.stringify(subscriber),
options: {
secure: true,
httpOnly: true,
path: "/",
maxAge: oneYear,
sameSite: "lax"
}
},
{
name: process.env.NEXT_PUBLIC_CONVERTKIT_SUBSCRIBER_KEY || "ck_subscriber_id",
value: subscriber.id,
options: {
secure: true,
httpOnly: true,
path: "/",
maxAge: 31556952,
sameSite: "lax"
}
}
] : [];
}
__name(getConvertkitSubscriberCookie, "getConvertkitSubscriberCookie");
function filterNullFields(obj) {
const filteredObj = {};
for (const key in obj) {
if (obj[key] !== null) {
if (typeof obj[key] === "object" && !Array.isArray(obj[key])) {
filteredObj[key] = filterNullFields(obj[key]);
} else {
filteredObj[key] = obj[key];
}
}
}
return filteredObj;
}
__name(filterNullFields, "filterNullFields");
var convertkitBaseUrl = "https://api.convertkit.com/v3/";
async function subscribeToEndpoint({ endPoint, params, convertkitApiKey }) {
if (!endPoint) {
throw new Error("No endPoint provided");
}
return await fetch(`${convertkitBaseUrl}${endPoint}`, {
method: "POST",
headers: {
"Content-Type": "application/json; charset=utf-8"
},
body: JSON.stringify({
...params,
api_key: convertkitApiKey
})
}).then((res) => res.json()).then(({ subscription }) => {
return subscription.subscriber;
}).catch((error) => {
console.error(error);
throw error;
});
}
__name(subscribeToEndpoint, "subscribeToEndpoint");
async function fetchSubscriber({ convertkitId, convertkitApiSecret, convertkitApiKey, subscriberEmail }) {
let subscriber;
if (convertkitId) {
const subscriberUrl = `${convertkitBaseUrl}/subscribers/${convertkitId}?api_secret=${convertkitApiSecret}`;
subscriber = await fetch(subscriberUrl).then((res) => res.json()).then(({ subscriber: subscriber2 }) => {
return subscriber2;
});
}
if (!subscriber && subscriberEmail) {
const tagsApiUrl2 = `${convertkitBaseUrl}subscribers?api_secret=${convertkitApiSecret}&email_address=${subscriberEmail.trim().toLowerCase()}`;
console.log({
tagsApiUrl: tagsApiUrl2
});
subscriber = await fetch(tagsApiUrl2).then((res) => res.json()).then((res) => {
const subscribers = res.subscribers;
return subscribers[0];
});
}
if (isEmpty(subscriber))
return;
const tagsApiUrl = `${convertkitBaseUrl}/subscribers/${subscriber.id}/tags?api_key=${convertkitApiKey}`;
const tags = await fetch(tagsApiUrl).then((res) => res.json());
return {
...subscriber,
tags
};
}
__name(fetchSubscriber, "fetchSubscriber");
async function setConvertkitSubscriberFields({ fields, subscriber, convertkitApiSecret, convertkitApiKey }) {
for (const field in fields) {
await createConvertkitCustomField({
customField: field,
subscriberId: subscriber.id.toString(),
convertkitApiSecret,
convertkitApiKey
});
}
return await fetch(`${convertkitBaseUrl}/subscribers/${subscriber.id}`, {
method: "PUT",
headers: {
"Content-Type": "application/json; charset=utf-8"
},
body: JSON.stringify({
api_secret: process.env.CONVERTKIT_API_SECRET,
fields
})
});
}
__name(setConvertkitSubscriberFields, "setConvertkitSubscriberFields");
async function createConvertkitCustomField({ customField, subscriberId, convertkitApiSecret, convertkitApiKey }) {
try {
const subscriber = await fetchSubscriber({
convertkitId: subscriberId,
convertkitApiSecret,
convertkitApiKey
});
const fieldExists = subscriber?.fields && !isEmpty(find(Object.keys(subscriber.fields), (field) => field === customField));
if (!fieldExists) {
await fetch(`${convertkitBaseUrl}/custom_fields`, {
method: "POST",
headers: {
"Content-Type": "application/json; charset=utf-8"
},
body: JSON.stringify({
api_secret: convertkitApiSecret,
label: customField
})
});
}
} catch (e) {
console.log({
e
});
console.debug(`convertkit field not created: ${customField}`);
}
}
__name(createConvertkitCustomField, "createConvertkitCustomField");
export {
ConvertkitProvider,
oneYear,
getConvertkitSubscriberCookie,
filterNullFields,
subscribeToEndpoint,
setConvertkitSubscriberFields,
createConvertkitCustomField
};
//# sourceMappingURL=chunk-YG7SUWCG.js.map