2026-09-15 23:23:47 +03:30
|
|
|
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
|
|
|
|
|
}
|
2026-09-19 22:17:12 +03:30
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
}
|