feat(api): data imports

This commit is contained in:
Isaac
2025-02-11 04:16:29 +00:00
parent c393a066ab
commit 9ad6d6e572
6 changed files with 359 additions and 26 deletions

View File

@@ -2,34 +2,35 @@ const { expose } = require('threads/worker');
const Cryptr = require('cryptr');
const { decrypt } = new Cryptr(process.env.ENCRYPTION_KEY);
function decryptIfExists(encrypted) {
if (encrypted) return decrypt(encrypted);
return null;
}
expose({
exportTicket(ticket) {
if (ticket.closedReason) ticket.closedReason = decrypt(ticket.closedReason);
if (ticket.feedback?.comment) ticket.feedback.comment = decrypt(ticket.feedback.comment);
if (ticket.topic) ticket.topic = decrypt(ticket.topic);
ticket.archivedMessages = ticket.archivedMessages.map(message => {
message.content = decryptIfExists(message.content);
message.content &&= decrypt(message.content);
return message;
});
ticket.archivedUsers = ticket.archivedUsers.map(user => {
user.displayName = decryptIfExists(user.displayName);
user.username = decryptIfExists(user.username);
user.displayName &&= decrypt(user.displayName);
user.username &&= decrypt(user.username);
return user;
});
if (ticket.feedback) {
// why is feedback the only one with a guild relation? 😕
delete ticket.feedback.guildId;
ticket.feedback.comment &&= decrypt(ticket.feedback.comment);
}
ticket.closedReason &&= decrypt(ticket.closedReason);
delete ticket.guildId;
ticket.questionAnswers = ticket.questionAnswers.map(answer => {
if (answer.value) answer.value = decryptIfExists(answer.value);
answer.value &&= decrypt(answer.value);
return answer;
});
delete ticket.guildId;
ticket.topic &&= decrypt(ticket.topic);
return JSON.stringify(ticket);
},

115
src/lib/workers/import.js Normal file
View File

@@ -0,0 +1,115 @@
const { expose } = require('threads/worker');
const Cryptr = require('cryptr');
const { encrypt } = new Cryptr(process.env.ENCRYPTION_KEY);
expose({
importTicket(stringified, guildId, categoryMap) {
const ticket = JSON.parse(stringified);
ticket.archivedChannels = {
create: ticket.archivedChannels.map(user => {
delete user.ticketId;
return user;
}),
};
ticket.archivedUsers = {
create: ticket.archivedUsers.map(user => {
delete user.ticketId;
user.displayName &&= encrypt(user.displayName);
user.username &&= encrypt(user.username);
return user;
}),
};
ticket.archivedRoles = {
create: ticket.archivedRoles.map(user => {
delete user.ticketId;
return user;
}),
};
const messages = ticket.archivedMessages.map(message => {
// messages don't need to be wrapped in {create}
message.content &&= encrypt(message.content);
return message;
});
delete ticket.archivedMessages;
ticket.category = { connect: { id: categoryMap.get(ticket.categoryId) } };
delete ticket.categoryId;
if (ticket.claimedById) {
ticket.claimedBy = {
connectOrCreate: {
create: { id: ticket.claimedById },
where: { id: ticket.claimedById },
},
};
}
delete ticket.claimedById;
if (ticket.closedById) {
ticket.closedBy = {
connectOrCreate: {
create: { id: ticket.closedById },
where: { id: ticket.closedById },
},
};
}
delete ticket.closedById;
if (ticket.createdById) {
ticket.createdBy = {
connectOrCreate: {
create: { id: ticket.createdById },
where: { id: ticket.createdById },
},
};
}
delete ticket.createdById;
ticket.closedReason &&= encrypt(ticket.closedReason);
if (ticket.feedback) {
ticket.feedback.guild = { connect: { id: guildId } };
ticket.feedback.comment &&= encrypt(ticket.feedback.comment);
if (ticket.feedback.userId) {
ticket.feedback.user = {
connectOrCreate: {
create: { id: ticket.feedback.userId },
where: { id: ticket.feedback.userId },
},
};
delete ticket.feedback.userId;
}
ticket.feedback = { create: ticket.feedback };
} else {
ticket.feedback = undefined;
}
ticket.guild = { connect: { id: guildId } };
delete ticket.guildId; // shouldn't exist but make sure
if (ticket.questionAnswers.length) {
ticket.questionAnswers = {
create: ticket.questionAnswers.map(async answer => {
answer.value &&= encrypt(answer.value);
return answer;
}),
};
} else {
ticket.questionAnswers = undefined;
}
if (ticket.referencesTicketId) {
ticket.referencesTicket = { connect: { id: ticket.referencesTicketId } };
}
delete ticket.referencesTicketId;
ticket.topic &&= encrypt(ticket.topic);
return [ticket, messages];
},
});