Files
chat_room/internal/repository/option_repository.go
T
mobiniqow 2823fb45f5 Initial commit: dating app backend (Go/Gin/GORM/Postgres)
Phone+OTP auth, staged onboarding, admin approval workflow, and a
full discovery/swipe/match/chat system with photo upload and
approximate distance (haversine) based on user location.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 23:23:47 +03:30

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
}