import { createLogger } from "@saleor/apps-shared"; import { sendgridConfigurationIdInputSchema, sendgridCreateConfigurationInputSchema, sendgridGetConfigurationsInputSchema, sendgridGetEventConfigurationInputSchema, sendgridUpdateApiConnectionSchema, sendgridUpdateBasicInformationSchema, sendgridUpdateEventConfigurationInputSchema, sendgridUpdateEventSchema, sendgridUpdateSenderSchema, } from "./sendgrid-config-input-schema"; import { SendgridConfigurationService } from "./get-sendgrid-configuration.service"; import { router } from "../../trpc/trpc-server"; import { protectedClientProcedure } from "../../trpc/protected-client-procedure"; import { TRPCError } from "@trpc/server"; import { getDefaultEmptyConfiguration } from "./sendgrid-config-container"; import { fetchSenders } from "../sendgrid-api"; import { updateChannelsInputSchema } from "../../channels/channel-configuration-schema"; /* * Allow access only for the dashboard users and attaches the * configuration service to the context */ const protectedWithConfigurationService = protectedClientProcedure.use(({ next, ctx }) => next({ ctx: { ...ctx, configurationService: new SendgridConfigurationService({ apiClient: ctx.apiClient, saleorApiUrl: ctx.saleorApiUrl, }), }, }) ); export const sendgridConfigurationRouter = router({ fetch: protectedWithConfigurationService.query(async ({ ctx }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug("sendgridConfigurationRouter.fetch called"); return ctx.configurationService.getConfigurationRoot(); }), getConfiguration: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridConfigurationIdInputSchema) .query(async ({ ctx, input }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.get called"); return ctx.configurationService.getConfiguration(input); }), getConfigurations: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridGetConfigurationsInputSchema) .query(async ({ ctx, input }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.getConfigurations called"); return ctx.configurationService.getConfigurations(input); }), createConfiguration: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridCreateConfigurationInputSchema) .mutation(async ({ ctx, input }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.create called"); const newConfiguration = { ...getDefaultEmptyConfiguration(), ...input, }; return await ctx.configurationService.createConfiguration(newConfiguration); }), deleteConfiguration: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridConfigurationIdInputSchema) .mutation(async ({ ctx, input }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.delete called"); const existingConfiguration = await ctx.configurationService.getConfiguration(input); if (!existingConfiguration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } await ctx.configurationService.deleteConfiguration(input); return null; }), getEventConfiguration: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridGetEventConfigurationInputSchema) .query(async ({ ctx, input }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.getEventConfiguration or create called"); const configuration = await ctx.configurationService.getConfiguration({ id: input.configurationId, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } const event = configuration.events.find((e) => e.eventType === input.eventType); if (!event) { throw new TRPCError({ code: "BAD_REQUEST", message: "Event configuration not found", }); } return event; }), updateEventConfiguration: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateEventConfigurationInputSchema) .mutation(async ({ ctx, input }) => { const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.updateEventConfiguration or create called"); const configuration = await ctx.configurationService.getConfiguration({ id: input.configurationId, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } const eventIndex = configuration.events.findIndex((e) => e.eventType === input.eventType); configuration.events[eventIndex] = { active: input.active, eventType: input.eventType, template: input.template, }; await ctx.configurationService.updateConfiguration(configuration); return configuration; }), updateBasicInformation: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateBasicInformationSchema) .mutation(async ({ ctx, input }) => { const configuration = await ctx.configurationService.getConfiguration({ id: input.id, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } await ctx.configurationService.updateConfiguration({ ...configuration, ...input }); return configuration; }), updateApiConnection: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateApiConnectionSchema) .mutation(async ({ ctx, input }) => { const configuration = await ctx.configurationService.getConfiguration({ id: input.id, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } await ctx.configurationService.updateConfiguration({ ...configuration, ...input }); return configuration; }), updateSender: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateSenderSchema) .mutation(async ({ ctx, input }) => { const configuration = await ctx.configurationService.getConfiguration({ id: input.id, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } // Pull fresh sender data from the API const senders = await fetchSenders({ apiKey: configuration.apiKey })(); const chosenSender = senders.find((s) => s.value === input.sender); if (!chosenSender) { throw new TRPCError({ code: "BAD_REQUEST", message: "Sender does not exist", }); } await ctx.configurationService.updateConfiguration({ ...configuration, ...input, senderEmail: chosenSender.from_email, senderName: chosenSender.label, }); return configuration; }), updateChannels: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(updateChannelsInputSchema) .mutation(async ({ ctx, input }) => { const configuration = await ctx.configurationService.getConfiguration({ id: input.id, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } configuration.channels = { override: input.override, channels: input.channels, mode: input.mode, }; await ctx.configurationService.updateConfiguration(configuration); return configuration; }), updateEvent: protectedWithConfigurationService .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateEventSchema) .mutation(async ({ ctx, input }) => { const configuration = await ctx.configurationService.getConfiguration({ id: input.id, }); if (!configuration) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration not found", }); } const event = configuration.events.find((e) => e.eventType === input.eventType); if (!event) { throw new TRPCError({ code: "BAD_REQUEST", message: "Configuration event not found", }); } event.template = input.template; event.active = input.active; await ctx.configurationService.updateConfiguration(configuration); return configuration; }), });