diff --git a/backend/internal/httpapi/task_api.go b/backend/internal/httpapi/task_api.go index b9b4e15..72b0109 100644 --- a/backend/internal/httpapi/task_api.go +++ b/backend/internal/httpapi/task_api.go @@ -74,7 +74,7 @@ func (s *Server) issueDomainAsTask(c *gin.Context) { } if existing, err := s.tasks.FindTaskByIdempotencyKey(c.Request.Context(), domainID, idempotencyKey); err == nil { status := http.StatusOK - if existing.Status == "queued" || existing.Status == "running" { + if isActiveTaskStatus(existing.Status) { status = http.StatusConflict } c.JSON(status, gin.H{"task": existing, "replayed": true}) @@ -106,7 +106,7 @@ func (s *Server) issueDomainAsTask(c *gin.Context) { if idempotencyKey != "" { if existing, lookupErr := s.tasks.FindTaskByIdempotencyKey(c.Request.Context(), domainID, idempotencyKey); lookupErr == nil { status := http.StatusOK - if existing.Status == "queued" || existing.Status == "running" { + if isActiveTaskStatus(existing.Status) { status = http.StatusConflict } c.JSON(status, gin.H{"task": existing, "replayed": true}) @@ -432,6 +432,23 @@ func validTaskIdempotencyKey(value string) bool { } return true } +func isActiveTaskStatus(status string) bool { + +switch status { + +case "queued", "running", "retry_wait", "cancelling": + + +return true + +default: + + +return false + +} +} + func (s *Server) listTasks(c *gin.Context) { reader, ok := s.projectTaskReader(c) if !ok { diff --git a/backend/internal/repository/project_domain_repository.go b/backend/internal/repository/project_domain_repository.go index 97b1114..1b42ebd 100644 --- a/backend/internal/repository/project_domain_repository.go +++ b/backend/internal/repository/project_domain_repository.go @@ -112,7 +112,7 @@ func (r *SQLProjectMemberRepository) DeleteProjectDomain(ctx context.Context, ac return err } rows, err := tx.QueryContext(ctx, Rebind(r.driver, `SELECT id FROM tasks - WHERE domain_id = ? AND task_type IN ('certificate_issue', 'certificate_validate', 'certificate_deploy', 'certificate_import', 'certificate_restore') + WHERE domain_id = ? AND task_type IN ('certificate_issue', 'certificate_validate', 'certificate_deploy', 'certificate_import', 'certificate_restore', 'renewal_run') AND status IN ('queued', 'running', 'retry_wait', 'cancelling')`+r.resourceWriteLock()), domainID) if err != nil { return fmt.Errorf("检查域名任务失败:%w", err)