forked from syntaxbullet/aurorabot
feat(api): add guild settings API endpoints
Add REST endpoints for managing per-guild configuration: - GET /api/guilds/:guildId/settings - PUT/PATCH /api/guilds/:guildId/settings - DELETE /api/guilds/:guildId/settings
This commit is contained in:
64
web/src/routes/guild-settings.routes.ts
Normal file
64
web/src/routes/guild-settings.routes.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/**
|
||||||
|
* @fileoverview Guild settings endpoints for Aurora API.
|
||||||
|
* Provides endpoints for reading and updating per-guild configuration
|
||||||
|
* stored in the database.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { RouteContext, RouteModule } from "./types";
|
||||||
|
import { jsonResponse, errorResponse, withErrorHandling } from "./utils";
|
||||||
|
import { guildSettingsService } from "@shared/modules/guild-settings/guild-settings.service";
|
||||||
|
import { invalidateGuildConfigCache } from "@shared/lib/config";
|
||||||
|
|
||||||
|
const GUILD_SETTINGS_PATTERN = /^\/api\/guilds\/(\d+)\/settings$/;
|
||||||
|
|
||||||
|
async function handler(ctx: RouteContext): Promise<Response | null> {
|
||||||
|
const { pathname, method, req } = ctx;
|
||||||
|
|
||||||
|
const match = pathname.match(GUILD_SETTINGS_PATTERN);
|
||||||
|
if (!match || !match[1]) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const guildId = match[1];
|
||||||
|
|
||||||
|
if (method === "GET") {
|
||||||
|
return withErrorHandling(async () => {
|
||||||
|
const settings = await guildSettingsService.getSettings(guildId);
|
||||||
|
if (!settings) {
|
||||||
|
return jsonResponse({ guildId, configured: false });
|
||||||
|
}
|
||||||
|
return jsonResponse({ ...settings, guildId, configured: true });
|
||||||
|
}, "fetch guild settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method === "PUT" || method === "PATCH") {
|
||||||
|
try {
|
||||||
|
const body = await req.json() as Record<string, unknown>;
|
||||||
|
const { guildId: _, ...settings } = body;
|
||||||
|
const result = await guildSettingsService.upsertSettings({
|
||||||
|
guildId,
|
||||||
|
...settings,
|
||||||
|
} as Parameters<typeof guildSettingsService.upsertSettings>[0]);
|
||||||
|
invalidateGuildConfigCache(guildId);
|
||||||
|
return jsonResponse(result);
|
||||||
|
} catch (error) {
|
||||||
|
const message = error instanceof Error ? error.message : String(error);
|
||||||
|
return errorResponse("Failed to save guild settings", 400, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method === "DELETE") {
|
||||||
|
return withErrorHandling(async () => {
|
||||||
|
await guildSettingsService.deleteSettings(guildId);
|
||||||
|
invalidateGuildConfigCache(guildId);
|
||||||
|
return jsonResponse({ success: true });
|
||||||
|
}, "delete guild settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const guildSettingsRoutes: RouteModule = {
|
||||||
|
name: "guild-settings",
|
||||||
|
handler
|
||||||
|
};
|
||||||
@@ -9,6 +9,7 @@ import { statsRoutes } from "./stats.routes";
|
|||||||
import { actionsRoutes } from "./actions.routes";
|
import { actionsRoutes } from "./actions.routes";
|
||||||
import { questsRoutes } from "./quests.routes";
|
import { questsRoutes } from "./quests.routes";
|
||||||
import { settingsRoutes } from "./settings.routes";
|
import { settingsRoutes } from "./settings.routes";
|
||||||
|
import { guildSettingsRoutes } from "./guild-settings.routes";
|
||||||
import { itemsRoutes } from "./items.routes";
|
import { itemsRoutes } from "./items.routes";
|
||||||
import { usersRoutes } from "./users.routes";
|
import { usersRoutes } from "./users.routes";
|
||||||
import { classesRoutes } from "./classes.routes";
|
import { classesRoutes } from "./classes.routes";
|
||||||
@@ -27,6 +28,7 @@ const routeModules: RouteModule[] = [
|
|||||||
actionsRoutes,
|
actionsRoutes,
|
||||||
questsRoutes,
|
questsRoutes,
|
||||||
settingsRoutes,
|
settingsRoutes,
|
||||||
|
guildSettingsRoutes,
|
||||||
itemsRoutes,
|
itemsRoutes,
|
||||||
usersRoutes,
|
usersRoutes,
|
||||||
classesRoutes,
|
classesRoutes,
|
||||||
|
|||||||
Reference in New Issue
Block a user