From 1c1b86f4956066f4eb79d938421cf54403757295 Mon Sep 17 00:00:00 2001 From: Dotta Date: Sat, 7 Mar 2026 15:19:08 -0600 Subject: [PATCH] fix(issues): guard missing companyId and enrich activity log context Add 400 response for /issues without companyId, tag issue.updated activity with source:comment when triggered by a comment, and mark comment activities with updated:true when field changes accompany them. Co-Authored-By: Claude Opus 4.6 --- server/src/routes/issues.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/server/src/routes/issues.ts b/server/src/routes/issues.ts index 113bbdb8..8d21fe65 100644 --- a/server/src/routes/issues.ts +++ b/server/src/routes/issues.ts @@ -184,6 +184,13 @@ export function issueRoutes(db: Db, storage: StorageService) { } }); + // Common malformed path when companyId is empty in "/api/companies/{companyId}/issues". + router.get("/issues", (_req, res) => { + res.status(400).json({ + error: "Missing companyId in path. Use /api/companies/{companyId}/issues.", + }); + }); + router.get("/companies/:companyId/issues", async (req, res) => { const companyId = req.params.companyId as string; assertCompanyAccess(req, companyId); @@ -522,6 +529,7 @@ export function issueRoutes(db: Db, storage: StorageService) { } const actor = getActorInfo(req); + const hasFieldChanges = Object.keys(previous).length > 0; await logActivity(db, { companyId: issue.companyId, actorType: actor.actorType, @@ -531,7 +539,12 @@ export function issueRoutes(db: Db, storage: StorageService) { action: "issue.updated", entityType: "issue", entityId: issue.id, - details: { ...updateFields, identifier: issue.identifier, _previous: Object.keys(previous).length > 0 ? previous : undefined }, + details: { + ...updateFields, + identifier: issue.identifier, + ...(commentBody ? { source: "comment" } : {}), + _previous: hasFieldChanges ? previous : undefined, + }, }); let comment = null; @@ -555,6 +568,7 @@ export function issueRoutes(db: Db, storage: StorageService) { bodySnippet: comment.body.slice(0, 120), identifier: issue.identifier, issueTitle: issue.title, + ...(hasFieldChanges ? { updated: true } : {}), }, });