mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-07 14:27:30 +00:00
PIT: fix resourceChangeSchema schema
This commit is contained in:
@@ -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}`);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user