PIT: UI views

This commit is contained in:
carlosmonastyrski
2025-05-20 08:22:14 -03:00
parent 8bfd3913da
commit 6319f53802
47 changed files with 4134 additions and 196 deletions
@@ -0,0 +1,2 @@
export { useGetFolderCommitHistory, useGetFolderCommitsCount } from "./queries";
export * from "./types";
@@ -0,0 +1,247 @@
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { CommitHistoryItem, CommitWithChanges, RollbackPreview } from "./types";
export const commitKeys = {
count: ({
workspaceId,
environment,
directory
}: {
workspaceId: string;
environment: string;
directory?: string;
}) => [{ workspaceId, environment, directory }, "folder-commits-count"] as const,
history: ({
workspaceId,
environment,
directory
}: {
workspaceId: string;
environment: string;
directory?: string;
}) => [{ workspaceId, environment, directory }, "folder-commits"] as const,
details: ({ workspaceId, commitId }: { workspaceId: string; commitId: string }) =>
[{ workspaceId, commitId }, "commit-details"] as const,
rollbackPreview: ({
folderId,
commitId,
envId,
projectId,
deepRollback
}: {
folderId: string;
commitId: string;
envId: string;
projectId: string;
deepRollback: boolean;
}) => [{ folderId, commitId, envId, projectId, deepRollback }, "rollback-preview"] as const
};
const fetchFolderCommitsCount = async ({
workspaceId,
environment,
directory
}: {
workspaceId: string;
environment: string;
directory?: string;
}) => {
const res = await apiRequest.get<{ count: number; folderId: string }>(
`/api/v1/pit/commits/count/${workspaceId}`,
{
params: {
environment,
path: directory
}
}
);
return res.data;
};
const fetchFolderCommitHistory = async (
workspaceId: string,
environment: string,
directory: string
): Promise<CommitHistoryItem[]> => {
const res = await apiRequest.get<CommitHistoryItem[]>(`/api/v1/pit/commits/${workspaceId}`, {
params: {
environment,
path: directory
}
});
return res.data;
};
export const fetchCommitDetails = async (workspaceId: string, commitId: string) => {
const { data } = await apiRequest.get<CommitWithChanges>(
`/api/v1/pit/commits/${workspaceId}/${commitId}/changes`
);
return data;
};
export const fetchRollbackPreview = async (
folderId: string,
commitId: string,
envId: string,
projectId: string,
deepRollback: boolean,
secretPath: string
): Promise<RollbackPreview[]> => {
const { data } = await apiRequest.get<RollbackPreview[]>(
`/api/v1/pit/commits/${projectId}/${commitId}/compare`,
{
params: {
folderId,
envId,
deepRollback,
secretPath
}
}
);
return data;
};
const fetchRollback = async (
folderId: string,
commitId: string,
projectId: string,
deepRollback: boolean,
message?: string
) => {
const { data } = await apiRequest.post<{ success: boolean }>(
`/api/v1/pit/commits/${projectId}/${commitId}/rollback`,
{
folderId,
deepRollback,
message
}
);
return data;
};
const fetchRevert = async (commitId: string, projectId: string) => {
const { data } = await apiRequest.post<{ success: boolean; message: string }>(
`/api/v1/pit/commits/${projectId}/${commitId}/revert`
);
return data;
};
export const useCommitRevert = ({
commitId,
projectId,
environment,
directory
}: {
commitId: string;
projectId: string;
environment: string;
directory: string;
}) => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => fetchRevert(commitId, projectId),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: [
commitKeys.details({ workspaceId: projectId, commitId }),
commitKeys.history({ workspaceId: projectId, environment, directory }),
commitKeys.count({ workspaceId: projectId, environment, directory })
]
});
}
});
};
export const useCommitRollback = ({
workspaceId,
commitId,
folderId,
deepRollback,
environment,
directory
}: {
workspaceId: string;
commitId: string;
folderId: string;
deepRollback: boolean;
environment: string;
directory: string;
}) => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (message: string) =>
fetchRollback(folderId, commitId, workspaceId, deepRollback, message),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: [
commitKeys.details({ workspaceId, commitId }),
commitKeys.history({ workspaceId, environment, directory }),
commitKeys.count({ workspaceId, environment, directory })
]
});
}
});
};
export const useGetFolderCommitsCount = ({
workspaceId,
environment,
directory,
isPaused
}: {
workspaceId: string;
environment: string;
directory: string;
isPaused?: boolean;
}) =>
useQuery({
enabled: Boolean(workspaceId && environment) && !isPaused,
queryKey: commitKeys.count({ workspaceId, environment, directory }),
queryFn: () => fetchFolderCommitsCount({ workspaceId, environment, directory })
});
export const useGetFolderCommitHistory = ({
workspaceId,
environment,
directory
}: {
workspaceId: string;
environment: string;
directory: string;
}) => {
return useQuery({
queryKey: commitKeys.history({ workspaceId, environment, directory }),
queryFn: () => fetchFolderCommitHistory(workspaceId, environment, directory),
enabled: Boolean(workspaceId && environment)
});
};
export const useGetCommitDetails = (workspaceId: string, commitId: string) => {
return useQuery({
queryKey: commitKeys.details({ workspaceId, commitId }),
queryFn: () => fetchCommitDetails(workspaceId, commitId),
enabled: Boolean(workspaceId) && Boolean(commitId)
});
};
export const useGetRollbackPreview = (
folderId: string,
commitId: string,
envId: string,
projectId: string,
deepRollback: boolean,
secretPath: string
) => {
return useQuery({
queryKey: commitKeys.rollbackPreview({ folderId, commitId, envId, projectId, deepRollback }),
queryFn: () =>
fetchRollbackPreview(folderId, commitId, envId, projectId, deepRollback, secretPath),
enabled: Boolean(folderId) && Boolean(commitId)
});
};
@@ -0,0 +1,63 @@
import { SecretVersions } from "../types";
export type CommitHistoryItem = {
id: string;
commitId: string;
actorMetadata: {
id: string;
name?: string;
};
actorType: string;
message: string;
folderId: string;
envId: string;
createdAt: string;
updatedAt: string;
};
export type TFolderCommitChanges = {
id: string;
folderCommitId: string;
changeType: "add" | "delete";
isUpdate: boolean;
secretVersionId: string | null;
folderVersionId: string | null;
createdAt: string;
updatedAt: string;
versions: SecretVersions[];
secretKey?: string;
folderName?: string;
secretVersion?: string;
folderVersion?: string;
};
export type FolderReconstructedItem = {
type: string;
id: string;
versionId: string;
folderName?: string;
folderVersion?: number;
secretKey?: string;
secretVersion?: number;
};
export type CommitWithChanges = {
changes: CommitHistoryItem & {
changes: TFolderCommitChanges[];
};
};
export type RollbackChange = {
type: "folder" | "secret";
id: string;
versionId: string;
changeType: "create" | "update" | "delete";
commitId: string;
};
export type RollbackPreview = {
folderId: string;
folderName: string;
folderPath: string;
changes: RollbackChange[];
};
@@ -10,6 +10,7 @@ import {
import { apiRequest } from "@app/config/request";
import { dashboardKeys } from "@app/hooks/api/dashboard/queries";
import { commitKeys } from "../folderCommits/queries";
import { secretSnapshotKeys } from "../secretSnapshots/queries";
import {
TCreateFolderDTO,
@@ -166,6 +167,9 @@ export const useCreateFolder = () => {
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ workspaceId: projectId, environment, directory: path })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId: projectId, environment, directory: path })
});
}
});
};
@@ -200,6 +204,12 @@ export const useUpdateFolder = () => {
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ workspaceId: projectId, environment, directory: path })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId: projectId, environment, directory: path })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId: projectId, environment, directory: path })
});
}
});
};
@@ -234,6 +244,12 @@ export const useDeleteFolder = () => {
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ workspaceId: projectId, environment, directory: path })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId: projectId, environment, directory: path })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId: projectId, environment, directory: path })
});
}
});
};
@@ -279,6 +295,20 @@ export const useUpdateFolderBatch = () => {
directory: folder.path
})
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({
workspaceId: projectId,
environment: folder.environment,
directory: folder.path
})
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({
workspaceId: projectId,
environment: folder.environment,
directory: folder.path
})
});
});
}
});
@@ -3,6 +3,7 @@ import { MutationOptions, useMutation, useQueryClient } from "@tanstack/react-qu
import { apiRequest } from "@app/config/request";
import { dashboardKeys } from "@app/hooks/api/dashboard/queries";
import { commitKeys } from "../folderCommits/queries";
import { secretApprovalRequestKeys } from "../secretApprovalRequest/queries";
import { secretSnapshotKeys } from "../secretSnapshots/queries";
import { secretKeys } from "./queries";
@@ -59,6 +60,12 @@ export const useCreateSecretV3 = ({
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({ queryKey: secretApprovalRequestKeys.count({ workspaceId }) });
},
...options
@@ -118,6 +125,12 @@ export const useUpdateSecretV3 = ({
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({ queryKey: secretApprovalRequestKeys.count({ workspaceId }) });
},
...options
@@ -164,6 +177,12 @@ export const useDeleteSecretV3 = ({
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({ queryKey: secretApprovalRequestKeys.count({ workspaceId }) });
},
...options
@@ -200,6 +219,12 @@ export const useCreateSecretBatch = ({
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({ queryKey: secretApprovalRequestKeys.count({ workspaceId }) });
},
...options
@@ -236,6 +261,12 @@ export const useUpdateSecretBatch = ({
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({ queryKey: secretApprovalRequestKeys.count({ workspaceId }) });
},
...options
@@ -274,6 +305,12 @@ export const useDeleteSecretBatch = ({
queryClient.invalidateQueries({
queryKey: secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({ workspaceId, environment, directory: secretPath })
});
queryClient.invalidateQueries({ queryKey: secretApprovalRequestKeys.count({ workspaceId }) });
},
...options
@@ -347,6 +384,20 @@ export const useMoveSecrets = ({
directory: sourceSecretPath
})
});
queryClient.invalidateQueries({
queryKey: commitKeys.count({
workspaceId: projectId,
environment: sourceEnvironment,
directory: sourceSecretPath
})
});
queryClient.invalidateQueries({
queryKey: commitKeys.history({
workspaceId: projectId,
environment: sourceEnvironment,
directory: sourceSecretPath
})
});
queryClient.invalidateQueries({
queryKey: secretApprovalRequestKeys.count({ workspaceId: projectId })
});