import { useMutation, useQueryClient } from "@tanstack/react-query"; import { apiRequest } from "@app/config/request"; import { workspaceKeys } from "../workspace"; import { caKeys } from "./queries"; import { TCertificateAuthority, TCreateCaDTO, TCreateCertificateDTO, TCreateCertificateResponse, TCreateUnifiedCertificateAuthorityDTO, TDeleteCaDTO, TDeleteUnifiedCertificateAuthorityDTO, TImportCaCertificateDTO, TImportCaCertificateResponse, TRenewCaDTO, TRenewCaResponse, TSignIntermediateDTO, TSignIntermediateResponse, TUnifiedCertificateAuthority, TUpdateCaDTO, TUpdateUnifiedCertificateAuthorityDTO } from "./types"; export const useUpdateUnifiedCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ id, ...body }) => { const { data: { certificateAuthority } } = await apiRequest.patch<{ certificateAuthority: TUnifiedCertificateAuthority }>( `/api/v1/pki/ca/${body.type}/${id}`, body ); return certificateAuthority; }, onSuccess: ({ projectId, type }) => { queryClient.invalidateQueries({ queryKey: caKeys.listCasByTypeAndProjectId(type, projectId) }); } }); }; export const useCreateUnifiedCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (body) => { const { data } = await apiRequest.post( `/api/v1/pki/ca/${body.type}`, body ); return data; }, onSuccess: (_, { type, projectId }) => { queryClient.invalidateQueries({ queryKey: caKeys.listCasByTypeAndProjectId(type, projectId) }); } }); }; export const useDeleteUnifiedCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ caId, type }) => { const { data: { certificateAuthority } } = await apiRequest.delete<{ certificateAuthority: TUnifiedCertificateAuthority }>( `/api/v1/pki/ca/${type}/${caId}` ); return certificateAuthority; }, onSuccess: (_, { type, projectId }) => { queryClient.invalidateQueries({ queryKey: caKeys.listCasByTypeAndProjectId(type, projectId) }); } }); }; export const useCreateCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (body) => { const { data: { ca } } = await apiRequest.post<{ ca: TCertificateAuthority }>("/api/v1/pki/ca/", body); return ca; }, onSuccess: (_, { projectSlug }) => { queryClient.invalidateQueries({ queryKey: workspaceKeys.getWorkspaceCas({ projectSlug }) }); } }); }; export const useUpdateCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ caId, projectSlug, ...body }) => { const { data: { ca } } = await apiRequest.patch<{ ca: TCertificateAuthority }>(`/api/v1/pki/ca/${caId}`, body); return ca; }, onSuccess: ({ id }, { projectSlug }) => { queryClient.invalidateQueries({ queryKey: workspaceKeys.getWorkspaceCas({ projectSlug }) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaById(id) }); } }); }; export const useDeleteCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ caId }) => { const { data: { ca } } = await apiRequest.delete<{ ca: TCertificateAuthority }>(`/api/v1/pki/ca/${caId}`); return ca; }, onSuccess: (_, { projectSlug }) => { queryClient.invalidateQueries({ queryKey: workspaceKeys.getWorkspaceCas({ projectSlug }) }); } }); }; export const useSignIntermediate = () => { // TODO: consider renaming return useMutation({ mutationFn: async (body) => { const { data } = await apiRequest.post( `/api/v1/pki/ca/${body.caId}/sign-intermediate`, body ); return data; } }); }; export const useImportCaCertificate = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ caId, ...body }) => { const { data } = await apiRequest.post( `/api/v1/pki/ca/${caId}/import-certificate`, body ); return data; }, onSuccess: (_, { caId, projectSlug }) => { queryClient.invalidateQueries({ queryKey: workspaceKeys.getWorkspaceCas({ projectSlug }) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaCerts(caId) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaCert(caId) }); } }); }; // consider rename to issue certificate export const useCreateCertificate = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (body) => { const { data } = await apiRequest.post( "/api/v1/pki/certificates/issue-certificate", body ); return data; }, onSuccess: (_, { projectSlug }) => { queryClient.invalidateQueries({ queryKey: workspaceKeys.forWorkspaceCertificates(projectSlug) }); } }); }; export const useRenewCa = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (body) => { const { data } = await apiRequest.post( `/api/v1/pki/ca/${body.caId}/renew`, body ); return data; }, onSuccess: (_, { caId, projectSlug }) => { queryClient.invalidateQueries({ queryKey: workspaceKeys.getWorkspaceCas({ projectSlug }) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaById(caId) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaCert(caId) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaCerts(caId) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaCsr(caId) }); queryClient.invalidateQueries({ queryKey: caKeys.getCaCrl(caId) }); } }); };