Addressed PR suggestions

This commit is contained in:
Carlos Monastyrski
2025-07-23 10:37:23 -03:00
parent 05408bc151
commit 60657f0bc6
11 changed files with 37 additions and 34 deletions
@@ -14,6 +14,7 @@ export async function up(knex: Knex): Promise<void> {
t.uuid("envId").notNullable(); t.uuid("envId").notNullable();
t.foreign("envId").references("id").inTable(TableName.Environment).onDelete("CASCADE"); t.foreign("envId").references("id").inTable(TableName.Environment).onDelete("CASCADE");
t.timestamps(true, true, true); t.timestamps(true, true, true);
t.unique(["policyId", "envId"]);
}); });
} }
if (!(await knex.schema.hasTable(TableName.SecretApprovalPolicyEnvironment))) { if (!(await knex.schema.hasTable(TableName.SecretApprovalPolicyEnvironment))) {
@@ -24,6 +25,7 @@ export async function up(knex: Knex): Promise<void> {
t.uuid("envId").notNullable(); t.uuid("envId").notNullable();
t.foreign("envId").references("id").inTable(TableName.Environment).onDelete("CASCADE"); t.foreign("envId").references("id").inTable(TableName.Environment).onDelete("CASCADE");
t.timestamps(true, true, true); t.timestamps(true, true, true);
t.unique(["policyId", "envId"]);
}); });
} }
@@ -92,7 +92,8 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
actorOrgId: req.permission.orgId, actorOrgId: req.permission.orgId,
...req.body, ...req.body,
projectSlug: req.body.projectSlug, projectSlug: req.body.projectSlug,
name: req.body.name ?? `${req.body.environment || req.body.environments?.join("-")}-${nanoid(3)}`, name:
req.body.name ?? `${req.body.environment || req.body.environments?.join("-").substring(0, 250)}-${nanoid(3)}`,
enforcementLevel: req.body.enforcementLevel enforcementLevel: req.body.enforcementLevel
}); });
return { approval }; return { approval };
@@ -144,7 +144,7 @@ export interface TAccessApprovalPolicyDALFactory
} }
| undefined | undefined
>; >;
findPoliciesByEnvIdAndSecretPath: ( findPolicyByEnvIdAndSecretPath: (
{ envIds, secretPath }: { envIds: string[]; secretPath: string }, { envIds, secretPath }: { envIds: string[]; secretPath: string },
tx?: Knex tx?: Knex
) => Promise<{ ) => Promise<{
@@ -399,17 +399,17 @@ export const accessApprovalPolicyDALFactory = (db: TDbClient): TAccessApprovalPo
void qb.where(`${TableName.AccessApprovalPolicy}.id`, "=", customFilter.policyId); void qb.where(`${TableName.AccessApprovalPolicy}.id`, "=", customFilter.policyId);
} }
}) })
.where((qb) => {
if (customFilter?.envId) {
void qb.where(`${TableName.AccessApprovalPolicyEnvironment}.envId`, "=", customFilter.envId);
}
})
.join( .join(
TableName.AccessApprovalPolicyEnvironment, TableName.AccessApprovalPolicyEnvironment,
`${TableName.AccessApprovalPolicy}.id`, `${TableName.AccessApprovalPolicy}.id`,
`${TableName.AccessApprovalPolicyEnvironment}.policyId` `${TableName.AccessApprovalPolicyEnvironment}.policyId`
) )
.join(TableName.Environment, `${TableName.AccessApprovalPolicyEnvironment}.envId`, `${TableName.Environment}.id`) .join(TableName.Environment, `${TableName.AccessApprovalPolicyEnvironment}.envId`, `${TableName.Environment}.id`)
.where((qb) => {
if (customFilter?.envId) {
void qb.where(`${TableName.AccessApprovalPolicyEnvironment}.envId`, "=", customFilter.envId);
}
})
.leftJoin( .leftJoin(
TableName.AccessApprovalPolicyApprover, TableName.AccessApprovalPolicyApprover,
`${TableName.AccessApprovalPolicy}.id`, `${TableName.AccessApprovalPolicy}.id`,
@@ -612,7 +612,7 @@ export const accessApprovalPolicyDALFactory = (db: TDbClient): TAccessApprovalPo
} }
}; };
const findPoliciesByEnvIdAndSecretPath: TAccessApprovalPolicyDALFactory["findPoliciesByEnvIdAndSecretPath"] = async ( const findPolicyByEnvIdAndSecretPath: TAccessApprovalPolicyDALFactory["findPolicyByEnvIdAndSecretPath"] = async (
{ envIds, secretPath }, { envIds, secretPath },
tx tx
) => { ) => {
@@ -677,7 +677,7 @@ export const accessApprovalPolicyDALFactory = (db: TDbClient): TAccessApprovalPo
}); });
return formattedDocs?.[0]; return formattedDocs?.[0];
} catch (error) { } catch (error) {
throw new DatabaseError({ error, name: "FindPoliciesByEnvIdAndSecretPath" }); throw new DatabaseError({ error, name: "findPolicyByEnvIdAndSecretPath" });
} }
}; };
@@ -687,6 +687,6 @@ export const accessApprovalPolicyDALFactory = (db: TDbClient): TAccessApprovalPo
findById, findById,
softDeleteById, softDeleteById,
findLastValidPolicy, findLastValidPolicy,
findPoliciesByEnvIdAndSecretPath findPolicyByEnvIdAndSecretPath
}; };
}; };
@@ -3,14 +3,14 @@ import { Knex } from "knex";
import { TDbClient } from "@app/db"; import { TDbClient } from "@app/db";
import { TableName } from "@app/db/schemas"; import { TableName } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors"; import { DatabaseError } from "@app/lib/errors";
import { ormify, selectAllTableCols } from "@app/lib/knex"; import { buildFindFilter, ormify, selectAllTableCols } from "@app/lib/knex";
export type TAccessApprovalPolicyEnvironmentDALFactory = ReturnType<typeof accessApprovalPolicyEnvironmentDALFactory>; export type TAccessApprovalPolicyEnvironmentDALFactory = ReturnType<typeof accessApprovalPolicyEnvironmentDALFactory>;
export const accessApprovalPolicyEnvironmentDALFactory = (db: TDbClient) => { export const accessApprovalPolicyEnvironmentDALFactory = (db: TDbClient) => {
const accessApprovalPolicyEnvironmentOrm = ormify(db, TableName.AccessApprovalPolicyEnvironment); const accessApprovalPolicyEnvironmentOrm = ormify(db, TableName.AccessApprovalPolicyEnvironment);
const findAvailablePoliciesIds = async (envId: string, tx?: Knex) => { const findAvailablePoliciesByEnvId = async (envId: string, tx?: Knex) => {
try { try {
const docs = await (tx || db.replicaNode())(TableName.AccessApprovalPolicyEnvironment) const docs = await (tx || db.replicaNode())(TableName.AccessApprovalPolicyEnvironment)
.join( .join(
@@ -18,14 +18,15 @@ export const accessApprovalPolicyEnvironmentDALFactory = (db: TDbClient) => {
`${TableName.AccessApprovalPolicyEnvironment}.policyId`, `${TableName.AccessApprovalPolicyEnvironment}.policyId`,
`${TableName.AccessApprovalPolicy}.id` `${TableName.AccessApprovalPolicy}.id`
) )
.where({ [`${TableName.AccessApprovalPolicyEnvironment}.envId` as "envId"]: envId }) // eslint-disable-next-line @typescript-eslint/no-misused-promises
.where(buildFindFilter({ envId }, TableName.AccessApprovalPolicyEnvironment))
.whereNull(`${TableName.AccessApprovalPolicy}.deletedAt`) .whereNull(`${TableName.AccessApprovalPolicy}.deletedAt`)
.select(selectAllTableCols(TableName.AccessApprovalPolicyEnvironment)); .select(selectAllTableCols(TableName.AccessApprovalPolicyEnvironment));
return docs; return docs;
} catch (error) { } catch (error) {
throw new DatabaseError({ error, name: "findAvailablePoliciesIds" }); throw new DatabaseError({ error, name: "findAvailablePoliciesByEnvId" });
} }
}; };
return { ...accessApprovalPolicyEnvironmentOrm, findAvailablePoliciesIds }; return { ...accessApprovalPolicyEnvironmentOrm, findAvailablePoliciesByEnvId };
}; };
@@ -77,9 +77,9 @@ export const accessApprovalPolicyServiceFactory = ({
if (!envId && !envIds) { if (!envId && !envIds) {
throw new BadRequestError({ message: "Must provide either envId or envIds" }); throw new BadRequestError({ message: "Must provide either envId or envIds" });
} }
const policy = await accessApprovalPolicyDAL.findPoliciesByEnvIdAndSecretPath({ const policy = await accessApprovalPolicyDAL.findPolicyByEnvIdAndSecretPath({
secretPath, secretPath,
envIds: envId ? [envId] : envIds || [] envIds: envId ? [envId] : (envIds as string[])
}); });
return policyId ? policy && policy.id !== policyId : Boolean(policy); return policyId ? policy && policy.id !== policyId : Boolean(policy);
}; };
@@ -265,7 +265,7 @@ export const secretApprovalPolicyDALFactory = (db: TDbClient) => {
return softDeletedPolicy; return softDeletedPolicy;
}; };
const findPoliciesByEnvIdAndSecretPath = async ( const findPolicyByEnvIdAndSecretPath = async (
{ envIds, secretPath }: { envIds: string[]; secretPath: string }, { envIds, secretPath }: { envIds: string[]; secretPath: string },
tx?: Knex tx?: Knex
) => { ) => {
@@ -330,9 +330,9 @@ export const secretApprovalPolicyDALFactory = (db: TDbClient) => {
}); });
return formattedDocs?.[0]; return formattedDocs?.[0];
} catch (error) { } catch (error) {
throw new DatabaseError({ error, name: "FindPoliciesByEnvIdAndSecretPath" }); throw new DatabaseError({ error, name: "findPolicyByEnvIdAndSecretPath" });
} }
}; };
return { ...secretApprovalPolicyOrm, findById, find, softDeleteById, findPoliciesByEnvIdAndSecretPath }; return { ...secretApprovalPolicyOrm, findById, find, softDeleteById, findPolicyByEnvIdAndSecretPath };
}; };
@@ -3,14 +3,14 @@ import { Knex } from "knex";
import { TDbClient } from "@app/db"; import { TDbClient } from "@app/db";
import { TableName } from "@app/db/schemas"; import { TableName } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors"; import { DatabaseError } from "@app/lib/errors";
import { ormify, selectAllTableCols } from "@app/lib/knex"; import { buildFindFilter, ormify, selectAllTableCols } from "@app/lib/knex";
export type TSecretApprovalPolicyEnvironmentDALFactory = ReturnType<typeof secretApprovalPolicyEnvironmentDALFactory>; export type TSecretApprovalPolicyEnvironmentDALFactory = ReturnType<typeof secretApprovalPolicyEnvironmentDALFactory>;
export const secretApprovalPolicyEnvironmentDALFactory = (db: TDbClient) => { export const secretApprovalPolicyEnvironmentDALFactory = (db: TDbClient) => {
const secretApprovalPolicyEnvironmentOrm = ormify(db, TableName.SecretApprovalPolicyEnvironment); const secretApprovalPolicyEnvironmentOrm = ormify(db, TableName.SecretApprovalPolicyEnvironment);
const findAvailablePoliciesIds = async (envId: string, tx?: Knex) => { const findAvailablePoliciesByEnvId = async (envId: string, tx?: Knex) => {
try { try {
const docs = await (tx || db.replicaNode())(TableName.SecretApprovalPolicyEnvironment) const docs = await (tx || db.replicaNode())(TableName.SecretApprovalPolicyEnvironment)
.join( .join(
@@ -18,14 +18,15 @@ export const secretApprovalPolicyEnvironmentDALFactory = (db: TDbClient) => {
`${TableName.SecretApprovalPolicyEnvironment}.policyId`, `${TableName.SecretApprovalPolicyEnvironment}.policyId`,
`${TableName.SecretApprovalPolicy}.id` `${TableName.SecretApprovalPolicy}.id`
) )
.where({ [`${TableName.SecretApprovalPolicyEnvironment}.envId` as "envId"]: envId }) // eslint-disable-next-line @typescript-eslint/no-misused-promises
.where(buildFindFilter({ envId }, TableName.SecretApprovalPolicyEnvironment))
.whereNull(`${TableName.SecretApprovalPolicy}.deletedAt`) .whereNull(`${TableName.SecretApprovalPolicy}.deletedAt`)
.select(selectAllTableCols(TableName.SecretApprovalPolicyEnvironment)); .select(selectAllTableCols(TableName.SecretApprovalPolicyEnvironment));
return docs; return docs;
} catch (error) { } catch (error) {
throw new DatabaseError({ error, name: "findAvailablePoliciesIds" }); throw new DatabaseError({ error, name: "findAvailablePoliciesByEnvId" });
} }
}; };
return { ...secretApprovalPolicyEnvironmentOrm, findAvailablePoliciesIds }; return { ...secretApprovalPolicyEnvironmentOrm, findAvailablePoliciesByEnvId };
}; };
@@ -72,7 +72,7 @@ export const secretApprovalPolicyServiceFactory = ({
if (!envIds && !envId) { if (!envIds && !envId) {
throw new BadRequestError({ message: "At least one environment should be provided" }); throw new BadRequestError({ message: "At least one environment should be provided" });
} }
const policy = await secretApprovalPolicyDAL.findPoliciesByEnvIdAndSecretPath({ const policy = await secretApprovalPolicyDAL.findPolicyByEnvIdAndSecretPath({
envIds: envId ? [envId] : envIds || [], envIds: envId ? [envId] : envIds || [],
secretPath secretPath
}); });
@@ -21,8 +21,8 @@ type TProjectEnvServiceFactoryDep = {
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">; permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">;
licenseService: Pick<TLicenseServiceFactory, "getPlan">; licenseService: Pick<TLicenseServiceFactory, "getPlan">;
keyStore: Pick<TKeyStoreFactory, "acquireLock" | "setItemWithExpiry" | "getItem" | "waitTillReady">; keyStore: Pick<TKeyStoreFactory, "acquireLock" | "setItemWithExpiry" | "getItem" | "waitTillReady">;
accessApprovalPolicyEnvironmentDAL: Pick<TAccessApprovalPolicyEnvironmentDALFactory, "findAvailablePoliciesIds">; accessApprovalPolicyEnvironmentDAL: Pick<TAccessApprovalPolicyEnvironmentDALFactory, "findAvailablePoliciesByEnvId">;
secretApprovalPolicyEnvironmentDAL: Pick<TSecretApprovalPolicyEnvironmentDALFactory, "findAvailablePoliciesIds">; secretApprovalPolicyEnvironmentDAL: Pick<TSecretApprovalPolicyEnvironmentDALFactory, "findAvailablePoliciesByEnvId">;
}; };
export type TProjectEnvServiceFactory = ReturnType<typeof projectEnvServiceFactory>; export type TProjectEnvServiceFactory = ReturnType<typeof projectEnvServiceFactory>;
@@ -222,15 +222,15 @@ export const projectEnvServiceFactory = ({
} }
const env = await projectEnvDAL.transaction(async (tx) => { const env = await projectEnvDAL.transaction(async (tx) => {
const secretApprovalRequest = await secretApprovalPolicyEnvironmentDAL.findAvailablePoliciesIds(id, tx); const secretApprovalPolicies = await secretApprovalPolicyEnvironmentDAL.findAvailablePoliciesByEnvId(id, tx);
if (secretApprovalRequest.length > 0) { if (secretApprovalPolicies.length > 0) {
throw new BadRequestError({ throw new BadRequestError({
message: "Environment is in use by a secret approval policy", message: "Environment is in use by a secret approval policy",
name: "DeleteEnvironment" name: "DeleteEnvironment"
}); });
} }
const accessApprovalPolicy = await accessApprovalPolicyEnvironmentDAL.findAvailablePoliciesIds(id, tx); const accessApprovalPolicies = await accessApprovalPolicyEnvironmentDAL.findAvailablePoliciesByEnvId(id, tx);
if (accessApprovalPolicy.length > 0) { if (accessApprovalPolicies.length > 0) {
throw new BadRequestError({ throw new BadRequestError({
message: "Environment is in use by an access approval policy", message: "Environment is in use by an access approval policy",
name: "DeleteEnvironment" name: "DeleteEnvironment"
@@ -8,7 +8,6 @@ export type TAccessApprovalPolicy = {
name: string; name: string;
approvals: number; approvals: number;
secretPath: string; secretPath: string;
envId: string;
workspace: string; workspace: string;
environments: WorkspaceEnv[]; environments: WorkspaceEnv[];
projectId: string; projectId: string;
@@ -5,7 +5,6 @@ export type TSecretApprovalPolicy = {
id: string; id: string;
workspace: string; workspace: string;
name: string; name: string;
envId: string;
environments: WorkspaceEnv[]; environments: WorkspaceEnv[];
secretPath?: string; secretPath?: string;
approvals: number; approvals: number;