Skip to content
Prev Previous commit
Next Next commit
fix(cloudwatch): validate dimensions JSON at Zod schema level
Move dimensions validation from runtime try-catch to Zod refinement,
catching malformed JSON and arrays at schema validation time (400)
instead of runtime (500). Also rejects JSON arrays that would produce
meaningless numeric dimension names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
  • Loading branch information
waleedlatif1 and claude committed Apr 8, 2026
commit 66ffcd9da57b961ba701c3280ae427563b2b5205
29 changes: 18 additions & 11 deletions apps/sim/app/api/tools/cloudwatch/put-metric-data/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,21 @@ const PutMetricDataSchema = z.object({
metricName: z.string().min(1, 'Metric name is required'),
value: z.number({ coerce: true }),
unit: z.enum(VALID_UNITS).optional(),
dimensions: z.string().optional(),
dimensions: z
.string()
.optional()
.refine(
(val) => {
if (!val) return true
try {
const parsed = JSON.parse(val)
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
} catch {
return false
}
},
{ message: 'dimensions must be a valid JSON object string' }
),
})

export async function POST(request: NextRequest) {
Expand All @@ -73,16 +87,9 @@ export async function POST(request: NextRequest) {

const dimensions: { Name: string; Value: string }[] = []
if (validatedData.dimensions) {
let parsed: unknown
try {
parsed = JSON.parse(validatedData.dimensions)
} catch {
return NextResponse.json({ error: 'Invalid dimensions JSON format' }, { status: 400 })
}
if (typeof parsed === 'object' && parsed !== null) {
for (const [name, value] of Object.entries(parsed)) {
dimensions.push({ Name: name, Value: String(value) })
}
const parsed = JSON.parse(validatedData.dimensions)
for (const [name, value] of Object.entries(parsed)) {
dimensions.push({ Name: name, Value: String(value) })
}
}

Expand Down
Loading