Merge pull request #3506 from Infisical/daniel/build-strict-find-filter

feat: strict find filter
This commit is contained in:
Daniel Hougaard
2025-04-29 05:41:39 +04:00
committed by GitHub
2 changed files with 22 additions and 6 deletions
+20 -5
View File
@@ -2,6 +2,8 @@
import { Knex } from "knex"; import { Knex } from "knex";
import { Tables } from "knex/types/tables"; import { Tables } from "knex/types/tables";
import { TableName } from "@app/db/schemas";
import { DatabaseError } from "../errors"; import { DatabaseError } from "../errors";
import { buildDynamicKnexQuery, TKnexDynamicOperator } from "./dynamic"; import { buildDynamicKnexQuery, TKnexDynamicOperator } from "./dynamic";
@@ -25,28 +27,41 @@ export type TFindFilter<R extends object = object> = Partial<R> & {
$search?: Partial<{ [k in keyof R]: R[k] }>; $search?: Partial<{ [k in keyof R]: R[k] }>;
$complex?: TKnexDynamicOperator<R>; $complex?: TKnexDynamicOperator<R>;
}; };
export const buildFindFilter = export const buildFindFilter =
<R extends object = object>({ $in, $notNull, $search, $complex, ...filter }: TFindFilter<R>) => <R extends object = object>(
{ $in, $notNull, $search, $complex, ...filter }: TFindFilter<R>,
tableName?: TableName,
excludeKeys?: Array<keyof R>
) =>
(bd: Knex.QueryBuilder<R, R>) => { (bd: Knex.QueryBuilder<R, R>) => {
void bd.where(filter); const processedFilter = tableName
? Object.fromEntries(
Object.entries(filter)
.filter(([key]) => !excludeKeys || !excludeKeys.includes(key as keyof R))
.map(([key, value]) => [`${tableName}.${key}`, value])
)
: filter;
void bd.where(processedFilter);
if ($in) { if ($in) {
Object.entries($in).forEach(([key, val]) => { Object.entries($in).forEach(([key, val]) => {
if (val) { if (val) {
void bd.whereIn(key as never, val as never); void bd.whereIn([`${tableName ? `${tableName}.` : ""}${key}`] as never, val as never);
} }
}); });
} }
if ($notNull?.length) { if ($notNull?.length) {
$notNull.forEach((key) => { $notNull.forEach((key) => {
void bd.whereNotNull(key as never); void bd.whereNotNull([`${tableName ? `${tableName}.` : ""}${key as string}`] as never);
}); });
} }
if ($search) { if ($search) {
Object.entries($search).forEach(([key, val]) => { Object.entries($search).forEach(([key, val]) => {
if (val) { if (val) {
void bd.whereILike(key as never, val as never); void bd.whereILike([`${tableName ? `${tableName}.` : ""}${key}`] as never, val as never);
} }
}); });
} }
@@ -64,7 +64,8 @@ export const secretV2BridgeDALFactory = ({ db, keyStore }: TSecretV2DalArg) => {
const findOne = async (filter: Partial<TSecretsV2>, tx?: Knex) => { const findOne = async (filter: Partial<TSecretsV2>, tx?: Knex) => {
try { try {
const docs = await (tx || db)(TableName.SecretV2) const docs = await (tx || db)(TableName.SecretV2)
.where(filter) // eslint-disable-next-line @typescript-eslint/no-misused-promises
.where(buildFindFilter(filter, TableName.SecretV2))
.leftJoin( .leftJoin(
TableName.SecretV2JnTag, TableName.SecretV2JnTag,
`${TableName.SecretV2}.id`, `${TableName.SecretV2}.id`,