package repository import ( "errors" "gorm.io/gorm" "dating-app/internal/models" ) var ErrCategoryNotFound = errors.New("دسته‌ی موردنظر یافت نشد") type OptionRepository struct { db *gorm.DB } func NewOptionRepository(db *gorm.DB) *OptionRepository { return &OptionRepository{db: db} } func (r *OptionRepository) GetCategoryByKey(key models.CategoryKey) (*models.Category, error) { var cat models.Category err := r.db.Where("key = ?", key).First(&cat).Error if err == gorm.ErrRecordNotFound { return nil, ErrCategoryNotFound } if err != nil { return nil, err } return &cat, nil } func (r *OptionRepository) UpdateCategory(cat *models.Category) error { return r.db.Save(cat).Error } func (r *OptionRepository) ListActiveOptionsByCategoryKey(key models.CategoryKey) ([]models.Option, error) { cat, err := r.GetCategoryByKey(key) if err != nil { return nil, err } var options []models.Option err = r.db.Where("category_id = ? AND is_active = ?", cat.ID, true). Order("sort_order asc, id asc"). Find(&options).Error return options, err } // ListOptionsByCategoryKeyAdmin تمام گزینه‌ها (فعال و غیرفعال) رو برمی‌گردونه - برای پنل ادمین func (r *OptionRepository) ListOptionsByCategoryKeyAdmin(key models.CategoryKey) ([]models.Option, error) { cat, err := r.GetCategoryByKey(key) if err != nil { return nil, err } var options []models.Option err = r.db.Where("category_id = ?", cat.ID). Order("sort_order asc, id asc"). Find(&options).Error return options, err } func (r *OptionRepository) CreateOption(opt *models.Option) error { return r.db.Create(opt).Error } func (r *OptionRepository) FindOptionByID(id uint) (*models.Option, error) { var opt models.Option err := r.db.First(&opt, id).Error if err != nil { return nil, err } return &opt, nil } func (r *OptionRepository) UpdateOption(opt *models.Option) error { return r.db.Save(opt).Error } func (r *OptionRepository) DeleteOption(id uint) error { return r.db.Delete(&models.Option{}, id).Error } // FindActiveOptionsByIDsInCategory فقط گزینه‌های فعالی که در این دسته هستند و id شون // داخل لیست داده‌شده است رو برمی‌گردونه (برای اعتبارسنجی انتخاب کاربر) func (r *OptionRepository) FindActiveOptionsByIDsInCategory(categoryID uint, ids []uint) ([]models.Option, error) { var options []models.Option err := r.db.Where("category_id = ? AND is_active = ? AND id IN ?", categoryID, true, ids). Find(&options).Error return options, err } // ReplaceUserSelections تمام انتخاب‌های قبلی کاربر در یک دسته را با لیست جدید جایگزین می‌کند (تراکنشی) func (r *OptionRepository) ReplaceUserSelections(userID, categoryID uint, optionIDs []uint) error { return r.db.Transaction(func(tx *gorm.DB) error { if err := tx.Where("user_id = ? AND category_id = ?", userID, categoryID). Delete(&models.UserOptionSelection{}).Error; err != nil { return err } for _, optID := range optionIDs { sel := models.UserOptionSelection{ UserID: userID, CategoryID: categoryID, OptionID: optID, } if err := tx.Create(&sel).Error; err != nil { return err } } return nil }) } // GetUserSelections انتخاب‌های کاربر در یک دسته را همراه با اطلاعات گزینه برمی‌گرداند func (r *OptionRepository) GetUserSelections(userID, categoryID uint) ([]models.UserOptionSelection, error) { var selections []models.UserOptionSelection err := r.db.Preload("Option"). Where("user_id = ? AND category_id = ?", userID, categoryID). Find(&selections).Error return selections, err } // CountUserSelections تعداد انتخاب‌های ثبت‌شده‌ی کاربر در یک دسته را برمی‌گرداند // (برای بررسی این‌که مرحله تکمیل شده یا نه) func (r *OptionRepository) CountUserSelections(userID, categoryID uint) (int64, error) { var count int64 err := r.db.Model(&models.UserOptionSelection{}). Where("user_id = ? AND category_id = ?", userID, categoryID). Count(&count).Error return count, err }