From 0703dffb9052be39149d5bcc04b15ee5a51f4ed5 Mon Sep 17 00:00:00 2001 From: cnbugs <717192502@qq.com> Date: Tue, 12 May 2026 15:01:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=94=B3=E8=AF=B7=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=87=8D=E8=AF=95=E5=A4=B1=E8=B4=A5/?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E7=9A=84=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/handlers/cert.go | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/backend/handlers/cert.go b/backend/handlers/cert.go index 587da73..c49ca6d 100644 --- a/backend/handlers/cert.go +++ b/backend/handlers/cert.go @@ -78,7 +78,40 @@ func (h *CertHandler) CreateCertificate(c *gin.Context) { // Check if domain already exists var existing config.Certificate if err := config.DB.Where("domain = ?", req.Domain).First(&existing).Error; err == nil { - c.JSON(http.StatusConflict, gin.H{"error": "domain already exists"}) + // Domain exists, check if it's a failed/expired certificate that can be retried + if existing.Status == "error" || existing.Status == "expired" || existing.Status == "pending" { + // Update existing record and retry issuance + existing.Email = req.Email + existing.Provider = req.Provider + existing.ChallengeType = req.ChallengeType + existing.DNSProvider = req.DNSProvider + existing.DNSConfig = req.DNSConfig + existing.Status = "pending" + existing.ErrorMessage = "" + if req.AutoRenew != nil { + existing.AutoRenew = *req.AutoRenew + } + if req.RenewDays != nil { + existing.RenewDays = *req.RenewDays + } + if err := config.DB.Save(&existing).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + // Start issuance in background + go func() { + if err := services.GetACMECertificate(&existing, h.Cfg); err != nil { + existing.Status = "error" + existing.ErrorMessage = err.Error() + } else { + existing.Status = "active" + } + config.DB.Save(&existing) + }() + c.JSON(http.StatusAccepted, gin.H{"message": "certificate re-issuance started", "certificate": existing}) + return + } + c.JSON(http.StatusConflict, gin.H{"error": "domain already exists with status: " + existing.Status}) return }