86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import { TFunction } from "i18next";
|
|
import NotificationService from "~/modules/notifications/services/.server/NotificationService";
|
|
import { createSupportTicket } from "../db/supportTickets.db.server";
|
|
import { redactFeedbackText } from "./FeedbackRedaction.server";
|
|
|
|
const MAX_SUBJECT_LENGTH = 160;
|
|
|
|
function normalizeSubject(subject: string, message: string) {
|
|
const redactedSubject = redactFeedbackText(subject).trim();
|
|
if (redactedSubject) {
|
|
return redactedSubject.slice(0, MAX_SUBJECT_LENGTH);
|
|
}
|
|
return redactFeedbackText(message).trim().slice(0, MAX_SUBJECT_LENGTH) || "Support request";
|
|
}
|
|
|
|
async function createInline({
|
|
t,
|
|
tenantId,
|
|
userId,
|
|
subject,
|
|
message,
|
|
fromUrl,
|
|
}: {
|
|
t: TFunction;
|
|
tenantId: string | null;
|
|
userId: string | null;
|
|
subject: string;
|
|
message: string;
|
|
fromUrl: string;
|
|
}) {
|
|
const redactedMessage = redactFeedbackText(message);
|
|
const redactedFromUrl = redactFeedbackText(fromUrl);
|
|
if (!redactedMessage) {
|
|
throw Error(t("feedback.messageRequired"));
|
|
}
|
|
const ticket = await createSupportTicket({
|
|
tenantId,
|
|
userId,
|
|
source: "inline",
|
|
subject: normalizeSubject(subject, redactedMessage),
|
|
message: redactedMessage,
|
|
fromUrl: redactedFromUrl,
|
|
});
|
|
await NotificationService.sendToRoles({
|
|
channel: "admin-users",
|
|
tenantId: null,
|
|
notification: {
|
|
message: `[New Support Ticket] ${ticket.subject}`,
|
|
},
|
|
});
|
|
return ticket;
|
|
}
|
|
|
|
async function createFromInboundEmail({
|
|
tenantId,
|
|
fromEmail,
|
|
subject,
|
|
message,
|
|
inboundMessageId,
|
|
}: {
|
|
tenantId: string | null;
|
|
fromEmail: string;
|
|
subject: string;
|
|
message: string;
|
|
inboundMessageId: string;
|
|
}) {
|
|
const redactedMessage = redactFeedbackText(message);
|
|
if (!redactedMessage) {
|
|
throw Error("Message is required");
|
|
}
|
|
return await createSupportTicket({
|
|
tenantId,
|
|
userId: null,
|
|
source: "email",
|
|
subject: normalizeSubject(subject, redactedMessage),
|
|
message: redactedMessage,
|
|
fromEmail: redactFeedbackText(fromEmail),
|
|
inboundMessageId,
|
|
});
|
|
}
|
|
|
|
export default {
|
|
createInline,
|
|
createFromInboundEmail,
|
|
};
|