100 lines
2.8 KiB
TypeScript
100 lines
2.8 KiB
TypeScript
![]() |
import { router } from "../trpc/trpc-server";
|
||
|
import { protectedClientProcedure } from "../trpc/protected-client-procedure";
|
||
|
import { createLogger } from "../../lib/logger";
|
||
|
import { MailchimpClientOAuth } from "./mailchimp-client";
|
||
|
import { MailchimpConfigSettingsManager } from "./mailchimp-config-settings-manager";
|
||
|
import { TRPCError } from "@trpc/server";
|
||
|
import { z } from "zod";
|
||
|
|
||
|
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,
|
||
|
},
|
||
|
};
|