UNPKG

@coursebuilder/core

Version:

Core package for Course Builder

274 lines (272 loc) 8.32 kB
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