feat: added hooks for policies

This commit is contained in:
=
2025-12-05 15:29:55 +05:30
parent bb60fb2f08
commit d192f1e3e1
4 changed files with 198 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
export {
useCreateApprovalPolicy,
useDeleteApprovalPolicy,
useUpdateApprovalPolicy
} from "./mutations";
export { approvalPolicyQuery } from "./queries";
export {
ApprovalPolicyType,
ApproverType,
type ApprovalPolicyStep,
type PamAccessPolicyConditions,
type PamAccessPolicyConstraints,
type TApprovalPolicy,
type TCreateApprovalPolicyDTO,
type TDeleteApprovalPolicyDTO,
type TGetApprovalPolicyByIdDTO,
type TListApprovalPoliciesDTO,
type TUpdateApprovalPolicyDTO
} from "./types";

View File

@@ -0,0 +1,58 @@
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { approvalPolicyQuery } from "./queries";
import {
TApprovalPolicy,
TCreateApprovalPolicyDTO,
TDeleteApprovalPolicyDTO,
TUpdateApprovalPolicyDTO
} from "./types";
export const useCreateApprovalPolicy = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async ({ policyType, ...dto }: TCreateApprovalPolicyDTO) => {
const { data } = await apiRequest.post<{ policy: TApprovalPolicy }>(
`/api/v1/approval-policies/${policyType}`,
dto
);
return data.policy;
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: approvalPolicyQuery.allKey() });
}
});
};
export const useUpdateApprovalPolicy = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async ({ policyType, policyId, ...updates }: TUpdateApprovalPolicyDTO) => {
const { data } = await apiRequest.patch<{ policy: TApprovalPolicy }>(
`/api/v1/approval-policies/${policyType}/${policyId}`,
updates
);
return data.policy;
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: approvalPolicyQuery.allKey() });
}
});
};
export const useDeleteApprovalPolicy = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async ({ policyType, policyId }: TDeleteApprovalPolicyDTO) => {
const { data } = await apiRequest.delete<{ policyId: string }>(
`/api/v1/approval-policies/${policyType}/${policyId}`
);
return data.policyId;
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: approvalPolicyQuery.allKey() });
}
});
};

View File

@@ -0,0 +1,37 @@
import { queryOptions } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { TApprovalPolicy, TGetApprovalPolicyByIdDTO, TListApprovalPoliciesDTO } from "./types";
export const approvalPolicyQuery = {
allKey: () => ["approval-policies"] as const,
getByIdKey: (params: TGetApprovalPolicyByIdDTO) =>
[...approvalPolicyQuery.allKey(), "by-id", params] as const,
listKey: (params: TListApprovalPoliciesDTO) =>
[...approvalPolicyQuery.allKey(), "list", params] as const,
getById: (params: TGetApprovalPolicyByIdDTO) =>
queryOptions({
queryKey: approvalPolicyQuery.getByIdKey(params),
queryFn: async () => {
const { data } = await apiRequest.get<{ policy: TApprovalPolicy }>(
`/api/v1/approval-policies/${params.policyType}/${params.policyId}`
);
return data.policy;
}
}),
list: (params: TListApprovalPoliciesDTO) =>
queryOptions({
queryKey: approvalPolicyQuery.listKey(params),
queryFn: async () => {
const { data } = await apiRequest.get<{
policies: TApprovalPolicy[];
}>(`/api/v1/approval-policies/${params.policyType}`, {
params: {
projectId: params.projectId
}
});
return data.policies;
}
})
};

View File

@@ -0,0 +1,84 @@
export enum ApprovalPolicyType {
PamAccess = "pam-access"
}
export enum ApproverType {
Group = "group",
User = "user"
}
export type ApprovalPolicyStep = {
name?: string | null;
requiredApprovals: number;
notifyApprovers?: boolean;
approvers: {
type: ApproverType;
id: string;
}[];
};
export type PamAccessPolicyConditions = {
resourceIds: string[];
accountPaths: string[];
}[];
export type PamAccessPolicyConstraints = {
requestDurationHours: {
min: number;
max: number;
};
};
export type TApprovalPolicy = {
id: string;
projectId: string;
name: string;
maxRequestTtlSeconds?: number | null;
type: ApprovalPolicyType;
conditions: {
version: number;
conditions: PamAccessPolicyConditions;
};
constraints: {
version: number;
constraints: PamAccessPolicyConstraints;
};
steps: ApprovalPolicyStep[];
createdAt: string;
updatedAt: string;
};
export type TCreateApprovalPolicyDTO = {
policyType: ApprovalPolicyType;
projectId: string;
name: string;
maxRequestTtlSeconds?: number | null;
conditions: PamAccessPolicyConditions;
constraints: PamAccessPolicyConstraints;
steps: ApprovalPolicyStep[];
};
export type TUpdateApprovalPolicyDTO = {
policyType: ApprovalPolicyType;
policyId: string;
name?: string;
maxRequestTtlSeconds?: number | null;
conditions?: PamAccessPolicyConditions;
constraints?: PamAccessPolicyConstraints;
steps?: ApprovalPolicyStep[];
};
export type TGetApprovalPolicyByIdDTO = {
policyType: ApprovalPolicyType;
policyId: string;
};
export type TListApprovalPoliciesDTO = {
policyType: ApprovalPolicyType;
projectId: string;
};
export type TDeleteApprovalPolicyDTO = {
policyType: ApprovalPolicyType;
policyId: string;
};