fix: missing tools on a composable handler

This commit is contained in:
41666 2021-08-07 18:05:34 -04:00
parent 76a03c2d2c
commit d5acea4abb

View file

@ -17,7 +17,7 @@ import {
SessionData, SessionData,
UserGuildPermissions, UserGuildPermissions,
} from '@roleypoly/types'; } from '@roleypoly/types';
import { AuthType, discordFetch, Handler } from '@roleypoly/worker-utils'; import { AuthType, discordFetch, Handler, HandlerTools } from '@roleypoly/worker-utils';
import { cacheLayer, CacheLayerOptions, isRoot, withSession } from './api-tools'; import { cacheLayer, CacheLayerOptions, isRoot, withSession } from './api-tools';
import { botClientID, botToken } from './config'; import { botClientID, botToken } from './config';
import { GuildData, Guilds } from './kv'; import { GuildData, Guilds } from './kv';
@ -229,58 +229,61 @@ export const asEditor = (
options: AsEditorOptions = {}, options: AsEditorOptions = {},
wrappedHandler: (session: SessionData, userGuildContext: UserGuildContext) => Handler wrappedHandler: (session: SessionData, userGuildContext: UserGuildContext) => Handler
): Handler => ): Handler =>
withSession((session: SessionData) => async (request: Request): Promise<Response> => { withSession(
const { rateLimitKey, rateLimitTimeoutSeconds } = options; (session: SessionData) =>
const url = new URL(request.url); async (request: Request, tools: HandlerTools): Promise<Response> => {
const [, , guildID] = url.pathname.split('/'); const { rateLimitKey, rateLimitTimeoutSeconds } = options;
if (!guildID) { const url = new URL(request.url);
return missingParameters(); const [, , guildID] = url.pathname.split('/');
} if (!guildID) {
return missingParameters();
}
let rateLimit: null | ReturnType<typeof useGuildRateLimiter> = null; let rateLimit: null | ReturnType<typeof useGuildRateLimiter> = null;
if (rateLimitKey) { if (rateLimitKey) {
rateLimit = await useGuildRateLimiter( rateLimit = await useGuildRateLimiter(
guildID, guildID,
rateLimitKey, rateLimitKey,
rateLimitTimeoutSeconds || 60 rateLimitTimeoutSeconds || 60
); );
} }
const userIsRoot = isRoot(session.user.id); const userIsRoot = isRoot(session.user.id);
let guild = session.guilds.find((guild) => guild.id === guildID); let guild = session.guilds.find((guild) => guild.id === guildID);
if (!guild) { if (!guild) {
if (!userIsRoot) { if (!userIsRoot) {
return notFound(); return notFound();
}
const fullGuild = await getGuild(guildID);
if (!fullGuild) {
return notFound();
}
guild = {
id: fullGuild.id,
name: fullGuild.name,
icon: fullGuild.icon,
permissionLevel: UserGuildPermissions.Admin, // root will always be considered admin
};
}
const userIsManager = guild.permissionLevel === UserGuildPermissions.Manager;
const userIsAdmin = guild.permissionLevel === UserGuildPermissions.Admin;
if (!userIsAdmin && !userIsManager) {
return lowPermissions();
}
if (!userIsRoot && rateLimit && (await rateLimit())) {
return rateLimited();
}
return await wrappedHandler(session, {
guildID,
guild,
url,
})(request, tools);
} }
);
const fullGuild = await getGuild(guildID);
if (!fullGuild) {
return notFound();
}
guild = {
id: fullGuild.id,
name: fullGuild.name,
icon: fullGuild.icon,
permissionLevel: UserGuildPermissions.Admin, // root will always be considered admin
};
}
const userIsManager = guild.permissionLevel === UserGuildPermissions.Manager;
const userIsAdmin = guild.permissionLevel === UserGuildPermissions.Admin;
if (!userIsAdmin && !userIsManager) {
return lowPermissions();
}
if (!userIsRoot && rateLimit && (await rateLimit())) {
return rateLimited();
}
return await wrappedHandler(session, {
guildID,
guild,
url,
})(request);
});