PIT: fix resourceChangeSchema schema

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