From 0968893d4b37af6d24f0929de57760aa96de9cdd Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Thu, 30 Jan 2025 21:41:17 +0100 Subject: [PATCH] improved filtering format --- backend/src/server/routes/v3/secret-router.ts | 39 ++++++++++++++----- .../secret-v2-bridge/secret-v2-bridge-dal.ts | 4 +- .../secret-v2-bridge-types.ts | 6 +-- backend/src/services/secret/secret-types.ts | 4 +- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/backend/src/server/routes/v3/secret-router.ts b/backend/src/server/routes/v3/secret-router.ts index cd928d4db..ca326367c 100644 --- a/backend/src/server/routes/v3/secret-router.ts +++ b/backend/src/server/routes/v3/secret-router.ts @@ -184,15 +184,36 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { secretMetadata: z .string() .optional() - .transform((value) => { - if (!value) return undefined; + .transform((val) => { + if (!val) return undefined; - const metadata = value.split(",").map((el) => { - const [key, val] = el.split(":"); - return { key, value: val }; - }); + const result: { key?: string; value?: string }[] = []; + const pairs = val.split(","); - return metadata; + for (const pair of pairs) { + const pairResult: { key?: string; value?: string } = {}; + const parts = pair.split(/[:=]/).map((part) => part.trim()); + + for (let i = 0; i < parts.length - 1; i += 1) { + const current = parts[i].toLowerCase(); + const next = parts[i + 1]; + + if (current === "key" && next) { + pairResult.key = next; + } else if (current === "value" && next) { + pairResult.value = next; + } + } + + // Only add pair if at least one of key or value is present + if (pairResult.key || pairResult.value) { + result.push(pairResult); + } + } + + if (!result.length) return undefined; + + return result; }) .superRefine((metadata, ctx) => { if (metadata && !Array.isArray(metadata)) { @@ -211,11 +232,11 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { } for (const item of metadata) { - if (!item.key || !item.value) { + if (!item.key && !item.value) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: - "Invalid secretMetadata format, key or value is missing. Correct format is key1:value1,key2:value2" + "Invalid secretMetadata format, key or value must be provided. Correct format is key1:value1,key2:value2" }); } } diff --git a/backend/src/services/secret-v2-bridge/secret-v2-bridge-dal.ts b/backend/src/services/secret-v2-bridge/secret-v2-bridge-dal.ts index e42617d7e..fb271cfdc 100644 --- a/backend/src/services/secret-v2-bridge/secret-v2-bridge-dal.ts +++ b/backend/src/services/secret-v2-bridge/secret-v2-bridge-dal.ts @@ -418,8 +418,8 @@ export const secretV2BridgeDALFactory = (db: TDbClient) => { if (filters?.secretMetadata && filters.secretMetadata.length > 0) { filters.secretMetadata.forEach((meta) => { void qb.where({ - [`${TableName.ResourceMetadata}.key` as string]: meta.key, - [`${TableName.ResourceMetadata}.value` as string]: meta.value + ...(meta.key ? { [`${TableName.ResourceMetadata}.key` as string]: meta.key } : {}), + ...(meta.value ? { [`${TableName.ResourceMetadata}.value` as string]: meta.value } : {}) }); }); } diff --git a/backend/src/services/secret-v2-bridge/secret-v2-bridge-types.ts b/backend/src/services/secret-v2-bridge/secret-v2-bridge-types.ts index ee997c970..f69ef52be 100644 --- a/backend/src/services/secret-v2-bridge/secret-v2-bridge-types.ts +++ b/backend/src/services/secret-v2-bridge/secret-v2-bridge-types.ts @@ -31,8 +31,8 @@ export type TGetSecretsDTO = { recursive?: boolean; tagSlugs?: string[]; secretMetadata?: { - key: string; - value: string; + key?: string; + value?: string; }[]; orderBy?: SecretsOrderBy; orderDirection?: OrderByDirection; @@ -314,7 +314,7 @@ export type TFindSecretsByFolderIdsFilter = { orderDirection?: OrderByDirection; search?: string; tagSlugs?: string[]; - secretMetadata?: { key: string; value: string }[]; + secretMetadata?: { key?: string; value?: string }[]; includeTagsInSearch?: boolean; keys?: string[]; }; diff --git a/backend/src/services/secret/secret-types.ts b/backend/src/services/secret/secret-types.ts index a857c0d30..887f62d25 100644 --- a/backend/src/services/secret/secret-types.ts +++ b/backend/src/services/secret/secret-types.ts @@ -183,8 +183,8 @@ export type TGetSecretsRawDTO = { recursive?: boolean; tagSlugs?: string[]; secretMetadata?: { - key: string; - value: string; + key?: string; + value?: string; }[]; orderBy?: SecretsOrderBy; orderDirection?: OrderByDirection;