package api import ( "fmt" "time" "github.com/gin-gonic/gin" "eai_agentplatform/backend/internal/middleware" "eai_agentplatform/backend/internal/model" "eai_agentplatform/backend/internal/repository" "eai_agentplatform/backend/internal/web" ) // certRepo 证书仓库(便于测试时覆写),包内共享。 var certRepo repository.CertificateRepo func init() { certRepo = repository.CertificateRepo{} } // issueCertificate 正式考试通过后颁发证书(幂等:同一 exam_record 只发一张)。 func issueCertificate(u *model.User, rec model.ExamRecord) { if u == nil || !rec.Passed { return } if _, found := certRepo.GetByExamRecord(rec.ID); found { return } certNo := fmt.Sprintf("BST-%06d", rec.ID) certRepo.Insert(&model.Certificate{ UserID: u.ID, ExamRecordID: rec.ID, UserName: u.FullName, ExamName: rec.ExamName, Score: rec.Score, TotalScore: rec.TotalScore, PassScore: rec.PassScore, CertNo: certNo, IssuedAt: time.Now(), }) } // MyCertificates GET /api/exam/certificates —— 我的证书列表 func MyCertificates(c *gin.Context) { u := middleware.CurrentUser(c) if u == nil { web.Fail(c, web.NewAuthError("未登录")) return } items := certRepo.ListByUser(u.ID) if items == nil { items = []model.Certificate{} } web.OK(c, items) } // CertificateDetail GET /api/exam/certificates/{id} —— 证书详情(本人或管理员可看,用于打印留存) func CertificateDetail(c *gin.Context) { u := middleware.CurrentUser(c) id, ok := parseID(c, "id") if !ok { return } cert, found := certRepo.GetByID(id) if !found { web.Fail(c, web.NewNotFoundError("证书不存在")) return } if u == nil || (u.Role != "admin" && cert.UserID != u.ID) { web.Fail(c, web.NewForbiddenError("无权查看他人证书")) return } web.OK(c, cert) } // AdminCertificates GET /api/system/certificates —— 全员证书(管理员) func AdminCertificates(c *gin.Context) { web.OK(c, certRepo.ListAll()) }