Files
ryan 39f3774940 feat: 配置列表分页与钉钉机器人分钟级排队限流
统一 sources/templates/channels/rules 列表为分页响应,避免配置增多时全量返回;按钉钉 access_token 限制每分钟发送并在超限时等待下一分钟,降低触发官方封禁风险。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-10 00:34:26 +08:00

66 lines
1.9 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"`
PageFilter
}
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
}
filter.Normalize()
logs := make([]model.MessageLog, 0)
query := "SELECT * FROM notification_message_log " + where + " ORDER BY id DESC LIMIT ? OFFSET ?"
args = append(args, filter.PageSize, filter.Offset())
if err := s.DB.SelectContext(ctx, &logs, query, args...); err != nil {
return nil, 0, err
}
return logs, count, nil
}