package repository import ( "carrot_bbs/internal/model" "gorm.io/gorm" ) // SystemNotificationRepository 系统通知仓储 type SystemNotificationRepository struct { db *gorm.DB } // NewSystemNotificationRepository 创建系统通知仓储 func NewSystemNotificationRepository(db *gorm.DB) *SystemNotificationRepository { return &SystemNotificationRepository{db: db} } // Create 创建系统通知 func (r *SystemNotificationRepository) Create(notification *model.SystemNotification) error { return r.db.Create(notification).Error } // GetByID 根据ID获取通知 func (r *SystemNotificationRepository) GetByID(id int64) (*model.SystemNotification, error) { var notification model.SystemNotification err := r.db.First(¬ification, "id = ?", id).Error if err != nil { return nil, err } return ¬ification, nil } // GetByReceiverID 获取用户的通知列表 func (r *SystemNotificationRepository) GetByReceiverID(receiverID string, page, pageSize int) ([]*model.SystemNotification, int64, error) { var notifications []*model.SystemNotification var total int64 query := r.db.Model(&model.SystemNotification{}).Where("receiver_id = ?", receiverID) query.Count(&total) offset := (page - 1) * pageSize err := query.Offset(offset). Limit(pageSize). Order("created_at DESC"). Find(¬ifications).Error return notifications, total, err } // GetUnreadByReceiverID 获取用户的未读通知列表 func (r *SystemNotificationRepository) GetUnreadByReceiverID(receiverID string, limit int) ([]*model.SystemNotification, error) { var notifications []*model.SystemNotification err := r.db.Where("receiver_id = ? AND is_read = ?", receiverID, false). Order("created_at DESC"). Limit(limit). Find(¬ifications).Error return notifications, err } // GetUnreadCount 获取用户未读通知数量 func (r *SystemNotificationRepository) GetUnreadCount(receiverID string) (int64, error) { var count int64 err := r.db.Model(&model.SystemNotification{}). Where("receiver_id = ? AND is_read = ?", receiverID, false). Count(&count).Error return count, err } // MarkAsRead 标记单条通知为已读 func (r *SystemNotificationRepository) MarkAsRead(id int64, receiverID string) error { now := model.SystemNotification{}.UpdatedAt return r.db.Model(&model.SystemNotification{}). Where("id = ? AND receiver_id = ?", id, receiverID). Updates(map[string]interface{}{ "is_read": true, "read_at": now, }).Error } // MarkAllAsRead 标记用户所有通知为已读 func (r *SystemNotificationRepository) MarkAllAsRead(receiverID string) error { now := model.SystemNotification{}.UpdatedAt return r.db.Model(&model.SystemNotification{}). Where("receiver_id = ? AND is_read = ?", receiverID, false). Updates(map[string]interface{}{ "is_read": true, "read_at": now, }).Error } // Delete 删除通知(软删除) func (r *SystemNotificationRepository) Delete(id int64, receiverID string) error { return r.db.Where("id = ? AND receiver_id = ?", id, receiverID). Delete(&model.SystemNotification{}).Error } // GetByType 获取用户指定类型的通知 func (r *SystemNotificationRepository) GetByType(receiverID string, notifyType model.SystemNotificationType, page, pageSize int) ([]*model.SystemNotification, int64, error) { var notifications []*model.SystemNotification var total int64 query := r.db.Model(&model.SystemNotification{}). Where("receiver_id = ? AND type = ?", receiverID, notifyType) query.Count(&total) offset := (page - 1) * pageSize err := query.Offset(offset). Limit(pageSize). Order("created_at DESC"). Find(¬ifications).Error return notifications, total, err }