Files
chat_room/internal/repository/message_repository.go
T
mobiniqow 769e76313f Add production hardening: monitoring, backups, caching, and high-traffic resilience
- 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.
2026-09-19 22:17:12 +03:30

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
}