chore: merge backend repo history into monorepo at backend/
git-subtree-dir: backend git-subtree-mainline:dc11190527git-subtree-split:acae976622
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user