131 lines
4.2 KiB
Go
131 lines
4.2 KiB
Go
|
|
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
|
||
|
|
}
|