- 新增 ops 错误日志记录器(ops_error_logger.go) - 新增 ops 主处理器(ops_handler.go) - 新增告警管理处理器(ops_alerts_handler.go) - 新增仪表板处理器(ops_dashboard_handler.go) - 新增实时监控处理器(ops_realtime_handler.go) - 新增配置管理处理器(ops_settings_handler.go) - 新增 WebSocket 处理器(ops_ws_handler.go) - 扩展设置 DTO 支持 ops 配置 - 新增客户端请求 ID 中间件(client_request_id.go) - 新增 WebSocket 查询令牌认证中间件(ws_query_token_auth.go) - 更新管理员认证中间件支持 ops 路由 - 注册 handler 依赖注入
104 lines
3.1 KiB
Go
104 lines
3.1 KiB
Go
package admin
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/pkg/response"
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// GetEmailNotificationConfig returns Ops email notification config (DB-backed).
|
|
// GET /api/v1/admin/ops/email-notification/config
|
|
func (h *OpsHandler) GetEmailNotificationConfig(c *gin.Context) {
|
|
if h.opsService == nil {
|
|
response.Error(c, http.StatusServiceUnavailable, "Ops service not available")
|
|
return
|
|
}
|
|
if err := h.opsService.RequireMonitoringEnabled(c.Request.Context()); err != nil {
|
|
response.ErrorFrom(c, err)
|
|
return
|
|
}
|
|
|
|
cfg, err := h.opsService.GetEmailNotificationConfig(c.Request.Context())
|
|
if err != nil {
|
|
response.Error(c, http.StatusInternalServerError, "Failed to get email notification config")
|
|
return
|
|
}
|
|
response.Success(c, cfg)
|
|
}
|
|
|
|
// UpdateEmailNotificationConfig updates Ops email notification config (DB-backed).
|
|
// PUT /api/v1/admin/ops/email-notification/config
|
|
func (h *OpsHandler) UpdateEmailNotificationConfig(c *gin.Context) {
|
|
if h.opsService == nil {
|
|
response.Error(c, http.StatusServiceUnavailable, "Ops service not available")
|
|
return
|
|
}
|
|
if err := h.opsService.RequireMonitoringEnabled(c.Request.Context()); err != nil {
|
|
response.ErrorFrom(c, err)
|
|
return
|
|
}
|
|
|
|
var req service.OpsEmailNotificationConfigUpdateRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
updated, err := h.opsService.UpdateEmailNotificationConfig(c.Request.Context(), &req)
|
|
if err != nil {
|
|
// Most failures here are validation errors from request payload; treat as 400.
|
|
response.Error(c, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
response.Success(c, updated)
|
|
}
|
|
|
|
// GetAlertRuntimeSettings returns Ops alert evaluator runtime settings (DB-backed).
|
|
// GET /api/v1/admin/ops/runtime/alert
|
|
func (h *OpsHandler) GetAlertRuntimeSettings(c *gin.Context) {
|
|
if h.opsService == nil {
|
|
response.Error(c, http.StatusServiceUnavailable, "Ops service not available")
|
|
return
|
|
}
|
|
if err := h.opsService.RequireMonitoringEnabled(c.Request.Context()); err != nil {
|
|
response.ErrorFrom(c, err)
|
|
return
|
|
}
|
|
|
|
cfg, err := h.opsService.GetOpsAlertRuntimeSettings(c.Request.Context())
|
|
if err != nil {
|
|
response.Error(c, http.StatusInternalServerError, "Failed to get alert runtime settings")
|
|
return
|
|
}
|
|
response.Success(c, cfg)
|
|
}
|
|
|
|
// UpdateAlertRuntimeSettings updates Ops alert evaluator runtime settings (DB-backed).
|
|
// PUT /api/v1/admin/ops/runtime/alert
|
|
func (h *OpsHandler) UpdateAlertRuntimeSettings(c *gin.Context) {
|
|
if h.opsService == nil {
|
|
response.Error(c, http.StatusServiceUnavailable, "Ops service not available")
|
|
return
|
|
}
|
|
if err := h.opsService.RequireMonitoringEnabled(c.Request.Context()); err != nil {
|
|
response.ErrorFrom(c, err)
|
|
return
|
|
}
|
|
|
|
var req service.OpsAlertRuntimeSettings
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
updated, err := h.opsService.UpdateOpsAlertRuntimeSettings(c.Request.Context(), &req)
|
|
if err != nil {
|
|
response.Error(c, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
response.Success(c, updated)
|
|
}
|
|
|