Skip to content

Commit

Permalink
perf: cache staff roles
Browse files Browse the repository at this point in the history
  • Loading branch information
eartharoid committed Jan 12, 2023
1 parent db94ab7 commit d7e1b05
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
36 changes: 28 additions & 8 deletions src/lib/users.js
Expand Up @@ -11,6 +11,29 @@ module.exports.getCommonGuilds = async (client, userId) => await client.guilds.c
return !!member;
});

/**
* @param {import("discord.js").Guild} guild
* @returns {Promise<string[]>}
*/
const updateStaffRoles = async guild => {
const { categories } = await guild.client.prisma.guild.findUnique({
select: { categories: { select: { staffRoles: true } } },
where: { id: guild.id },
});
const staffRoles = [
...new Set(
categories.reduce((acc, c) => {
acc.push(...c.staffRoles);
return acc;
}, []),
),
];
await guild.client.keyv.set(`cache/guild-staff:${guild.id}`, staffRoles);
return staffRoles;
};

module.exports.updateStaffRoles = updateStaffRoles;

/**
*
* @param {import("discord.js").Guild} guild
Expand All @@ -20,12 +43,9 @@ module.exports.getCommonGuilds = async (client, userId) => await client.guilds.c
module.exports.isStaff = async (guild, userId) => {
/** @type {import("client")} */
const client = guild.client;
if (guild.client.supers.includes(userId)) return true;
const guildMember = await guild.members.fetch(userId);
if (guildMember?.permissions.has(PermissionsBitField.Flags.ManageGuild)) return true;
const { categories } = await client.prisma.guild.findUnique({
select: { categories: true },
where: { id: guild.id },
});
return categories.some(cat => cat.roles.some(r => guildMember.roles.cache.has(r)));
if (client.supers.includes(userId)) return true;
const guildMember = guild.members.cache.get(userId) || await guild.members.fetch(userId);
if (guildMember.permissions.has(PermissionsBitField.Flags.ManageGuild)) return true;
const staffRoles = await client.keyv.get(`cache/guild-staff:${guild.id}`) || await updateStaffRoles(guild);
return staffRoles.some(r => guildMember.roles.cache.has(r));
};
@@ -1,16 +1,19 @@
const { logAdminEvent } = require('../../../../../../../lib/logging');
const { updateStaffRoles } = require('../../../../../../../lib/users');
const { randomUUID } = require('crypto');

module.exports.delete = fastify => ({
handler: async (req, res) => {
/** @type {import('client')} */
const client = res.context.config.client;
const guildId = req.params.guild;
const guild = client.guilds.cache.get(req.params.guild);
const categoryId = Number(req.params.category);
const original = categoryId && await client.prisma.category.findUnique({ where: { id: categoryId } });
if (!original || original.guildId !== guildId) return res.status(404).send(new Error('Not Found'));
if (!original || original.guildId !== guild.id) return res.status(404).send(new Error('Not Found'));
const category = await client.prisma.category.delete({ where: { id: categoryId } });

await updateStaffRoles(guild);

logAdminEvent(client, {
action: 'delete',
guildId: req.params.guild,
Expand Down Expand Up @@ -137,6 +140,8 @@ module.exports.patch = fastify => ({
where: { id: categoryId },
});

await updateStaffRoles(guild);

logAdminEvent(client, {
action: 'update',
diff: {
Expand Down
3 changes: 3 additions & 0 deletions src/routes/api/admin/guilds/[guild]/categories/index.js
@@ -1,4 +1,5 @@
const { logAdminEvent } = require('../../../../../../lib/logging');
const { updateStaffRoles } = require('../../../../../../lib/users');
const emoji = require('node-emoji');
const { ChannelType: { GuildCategory } } = require('discord.js');
const ms = require('ms');
Expand Down Expand Up @@ -93,6 +94,8 @@ module.exports.post = fastify => ({
},
});

await updateStaffRoles(guild);

logAdminEvent(client, {
action: 'create',
guildId: guild.id,
Expand Down

0 comments on commit d7e1b05

Please sign in to comment.