From 4e5257481cde66af657d428d457ae5ba168c635a Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Thu, 4 Dec 2025 04:45:36 -0800 Subject: [PATCH] fix: route ordering for /api/tasks/reorder endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Static routes (/api/tasks/reorder, /api/tasks/cleanup) must be defined before parameterized routes (/api/tasks/:id) to prevent Bun's router from matching the parameter route first. This was causing 404 errors on drag-and-drop task reordering in the kanban board. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/server/index.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/server/index.ts b/src/server/index.ts index 83ef59f..850df56 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -167,10 +167,20 @@ export class BacklogServer { "/settings": indexHtml, // API Routes using Bun's native route syntax + // IMPORTANT: Static routes must come BEFORE parameterized routes to avoid `:id` matching literal paths "/api/tasks": { GET: async (req: Request) => await this.handleListTasks(req), POST: async (req: Request) => await this.handleCreateTask(req), }, + "/api/tasks/reorder": { + POST: async (req: Request) => await this.handleReorderTask(req), + }, + "/api/tasks/cleanup": { + GET: async (req: Request) => await this.handleCleanupPreview(req), + }, + "/api/tasks/cleanup/execute": { + POST: async (req: Request) => await this.handleCleanupExecute(req), + }, "/api/task/:id": { GET: async (req: Request & { params: { id: string } }) => await this.handleGetTask(req.params.id), }, @@ -218,15 +228,6 @@ export class BacklogServer { "/api/drafts/:id/promote": { POST: async (req: Request & { params: { id: string } }) => await this.handlePromoteDraft(req.params.id), }, - "/api/tasks/reorder": { - POST: async (req: Request) => await this.handleReorderTask(req), - }, - "/api/tasks/cleanup": { - GET: async (req: Request) => await this.handleCleanupPreview(req), - }, - "/api/tasks/cleanup/execute": { - POST: async (req: Request) => await this.handleCleanupExecute(req), - }, "/api/version": { GET: async () => await this.handleGetVersion(), },