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

View File

@@ -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 {

View File

@@ -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()
});

View File

@@ -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);
});
});
});

View File

@@ -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<string, SecretTargetChange | FolderTargetChange> = {};
// 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<string, SecretTargetChange | FolderTargetChange> = {};
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}`);