package repository import ( "accounting-app/internal/models" "time" "gorm.io/gorm" ) type NotificationRepository struct { db *gorm.DB } func NewNotificationRepository(db *gorm.DB) *NotificationRepository { return &NotificationRepository{db: db} } // Create creates a new notification func (r *NotificationRepository) Create(notification *models.Notification) error { return r.db.Create(notification).Error } // FindAll retrieves notifications for a user with pagination and filtering func (r *NotificationRepository) FindAll(userID uint, page, pageSize int, isRead *bool) ([]models.Notification, int64, error) { var notifications []models.Notification var total int64 query := r.db.Model(&models.Notification{}).Where("user_id = ?", userID) if isRead != nil { query = query.Where("is_read = ?", *isRead) } if err := query.Count(&total).Error; err != nil { return nil, 0, err } offset := (page - 1) * pageSize err := query.Order("created_at desc"). Offset(offset). Limit(pageSize). Find(¬ifications).Error return notifications, total, err } // CountUnread counts unread notifications for a user func (r *NotificationRepository) CountUnread(userID uint) (int64, error) { var count int64 err := r.db.Model(&models.Notification{}). Where("user_id = ? AND is_read = ?", userID, false). Count(&count).Error return count, err } // MarkAsRead marks a single notification as read func (r *NotificationRepository) MarkAsRead(id uint, userID uint) error { return r.db.Model(&models.Notification{}). Where("id = ? AND user_id = ?", id, userID). Updates(map[string]interface{}{ "is_read": true, "read_at": time.Now(), }).Error } // MarkAllAsRead marks all notifications as read for a user func (r *NotificationRepository) MarkAllAsRead(userID uint) error { return r.db.Model(&models.Notification{}). Where("user_id = ? AND is_read = ?", userID, false). Updates(map[string]interface{}{ "is_read": true, "read_at": time.Now(), }).Error }