feat: 添加 HTTP 处理层和结构化日志
- JobHandler: 提交/查询/取消/历史,5xx Error + 4xx Warn 日志 - ClusterHandler: 节点/分区/诊断,错误和未找到日志 - TemplateHandler: CRUD 操作,创建/更新/删除 Info + 未找到 Warn - 不记录成功响应(由 middleware.RequestLogger 处理) - 不记录请求体和模板内容(安全考虑) - 完整 TDD 测试,使用 zaptest/observer 验证日志级别和字段 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
139
internal/handler/template.go
Normal file
139
internal/handler/template.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"gcy_hpc_server/internal/model"
|
||||
"gcy_hpc_server/internal/server"
|
||||
"gcy_hpc_server/internal/store"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type TemplateHandler struct {
|
||||
store *store.TemplateStore
|
||||
logger *zap.Logger
|
||||
}
|
||||
|
||||
func NewTemplateHandler(s *store.TemplateStore, logger *zap.Logger) *TemplateHandler {
|
||||
return &TemplateHandler{store: s, logger: logger}
|
||||
}
|
||||
|
||||
func (h *TemplateHandler) ListTemplates(c *gin.Context) {
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
||||
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
|
||||
templates, total, err := h.store.List(c.Request.Context(), page, pageSize)
|
||||
if err != nil {
|
||||
h.logger.Error("failed to list templates", zap.Error(err))
|
||||
server.InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
server.OK(c, gin.H{
|
||||
"templates": templates,
|
||||
"total": total,
|
||||
"page": page,
|
||||
"page_size": pageSize,
|
||||
})
|
||||
}
|
||||
|
||||
func (h *TemplateHandler) CreateTemplate(c *gin.Context) {
|
||||
var req model.CreateTemplateRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
h.logger.Warn("invalid request body for create template", zap.Error(err))
|
||||
server.BadRequest(c, "invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
if req.Name == "" || req.Script == "" {
|
||||
h.logger.Warn("missing required fields for create template")
|
||||
server.BadRequest(c, "name and script are required")
|
||||
return
|
||||
}
|
||||
|
||||
id, err := h.store.Create(c.Request.Context(), &req)
|
||||
if err != nil {
|
||||
h.logger.Error("failed to create template", zap.Error(err))
|
||||
server.InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Info("template created", zap.Int64("id", id))
|
||||
server.Created(c, gin.H{"id": id})
|
||||
}
|
||||
|
||||
func (h *TemplateHandler) GetTemplate(c *gin.Context) {
|
||||
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
h.logger.Warn("invalid template id", zap.String("id", c.Param("id")))
|
||||
server.BadRequest(c, "invalid id")
|
||||
return
|
||||
}
|
||||
|
||||
tmpl, err := h.store.GetByID(c.Request.Context(), id)
|
||||
if err != nil {
|
||||
h.logger.Error("failed to get template", zap.Int64("id", id), zap.Error(err))
|
||||
server.InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if tmpl == nil {
|
||||
h.logger.Warn("template not found", zap.Int64("id", id))
|
||||
server.NotFound(c, "template not found")
|
||||
return
|
||||
}
|
||||
|
||||
server.OK(c, tmpl)
|
||||
}
|
||||
|
||||
func (h *TemplateHandler) UpdateTemplate(c *gin.Context) {
|
||||
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
h.logger.Warn("invalid template id for update", zap.String("id", c.Param("id")))
|
||||
server.BadRequest(c, "invalid id")
|
||||
return
|
||||
}
|
||||
|
||||
var req model.UpdateTemplateRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
h.logger.Warn("invalid request body for update template", zap.Int64("id", id), zap.Error(err))
|
||||
server.BadRequest(c, "invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
if err := h.store.Update(c.Request.Context(), id, &req); err != nil {
|
||||
h.logger.Error("failed to update template", zap.Int64("id", id), zap.Error(err))
|
||||
server.InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Info("template updated", zap.Int64("id", id))
|
||||
server.OK(c, gin.H{"message": "template updated"})
|
||||
}
|
||||
|
||||
func (h *TemplateHandler) DeleteTemplate(c *gin.Context) {
|
||||
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
h.logger.Warn("invalid template id for delete", zap.String("id", c.Param("id")))
|
||||
server.BadRequest(c, "invalid id")
|
||||
return
|
||||
}
|
||||
|
||||
if err := h.store.Delete(c.Request.Context(), id); err != nil {
|
||||
h.logger.Error("failed to delete template", zap.Int64("id", id), zap.Error(err))
|
||||
server.InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Info("template deleted", zap.Int64("id", id))
|
||||
server.OK(c, gin.H{"message": "template deleted"})
|
||||
}
|
||||
Reference in New Issue
Block a user