From d546335345fe4c2f6b2d7ec972ed0e4477fd5222 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 11 Nov 2025 01:52:48 +0800 Subject: [PATCH] misc: add delete protection for projects on create --- backend/src/server/routes/v1/project-router.ts | 6 ++++-- backend/src/server/routes/v2/deprecated-project-router.ts | 6 ++++-- backend/src/services/project/project-service.ts | 7 +++++-- backend/src/services/project/project-types.ts | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index 70548395d..e3838cddc 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -162,7 +162,8 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { .default(InfisicalProjectTemplate.Default) .describe(PROJECTS.CREATE.template), type: z.nativeEnum(ProjectType).default(ProjectType.SecretManager), - shouldCreateDefaultEnvs: z.boolean().optional().default(true) + shouldCreateDefaultEnvs: z.boolean().optional().default(true), + hasDeleteProtection: z.boolean().optional().default(false) }), response: { 200: z.object({ @@ -183,7 +184,8 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { kmsKeyId: req.body.kmsKeyId, template: req.body.template, type: req.body.type, - createDefaultEnvs: req.body.shouldCreateDefaultEnvs + createDefaultEnvs: req.body.shouldCreateDefaultEnvs, + hasDeleteProtection: req.body.hasDeleteProtection }); await server.services.telemetry.sendPostHogEvents({ diff --git a/backend/src/server/routes/v2/deprecated-project-router.ts b/backend/src/server/routes/v2/deprecated-project-router.ts index 55493681a..82b351359 100644 --- a/backend/src/server/routes/v2/deprecated-project-router.ts +++ b/backend/src/server/routes/v2/deprecated-project-router.ts @@ -110,7 +110,8 @@ export const registerDeprecatedProjectRouter = async (server: FastifyZodProvider .default(InfisicalProjectTemplate.Default) .describe(PROJECTS.CREATE.template), type: z.nativeEnum(ProjectType).default(ProjectType.SecretManager), - shouldCreateDefaultEnvs: z.boolean().optional().default(true) + shouldCreateDefaultEnvs: z.boolean().optional().default(true), + hasDeleteProtection: z.boolean().optional().default(false) }), response: { 200: z.object({ @@ -131,7 +132,8 @@ export const registerDeprecatedProjectRouter = async (server: FastifyZodProvider kmsKeyId: req.body.kmsKeyId, template: req.body.template, type: req.body.type, - createDefaultEnvs: req.body.shouldCreateDefaultEnvs + createDefaultEnvs: req.body.shouldCreateDefaultEnvs, + hasDeleteProtection: req.body.hasDeleteProtection }); await server.services.telemetry.sendPostHogEvents({ diff --git a/backend/src/services/project/project-service.ts b/backend/src/services/project/project-service.ts index 727cc9aa9..188c985fb 100644 --- a/backend/src/services/project/project-service.ts +++ b/backend/src/services/project/project-service.ts @@ -252,7 +252,8 @@ export const projectServiceFactory = ({ tx: trx, createDefaultEnvs = true, template = InfisicalProjectTemplate.Default, - type = ProjectType.SecretManager + type = ProjectType.SecretManager, + hasDeleteProtection }: TCreateProjectDTO) => { const organization = await orgDAL.findOne({ id: actorOrgId }); const { permission } = await permissionService.getOrgPermission({ @@ -325,7 +326,8 @@ export const projectServiceFactory = ({ slug, kmsSecretManagerKeyId: kmsKeyId, version: ProjectVersion.V3, - pitVersionLimit: 10 + pitVersionLimit: 10, + hasDeleteProtection }, tx ); @@ -587,6 +589,7 @@ export const projectServiceFactory = ({ actorOrgId, actionProjectType: ActionProjectType.Any }); + return project; }; diff --git a/backend/src/services/project/project-types.ts b/backend/src/services/project/project-types.ts index 9e0745236..2d27c7c44 100644 --- a/backend/src/services/project/project-types.ts +++ b/backend/src/services/project/project-types.ts @@ -51,6 +51,7 @@ export type TCreateProjectDTO = { pitVersionLimit?: number; tx?: Knex; type?: ProjectType; + hasDeleteProtection?: boolean; }; export type TDeleteProjectBySlugDTO = {