Skip to content

Commit

Permalink
Merge pull request #47 from useplunk/9-allow-campaigns-to-accept-emai…
Browse files Browse the repository at this point in the history
…ls-as-input

Added automated contact creation for campaigns
  • Loading branch information
driaug authored Aug 10, 2024
2 parents 876289b + 75dca5b commit d9a6930
Showing 1 changed file with 48 additions and 4 deletions.
52 changes: 48 additions & 4 deletions packages/api/src/controllers/v1/Campaigns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { prisma } from "../../database/prisma";
import { HttpException, NotFound } from "../../exceptions";
import { type IJwt, type ISecret, isAuthenticated, isValidSecretKey } from "../../middleware/auth";
import { CampaignService } from "../../services/CampaignService";
import { ContactService } from "../../services/ContactService";
import { EmailService } from "../../services/EmailService";
import { MembershipService } from "../../services/MembershipService";
import { ProjectService } from "../../services/ProjectService";
Expand Down Expand Up @@ -203,11 +204,33 @@ export class Campaigns {
for (let i = 0; i < recipients.length; i += chunkSize) {
const chunk = recipients.slice(i, i + chunkSize);

const recipientIds = await Promise.all(
chunk.map(async (recipient) => {
if (recipient.includes("@")) {
let contact = await ContactService.email(recipient, project.id);

if (!contact) {
contact = await prisma.contact.create({
data: {
email: recipient,
projectId: project.id,
subscribed: true,
},
});
}

return contact.id;
}

return recipient;
}),
);

await prisma.campaign.update({
where: { id: campaign.id },
data: {
recipients: {
connect: chunk.map((r: string) => ({ id: r })),
connect: recipientIds.map((id) => ({ id })),
},
},
});
Expand All @@ -230,7 +253,6 @@ export class Campaigns {
throw new NotFound("project");
}

// eslint-disable-next-line prefer-const
let { id, subject, body, recipients, style } = CampaignSchemas.update.parse(req.body);

if (recipients.length === 1 && recipients[0] === "all") {
Expand Down Expand Up @@ -280,11 +302,33 @@ export class Campaigns {
for (let i = 0; i < recipients.length; i += chunkSize) {
const chunk = recipients.slice(i, i + chunkSize);

const recipientIds = await Promise.all(
chunk.map(async (recipient) => {
if (recipient.includes("@")) {
let contact = await ContactService.email(recipient, project.id);

if (!contact) {
contact = await prisma.contact.create({
data: {
email: recipient,
projectId: project.id,
subscribed: true,
},
});
}

return contact.id;
}

return recipient;
}),
);

await prisma.campaign.update({
where: { id },
where: { id: campaign.id },
data: {
recipients: {
connect: chunk.map((r: string) => ({ id: r })),
connect: recipientIds.map((id) => ({ id })),
},
},
});
Expand Down

0 comments on commit d9a6930

Please sign in to comment.