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:
syntaxbullet
2026-02-12 15:09:29 +01:00
parent 0bc254b728
commit 43d32918ab
2 changed files with 66 additions and 0 deletions

View 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
};

View File

@@ -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,