diff --git a/backend/src/server/routes/v3/secret-router.ts b/backend/src/server/routes/v3/secret-router.ts index ca326367c..62de9d69b 100644 --- a/backend/src/server/routes/v3/secret-router.ts +++ b/backend/src/server/routes/v3/secret-router.ts @@ -181,68 +181,81 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { } ], querystring: z.object({ - secretMetadata: z + filters: z .string() .optional() .transform((val) => { + // TODO: Add support for more filtering fields & operators. + // Currently only supports secretMetadata filtering in a specific format to allow for further expansion of filtering in the future. + if (!val) return undefined; + const secretMetadataSection = [val].find((section) => section.startsWith("secretMetadata=")); - const result: { key?: string; value?: string }[] = []; - const pairs = val.split(","); + if (!secretMetadataSection) return undefined; - for (const pair of pairs) { - const pairResult: { key?: string; value?: string } = {}; - const parts = pair.split(/[:=]/).map((part) => part.trim()); + const metadataContent = secretMetadataSection.replace("secretMetadata=", ""); - for (let i = 0; i < parts.length - 1; i += 1) { - const current = parts[i].toLowerCase(); - const next = parts[i + 1]; + const secretMetadataResult: { key?: string; value?: string }[] = []; + let currentPair: { key?: string; value?: string } = {}; - if (current === "key" && next) { - pairResult.key = next; - } else if (current === "value" && next) { - pairResult.value = next; + const parts = metadataContent.split(/(? { - if (metadata && !Array.isArray(metadata)) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Invalid secretMetadata format. Correct format is key1:value1,key2:value2" - }); - } + .superRefine((filters, ctx) => { + if (filters?.secretMetadata) { + if (!Array.isArray(filters.secretMetadata)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + "Invalid secretMetadata format in filters. Correct format is filters=secretMetadata=key=key1,value=val1" + }); + } - if (metadata) { - if (metadata.length > 10) { + if (filters.secretMetadata.length > 10) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "You can only filter by up to 10 metadata fields" }); } - for (const item of metadata) { + for (const item of filters.secretMetadata) { if (!item.key && !item.value) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: - "Invalid secretMetadata format, key or value must be provided. Correct format is key1:value1,key2:value2" + "Invalid secretMetadata format in filters, key or value must be provided. Correct format is filters=secretMetadata=key=key1,value=val1" }); } } } }) .describe(RAW_SECRETS.LIST.secretMetadata), + workspaceId: z.string().trim().optional().describe(RAW_SECRETS.LIST.workspaceId), workspaceSlug: z.string().trim().optional().describe(RAW_SECRETS.LIST.workspaceSlug), environment: z.string().trim().optional().describe(RAW_SECRETS.LIST.environment), @@ -343,7 +356,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { actorAuthMethod: req.permission.authMethod, projectId: workspaceId, path: secretPath, - secretMetadata: req.query.secretMetadata, + secretMetadata: req.query.filters?.secretMetadata, includeImports: req.query.include_imports, recursive: req.query.recursive, tagSlugs: req.query.tagSlugs