mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-15 06:35:21 +00:00
feat(secret-approval): conflict ui, request count and secret path in request detail
This commit is contained in:
@@ -3,4 +3,8 @@ export {
|
||||
useUpdateSecretApprovalRequestStatus,
|
||||
useUpdateSecretApprovalReviewStatus
|
||||
} from "./mutation";
|
||||
export { useGetSecretApprovalRequestDetails, useGetSecretApprovalRequests } from "./queries";
|
||||
export {
|
||||
useGetSecretApprovalRequestCount,
|
||||
useGetSecretApprovalRequestDetails,
|
||||
useGetSecretApprovalRequests
|
||||
} from "./queries";
|
||||
|
||||
@@ -35,8 +35,9 @@ export const useUpdateSecretApprovalRequestStatus = () => {
|
||||
});
|
||||
return data;
|
||||
},
|
||||
onSuccess: (_, { id }) => {
|
||||
onSuccess: (_, { id, workspaceId }) => {
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.detail({ id }));
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -52,6 +53,7 @@ export const usePerformSecretApprovalRequestMerge = () => {
|
||||
onSuccess: (_, { id, workspaceId }) => {
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.detail({ id }));
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.list({ workspaceId }));
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@@ -15,9 +15,11 @@ import { UserWsKeyPair } from "../keys/types";
|
||||
import { decryptSecrets } from "../secrets/queries";
|
||||
import { DecryptedSecret } from "../secrets/types";
|
||||
import {
|
||||
TGetSecretApprovalRequestCount,
|
||||
TGetSecretApprovalRequestDetails,
|
||||
TGetSecretApprovalRequestList,
|
||||
TSecretApprovalRequest,
|
||||
TSecretApprovalRequestCount,
|
||||
TSecretApprovalSecChange,
|
||||
TSecretApprovalSecChangeData
|
||||
} from "./types";
|
||||
@@ -36,7 +38,11 @@ export const secretApprovalRequestKeys = {
|
||||
"secret-approval-requests"
|
||||
] as const,
|
||||
detail: ({ id }: Omit<TGetSecretApprovalRequestDetails, "decryptKey">) =>
|
||||
[{ id }, "secret-approval-request-detail"] as const
|
||||
[{ id }, "secret-approval-request-detail"] as const,
|
||||
count: ({ workspaceId }: TGetSecretApprovalRequestCount) => [
|
||||
{ workspaceId },
|
||||
"secret-approval-request-count"
|
||||
]
|
||||
};
|
||||
|
||||
export const decryptSecretApprovalSecret = (
|
||||
@@ -187,3 +193,32 @@ export const useGetSecretApprovalRequestDetails = ({
|
||||
}),
|
||||
enabled: Boolean(id && decryptKey) && (options?.enabled ?? true)
|
||||
});
|
||||
|
||||
const fetchSecretApprovalRequestCount = async ({ workspaceId }: TGetSecretApprovalRequestCount) => {
|
||||
const { data } = await apiRequest.get<{ approvals: TSecretApprovalRequestCount }>(
|
||||
"/api/v1/secret-approval-requests/count",
|
||||
{ params: { workspaceId } }
|
||||
);
|
||||
|
||||
return data.approvals;
|
||||
};
|
||||
|
||||
export const useGetSecretApprovalRequestCount = ({
|
||||
workspaceId,
|
||||
options = {}
|
||||
}: TGetSecretApprovalRequestCount & {
|
||||
options?: Omit<
|
||||
UseQueryOptions<
|
||||
TSecretApprovalRequestCount,
|
||||
unknown,
|
||||
TSecretApprovalRequestCount,
|
||||
ReturnType<typeof secretApprovalRequestKeys.count>
|
||||
>,
|
||||
"queryKey" | "queryFn"
|
||||
>;
|
||||
}) =>
|
||||
useQuery({
|
||||
queryKey: secretApprovalRequestKeys.count({ workspaceId }),
|
||||
queryFn: () => fetchSecretApprovalRequestCount({ workspaceId }),
|
||||
enabled: Boolean(workspaceId) && (options?.enabled ?? true)
|
||||
});
|
||||
|
||||
@@ -17,7 +17,6 @@ export enum CommitType {
|
||||
|
||||
export type TSecretApprovalSecChangeData = {
|
||||
_id: string;
|
||||
version: number;
|
||||
secretKeyCiphertext: string;
|
||||
secretKeyIV: string;
|
||||
secretKeyTag: string;
|
||||
@@ -31,6 +30,7 @@ export type TSecretApprovalSecChangeData = {
|
||||
algorithm: "aes-256-gcm";
|
||||
keyEncoding: "utf8" | "base64";
|
||||
tags?: WsTag[];
|
||||
version: number;
|
||||
};
|
||||
|
||||
export type TSecretApprovalSecChange = {
|
||||
@@ -57,10 +57,12 @@ export type TSecretApprovalRequest<
|
||||
workspace: string;
|
||||
environment: string;
|
||||
folderId: string;
|
||||
secretPath: string;
|
||||
hasMerged: boolean;
|
||||
status: "open" | "close";
|
||||
policy: TSecretApprovalPolicy;
|
||||
statusChangeBy: string;
|
||||
conflicts: Array<{ secretId: string; op: CommitType.UPDATE }>;
|
||||
commits: {
|
||||
// if there is no secret means it was creation
|
||||
secret?: { version: number };
|
||||
@@ -71,6 +73,11 @@ export type TSecretApprovalRequest<
|
||||
}[];
|
||||
};
|
||||
|
||||
export type TSecretApprovalRequestCount = {
|
||||
open: number;
|
||||
closed: number;
|
||||
};
|
||||
|
||||
export type TGetSecretApprovalRequestList = {
|
||||
workspaceId: string;
|
||||
environment?: string;
|
||||
@@ -80,6 +87,10 @@ export type TGetSecretApprovalRequestList = {
|
||||
offset?: number;
|
||||
};
|
||||
|
||||
export type TGetSecretApprovalRequestCount = {
|
||||
workspaceId: string;
|
||||
};
|
||||
|
||||
export type TGetSecretApprovalRequestDetails = {
|
||||
id: string;
|
||||
decryptKey: UserWsKeyPair;
|
||||
@@ -93,6 +104,7 @@ export type TUpdateSecretApprovalReviewStatusDTO = {
|
||||
export type TUpdateSecretApprovalRequestStatusDTO = {
|
||||
status: "open" | "close";
|
||||
id: string;
|
||||
workspaceId: string;
|
||||
};
|
||||
|
||||
export type TPerformSecretApprovalRequestMerge = {
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
} from "@app/components/utilities/cryptography/crypto";
|
||||
import { apiRequest } from "@app/config/request";
|
||||
|
||||
import { secretApprovalRequestKeys } from "../secretApprovalRequest/queries";
|
||||
import { secretSnapshotKeys } from "../secretSnapshots/queries";
|
||||
import { secretKeys } from "./queries";
|
||||
import {
|
||||
@@ -114,6 +115,7 @@ export const useCreateSecretV3 = ({
|
||||
queryClient.invalidateQueries(
|
||||
secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
|
||||
);
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
},
|
||||
...options
|
||||
});
|
||||
@@ -173,6 +175,7 @@ export const useUpdateSecretV3 = ({
|
||||
queryClient.invalidateQueries(
|
||||
secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
|
||||
);
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
},
|
||||
...options
|
||||
});
|
||||
@@ -209,6 +212,7 @@ export const useDeleteSecretV3 = ({
|
||||
queryClient.invalidateQueries(
|
||||
secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
|
||||
);
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
},
|
||||
...options
|
||||
});
|
||||
@@ -261,6 +265,7 @@ export const useCreateSecretBatch = ({
|
||||
queryClient.invalidateQueries(
|
||||
secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
|
||||
);
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
},
|
||||
...options
|
||||
});
|
||||
@@ -313,6 +318,7 @@ export const useUpdateSecretBatch = ({
|
||||
queryClient.invalidateQueries(
|
||||
secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
|
||||
);
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
},
|
||||
...options
|
||||
});
|
||||
@@ -349,6 +355,7 @@ export const useDeleteSecretBatch = ({
|
||||
queryClient.invalidateQueries(
|
||||
secretSnapshotKeys.count({ environment, workspaceId, directory: secretPath })
|
||||
);
|
||||
queryClient.invalidateQueries(secretApprovalRequestKeys.count({ workspaceId }));
|
||||
},
|
||||
...options
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user