mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-05 07:26:34 +00:00
Addressed PR suggestions
This commit is contained in:
@@ -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
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
+6
-5
@@ -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 };
|
||||||
};
|
};
|
||||||
|
|||||||
+6
-5
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user