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 var logs []model.MessageLog 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 }