769e76313f
- Recovery middleware (no more crash-on-panic), request metrics/monitoring store + admin API, in-memory TTL caching for read-heavy option/question/ category lookups, gzip + rate-limiting middleware, sanitized chat message encoding, and pg_dump-based database backups with an admin API. - Fix N+1 queries in the discover feed, candidate detail, and match list endpoints by batching selection/photo/user/last-message lookups into single queries instead of one-per-item loops. - Tune DB connection pooling and add HTTP server timeouts + graceful shutdown so the API degrades gracefully instead of falling over under load. - Fix a null (vs empty array) JSON response for candidates/matches without photos or interests, which crashed the web app's swipe card.
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
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
|
|
}
|