Skip to content

Commit 66ffcd9

Browse files
waleedlatif1claude
andcommitted
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>
1 parent 0aecc0f commit 66ffcd9

1 file changed

Lines changed: 18 additions & 11 deletions

File tree

  • apps/sim/app/api/tools/cloudwatch/put-metric-data

apps/sim/app/api/tools/cloudwatch/put-metric-data/route.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,21 @@ const PutMetricDataSchema = z.object({
4848
metricName: z.string().min(1, 'Metric name is required'),
4949
value: z.number({ coerce: true }),
5050
unit: z.enum(VALID_UNITS).optional(),
51-
dimensions: z.string().optional(),
51+
dimensions: z
52+
.string()
53+
.optional()
54+
.refine(
55+
(val) => {
56+
if (!val) return true
57+
try {
58+
const parsed = JSON.parse(val)
59+
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
60+
} catch {
61+
return false
62+
}
63+
},
64+
{ message: 'dimensions must be a valid JSON object string' }
65+
),
5266
})
5367

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

7488
const dimensions: { Name: string; Value: string }[] = []
7589
if (validatedData.dimensions) {
76-
let parsed: unknown
77-
try {
78-
parsed = JSON.parse(validatedData.dimensions)
79-
} catch {
80-
return NextResponse.json({ error: 'Invalid dimensions JSON format' }, { status: 400 })
81-
}
82-
if (typeof parsed === 'object' && parsed !== null) {
83-
for (const [name, value] of Object.entries(parsed)) {
84-
dimensions.push({ Name: name, Value: String(value) })
85-
}
90+
const parsed = JSON.parse(validatedData.dimensions)
91+
for (const [name, value] of Object.entries(parsed)) {
92+
dimensions.push({ Name: name, Value: String(value) })
8693
}
8794
}
8895

0 commit comments

Comments
 (0)