feat: initial integration of cert template management

This commit is contained in:
Sheen Capadngan
2024-08-15 21:06:37 +08:00
parent 05efd95472
commit 28a2a6c41a
14 changed files with 595 additions and 3 deletions
@@ -0,0 +1,2 @@
export { useCreateCertTemplate, useDeleteCertTemplate, useUpdateCertTemplate } from "./mutations";
export { useGetCertTemplate } from "./queries";
@@ -0,0 +1,63 @@
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { workspaceKeys } from "../workspace/queries";
import { certTemplateKeys } from "./queries";
import {
TCertificateTemplate,
TCreateCertificateTemplateDTO,
TDeleteCertificateTemplateDTO,
TUpdateCertificateTemplateDTO
} from "./types";
export const useCreateCertTemplate = () => {
const queryClient = useQueryClient();
return useMutation<TCertificateTemplate, {}, TCreateCertificateTemplateDTO>({
mutationFn: async (data) => {
const {
data: { certificateTemplate }
} = await apiRequest.post<{ certificateTemplate: TCertificateTemplate }>(
"/api/v1/pki/certificate-templates",
data
);
return certificateTemplate;
},
onSuccess: (_, { projectId }) => {
queryClient.invalidateQueries(workspaceKeys.getWorkspaceCertificateTemplates(projectId));
}
});
};
export const useUpdateCertTemplate = () => {
const queryClient = useQueryClient();
return useMutation<TCertificateTemplate, {}, TUpdateCertificateTemplateDTO>({
mutationFn: async (data) => {
const {
data: { certificateTemplate }
} = await apiRequest.patch<{ certificateTemplate: TCertificateTemplate }>(
`/api/v1/pki/certificate-templates/${data.id}`,
data
);
return certificateTemplate;
},
onSuccess: (_, { projectId, id }) => {
queryClient.invalidateQueries(workspaceKeys.getWorkspaceCertificateTemplates(projectId));
queryClient.invalidateQueries(certTemplateKeys.getCertTemplateById(id));
}
});
};
export const useDeleteCertTemplate = () => {
const queryClient = useQueryClient();
return useMutation<void, {}, TDeleteCertificateTemplateDTO>({
mutationFn: async (data) => {
return apiRequest.delete(`/api/v1/pki/certificate-templates/${data.id}`);
},
onSuccess: (_, { projectId, id }) => {
queryClient.invalidateQueries(workspaceKeys.getWorkspaceCertificateTemplates(projectId));
queryClient.invalidateQueries(certTemplateKeys.getCertTemplateById(id));
}
});
};
@@ -0,0 +1,24 @@
import { useQuery } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { TCertificateTemplate } from "./types";
export const certTemplateKeys = {
getCertTemplateById: (id: string) => [{ id }, "cert-template"]
};
export const useGetCertTemplate = (id: string) => {
return useQuery({
queryKey: certTemplateKeys.getCertTemplateById(id),
queryFn: async () => {
const {
data: { certificateTemplate }
} = await apiRequest.get<{ certificateTemplate: TCertificateTemplate }>(
`/api/v1/pki/certificate-templates/${id}`
);
return certificateTemplate;
},
enabled: Boolean(id)
});
};
@@ -0,0 +1,35 @@
export type TCertificateTemplateListEntry = {
id: string;
name: string;
caName: string;
};
export type TCertificateTemplate = {
id: string;
caId: string;
name: string;
commonName: string;
ttl: string;
};
export type TCreateCertificateTemplateDTO = {
caId: string;
name: string;
commonName: string;
ttl: string;
projectId: string;
};
export type TUpdateCertificateTemplateDTO = {
id: string;
caId?: string;
name?: string;
commonName?: string;
ttl?: string;
projectId: string;
};
export type TDeleteCertificateTemplateDTO = {
id: string;
projectId: string;
};
+1
View File
@@ -7,6 +7,7 @@ export * from "./auth";
export * from "./bots";
export * from "./ca";
export * from "./certificates";
export * from "./certificateTemplates";
export * from "./dynamicSecret";
export * from "./dynamicSecretLease";
export * from "./groups";
@@ -25,6 +25,7 @@ export {
useGetWorkspaceUsers,
useListWorkspaceCas,
useListWorkspaceCertificates,
useListWorkspaceCertificateTemplates,
useListWorkspaceGroups,
useListWorkspacePkiAlerts,
useListWorkspacePkiCollections,
+20 -1
View File
@@ -5,6 +5,7 @@ import { apiRequest } from "@app/config/request";
import { CaStatus } from "../ca/enums";
import { TCertificateAuthority } from "../ca/types";
import { TCertificate } from "../certificates/types";
import { TCertificateTemplateListEntry } from "../certificateTemplates/types";
import { TGroupMembership } from "../groups/types";
import { identitiesKeys } from "../identities/queries";
import { IdentityMembership } from "../identities/types";
@@ -68,7 +69,9 @@ export const workspaceKeys = {
getWorkspacePkiAlerts: (workspaceId: string) =>
[{ workspaceId }, "workspace-pki-alerts"] as const,
getWorkspacePkiCollections: (workspaceId: string) =>
[{ workspaceId }, "workspace-pki-collections"] as const
[{ workspaceId }, "workspace-pki-collections"] as const,
getWorkspaceCertificateTemplates: (workspaceId: string) =>
[{ workspaceId }, "workspace-certificate-templates"] as const
};
const fetchWorkspaceById = async (workspaceId: string) => {
@@ -639,3 +642,19 @@ export const useListWorkspacePkiCollections = ({ workspaceId }: { workspaceId: s
enabled: Boolean(workspaceId)
});
};
export const useListWorkspaceCertificateTemplates = ({ workspaceId }: { workspaceId: string }) => {
return useQuery({
queryKey: workspaceKeys.getWorkspaceCertificateTemplates(workspaceId),
queryFn: async () => {
const {
data: { certificateTemplates }
} = await apiRequest.get<{ certificateTemplates: TCertificateTemplateListEntry[] }>(
`/api/v2/workspace/${workspaceId}/certificate-templates`
);
return { certificateTemplates };
},
enabled: Boolean(workspaceId)
});
};