From 8e45fe128b2d470b98a163141e14916a98a540d7 Mon Sep 17 00:00:00 2001 From: Ben Blackmore Date: Thu, 11 Jan 2024 13:32:20 +0100 Subject: [PATCH] feat: adapt validation in OTelBin next.js app to changed lambda contract --- packages/otelbin/package-lock.json | 11 +++++++- packages/otelbin/package.json | 3 ++- packages/otelbin/src/app/validation/route.ts | 27 ++++++++++++++++--- .../validation/useServerSideValidation.ts | 5 +++- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/packages/otelbin/package-lock.json b/packages/otelbin/package-lock.json index a27b86ae..eed92925 100644 --- a/packages/otelbin/package-lock.json +++ b/packages/otelbin/package-lock.json @@ -49,7 +49,8 @@ "tailwindcss-animate": "^1.0.6", "ts-jest": "^29.1.1", "yaml": "^2.3.4", - "yaml-language-server": "^1.14.0" + "yaml-language-server": "^1.14.0", + "zod": "^3.22.4" }, "devDependencies": { "@svgr/webpack": "^8.1.0", @@ -13996,6 +13997,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zustand": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.1.tgz", diff --git a/packages/otelbin/package.json b/packages/otelbin/package.json index 0ef5f68f..5ab69738 100644 --- a/packages/otelbin/package.json +++ b/packages/otelbin/package.json @@ -55,7 +55,8 @@ "tailwindcss-animate": "^1.0.6", "ts-jest": "^29.1.1", "yaml": "^2.3.4", - "yaml-language-server": "^1.14.0" + "yaml-language-server": "^1.14.0", + "zod": "^3.22.4" }, "devDependencies": { "@svgr/webpack": "^8.1.0", diff --git a/packages/otelbin/src/app/validation/route.ts b/packages/otelbin/src/app/validation/route.ts index 18716135..b7696ba3 100644 --- a/packages/otelbin/src/app/validation/route.ts +++ b/packages/otelbin/src/app/validation/route.ts @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2023 Dash0 Inc. // SPDX-License-Identifier: Apache-2.0 +import z from "zod"; import retryFetch from "fetch-retry"; import { Redis } from "@upstash/redis"; import { Ratelimit } from "@upstash/ratelimit"; @@ -19,6 +20,12 @@ const rateLimit = new Ratelimit({ prefix: "rate-limit-validate", }); +const validationPayloadSchema = z.object({ + config: z.string(), + env: z.record(z.string()).optional(), +}); +type ValidationPayload = z.infer; + export async function POST(request: NextRequest): Promise { const distro = request.nextUrl.searchParams.get("distro"); const version = request.nextUrl.searchParams.get("version"); @@ -36,7 +43,21 @@ export async function POST(request: NextRequest): Promise { ); } - const config = await request.text(); + const reqBody = await request.json(); + let validationPayload: ValidationPayload; + try { + validationPayload = validationPayloadSchema.parse(reqBody); + } catch (e: unknown) { + console.error('Failed to parse request body as JSON: "%s"', reqBody, e); + return NextResponse.json( + { + error: `Could not parse request body.`, + }, + { + status: 400, + } + ); + } const userIdentifier = getUserIdentifier(request); const { success } = await rateLimit.blockUntilReady(userIdentifier, 1000 * 60); @@ -66,9 +87,7 @@ export async function POST(request: NextRequest): Promise { "COLLECTOR_CONFIGURATION_VALIDATION_API_KEY env var is not configured" ), }, - body: JSON.stringify({ - config, - }), + body: JSON.stringify(validationPayload), retries: 3, retryDelay: 1000, retryOn: [500, 503], diff --git a/packages/otelbin/src/components/validation/useServerSideValidation.ts b/packages/otelbin/src/components/validation/useServerSideValidation.ts index be8b019f..6c6c3b6d 100644 --- a/packages/otelbin/src/components/validation/useServerSideValidation.ts +++ b/packages/otelbin/src/components/validation/useServerSideValidation.ts @@ -51,7 +51,10 @@ export function useServerSideValidation(): ValidationState { "Content-Type": "application/json", Accept: "application/json", }, - body: config, + body: JSON.stringify({ + config, + env: {}, + }), } );