package repository import ( "gorm.io/gorm" "dating-app/internal/models" ) type MessageRepository struct { db *gorm.DB } func NewMessageRepository(db *gorm.DB) *MessageRepository { return &MessageRepository{db: db} } func (r *MessageRepository) Create(msg *models.Message) error { return r.db.Create(msg).Error } func (r *MessageRepository) ListByMatch(matchID uint) ([]models.Message, error) { var messages []models.Message err := r.db.Where("match_id = ?", matchID).Order("created_at asc").Find(&messages).Error return messages, err } // LastMessage آخرین پیام یک مچ رو برمی‌گردونه (برای پیش‌نمایش لیست گفتگوها) func (r *MessageRepository) LastMessage(matchID uint) (*models.Message, error) { var msg models.Message err := r.db.Where("match_id = ?", matchID).Order("created_at desc").First(&msg).Error if err != nil { return nil, err } return &msg, nil } // LastMessagesByMatchIDs آخرین پیام هر مچ رو، برای چند مچ با هم در یک کوئری // برمی‌گردونه (به‌جای یک کوئری جدا به‌ازای هر مچ توی لیست گفتگوها). از // DISTINCT ON پستگرس استفاده می‌کنه که دقیقاً برای همین کار («آخرین ردیف هر // گروه») ساخته شده. func (r *MessageRepository) LastMessagesByMatchIDs(matchIDs []uint) (map[uint]models.Message, error) { result := make(map[uint]models.Message, len(matchIDs)) if len(matchIDs) == 0 { return result, nil } var messages []models.Message err := r.db. Distinct("ON (match_id) *"). Where("match_id IN ?", matchIDs). Order("match_id, created_at desc"). Find(&messages).Error if err != nil { return nil, err } for _, m := range messages { result[m.MatchID] = m } return result, nil }