2023-04-06 07:26:56 +00:00
|
|
|
import { router } from "../trpc/trpc-server";
|
|
|
|
import { protectedClientProcedure } from "../trpc/protected-client-procedure";
|
2023-05-05 06:15:47 +00:00
|
|
|
|
2023-04-06 07:26:56 +00:00
|
|
|
import { MailchimpClientOAuth } from "./mailchimp-client";
|
|
|
|
import { MailchimpConfigSettingsManager } from "./mailchimp-config-settings-manager";
|
|
|
|
import { TRPCError } from "@trpc/server";
|
|
|
|
import { z } from "zod";
|
2023-05-05 06:15:47 +00:00
|
|
|
import { createLogger } from "@saleor/apps-shared";
|
2023-04-06 07:26:56 +00:00
|
|
|
|
|
|
|
const AddContactSchema = z.object({
|
|
|
|
listId: z.string().min(1),
|
|
|
|
contact: z.object({
|
|
|
|
email: z.string().email().min(2),
|
|
|
|
}),
|
|
|
|
});
|
|
|
|
|
|
|
|
const BulkAddContactsSchema = z.object({
|
|
|
|
contacts: z.array(
|
|
|
|
z.object({
|
|
|
|
email: z.string().email().min(2),
|
|
|
|
firstName: z.string().optional(),
|
|
|
|
lastName: z.string().optional(),
|
|
|
|
tags: z.array(z.string()).optional(),
|
|
|
|
})
|
|
|
|
),
|
|
|
|
listId: z.string().min(1),
|
|
|
|
});
|
|
|
|
|
|
|
|
const mailchimpAudienceRouter = router({
|
|
|
|
getLists: protectedClientProcedure.query(async ({ ctx }) => {
|
|
|
|
const config = await new MailchimpConfigSettingsManager(ctx.apiClient).getConfig();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* TODO extract mailchimp API readiness shared class
|
|
|
|
*/
|
|
|
|
if (!config) {
|
|
|
|
throw new TRPCError({
|
|
|
|
code: "FORBIDDEN",
|
|
|
|
cause: "MAILCHIMP_CONFIG_NOT_FOUND",
|
|
|
|
message: "Couldnt restore saved Mailchimp config",
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const logger = createLogger({
|
|
|
|
context: "mailchimpConfigRouter",
|
|
|
|
saleorApiUrl: ctx.saleorApiUrl,
|
|
|
|
});
|
|
|
|
|
|
|
|
const mailchimpClient = new MailchimpClientOAuth(config.dc, config.token);
|
|
|
|
|
|
|
|
const listsResponseOrError = await mailchimpClient.fetchLists();
|
|
|
|
|
|
|
|
logger.trace(listsResponseOrError, "Fetched lists");
|
|
|
|
|
|
|
|
if ("lists" in listsResponseOrError) {
|
|
|
|
return listsResponseOrError.lists.map((l) => ({
|
|
|
|
id: l.id,
|
|
|
|
name: l.name,
|
|
|
|
members: l.stats.member_count,
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new Error("Failed fetching lists from Mailchimp");
|
|
|
|
}),
|
|
|
|
bulkAddContacts: protectedClientProcedure
|
|
|
|
.input(BulkAddContactsSchema)
|
|
|
|
.mutation(async ({ ctx, input }) => {
|
|
|
|
const logger = createLogger({
|
|
|
|
context: "mailchimpConfigRouter.bulkAddContacts",
|
|
|
|
saleorApiUrl: ctx.saleorApiUrl,
|
|
|
|
});
|
|
|
|
|
|
|
|
const config = await new MailchimpConfigSettingsManager(ctx.apiClient).getConfig();
|
|
|
|
|
|
|
|
logger.debug("Fetched config from metadata");
|
|
|
|
|
|
|
|
if (!config) {
|
|
|
|
logger.warn("Config not found");
|
|
|
|
|
|
|
|
throw new TRPCError({
|
|
|
|
code: "FORBIDDEN",
|
|
|
|
cause: "MAILCHIMP_CONFIG_NOT_FOUND",
|
|
|
|
message: "Couldnt restore saved Mailchimp config",
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const mailchimpClient = new MailchimpClientOAuth(config.dc, config.token);
|
|
|
|
|
|
|
|
logger.debug(input, "Will bulk add contacts to Mailchimp");
|
|
|
|
|
|
|
|
await mailchimpClient.batchAddContacts(input.listId, input.contacts);
|
|
|
|
}),
|
|
|
|
});
|
|
|
|
|
|
|
|
export const MailchimpAudienceRouter = {
|
|
|
|
router: mailchimpAudienceRouter,
|
|
|
|
input: {
|
|
|
|
AddContactSchema,
|
|
|
|
},
|
|
|
|
};
|