{
+ const body: { url: string; username: string; password: string } =
+ JSON.parse(
+ AuthService.fixedDecryption(integration.customInstanceDetails!)
+ );
+
+ const auth = Buffer.from(`${body.username}:${body.password}`).toString(
+ 'base64'
+ );
+
+ const sendBody = `
+
+
+
+
+ ${postDetails[0].message}
+
+`;
+
+ const {
+ data: { uuid: postId, id: campaignId },
+ } = await (
+ await this.fetch(body.url + '/api/campaigns', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ Authorization: `Basic ${auth}`,
+ },
+ body: JSON.stringify({
+ name: slugify(postDetails[0].settings.subject, {
+ lower: true,
+ strict: true,
+ trim: true,
+ }),
+ type: 'regular',
+ content_type: 'html',
+ subject: postDetails[0].settings.subject,
+ lists: [+postDetails[0].settings.list],
+ body: sendBody,
+ ...(+postDetails?.[0]?.settings?.template
+ ? { template_id: +postDetails[0].settings.template }
+ : {}),
+ }),
+ })
+ ).json();
+
+ await this.fetch(body.url + `/api/campaigns/${campaignId}/status`, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ Authorization: `Basic ${auth}`,
+ },
+ body: JSON.stringify({
+ status: 'running',
+ }),
+ });
+
+ return [
+ {
+ id,
+ status: 'completed',
+ releaseURL: `${body.url}/api/campaigns/${campaignId}/preview`,
+ postId,
+ },
+ ];
+ }
+}
diff --git a/libraries/nestjs-libraries/src/newsletter/newsletter.interface.ts b/libraries/nestjs-libraries/src/newsletter/newsletter.interface.ts
new file mode 100644
index 00000000..200ad05d
--- /dev/null
+++ b/libraries/nestjs-libraries/src/newsletter/newsletter.interface.ts
@@ -0,0 +1,4 @@
+export interface NewsletterInterface {
+ name: string;
+ register(email: string): Promise;
+}
\ No newline at end of file
diff --git a/libraries/nestjs-libraries/src/newsletter/newsletter.service.ts b/libraries/nestjs-libraries/src/newsletter/newsletter.service.ts
new file mode 100644
index 00000000..7980a6d0
--- /dev/null
+++ b/libraries/nestjs-libraries/src/newsletter/newsletter.service.ts
@@ -0,0 +1,20 @@
+import { newsletterProviders } from '@gitroom/nestjs-libraries/newsletter/providers';
+
+export class NewsletterService {
+ static getProvider() {
+ if (process.env.BEEHIIVE_API_KEY) {
+ return newsletterProviders.find((p) => p.name === 'beehiiv')!;
+ }
+ if (process.env.LISTMONK_API_KEY) {
+ return newsletterProviders.find((p) => p.name === 'listmonk')!;
+ }
+
+ return newsletterProviders.find((p) => p.name === 'empty')!;
+ }
+ static async register(email: string) {
+ if (email.indexOf('@') === -1) {
+ return;
+ }
+ return NewsletterService.getProvider().register(email);
+ }
+}
diff --git a/libraries/nestjs-libraries/src/newsletter/providers.ts b/libraries/nestjs-libraries/src/newsletter/providers.ts
new file mode 100644
index 00000000..c43fdca3
--- /dev/null
+++ b/libraries/nestjs-libraries/src/newsletter/providers.ts
@@ -0,0 +1,9 @@
+import { BeehiivProvider } from '@gitroom/nestjs-libraries/newsletter/providers/beehiiv.provider';
+import { EmailEmptyProvider } from '@gitroom/nestjs-libraries/newsletter/providers/email-empty.provider';
+import { ListmonkProvider } from '@gitroom/nestjs-libraries/newsletter/providers/listmonk.provider';
+
+export const newsletterProviders = [
+ new BeehiivProvider(),
+ new ListmonkProvider(),
+ new EmailEmptyProvider(),
+];
diff --git a/libraries/nestjs-libraries/src/services/newsletter.service.ts b/libraries/nestjs-libraries/src/newsletter/providers/beehiiv.provider.ts
similarity index 65%
rename from libraries/nestjs-libraries/src/services/newsletter.service.ts
rename to libraries/nestjs-libraries/src/newsletter/providers/beehiiv.provider.ts
index db2c7939..f7d0e885 100644
--- a/libraries/nestjs-libraries/src/services/newsletter.service.ts
+++ b/libraries/nestjs-libraries/src/newsletter/providers/beehiiv.provider.ts
@@ -1,13 +1,8 @@
-export class NewsletterService {
- static async register(email: string) {
- if (
- !process.env.BEEHIIVE_API_KEY ||
- !process.env.BEEHIIVE_PUBLICATION_ID ||
- process.env.NODE_ENV === 'development' ||
- email.indexOf('@') === -1
- ) {
- return;
- }
+import { NewsletterInterface } from '@gitroom/nestjs-libraries/newsletter/newsletter.interface';
+
+export class BeehiivProvider implements NewsletterInterface {
+ name = 'beehiiv';
+ async register(email: string) {
const body = {
email,
reactivate_existing: false,
diff --git a/libraries/nestjs-libraries/src/newsletter/providers/email-empty.provider.ts b/libraries/nestjs-libraries/src/newsletter/providers/email-empty.provider.ts
new file mode 100644
index 00000000..2abf9307
--- /dev/null
+++ b/libraries/nestjs-libraries/src/newsletter/providers/email-empty.provider.ts
@@ -0,0 +1,8 @@
+import { NewsletterInterface } from '@gitroom/nestjs-libraries/newsletter/newsletter.interface';
+
+export class EmailEmptyProvider implements NewsletterInterface {
+ name = 'empty';
+ async register(email: string) {
+ console.log('Could have registered to newsletter:', email);
+ }
+}
diff --git a/libraries/nestjs-libraries/src/newsletter/providers/listmonk.provider.ts b/libraries/nestjs-libraries/src/newsletter/providers/listmonk.provider.ts
new file mode 100644
index 00000000..ae022df1
--- /dev/null
+++ b/libraries/nestjs-libraries/src/newsletter/providers/listmonk.provider.ts
@@ -0,0 +1,45 @@
+import { NewsletterInterface } from '@gitroom/nestjs-libraries/newsletter/newsletter.interface';
+
+export class ListmonkProvider implements NewsletterInterface {
+ name = 'listmonk';
+ async register(email: string) {
+ const body = {
+ email,
+ status: 'enabled',
+ lists: [+process.env.LISTMONK_LIST_ID].filter((f) => f),
+ };
+
+ const authString = `${process.env.LISTMONK_USER}:${process.env.LISTMONK_API_KEY}`;
+ const headers = new Headers();
+ headers.set('Content-Type', 'application/json');
+ headers.set('Accept', 'application/json');
+ headers.set(
+ 'Authorization',
+ 'Basic ' + Buffer.from(authString).toString('base64')
+ );
+
+ try {
+ const {
+ data: { id },
+ } = await (
+ await fetch(`${process.env.LISTMONK_DOMAIN}/api/subscribers`, {
+ method: 'POST',
+ headers,
+ body: JSON.stringify(body),
+ })
+ ).json();
+
+ const welcomeEmail = {
+ subscriber_id: id,
+ template_id: +process.env.LISTMONK_WELCOME_TEMPLATE_ID,
+ subject: 'Welcome to Postiz 🚀',
+ };
+
+ await fetch(`${process.env.LISTMONK_DOMAIN}/api/tx`, {
+ method: 'POST',
+ headers,
+ body: JSON.stringify(welcomeEmail),
+ });
+ } catch (err) {}
+ }
+}