Renamed column to allowedSelfApprovals

This commit is contained in:
carlosmonastyrski
2025-03-25 12:18:13 -03:00
parent 871be7132a
commit ef6abedfe0
22 changed files with 61 additions and 61 deletions
@@ -3,27 +3,27 @@ import { Knex } from "knex";
import { TableName } from "../schemas/models"; import { TableName } from "../schemas/models";
export async function up(knex: Knex): Promise<void> { export async function up(knex: Knex): Promise<void> {
if (!(await knex.schema.hasColumn(TableName.SecretApprovalPolicy, "selfApprovals"))) { if (!(await knex.schema.hasColumn(TableName.SecretApprovalPolicy, "allowedallowedSelfApprovals"))) {
await knex.schema.alterTable(TableName.SecretApprovalPolicy, (t) => { await knex.schema.alterTable(TableName.SecretApprovalPolicy, (t) => {
t.boolean("selfApprovals").notNullable().defaultTo(true); t.boolean("allowedSelfApprovals").notNullable().defaultTo(true);
}); });
} }
if (!(await knex.schema.hasColumn(TableName.AccessApprovalPolicy, "selfApprovals"))) { if (!(await knex.schema.hasColumn(TableName.AccessApprovalPolicy, "allowedSelfApprovals"))) {
await knex.schema.alterTable(TableName.AccessApprovalPolicy, (t) => { await knex.schema.alterTable(TableName.AccessApprovalPolicy, (t) => {
t.boolean("selfApprovals").notNullable().defaultTo(true); t.boolean("allowedSelfApprovals").notNullable().defaultTo(true);
}); });
} }
} }
export async function down(knex: Knex): Promise<void> { export async function down(knex: Knex): Promise<void> {
if (await knex.schema.hasColumn(TableName.SecretApprovalPolicy, "selfApprovals")) { if (await knex.schema.hasColumn(TableName.SecretApprovalPolicy, "allowedSelfApprovals")) {
await knex.schema.alterTable(TableName.SecretApprovalPolicy, (t) => { await knex.schema.alterTable(TableName.SecretApprovalPolicy, (t) => {
t.dropColumn("selfApprovals"); t.dropColumn("allowedSelfApprovals");
}); });
} }
if (await knex.schema.hasColumn(TableName.AccessApprovalPolicy, "selfApprovals")) { if (await knex.schema.hasColumn(TableName.AccessApprovalPolicy, "allowedSelfApprovals")) {
await knex.schema.alterTable(TableName.AccessApprovalPolicy, (t) => { await knex.schema.alterTable(TableName.AccessApprovalPolicy, (t) => {
t.dropColumn("selfApprovals"); t.dropColumn("allowedSelfApprovals");
}); });
} }
} }
@@ -17,7 +17,7 @@ export const AccessApprovalPoliciesSchema = z.object({
updatedAt: z.date(), updatedAt: z.date(),
enforcementLevel: z.string().default("hard"), enforcementLevel: z.string().default("hard"),
deletedAt: z.date().nullable().optional(), deletedAt: z.date().nullable().optional(),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}); });
export type TAccessApprovalPolicies = z.infer<typeof AccessApprovalPoliciesSchema>; export type TAccessApprovalPolicies = z.infer<typeof AccessApprovalPoliciesSchema>;
@@ -17,7 +17,7 @@ export const SecretApprovalPoliciesSchema = z.object({
updatedAt: z.date(), updatedAt: z.date(),
enforcementLevel: z.string().default("hard"), enforcementLevel: z.string().default("hard"),
deletedAt: z.date().nullable().optional(), deletedAt: z.date().nullable().optional(),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}); });
export type TSecretApprovalPolicies = z.infer<typeof SecretApprovalPoliciesSchema>; export type TSecretApprovalPolicies = z.infer<typeof SecretApprovalPoliciesSchema>;
@@ -30,7 +30,7 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
.min(1, { message: "At least one approver should be provided" }), .min(1, { message: "At least one approver should be provided" }),
approvals: z.number().min(1).default(1), approvals: z.number().min(1).default(1),
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard), enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}), }),
response: { response: {
200: z.object({ 200: z.object({
@@ -149,7 +149,7 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
.min(1, { message: "At least one approver should be provided" }), .min(1, { message: "At least one approver should be provided" }),
approvals: z.number().min(1).optional(), approvals: z.number().min(1).optional(),
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard), enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}), }),
response: { response: {
200: z.object({ 200: z.object({
@@ -111,7 +111,7 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
envId: z.string(), envId: z.string(),
enforcementLevel: z.string(), enforcementLevel: z.string(),
deletedAt: z.date().nullish(), deletedAt: z.date().nullish(),
selfApprovals: z.boolean() allowedSelfApprovals: z.boolean()
}), }),
reviewers: z reviewers: z
.object({ .object({
@@ -36,7 +36,7 @@ export const registerSecretApprovalPolicyRouter = async (server: FastifyZodProvi
.min(1, { message: "At least one approver should be provided" }), .min(1, { message: "At least one approver should be provided" }),
approvals: z.number().min(1).default(1), approvals: z.number().min(1).default(1),
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard), enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}), }),
response: { response: {
200: z.object({ 200: z.object({
@@ -87,7 +87,7 @@ export const registerSecretApprovalPolicyRouter = async (server: FastifyZodProvi
.transform((val) => (val ? removeTrailingSlash(val) : val)) .transform((val) => (val ? removeTrailingSlash(val) : val))
.transform((val) => (val === "" ? "/" : val)), .transform((val) => (val === "" ? "/" : val)),
enforcementLevel: z.nativeEnum(EnforcementLevel).optional(), enforcementLevel: z.nativeEnum(EnforcementLevel).optional(),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}), }),
response: { response: {
200: z.object({ 200: z.object({
@@ -50,7 +50,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv
secretPath: z.string().optional().nullable(), secretPath: z.string().optional().nullable(),
enforcementLevel: z.string(), enforcementLevel: z.string(),
deletedAt: z.date().nullish(), deletedAt: z.date().nullish(),
selfApprovals: z.boolean() allowedSelfApprovals: z.boolean()
}), }),
committerUser: approvalRequestUser, committerUser: approvalRequestUser,
commits: z.object({ op: z.string(), secretId: z.string().nullable().optional() }).array(), commits: z.object({ op: z.string(), secretId: z.string().nullable().optional() }).array(),
@@ -269,7 +269,7 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv
secretPath: z.string().optional().nullable(), secretPath: z.string().optional().nullable(),
enforcementLevel: z.string(), enforcementLevel: z.string(),
deletedAt: z.date().nullish(), deletedAt: z.date().nullish(),
selfApprovals: z.boolean() allowedSelfApprovals: z.boolean()
}), }),
environment: z.string(), environment: z.string(),
statusChangedByUser: approvalRequestUser.optional(), statusChangedByUser: approvalRequestUser.optional(),
@@ -66,7 +66,7 @@ export const accessApprovalPolicyServiceFactory = ({
projectSlug, projectSlug,
environment, environment,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}: TCreateAccessApprovalPolicy) => { }: TCreateAccessApprovalPolicy) => {
const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId);
if (!project) throw new NotFoundError({ message: `Project with slug '${projectSlug}' not found` }); if (!project) throw new NotFoundError({ message: `Project with slug '${projectSlug}' not found` });
@@ -155,7 +155,7 @@ export const accessApprovalPolicyServiceFactory = ({
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}, },
tx tx
); );
@@ -219,7 +219,7 @@ export const accessApprovalPolicyServiceFactory = ({
actorAuthMethod, actorAuthMethod,
approvals, approvals,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}: TUpdateAccessApprovalPolicy) => { }: TUpdateAccessApprovalPolicy) => {
const groupApprovers = approvers const groupApprovers = approvers
.filter((approver) => approver.type === ApproverType.Group) .filter((approver) => approver.type === ApproverType.Group)
@@ -266,7 +266,7 @@ export const accessApprovalPolicyServiceFactory = ({
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}, },
tx tx
); );
@@ -26,7 +26,7 @@ export type TCreateAccessApprovalPolicy = {
projectSlug: string; projectSlug: string;
name: string; name: string;
enforcementLevel: EnforcementLevel; enforcementLevel: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
} & Omit<TProjectPermission, "projectId">; } & Omit<TProjectPermission, "projectId">;
export type TUpdateAccessApprovalPolicy = { export type TUpdateAccessApprovalPolicy = {
@@ -36,7 +36,7 @@ export type TUpdateAccessApprovalPolicy = {
secretPath?: string; secretPath?: string;
name?: string; name?: string;
enforcementLevel?: EnforcementLevel; enforcementLevel?: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
} & Omit<TProjectPermission, "projectId">; } & Omit<TProjectPermission, "projectId">;
export type TDeleteAccessApprovalPolicy = { export type TDeleteAccessApprovalPolicy = {
@@ -61,7 +61,7 @@ export const accessApprovalRequestDALFactory = (db: TDbClient) => {
db.ref("approvals").withSchema(TableName.AccessApprovalPolicy).as("policyApprovals"), db.ref("approvals").withSchema(TableName.AccessApprovalPolicy).as("policyApprovals"),
db.ref("secretPath").withSchema(TableName.AccessApprovalPolicy).as("policySecretPath"), db.ref("secretPath").withSchema(TableName.AccessApprovalPolicy).as("policySecretPath"),
db.ref("enforcementLevel").withSchema(TableName.AccessApprovalPolicy).as("policyEnforcementLevel"), db.ref("enforcementLevel").withSchema(TableName.AccessApprovalPolicy).as("policyEnforcementLevel"),
db.ref("selfApprovals").withSchema(TableName.AccessApprovalPolicy).as("policySelfApprovals"), db.ref("allowedSelfApprovals").withSchema(TableName.AccessApprovalPolicy).as("policyAllowedSelfApprovals"),
db.ref("envId").withSchema(TableName.AccessApprovalPolicy).as("policyEnvId"), db.ref("envId").withSchema(TableName.AccessApprovalPolicy).as("policyEnvId"),
db.ref("deletedAt").withSchema(TableName.AccessApprovalPolicy).as("policyDeletedAt") db.ref("deletedAt").withSchema(TableName.AccessApprovalPolicy).as("policyDeletedAt")
) )
@@ -120,7 +120,7 @@ export const accessApprovalRequestDALFactory = (db: TDbClient) => {
approvals: doc.policyApprovals, approvals: doc.policyApprovals,
secretPath: doc.policySecretPath, secretPath: doc.policySecretPath,
enforcementLevel: doc.policyEnforcementLevel, enforcementLevel: doc.policyEnforcementLevel,
selfApprovals: doc.policySelfApprovals, allowedSelfApprovals: doc.policyAllowedSelfApprovals,
envId: doc.policyEnvId, envId: doc.policyEnvId,
deletedAt: doc.policyDeletedAt deletedAt: doc.policyDeletedAt
}, },
@@ -256,7 +256,7 @@ export const accessApprovalRequestDALFactory = (db: TDbClient) => {
tx.ref("slug").withSchema(TableName.Environment).as("environment"), tx.ref("slug").withSchema(TableName.Environment).as("environment"),
tx.ref("secretPath").withSchema(TableName.AccessApprovalPolicy).as("policySecretPath"), tx.ref("secretPath").withSchema(TableName.AccessApprovalPolicy).as("policySecretPath"),
tx.ref("enforcementLevel").withSchema(TableName.AccessApprovalPolicy).as("policyEnforcementLevel"), tx.ref("enforcementLevel").withSchema(TableName.AccessApprovalPolicy).as("policyEnforcementLevel"),
tx.ref("selfApprovals").withSchema(TableName.AccessApprovalPolicy).as("policySelfApprovals"), tx.ref("allowedSelfApprovals").withSchema(TableName.AccessApprovalPolicy).as("policyAllowedSelfApprovals"),
tx.ref("approvals").withSchema(TableName.AccessApprovalPolicy).as("policyApprovals"), tx.ref("approvals").withSchema(TableName.AccessApprovalPolicy).as("policyApprovals"),
tx.ref("deletedAt").withSchema(TableName.AccessApprovalPolicy).as("policyDeletedAt") tx.ref("deletedAt").withSchema(TableName.AccessApprovalPolicy).as("policyDeletedAt")
); );
@@ -278,7 +278,7 @@ export const accessApprovalRequestDALFactory = (db: TDbClient) => {
approvals: el.policyApprovals, approvals: el.policyApprovals,
secretPath: el.policySecretPath, secretPath: el.policySecretPath,
enforcementLevel: el.policyEnforcementLevel, enforcementLevel: el.policyEnforcementLevel,
selfApprovals: el.policySelfApprovals, allowedSelfApprovals: el.policyAllowedSelfApprovals,
deletedAt: el.policyDeletedAt deletedAt: el.policyDeletedAt
}, },
requestedByUser: { requestedByUser: {
@@ -320,7 +320,7 @@ export const accessApprovalRequestServiceFactory = ({
message: "The policy associated with this access request has been deleted." message: "The policy associated with this access request has been deleted."
}); });
} }
if (!policy.selfApprovals && actorId === accessApprovalRequest.requestedByUserId) { if (!policy.allowedSelfApprovals && actorId === accessApprovalRequest.requestedByUserId) {
throw new BadRequestError({ throw new BadRequestError({
message: "Failed to review access approval request. Users are not authorized to review their own request." message: "Failed to review access approval request. Users are not authorized to review their own request."
}); });
@@ -63,7 +63,7 @@ export const secretApprovalPolicyServiceFactory = ({
secretPath, secretPath,
environment, environment,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}: TCreateSapDTO) => { }: TCreateSapDTO) => {
const groupApprovers = approvers const groupApprovers = approvers
?.filter((approver) => approver.type === ApproverType.Group) ?.filter((approver) => approver.type === ApproverType.Group)
@@ -115,7 +115,7 @@ export const secretApprovalPolicyServiceFactory = ({
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}, },
tx tx
); );
@@ -175,7 +175,7 @@ export const secretApprovalPolicyServiceFactory = ({
approvals, approvals,
secretPolicyId, secretPolicyId,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}: TUpdateSapDTO) => { }: TUpdateSapDTO) => {
const groupApprovers = approvers const groupApprovers = approvers
?.filter((approver) => approver.type === ApproverType.Group) ?.filter((approver) => approver.type === ApproverType.Group)
@@ -222,7 +222,7 @@ export const secretApprovalPolicyServiceFactory = ({
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}, },
tx tx
); );
@@ -10,7 +10,7 @@ export type TCreateSapDTO = {
projectId: string; projectId: string;
name: string; name: string;
enforcementLevel: EnforcementLevel; enforcementLevel: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
} & Omit<TProjectPermission, "projectId">; } & Omit<TProjectPermission, "projectId">;
export type TUpdateSapDTO = { export type TUpdateSapDTO = {
@@ -20,7 +20,7 @@ export type TUpdateSapDTO = {
approvers: ({ type: ApproverType.Group; id: string } | { type: ApproverType.User; id?: string; name?: string })[]; approvers: ({ type: ApproverType.Group; id: string } | { type: ApproverType.User; id?: string; name?: string })[];
name?: string; name?: string;
enforcementLevel?: EnforcementLevel; enforcementLevel?: EnforcementLevel;
selfApprovals?: boolean; allowedSelfApprovals?: boolean;
} & Omit<TProjectPermission, "projectId">; } & Omit<TProjectPermission, "projectId">;
export type TDeleteSapDTO = { export type TDeleteSapDTO = {
@@ -112,7 +112,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
tx.ref("secretPath").withSchema(TableName.SecretApprovalPolicy).as("policySecretPath"), tx.ref("secretPath").withSchema(TableName.SecretApprovalPolicy).as("policySecretPath"),
tx.ref("envId").withSchema(TableName.SecretApprovalPolicy).as("policyEnvId"), tx.ref("envId").withSchema(TableName.SecretApprovalPolicy).as("policyEnvId"),
tx.ref("enforcementLevel").withSchema(TableName.SecretApprovalPolicy).as("policyEnforcementLevel"), tx.ref("enforcementLevel").withSchema(TableName.SecretApprovalPolicy).as("policyEnforcementLevel"),
tx.ref("selfApprovals").withSchema(TableName.SecretApprovalPolicy).as("policySelfApprovals"), tx.ref("allowedSelfApprovals").withSchema(TableName.SecretApprovalPolicy).as("policyAllowedSelfApprovals"),
tx.ref("approvals").withSchema(TableName.SecretApprovalPolicy).as("policyApprovals"), tx.ref("approvals").withSchema(TableName.SecretApprovalPolicy).as("policyApprovals"),
tx.ref("deletedAt").withSchema(TableName.SecretApprovalPolicy).as("policyDeletedAt") tx.ref("deletedAt").withSchema(TableName.SecretApprovalPolicy).as("policyDeletedAt")
); );
@@ -152,7 +152,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
enforcementLevel: el.policyEnforcementLevel, enforcementLevel: el.policyEnforcementLevel,
envId: el.policyEnvId, envId: el.policyEnvId,
deletedAt: el.policyDeletedAt, deletedAt: el.policyDeletedAt,
selfApprovals: el.policySelfApprovals allowedSelfApprovals: el.policyAllowedSelfApprovals
} }
}), }),
childrenMapper: [ childrenMapper: [
@@ -338,7 +338,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
), ),
db.ref("secretPath").withSchema(TableName.SecretApprovalPolicy).as("policySecretPath"), db.ref("secretPath").withSchema(TableName.SecretApprovalPolicy).as("policySecretPath"),
db.ref("enforcementLevel").withSchema(TableName.SecretApprovalPolicy).as("policyEnforcementLevel"), db.ref("enforcementLevel").withSchema(TableName.SecretApprovalPolicy).as("policyEnforcementLevel"),
db.ref("selfApprovals").withSchema(TableName.SecretApprovalPolicy).as("policySelfApprovals"), db.ref("allowedSelfApprovals").withSchema(TableName.SecretApprovalPolicy).as("policyAllowedSelfApprovals"),
db.ref("approvals").withSchema(TableName.SecretApprovalPolicy).as("policyApprovals"), db.ref("approvals").withSchema(TableName.SecretApprovalPolicy).as("policyApprovals"),
db.ref("approverUserId").withSchema(TableName.SecretApprovalPolicyApprover), db.ref("approverUserId").withSchema(TableName.SecretApprovalPolicyApprover),
db.ref("userId").withSchema(TableName.UserGroupMembership).as("approverGroupUserId"), db.ref("userId").withSchema(TableName.UserGroupMembership).as("approverGroupUserId"),
@@ -368,7 +368,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
approvals: el.policyApprovals, approvals: el.policyApprovals,
secretPath: el.policySecretPath, secretPath: el.policySecretPath,
enforcementLevel: el.policyEnforcementLevel, enforcementLevel: el.policyEnforcementLevel,
selfApprovals: el.policySelfApprovals allowedSelfApprovals: el.policyAllowedSelfApprovals
}, },
committerUser: { committerUser: {
userId: el.committerUserId, userId: el.committerUserId,
@@ -486,7 +486,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
`DENSE_RANK() OVER (partition by ${TableName.Environment}."projectId" ORDER BY ${TableName.SecretApprovalRequest}."id" DESC) as rank` `DENSE_RANK() OVER (partition by ${TableName.Environment}."projectId" ORDER BY ${TableName.SecretApprovalRequest}."id" DESC) as rank`
), ),
db.ref("secretPath").withSchema(TableName.SecretApprovalPolicy).as("policySecretPath"), db.ref("secretPath").withSchema(TableName.SecretApprovalPolicy).as("policySecretPath"),
db.ref("selfApprovals").withSchema(TableName.SecretApprovalPolicy).as("policySelfApprovals"), db.ref("allowedSelfApprovals").withSchema(TableName.SecretApprovalPolicy).as("policyAllowedSelfApprovals"),
db.ref("approvals").withSchema(TableName.SecretApprovalPolicy).as("policyApprovals"), db.ref("approvals").withSchema(TableName.SecretApprovalPolicy).as("policyApprovals"),
db.ref("enforcementLevel").withSchema(TableName.SecretApprovalPolicy).as("policyEnforcementLevel"), db.ref("enforcementLevel").withSchema(TableName.SecretApprovalPolicy).as("policyEnforcementLevel"),
db.ref("approverUserId").withSchema(TableName.SecretApprovalPolicyApprover), db.ref("approverUserId").withSchema(TableName.SecretApprovalPolicyApprover),
@@ -517,7 +517,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => {
approvals: el.policyApprovals, approvals: el.policyApprovals,
secretPath: el.policySecretPath, secretPath: el.policySecretPath,
enforcementLevel: el.policyEnforcementLevel, enforcementLevel: el.policyEnforcementLevel,
selfApprovals: el.policySelfApprovals allowedSelfApprovals: el.policyAllowedSelfApprovals
}, },
committerUser: { committerUser: {
userId: el.committerUserId, userId: el.committerUserId,
@@ -352,7 +352,7 @@ export const secretApprovalRequestServiceFactory = ({
message: "The policy associated with this secret approval request has been deleted." message: "The policy associated with this secret approval request has been deleted."
}); });
} }
if (!policy.selfApprovals && actorId === secretApprovalRequest.committerUserId) { if (!policy.allowedSelfApprovals && actorId === secretApprovalRequest.committerUserId) {
throw new BadRequestError({ throw new BadRequestError({
message: "Failed to review secret approval request. Users are not authorized to review their own request." message: "Failed to review secret approval request. Users are not authorized to review their own request."
}); });
@@ -24,7 +24,7 @@ export const useCreateAccessApprovalPolicy = () => {
name, name,
secretPath, secretPath,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}) => { }) => {
const { data } = await apiRequest.post("/api/v1/access-approvals/policies", { const { data } = await apiRequest.post("/api/v1/access-approvals/policies", {
environment, environment,
@@ -34,7 +34,7 @@ export const useCreateAccessApprovalPolicy = () => {
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}); });
return data; return data;
}, },
@@ -57,7 +57,7 @@ export const useUpdateAccessApprovalPolicy = () => {
name, name,
secretPath, secretPath,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}) => { }) => {
const { data } = await apiRequest.patch(`/api/v1/access-approvals/policies/${id}`, { const { data } = await apiRequest.patch(`/api/v1/access-approvals/policies/${id}`, {
approvals, approvals,
@@ -65,7 +65,7 @@ export const useUpdateAccessApprovalPolicy = () => {
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}); });
return data; return data;
}, },
@@ -16,7 +16,7 @@ export type TAccessApprovalPolicy = {
enforcementLevel: EnforcementLevel; enforcementLevel: EnforcementLevel;
updatedAt: Date; updatedAt: Date;
approvers?: Approver[]; approvers?: Approver[];
selfApprovals: boolean; allowedSelfApprovals: boolean;
}; };
export enum ApproverType { export enum ApproverType {
@@ -72,7 +72,7 @@ export type TAccessApprovalRequest = {
envId: string; envId: string;
enforcementLevel: EnforcementLevel; enforcementLevel: EnforcementLevel;
deletedAt: Date | null; deletedAt: Date | null;
selfApprovals: boolean; allowedSelfApprovals: boolean;
}; };
reviewers: { reviewers: {
@@ -146,7 +146,7 @@ export type TCreateAccessPolicyDTO = {
approvals?: number; approvals?: number;
secretPath?: string; secretPath?: string;
enforcementLevel?: EnforcementLevel; enforcementLevel?: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
}; };
export type TUpdateAccessPolicyDTO = { export type TUpdateAccessPolicyDTO = {
@@ -157,7 +157,7 @@ export type TUpdateAccessPolicyDTO = {
environment?: string; environment?: string;
approvals?: number; approvals?: number;
enforcementLevel?: EnforcementLevel; enforcementLevel?: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
// for invalidating list // for invalidating list
projectSlug: string; projectSlug: string;
}; };
@@ -17,7 +17,7 @@ export const useCreateSecretApprovalPolicy = () => {
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}) => { }) => {
const { data } = await apiRequest.post("/api/v1/secret-approvals", { const { data } = await apiRequest.post("/api/v1/secret-approvals", {
environment, environment,
@@ -27,7 +27,7 @@ export const useCreateSecretApprovalPolicy = () => {
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}); });
return data; return data;
}, },
@@ -50,7 +50,7 @@ export const useUpdateSecretApprovalPolicy = () => {
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}) => { }) => {
const { data } = await apiRequest.patch(`/api/v1/secret-approvals/${id}`, { const { data } = await apiRequest.patch(`/api/v1/secret-approvals/${id}`, {
approvals, approvals,
@@ -58,7 +58,7 @@ export const useUpdateSecretApprovalPolicy = () => {
secretPath, secretPath,
name, name,
enforcementLevel, enforcementLevel,
selfApprovals allowedSelfApprovals
}); });
return data; return data;
}, },
@@ -12,7 +12,7 @@ export type TSecretApprovalPolicy = {
approvers: Approver[]; approvers: Approver[];
updatedAt: Date; updatedAt: Date;
enforcementLevel: EnforcementLevel; enforcementLevel: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
}; };
export enum ApproverType { export enum ApproverType {
@@ -43,7 +43,7 @@ export type TCreateSecretPolicyDTO = {
approvers?: Approver[]; approvers?: Approver[];
approvals?: number; approvals?: number;
enforcementLevel: EnforcementLevel; enforcementLevel: EnforcementLevel;
selfApprovals: boolean; allowedSelfApprovals: boolean;
}; };
export type TUpdateSecretPolicyDTO = { export type TUpdateSecretPolicyDTO = {
@@ -52,7 +52,7 @@ export type TUpdateSecretPolicyDTO = {
approvers?: Approver[]; approvers?: Approver[];
secretPath?: string | null; secretPath?: string | null;
approvals?: number; approvals?: number;
selfApprovals?: boolean; allowedSelfApprovals?: boolean;
enforcementLevel?: EnforcementLevel; enforcementLevel?: EnforcementLevel;
// for invalidating list // for invalidating list
workspaceId: string; workspaceId: string;
@@ -152,7 +152,7 @@ export const AccessApprovalRequest = ({
const isAccepted = request.isApproved; const isAccepted = request.isApproved;
const isSoftEnforcement = request.policy.enforcementLevel === EnforcementLevel.Soft; const isSoftEnforcement = request.policy.enforcementLevel === EnforcementLevel.Soft;
const isRequestedByCurrentUser = request.requestedByUserId === user.id; const isRequestedByCurrentUser = request.requestedByUserId === user.id;
const isSelfApproveAllowed = request.policy.selfApprovals; const isSelfApproveAllowed = request.policy.allowedSelfApprovals;
const userReviewStatus = request.reviewers.find(({ member }) => member === user.id)?.status; const userReviewStatus = request.reviewers.find(({ member }) => member === user.id)?.status;
let displayData: { label: string; type: "primary" | "danger" | "success" } = { let displayData: { label: string; type: "primary" | "danger" | "success" } = {
@@ -56,7 +56,7 @@ const formSchema = z
.default([]), .default([]),
policyType: z.nativeEnum(PolicyType), policyType: z.nativeEnum(PolicyType),
enforcementLevel: z.nativeEnum(EnforcementLevel), enforcementLevel: z.nativeEnum(EnforcementLevel),
selfApprovals: z.boolean().default(true) allowedSelfApprovals: z.boolean().default(true)
}) })
.superRefine((data, ctx) => { .superRefine((data, ctx) => {
if (!(data.groupApprovers.length || data.userApprovers.length)) { if (!(data.groupApprovers.length || data.userApprovers.length)) {
@@ -104,7 +104,7 @@ export const AccessPolicyForm = ({
?.filter((approver) => approver.type === ApproverType.Group) ?.filter((approver) => approver.type === ApproverType.Group)
.map(({ id, type }) => ({ id, type: type as ApproverType.Group })) || [], .map(({ id, type }) => ({ id, type: type as ApproverType.Group })) || [],
approvals: editValues?.approvals, approvals: editValues?.approvals,
selfApprovals: editValues?.selfApprovals allowedSelfApprovals: editValues?.allowedSelfApprovals
} }
: undefined : undefined
}); });
@@ -446,7 +446,7 @@ export const AccessPolicyForm = ({
/> />
<Controller <Controller
control={control} control={control}
name="selfApprovals" name="allowedSelfApprovals"
defaultValue defaultValue
render={({ field: { value, onChange }, fieldState: { error } }) => ( render={({ field: { value, onChange }, fieldState: { error } }) => (
<FormControl <FormControl
@@ -128,7 +128,7 @@ export const SecretApprovalRequestChanges = ({
resolver: zodResolver(reviewFormSchema) resolver: zodResolver(reviewFormSchema)
}); });
const shouldBlockSelfReview = const shouldBlockSelfReview =
secretApprovalRequestDetails?.policy?.selfApprovals === false && secretApprovalRequestDetails?.policy?.allowedSelfApprovals === false &&
secretApprovalRequestDetails?.committerUserId === userSession.id; secretApprovalRequestDetails?.committerUserId === userSession.id;
const isApproving = variables?.status === ApprovalStatus.APPROVED && isUpdatingRequestStatus; const isApproving = variables?.status === ApprovalStatus.APPROVED && isUpdatingRequestStatus;
const isRejecting = variables?.status === ApprovalStatus.REJECTED && isUpdatingRequestStatus; const isRejecting = variables?.status === ApprovalStatus.REJECTED && isUpdatingRequestStatus;