From fc24306cd8828afe59677aba1692d40db9d24b64 Mon Sep 17 00:00:00 2001 From: Sacha Al Himdani Date: Tue, 12 May 2026 14:34:49 +0200 Subject: [PATCH] Address code review findings across relay, UI, and Go backend - relay: key uploadables map by actual variable name instead of iteration index so order-mismatch between Object.keys passes can't desync the multipart map from form field names - mcp/v1: drop dead commented middleware line - DurationPicker: tighten parse regex to require PT prefix for M/H and P for D/W, and reject NaN in stringify so cleared inputs don't produce invalid duration strings Signed-off-by: Sacha Al Himdani --- packages/relay/src/fetch.ts | 9 +++++---- .../ui/src/Molecules/DurationPicker/DurationPicker.tsx | 8 ++++---- pkg/server/api/mcp/v1/v1_handler.go | 1 - 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/relay/src/fetch.ts b/packages/relay/src/fetch.ts index 05d05611d..aa0c4f271 100644 --- a/packages/relay/src/fetch.ts +++ b/packages/relay/src/fetch.ts @@ -60,15 +60,16 @@ export const makeFetchQuery = (endpoint: string): FetchFunction => { const uploadableMap: { [key: string]: string[]; } = {}; + const uploadableKeys = Object.keys(uploadables); - Object.keys(uploadables).forEach((key, index) => { - uploadableMap[index] = [`variables.${key}`]; + uploadableKeys.forEach((key) => { + uploadableMap[key] = [`variables.${key}`]; }); formData.append("map", JSON.stringify(uploadableMap)); - Object.keys(uploadables).forEach((key, index) => { - formData.append(index.toString(), uploadables[key]); + uploadableKeys.forEach((key) => { + formData.append(key, uploadables[key]); }); requestInit.body = formData; diff --git a/packages/ui/src/Molecules/DurationPicker/DurationPicker.tsx b/packages/ui/src/Molecules/DurationPicker/DurationPicker.tsx index 80838b663..311d90867 100644 --- a/packages/ui/src/Molecules/DurationPicker/DurationPicker.tsx +++ b/packages/ui/src/Molecules/DurationPicker/DurationPicker.tsx @@ -26,7 +26,7 @@ type Props = { } & HTMLAttributes; const stringify = (value: number | null, unit: string): string | null => { - if (value === null || value <= 0) return null; + if (value === null || !Number.isFinite(value) || value <= 0) return null; switch (unit) { case "M": @@ -43,10 +43,10 @@ const stringify = (value: number | null, unit: string): string | null => { }; const parse = (value: string): { amount: number; unit: string } => { - const match = value.match(/PT?(\d+)([MDWH])/); + const match = value.match(/^P(?:T(\d+)([MH])|(\d+)([DW]))$/); if (!match) return { amount: 0, unit: "D" }; - const amount = parseInt(match[1], 10) || 0; - const unit = match[2]; + const amount = parseInt(match[1] ?? match[3] ?? "0", 10) || 0; + const unit = match[2] ?? match[4] ?? "D"; if (amount % 7 === 0 && unit === "D") { return { amount: amount / 7, unit: "W" }; } diff --git a/pkg/server/api/mcp/v1/v1_handler.go b/pkg/server/api/mcp/v1/v1_handler.go index ba6d2ba0e..6ddc96143 100644 --- a/pkg/server/api/mcp/v1/v1_handler.go +++ b/pkg/server/api/mcp/v1/v1_handler.go @@ -40,7 +40,6 @@ func NewMux(logger *log.Logger, proboSvc *probo.Service, iamSvc *iam.Service, ac logger = logger.Named("mcp.v1") logger.Info("initializing MCP server") - // server.AddReceivingMiddleware(mcputils.LoggingMiddleware(logger)) resolver := &Resolver{ proboSvc: proboSvc,