Scert/backend/internal/httpapi/task_validation.go
xuans 24a9683c43 保存证书校验后台任务及独立结果的修复前基线
校验结果事务持久化、三库迁移及前端详情接线已实现,完整回归仍在执行。审查发现前端校验幂等键包含路径分隔符,下一批补回归并修复;本提交不是正式发布或生产验收结论。
2026-10-02 20:25:28 +08:00

54 lines
1.8 KiB
Go

package httpapi
import (
"context"
"database/sql"
"errors"
"net/http"
"github.com/gin-gonic/gin"
"git.pcux.cn/xuans/Scert/backend/internal/repository"
)
func (s *Server) executeCertificateValidationTask(c *gin.Context, task repository.Task, attempt repository.TaskAttempt) {
if s.enqueueTaskWorker(c, task, attempt, func(ctx context.Context) {
s.runCertificateOperation(ctx, task, attempt, task.TaskType, func(ctx context.Context, id string) (certificateTaskResult, error) {
_, validation, err := s.validateCertificateTask(ctx, id)
if err != nil {
return certificateTaskResult{}, err
}
return certificateTaskResult{Validation: &validation}, nil
}, "certificate_validate", "正在校验证书、私钥匹配及证书链", "证书校验通过")
}, nil) {
writeAcceptedCertificateTask(c, task)
}
}
func (s *Server) listTaskValidationResults(c *gin.Context) {
reader, ok := s.projectTaskReader(c)
if !ok {
return
}
actorID := c.GetString(authenticatedActorKey)
if _, err := reader.GetVisibleTask(c.Request.Context(), actorID, c.Param("id")); err != nil {
if errors.Is(err, sql.ErrNoRows) || errors.Is(err, repository.ErrProjectAccessDenied) {
s.writeError(c, http.StatusForbidden, "无权访问此任务", nil)
return
}
s.writeError(c, http.StatusInternalServerError, "读取任务失败", err)
return
}
validationReader, ok := s.tasks.(repository.TaskValidationReader)
if !ok {
s.writeError(c, http.StatusNotImplemented, "任务校验结果接口尚未配置", nil)
return
}
items, err := validationReader.ListVisibleTaskValidations(c.Request.Context(), actorID, c.Param("id"))
if err != nil {
s.writeError(c, http.StatusInternalServerError, "查询任务校验结果失败", err)
return
}
c.JSON(http.StatusOK, gin.H{"items": items})
}