diff --git a/backend/internal/app/app.go b/backend/internal/app/app.go index cb0baaf..75f44c4 100644 --- a/backend/internal/app/app.go +++ b/backend/internal/app/app.go @@ -212,6 +212,9 @@ func NewWithConfigPath(ctx context.Context, cfg config.Config, configPath string result, err := trackedWorkflow.Restore(ctx, domainID, version) return result.Certificate, err }, + RestoreCertificateVersionTask: func(ctx context.Context, domainID, version string) (certificate.IssueResult, error) { + return workflow.RestoreVersion(ctx, domainID, version) + }, ValidateCertificate: func(ctx context.Context, domainID string) (certificate.IssueResult, certificate.ValidationResult, error) { return trackedWorkflow.Validate(ctx, domainID) }, diff --git a/backend/internal/httpapi/certificate_restore_api.go b/backend/internal/httpapi/certificate_restore_api.go index 934e666..eee2e44 100644 --- a/backend/internal/httpapi/certificate_restore_api.go +++ b/backend/internal/httpapi/certificate_restore_api.go @@ -1,12 +1,15 @@ package httpapi import ( + "context" "errors" "net/http" "strings" "github.com/gin-gonic/gin" + "git.pcux.cn/xuans/Scert/backend/internal/certificate" + "git.pcux.cn/xuans/Scert/backend/internal/deployment" "git.pcux.cn/xuans/Scert/backend/internal/domain" "git.pcux.cn/xuans/Scert/backend/internal/repository" ) @@ -15,12 +18,22 @@ func (s *Server) restoreCertificateVersion(c *gin.Context) { if !s.authorizeVisibleDomainPermission(c, domain.PermissionDeploymentRollback) { return } + domainID := strings.TrimSpace(c.Param("id")) + version := strings.TrimSpace(c.Param("version")) + if s.restoreVersionTask != nil && !taskRepositoryUnavailable(s.tasks) { + s.submitPreparedDomainTask(c, "certificate_restore", &preparedCertificateTask{ + operation: func(ctx context.Context, id string) (certificate.IssueResult, deployment.Report, error) { + result, err := s.restoreVersionTask(ctx, id, version) + return result, deployment.Report{}, err + }, + }) + return + } if s.restoreVersion == nil { s.writeError(c, http.StatusNotImplemented, "证书恢复接口尚未配置", errors.New("证书恢复流程未配置")) return } - version := strings.TrimSpace(c.Param("version")) - result, err := s.restoreVersion(s.taskWorkflowContext(c), strings.TrimSpace(c.Param("id")), version) + result, err := s.restoreVersion(s.taskWorkflowContext(c), domainID, version) if err != nil { if s.logger != nil { s.logger.Error("恢复证书历史版本失败", "domain_id", c.Param("id"), "version", version, "error", err) diff --git a/backend/internal/httpapi/task_api.go b/backend/internal/httpapi/task_api.go index c868b58..7a83b1b 100644 --- a/backend/internal/httpapi/task_api.go +++ b/backend/internal/httpapi/task_api.go @@ -220,6 +220,10 @@ type certificateTaskResult struct { } func (s *Server) runCertificateOperation(ctx context.Context, task repository.Task, attempt repository.TaskAttempt, auditAction string, operation func(context.Context, string) (certificateTaskResult, error), stage, runningMessage, successMessage string) { + if task.TaskType == "certificate_restore" { + runningMessage = "\u6b63\u5728\u6062\u590d\u672c\u5730\u8bc1\u4e66\u5386\u53f2\u7248\u672c" + successMessage = "\u672c\u5730\u8bc1\u4e66\u5386\u53f2\u7248\u672c\u6062\u590d\u5b8c\u6210\uff0c\u5c1a\u672a\u4ee3\u8868\u8fdc\u7aef\u670d\u52a1\u5668\u90e8\u7f6e\u5b8c\u6210" + } executionCtx := deployment.WithTransactionContext(ctx, deployment.TransactionContext{ TaskID: task.ID, AttemptID: attempt.ID, AttemptNumber: attempt.AttemptNumber, })