c74bab3033
Motivation: 当数据库查询无结果时,Go 的 `var slice []Type` 声明会使 JSON 序列化输出 `null`,而非 `[]`。这在 API 响应中造成不一致,也增加了客户端的空值处理负担。改为 `make([]Type, 0)` 后空结果统一输出为 `[]`,提升 API 规范性。 Changes: * 统一 store 层所有 List 方法使用 `make([]Type, 0)` 初始化切片,覆盖 Sources、Channels、Templates、Rules、MessageLogs 及 RuleChannels 查询 * 新增完整的 cURL 示例文档,覆盖全部 API 端点(通知、Source、Template、Channel、Rule、消息记录) * 新增 Postman Collection JSON 文件,可直接导入 HTTPie 使用,包含环境变量配置
73 lines
2.1 KiB
Go
73 lines
2.1 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"aiaa-notification-service/internal/model"
|
|
)
|
|
|
|
type MessageLogFilter struct {
|
|
Source string `form:"source"`
|
|
Event string `form:"event"`
|
|
Status string `form:"status"`
|
|
Page int `form:"page"`
|
|
PageSize int `form:"page_size"`
|
|
}
|
|
|
|
func (s *Store) CreateMessageLog(ctx context.Context, ml *model.MessageLog) error {
|
|
query := `INSERT INTO notification_message_log (rule_id, channel_id, source, event, payload, content, status, retry_count) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
|
|
result, err := s.DB.ExecContext(ctx, query, ml.RuleID, ml.ChannelID, ml.Source, ml.Event, ml.Payload, ml.Content, ml.Status, ml.RetryCount)
|
|
if err != nil {
|
|
return fmt.Errorf("create message_log: %w", err)
|
|
}
|
|
id, _ := result.LastInsertId()
|
|
ml.ID = id
|
|
return nil
|
|
}
|
|
|
|
func (s *Store) UpdateMessageLog(ctx context.Context, id int64, status string, response, errMsg *string) error {
|
|
query := `UPDATE notification_message_log SET status=?, response=?, error_msg=? WHERE id=?`
|
|
_, err := s.DB.ExecContext(ctx, query, status, response, errMsg, id)
|
|
return err
|
|
}
|
|
|
|
func (s *Store) ListMessageLogs(ctx context.Context, filter MessageLogFilter) ([]model.MessageLog, int, error) {
|
|
where := "WHERE 1=1"
|
|
args := []interface{}{}
|
|
if filter.Source != "" {
|
|
where += " AND source = ?"
|
|
args = append(args, filter.Source)
|
|
}
|
|
if filter.Event != "" {
|
|
where += " AND event = ?"
|
|
args = append(args, filter.Event)
|
|
}
|
|
if filter.Status != "" {
|
|
where += " AND status = ?"
|
|
args = append(args, filter.Status)
|
|
}
|
|
|
|
var count int
|
|
countQuery := "SELECT COUNT(*) FROM notification_message_log " + where
|
|
if err := s.DB.GetContext(ctx, &count, countQuery, args...); err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
if filter.Page <= 0 {
|
|
filter.Page = 1
|
|
}
|
|
if filter.PageSize <= 0 {
|
|
filter.PageSize = 20
|
|
}
|
|
offset := (filter.Page - 1) * filter.PageSize
|
|
|
|
logs := make([]model.MessageLog, 0)
|
|
query := "SELECT * FROM notification_message_log " + where + " ORDER BY id DESC LIMIT ? OFFSET ?"
|
|
args = append(args, filter.PageSize, offset)
|
|
if err := s.DB.SelectContext(ctx, &logs, query, args...); err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return logs, count, nil
|
|
}
|