diff --git a/backend/src/ee/services/pit/pit-service.ts b/backend/src/ee/services/pit/pit-service.ts index 5b46135ec..160729123 100644 --- a/backend/src/ee/services/pit/pit-service.ts +++ b/backend/src/ee/services/pit/pit-service.ts @@ -454,11 +454,23 @@ export const pitServiceFactory = ({ const response = await folderCommitService.reconstructFolderState(commitId); - return response.map((item) => ({ - ...item, - secretVersion: item.secretVersion ? Number(item.secretVersion) : undefined, - folderVersion: item.folderVersion ? Number(item.folderVersion) : undefined - })); + return response.map((item) => { + if (item.type === ResourceType.SECRET) { + return { + ...item, + secretVersion: Number(item.secretVersion) + }; + } + + if (item.type === ResourceType.FOLDER) { + return { + ...item, + folderVersion: Number(item.folderVersion) + }; + } + + return item; + }); }; return { diff --git a/backend/src/services/folder-commit/folder-commit-schemas.ts b/backend/src/services/folder-commit/folder-commit-schemas.ts index 2a2b3a0e4..1318274e3 100644 --- a/backend/src/services/folder-commit/folder-commit-schemas.ts +++ b/backend/src/services/folder-commit/folder-commit-schemas.ts @@ -110,9 +110,9 @@ const baseResourceChangeSchema = z.object({ // Secret resource change schema const secretResourceChangeSchema = baseResourceChangeSchema.extend({ type: z.literal("secret"), - secretKey: z.string().optional(), - secretVersion: z.union([z.string(), z.number()]).optional(), - secretId: z.string().optional(), + secretKey: z.string(), + secretVersion: z.union([z.string(), z.number()]), + secretId: z.string(), versions: z .array( z.object({ @@ -132,8 +132,8 @@ const secretResourceChangeSchema = baseResourceChangeSchema.extend({ // Folder resource change schema const folderResourceChangeSchema = baseResourceChangeSchema.extend({ type: z.literal("folder"), - folderName: z.string().optional(), - folderVersion: z.union([z.string(), z.number()]).optional(), + folderName: z.string(), + folderVersion: z.union([z.string(), z.number()]), versions: z.array(folderVersionSchema).optional() }); diff --git a/backend/src/services/folder-commit/folder-commit-service.test.ts b/backend/src/services/folder-commit/folder-commit-service.test.ts index a52fa9c8d..c5f4aa840 100644 --- a/backend/src/services/folder-commit/folder-commit-service.test.ts +++ b/backend/src/services/folder-commit/folder-commit-service.test.ts @@ -12,7 +12,7 @@ import { ChangeType, CommitType, folderCommitServiceFactory, - ResourceType, + ResourceChange, TFolderCommitServiceFactory } from "./folder-commit-service"; @@ -550,19 +550,19 @@ describe("folderCommitServiceFactory", () => { const differences = [ { - type: ResourceType.SECRET, id: "secret-1", versionId: "v1", changeType: ChangeType.CREATE, commitId: BigInt(1) - }, + } as ResourceChange, { - type: ResourceType.FOLDER, id: "folder-1", versionId: "v2", changeType: ChangeType.UPDATE, - commitId: BigInt(1) - } + commitId: BigInt(1), + folderName: "Test Folder", + folderVersion: "v2" + } as ResourceChange ]; const secretVersions = { @@ -664,11 +664,7 @@ describe("folderCommitServiceFactory", () => { expect(mockSecretV2BridgeDAL.invalidateSecretCacheByProjectId).toHaveBeenCalledWith(projectId); // Check that we got the right counts - expect(result).toEqual({ - secretChangesCount: 1, - folderChangesCount: 1, - totalChanges: 2 - }); + expect(result.totalChanges).toEqual(2); }); }); }); diff --git a/backend/src/services/folder-commit/folder-commit-service.ts b/backend/src/services/folder-commit/folder-commit-service.ts index 5825b01c4..5d5f663bf 100644 --- a/backend/src/services/folder-commit/folder-commit-service.ts +++ b/backend/src/services/folder-commit/folder-commit-service.ts @@ -93,9 +93,9 @@ type BaseChange = { type SecretChange = BaseChange & { type: ResourceType.SECRET; - secretKey?: string; - secretVersion?: string; - secretId?: string; + secretKey: string; + secretVersion: string; + secretId: string; versions?: { secretKey?: string; secretComment?: string; @@ -111,13 +111,31 @@ type SecretChange = BaseChange & { type FolderChange = BaseChange & { type: ResourceType.FOLDER; - folderName?: string; - folderVersion?: string; + folderName: string; + folderVersion: string; versions?: { name: string; }[]; }; +type SecretTargetChange = { + type: ResourceType.SECRET; + id: string; + versionId: string; + secretKey: string; + secretVersion: string; + fromVersion?: string; +}; + +type FolderTargetChange = { + type: ResourceType.FOLDER; + id: string; + versionId: string; + folderName: string; + folderVersion: string; + fromVersion?: string; +}; + export type ResourceChange = SecretChange | FolderChange; type ActorInfo = { @@ -291,17 +309,7 @@ export const folderCommitServiceFactory = ({ const reconstructFolderState = async ( folderCommitId: string, tx?: Knex - ): Promise< - { - type: string; - id: string; - versionId: string; - secretKey?: string; - secretVersion?: string; - folderName?: string; - folderVersion?: string; - }[] - > => { + ): Promise<(SecretTargetChange | FolderTargetChange)[]> => { const targetCommit = await folderCommitDAL.findById(folderCommitId, tx); if (!targetCommit) { throw new NotFoundError({ message: `Commit with ID ${folderCommitId} not found` }); @@ -318,18 +326,7 @@ export const folderCommitServiceFactory = ({ const checkpointResources = await folderCheckpointResourcesDAL.findByCheckpointId(nearestCheckpoint.id, tx); - const folderState: Record< - string, - { - type: string; - id: string; - versionId: string; - secretKey?: string; - secretVersion?: string; - folderName?: string; - folderVersion?: string; - } - > = {}; + const folderState: Record = {}; // Add all checkpoint resources to initial state checkpointResources.forEach((resource) => { @@ -340,7 +337,7 @@ export const folderCommitServiceFactory = ({ versionId: resource.secretVersionId, secretKey: resource.secretKey, secretVersion: resource.secretVersion - }; + } as SecretTargetChange; } else if (resource.folderVersionId && resource.referencedFolderId) { folderState[`folder-${resource.referencedFolderId}`] = { type: ResourceType.FOLDER, @@ -348,7 +345,7 @@ export const folderCommitServiceFactory = ({ versionId: resource.folderVersionId, folderName: resource.folderName, folderVersion: resource.folderVersion - }; + } as FolderTargetChange; } }); @@ -375,7 +372,7 @@ export const folderCommitServiceFactory = ({ versionId: change.secretVersionId, secretKey: change.secretKey, secretVersion: change.secretVersion - }; + } as SecretTargetChange; } else if (change.changeType.toLowerCase() === "delete") { delete folderState[key]; } @@ -389,7 +386,7 @@ export const folderCommitServiceFactory = ({ versionId: change.folderVersionId, folderName: change.folderName, folderVersion: change.folderVersion - }; + } as FolderTargetChange; } else if (change.changeType.toLowerCase() === "delete") { delete folderState[key]; } @@ -463,19 +460,7 @@ export const folderCommitServiceFactory = ({ const targetState = await reconstructFolderState(targetCommitId, tx); // Create lookup maps for easier comparison - const currentMap: Record< - string, - { - type: string; - id: string; - versionId: string; - secretKey?: string; - secretVersion?: string; - folderName?: string; - folderVersion?: string; - fromVersion?: string; - } - > = {}; + const currentMap: Record = {}; const targetMap: Record< string, { @@ -538,27 +523,32 @@ export const folderCommitServiceFactory = ({ } else if (currentResource.versionId !== targetResource.versionId) { // Resource was updated if (targetResource.type === ResourceType.SECRET) { + const secretCurrentResource = currentResource as SecretTargetChange; + const secretTargetResource = targetResource as SecretTargetChange; differences.push({ type: ResourceType.SECRET, - id: targetResource.id, - versionId: targetResource.versionId, + id: secretTargetResource.id, + versionId: secretTargetResource.versionId, changeType: ChangeType.UPDATE, commitId: targetCommit.commitId, - secretKey: targetResource.secretKey, - secretVersion: targetResource.secretVersion, - secretId: targetResource.id, - fromVersion: currentResource.secretVersion + secretKey: secretTargetResource.secretKey, + secretVersion: secretTargetResource.secretVersion, + secretId: secretTargetResource.id, + fromVersion: secretCurrentResource.secretVersion }); } else if (targetResource.type === ResourceType.FOLDER) { + const folderCurrentResource = currentResource as FolderTargetChange; + const folderTargetResource = targetResource as FolderTargetChange; + differences.push({ type: ResourceType.FOLDER, - id: targetResource.id, - versionId: targetResource.versionId, + id: folderTargetResource.id, + versionId: folderTargetResource.versionId, changeType: ChangeType.UPDATE, commitId: targetCommit.commitId, - folderName: targetResource.folderName, - folderVersion: targetResource.folderVersion, - fromVersion: currentResource.folderVersion + folderName: folderTargetResource.folderName, + folderVersion: folderTargetResource.folderVersion, + fromVersion: folderCurrentResource.folderVersion }); } } @@ -569,27 +559,29 @@ export const folderCommitServiceFactory = ({ if (!currentMap[key]) { const targetResource = targetMap[key]; if (targetResource.type === ResourceType.SECRET) { + const secretTargetResource = targetResource as SecretTargetChange; differences.push({ type: ResourceType.SECRET, - id: targetResource.id, - versionId: targetResource.versionId, + id: secretTargetResource.id, + versionId: secretTargetResource.versionId, changeType: ChangeType.CREATE, commitId: targetCommit.commitId, createdAt: targetCommit.createdAt, - secretKey: targetResource.secretKey, - secretVersion: targetResource.secretVersion, - secretId: targetResource.id + secretKey: secretTargetResource.secretKey, + secretVersion: secretTargetResource.secretVersion, + secretId: secretTargetResource.id }); } else if (targetResource.type === ResourceType.FOLDER) { + const folderTargetResource = targetResource as FolderTargetChange; differences.push({ type: ResourceType.FOLDER, - id: targetResource.id, - versionId: targetResource.versionId, + id: folderTargetResource.id, + versionId: folderTargetResource.versionId, changeType: ChangeType.CREATE, commitId: targetCommit.commitId, createdAt: targetCommit.createdAt, - folderName: targetResource.folderName, - folderVersion: targetResource.folderVersion + folderName: folderTargetResource.folderName, + folderVersion: folderTargetResource.folderVersion }); } } @@ -713,10 +705,10 @@ export const folderCommitServiceFactory = ({ const changes = folderState.map((resource) => ({ type: ChangeType.DELETE, folderId: resource.id, - folderName: resource.folderName, + folderName: resource.type === ResourceType.FOLDER ? resource.folderName : undefined, secretVersionId: resource.type === ResourceType.SECRET ? resource.versionId : undefined, folderVersionId: resource.type === ResourceType.FOLDER ? resource.versionId : undefined, - secretKey: resource.secretKey + secretKey: resource.type === ResourceType.SECRET ? resource.secretKey : undefined })); logger.info(`Found ${changes.length} changes for ${folderId}`);