package repository import ( "errors" "gorm.io/gorm" "dating-app/internal/models" ) type MatchRepository struct { db *gorm.DB } func NewMatchRepository(db *gorm.DB) *MatchRepository { return &MatchRepository{db: db} } // normalizePair همیشه شناسه‌ی کوچیک‌تر رو اول می‌ذاره تا هر جفت فقط یک رکورد داشته باشه func normalizePair(a, b uint) (uint, uint) { if a < b { return a, b } return b, a } // FindOrCreate اگه مچ بین این دو کاربر از قبل وجود داشته باشه همونو برمی‌گردونه، // وگرنه می‌سازتش. خروجی دوم true یعنی همین الان تازه ساخته شده. func (r *MatchRepository) FindOrCreate(userA, userB uint) (*models.Match, bool, error) { one, two := normalizePair(userA, userB) var match models.Match err := r.db.Where("user_one_id = ? AND user_two_id = ?", one, two).First(&match).Error if err == nil { return &match, false, nil } if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, false, err } match = models.Match{UserOneID: one, UserTwoID: two} if err := r.db.Create(&match).Error; err != nil { return nil, false, err } return &match, true, nil } func (r *MatchRepository) FindByID(id uint) (*models.Match, error) { var match models.Match if err := r.db.First(&match, id).Error; err != nil { return nil, err } return &match, nil } // ListByUser مچ‌های کاربر رو از جدیدترین به قدیمی‌ترین برمی‌گردونه func (r *MatchRepository) ListByUser(userID uint) ([]models.Match, error) { var matches []models.Match err := r.db. Where("user_one_id = ? OR user_two_id = ?", userID, userID). Order("created_at desc"). Find(&matches).Error return matches, err } // ListAllPaginated همه‌ی مچ‌های اپ رو صفحه‌بندی‌شده برمی‌گردونه (برای پنل ادمین) func (r *MatchRepository) ListAllPaginated(limit, offset int) ([]models.Match, int64, error) { var total int64 if err := r.db.Model(&models.Match{}).Count(&total).Error; err != nil { return nil, 0, err } var matches []models.Match err := r.db.Order("created_at desc").Limit(limit).Offset(offset).Find(&matches).Error return matches, total, err } // OtherUserID شناسه‌ی طرف مقابل کاربر جاری رو توی یک مچ برمی‌گردونه func OtherUserID(match *models.Match, currentUserID uint) uint { if match.UserOneID == currentUserID { return match.UserTwoID } return match.UserOneID } // IsMember یعنی این کاربر عضو این مچه func IsMember(match *models.Match, userID uint) bool { return match.UserOneID == userID || match.UserTwoID == userID }