Files
pika/internal/handler/monitor_handler.go
T
2025-11-19 20:18:21 +08:00

163 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handler
import (
"github.com/dushixiang/pika/internal/service"
"github.com/go-orz/orz"
"github.com/labstack/echo/v4"
"go.uber.org/zap"
)
type MonitorHandler struct {
logger *zap.Logger
monitorService *service.MonitorService
}
func NewMonitorHandler(logger *zap.Logger, monitorService *service.MonitorService) *MonitorHandler {
return &MonitorHandler{
logger: logger,
monitorService: monitorService,
}
}
func (h *MonitorHandler) List(c echo.Context) error {
keyword := c.QueryParam("keyword")
name := c.QueryParam("name")
target := c.QueryParam("target")
typeParam := c.QueryParam("type")
enabled := c.QueryParam("enabled")
pr := orz.GetPageRequest(c, "-updated_at", "name")
builder := orz.NewPageBuilder(h.monitorService.MonitorRepo).
PageRequest(pr)
// 如果有 keyword,则搜索 name(也可以搜索 target)
if keyword != "" {
// keyword 可以匹配 name 或 target
builder.Contains("name", keyword)
// 如果需要同时搜索 target,可以手动构建 OR 查询
// 这里简化处理,只搜索 name
} else {
// 否则使用独立的 name 和 target 搜索
builder.Contains("name", name).
Contains("target", target)
}
// 处理类型筛选
if typeParam != "" {
builder.Equal("type", typeParam)
}
// 处理启用状态筛选
if enabled == "true" {
builder.Equal("enabled", "1")
} else if enabled == "false" {
builder.Equal("enabled", "0")
}
ctx := c.Request().Context()
page, err := builder.Execute(ctx)
if err != nil {
return err
}
return orz.Ok(c, page)
}
func (h *MonitorHandler) Create(c echo.Context) error {
var req service.MonitorTaskRequest
if err := c.Bind(&req); err != nil {
return orz.NewError(400, "请求参数错误")
}
ctx := c.Request().Context()
item, err := h.monitorService.CreateMonitor(ctx, &req)
if err != nil {
return err
}
return orz.Ok(c, item)
}
func (h *MonitorHandler) Get(c echo.Context) error {
id := c.Param("id")
ctx := c.Request().Context()
item, err := h.monitorService.FindById(ctx, id)
if err != nil {
return err
}
return orz.Ok(c, item)
}
func (h *MonitorHandler) Update(c echo.Context) error {
id := c.Param("id")
var req service.MonitorTaskRequest
if err := c.Bind(&req); err != nil {
return orz.NewError(400, "请求参数错误")
}
ctx := c.Request().Context()
item, err := h.monitorService.UpdateMonitor(ctx, id, &req)
if err != nil {
return err
}
return orz.Ok(c, item)
}
func (h *MonitorHandler) Delete(c echo.Context) error {
id := c.Param("id")
ctx := c.Request().Context()
if err := h.monitorService.DeleteMonitor(ctx, id); err != nil {
return err
}
return nil
}
// GetAllStats 获取所有监控统计数据
func (h *MonitorHandler) GetAllStats(c echo.Context) error {
ctx := c.Request().Context()
stats, err := h.monitorService.GetPublicMonitorOverview(ctx)
if err != nil {
return err
}
return orz.Ok(c, stats)
}
// GetStatsByID 获取指定监控任务的统计数据(所有探针)
func (h *MonitorHandler) GetStatsByID(c echo.Context) error {
id := c.Param("id")
ctx := c.Request().Context()
stats, err := h.monitorService.GetMonitorStatsByID(ctx, id)
if err != nil {
return err
}
return orz.Ok(c, stats)
}
// GetHistoryByID 获取指定监控任务的历史响应时间数据
func (h *MonitorHandler) GetHistoryByID(c echo.Context) error {
id := c.Param("id")
timeRange := c.QueryParam("range")
// 默认时间范围为 5 分钟
if timeRange == "" {
timeRange = "5m"
}
ctx := c.Request().Context()
history, err := h.monitorService.GetMonitorHistory(ctx, id, timeRange)
if err != nil {
return err
}
return orz.Ok(c, history)
}