feat(certificates): add certificate import, export, and deletion support (server handlers, request types, and UI)

This commit is contained in:
2026-02-17 16:28:33 +00:00
parent 529a4bae00
commit c23f16149c
7 changed files with 455 additions and 2 deletions

View File

@@ -780,6 +780,80 @@ export const reprovisionCertificateAction = certificateStatePart.createAction<st
}
);
export const deleteCertificateAction = certificateStatePart.createAction<string>(
async (statePartArg, domain) => {
const context = getActionContext();
const currentState = statePartArg.getState();
try {
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_DeleteCertificate
>('/typedrequest', 'deleteCertificate');
await request.fire({
identity: context.identity,
domain,
});
// Re-fetch overview after deletion
await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
return statePartArg.getState();
} catch (error) {
return {
...currentState,
error: error instanceof Error ? error.message : 'Failed to delete certificate',
};
}
}
);
export const importCertificateAction = certificateStatePart.createAction<{
id: string;
domainName: string;
created: number;
validUntil: number;
privateKey: string;
publicKey: string;
csr: string;
}>(
async (statePartArg, cert) => {
const context = getActionContext();
const currentState = statePartArg.getState();
try {
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_ImportCertificate
>('/typedrequest', 'importCertificate');
await request.fire({
identity: context.identity,
cert,
});
// Re-fetch overview after import
await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
return statePartArg.getState();
} catch (error) {
return {
...currentState,
error: error instanceof Error ? error.message : 'Failed to import certificate',
};
}
}
);
export async function fetchCertificateExport(domain: string) {
const context = getActionContext();
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_ExportCertificate
>('/typedrequest', 'exportCertificate');
return request.fire({
identity: context.identity,
domain,
});
}
// ============================================================================
// Remote Ingress Actions
// ============================================================================