From c11d71ed3b807b87975f1da2d529c1d5095b68bd Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Mon, 5 Jan 2026 10:44:43 -0500 Subject: [PATCH] Fix working group slug updates being silently ignored MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The slug field was missing from COLUMN_MAP in updateWorkingGroup(), causing slug changes to be silently skipped. Also adds slug format and uniqueness validation to the PUT endpoint, matching the existing validation in the POST endpoint. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .changeset/ripe-zebras-sell.md | 2 ++ server/src/db/working-group-db.ts | 1 + server/src/routes/committees.ts | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 .changeset/ripe-zebras-sell.md diff --git a/.changeset/ripe-zebras-sell.md b/.changeset/ripe-zebras-sell.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/ripe-zebras-sell.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/server/src/db/working-group-db.ts b/server/src/db/working-group-db.ts index 407dbbac3e..f4e10ed0fd 100644 --- a/server/src/db/working-group-db.ts +++ b/server/src/db/working-group-db.ts @@ -153,6 +153,7 @@ export class WorkingGroupDatabase { const COLUMN_MAP: Record = { name: 'name', + slug: 'slug', description: 'description', slack_channel_url: 'slack_channel_url', slack_channel_id: 'slack_channel_id', diff --git a/server/src/routes/committees.ts b/server/src/routes/committees.ts index a04bd463a1..a484b701b0 100644 --- a/server/src/routes/committees.ts +++ b/server/src/routes/committees.ts @@ -313,6 +313,25 @@ export function createCommitteeRouters(): { updates.region = null; } + // Validate slug format and uniqueness if changing + if (updates.slug) { + const slugPattern = /^[a-z0-9-]+$/; + if (!slugPattern.test(updates.slug)) { + return res.status(400).json({ + error: 'Invalid slug', + message: 'Slug must contain only lowercase letters, numbers, and hyphens' + }); + } + + const slugAvailable = await workingGroupDb.isSlugAvailable(updates.slug, id); + if (!slugAvailable) { + return res.status(409).json({ + error: 'Slug already exists', + message: `A working group with slug '${updates.slug}' already exists` + }); + } + } + // Check if we're adding/changing a Slack channel const existingGroup = await workingGroupDb.getWorkingGroupById(id); const isAddingChannel = updates.slack_channel_url && (!existingGroup?.slack_channel_id || updates.slack_channel_url !== existingGroup.slack_channel_url);