276 lines
9.3 KiB
TypeScript
276 lines
9.3 KiB
TypeScript
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;
|
|
}),
|
|
});
|