// Copyright 2026 Arctel.net // SPDX-License-Identifier: Apache-2.0 package repository import ( "context" "time" "gorm.io/gorm" db "github.com/Rain-kl/Wavelet/internal/infra/persistence" "github.com/Rain-kl/Wavelet/internal/model" ) // PushHistoryListFilter filters push history pagination queries. type PushHistoryListFilter struct { EventKey string Status string Page int PageSize int } // ListPushHistories returns paginated push history records. func ListPushHistories(ctx context.Context, filter PushHistoryListFilter) (int64, []model.PushHistory, error) { query := db.DB(ctx).Model(&model.PushHistory{}).Order("created_at DESC") if filter.EventKey != "" { query = query.Where("event_key = ?", filter.EventKey) } if filter.Status != "" { query = query.Where("status = ?", filter.Status) } var total int64 if err := query.Count(&total).Error; err != nil { return 0, nil, err } var results []model.PushHistory offset := (filter.Page - 1) * filter.PageSize if err := query.Offset(offset).Limit(filter.PageSize).Find(&results).Error; err != nil { return 0, nil, err } return total, results, nil } // CreatePushHistory persists a push history audit record. func CreatePushHistory(ctx context.Context, history *model.PushHistory) error { return db.DB(ctx).Create(history).Error } // CountPushHistoriesCreatedBefore returns how many push history rows were created before cutoff. func CountPushHistoriesCreatedBefore(ctx context.Context, cutoff time.Time) (int64, error) { var count int64 err := db.DB(ctx).Model(&model.PushHistory{}).Where("created_at < ?", cutoff).Count(&count).Error return count, err } // DeletePushHistoriesCreatedBefore deletes push history rows created before cutoff. func DeletePushHistoriesCreatedBefore(ctx context.Context, cutoff time.Time) (int64, error) { result := db.DB(ctx).Where("created_at < ?", cutoff).Delete(&model.PushHistory{}) return result.RowsAffected, result.Error } // PushHistoryQuery returns a scoped query builder for push histories. func PushHistoryQuery(ctx context.Context) *gorm.DB { return db.DB(ctx).Model(&model.PushHistory{}) }