package repository import ( "apskel-pos-be/internal/entities" "context" "fmt" "github.com/google/uuid" "gorm.io/gorm" ) type TierRepository struct { db *gorm.DB } func NewTierRepository(db *gorm.DB) *TierRepository { return &TierRepository{db: db} } func (r *TierRepository) Create(ctx context.Context, tier *entities.Tier) error { return r.db.WithContext(ctx).Create(tier).Error } func (r *TierRepository) GetByID(ctx context.Context, id uuid.UUID) (*entities.Tier, error) { var tier entities.Tier err := r.db.WithContext(ctx).Where("id = ?", id).First(&tier).Error if err != nil { return nil, err } return &tier, nil } func (r *TierRepository) GetByName(ctx context.Context, name string) (*entities.Tier, error) { var tier entities.Tier err := r.db.WithContext(ctx).Where("name = ?", name).First(&tier).Error if err != nil { return nil, err } return &tier, nil } func (r *TierRepository) List(ctx context.Context, offset, limit int, search string, sortBy, sortOrder string) ([]entities.Tier, int64, error) { var tiers []entities.Tier var total int64 query := r.db.WithContext(ctx) if search != "" { searchTerm := "%" + search + "%" query = query.Where("name ILIKE ?", searchTerm) } if err := query.Model(&entities.Tier{}).Count(&total).Error; err != nil { return nil, 0, err } if sortBy != "" { if sortOrder == "" { sortOrder = "asc" } query = query.Order(fmt.Sprintf("%s %s", sortBy, sortOrder)) } else { query = query.Order("min_points ASC") } err := query.Offset(offset).Limit(limit).Find(&tiers).Error if err != nil { return nil, 0, err } return tiers, total, nil } func (r *TierRepository) Update(ctx context.Context, tier *entities.Tier) error { return r.db.WithContext(ctx).Save(tier).Error } func (r *TierRepository) Delete(ctx context.Context, id uuid.UUID) error { return r.db.WithContext(ctx).Delete(&entities.Tier{}, id).Error } func (r *TierRepository) GetTierByPoints(ctx context.Context, points int64) (*entities.Tier, error) { var tier entities.Tier err := r.db.WithContext(ctx).Where("min_points <= ?", points).Order("min_points DESC").First(&tier).Error if err != nil { return nil, err } return &tier, nil }