Initial commit (code only without large binaries)

This commit is contained in:
robin
2026-02-15 18:58:44 +08:00
commit 35df75498f
9442 changed files with 1495866 additions and 0 deletions

View File

@@ -0,0 +1,148 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
//go:build plus
package trafficpackages
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// TrafficPackageService 流量包服务
type TrafficPackageService struct {
services.BaseService
}
// CreateTrafficPackage 创建流量包
func (this *TrafficPackageService) CreateTrafficPackage(ctx context.Context, req *pb.CreateTrafficPackageRequest) (*pb.CreateTrafficPackageResponse, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
// TODO limit package size (< 8000PB)
var tx = this.NullTx()
packageId, err := models.SharedTrafficPackageDAO.CreatePackage(tx, req.Size, req.Unit)
if err != nil {
return nil, err
}
return &pb.CreateTrafficPackageResponse{TrafficPackageId: packageId}, nil
}
// UpdateTrafficPackage 修改流量包
func (this *TrafficPackageService) UpdateTrafficPackage(ctx context.Context, req *pb.UpdateTrafficPackageRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
// TODO limit package size (< 8000PB)
var tx = this.NullTx()
err = models.SharedTrafficPackageDAO.UpdatePackage(tx, req.TrafficPackageId, req.IsOn)
if err != nil {
return nil, err
}
return this.Success()
}
// DeleteTrafficPackage 删除流量包
func (this *TrafficPackageService) DeleteTrafficPackage(ctx context.Context, req *pb.DeleteTrafficPackageRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
err = models.SharedTrafficPackageDAO.DisableTrafficPackage(tx, req.TrafficPackageId)
if err != nil {
return nil, err
}
return this.Success()
}
// FindTrafficPackage 查找流量包
func (this *TrafficPackageService) FindTrafficPackage(ctx context.Context, req *pb.FindTrafficPackageRequest) (*pb.FindTrafficPackageResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
p, err := models.SharedTrafficPackageDAO.FindEnabledTrafficPackage(tx, req.TrafficPackageId)
if err != nil {
return nil, err
}
if p == nil {
return &pb.FindTrafficPackageResponse{
TrafficPackage: nil,
}, nil
}
return &pb.FindTrafficPackageResponse{
TrafficPackage: &pb.TrafficPackage{
Id: int64(p.Id),
Size: int32(p.Size),
Unit: p.Unit,
Bytes: int64(p.Bytes),
IsOn: p.IsOn,
}}, nil
}
// FindAllTrafficPackages 查找所有流量包
func (this *TrafficPackageService) FindAllTrafficPackages(ctx context.Context, req *pb.FindAllTrafficPackagesRequest) (*pb.FindAllTrafficPackagesResponse, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
packages, err := models.SharedTrafficPackageDAO.FindAllPackages(tx)
if err != nil {
return nil, err
}
var pbPackages = []*pb.TrafficPackage{}
for _, p := range packages {
pbPackages = append(pbPackages, &pb.TrafficPackage{
Id: int64(p.Id),
Size: int32(p.Size),
Unit: p.Unit,
Bytes: int64(p.Bytes),
IsOn: p.IsOn,
})
}
return &pb.FindAllTrafficPackagesResponse{
TrafficPackages: pbPackages,
}, nil
}
// FindAllAvailableTrafficPackages 查找所有可用流量包
func (this *TrafficPackageService) FindAllAvailableTrafficPackages(ctx context.Context, req *pb.FindAllAvailableTrafficPackagesRequest) (*pb.FindAllAvailableTrafficPackagesResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
packages, err := models.SharedTrafficPackageDAO.FindAllAvailablePackages(tx)
if err != nil {
return nil, err
}
var pbPackages = []*pb.TrafficPackage{}
for _, p := range packages {
pbPackages = append(pbPackages, &pb.TrafficPackage{
Id: int64(p.Id),
Size: int32(p.Size),
Unit: p.Unit,
Bytes: int64(p.Bytes),
IsOn: p.IsOn,
})
}
return &pb.FindAllAvailableTrafficPackagesResponse{
TrafficPackages: pbPackages,
}, nil
}

View File

@@ -0,0 +1,147 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
//go:build plus
package trafficpackages
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// TrafficPackagePeriodService 流量包有效期服务
type TrafficPackagePeriodService struct {
services.BaseService
}
// CreateTrafficPackagePeriod 创建有效期
func (this *TrafficPackagePeriodService) CreateTrafficPackagePeriod(ctx context.Context, req *pb.CreateTrafficPackagePeriodRequest) (*pb.CreateTrafficPackagePeriodResponse, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
periodId, err := models.SharedTrafficPackagePeriodDAO.CreatePeriod(tx, req.Count, req.Unit)
if err != nil {
return nil, err
}
return &pb.CreateTrafficPackagePeriodResponse{
TrafficPackagePeriodId: periodId,
}, nil
}
// UpdateTrafficPackagePeriod 修改有效期
func (this *TrafficPackagePeriodService) UpdateTrafficPackagePeriod(ctx context.Context, req *pb.UpdateTrafficPackagePeriodRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
err = models.SharedTrafficPackagePeriodDAO.UpdatePeriod(tx, req.TrafficPackagePeriodId, req.IsOn)
if err != nil {
return nil, err
}
return this.Success()
}
// DeleteTrafficPackagePeriod 删除有效期
func (this *TrafficPackagePeriodService) DeleteTrafficPackagePeriod(ctx context.Context, req *pb.DeleteTrafficPackagePeriodRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
err = models.SharedTrafficPackagePeriodDAO.DisableTrafficPackagePeriod(tx, req.TrafficPackagePeriodId)
if err != nil {
return nil, err
}
return this.Success()
}
// FindTrafficPackagePeriod 查找有效期
func (this *TrafficPackagePeriodService) FindTrafficPackagePeriod(ctx context.Context, req *pb.FindTrafficPackagePeriodRequest) (*pb.FindTrafficPackagePeriodResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
period, err := models.SharedTrafficPackagePeriodDAO.FindEnabledTrafficPackagePeriod(tx, req.TrafficPackagePeriodId)
if err != nil {
return nil, err
}
if period == nil {
return &pb.FindTrafficPackagePeriodResponse{TrafficPackagePeriod: nil}, nil
}
return &pb.FindTrafficPackagePeriodResponse{TrafficPackagePeriod: &pb.TrafficPackagePeriod{
Id: int64(period.Id),
IsOn: period.IsOn,
Count: int32(period.Count),
Unit: period.Unit,
Months: int32(period.Months),
}}, nil
}
// FindAllTrafficPackagePeriods 列出所有有效期
func (this *TrafficPackagePeriodService) FindAllTrafficPackagePeriods(ctx context.Context, req *pb.FindAllTrafficPackagePeriodsRequest) (*pb.FindAllTrafficPackagePeriodsResponse, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
periods, err := models.SharedTrafficPackagePeriodDAO.FindAllPeriods(tx)
if err != nil {
return nil, err
}
var pbPeriods = []*pb.TrafficPackagePeriod{}
for _, period := range periods {
pbPeriods = append(pbPeriods, &pb.TrafficPackagePeriod{
Id: int64(period.Id),
IsOn: period.IsOn,
Count: int32(period.Count),
Unit: period.Unit,
Months: int32(period.Months),
})
}
return &pb.FindAllTrafficPackagePeriodsResponse{
TrafficPackagePeriods: pbPeriods,
}, nil
}
// FindAllAvailableTrafficPackagePeriods 列出所有可用有效期
func (this *TrafficPackagePeriodService) FindAllAvailableTrafficPackagePeriods(ctx context.Context, req *pb.FindAllAvailableTrafficPackagePeriodsRequest) (*pb.FindAllAvailableTrafficPackagePeriodsResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
periods, err := models.SharedTrafficPackagePeriodDAO.FindAllAvailablePeriods(tx)
if err != nil {
return nil, err
}
var pbPeriods = []*pb.TrafficPackagePeriod{}
for _, period := range periods {
pbPeriods = append(pbPeriods, &pb.TrafficPackagePeriod{
Id: int64(period.Id),
IsOn: period.IsOn,
Count: int32(period.Count),
Unit: period.Unit,
Months: int32(period.Months),
})
}
return &pb.FindAllAvailableTrafficPackagePeriodsResponse{
TrafficPackagePeriods: pbPeriods,
}, nil
}

View File

@@ -0,0 +1,123 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
//go:build plus
package trafficpackages
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// TrafficPackagePriceService 流量包价格服务
type TrafficPackagePriceService struct {
services.BaseService
}
// UpdateTrafficPackagePrice 设置流量包价格
func (this *TrafficPackagePriceService) UpdateTrafficPackagePrice(ctx context.Context, req *pb.UpdateTrafficPackagePriceRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
// TODO 检查各项参数的有效性
err = models.SharedTrafficPackagePriceDAO.UpdatePackagePrice(tx, req.TrafficPackageId, req.NodeRegionId, req.TrafficPackagePeriodId, req.Price)
if err != nil {
return nil, err
}
return this.Success()
}
// FindTrafficPackagePrice 获取单个流量包具体价格
func (this *TrafficPackagePriceService) FindTrafficPackagePrice(ctx context.Context, req *pb.FindTrafficPackagePriceRequest) (*pb.FindTrafficPackagePriceResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
price, err := models.SharedTrafficPackagePriceDAO.FindPackagePrice(tx, req.TrafficPackageId, req.NodeRegionId, req.TrafficPackagePeriodId)
if err != nil {
return nil, err
}
return &pb.FindTrafficPackagePriceResponse{
Price: price,
Amount: float64(req.Count) * price,
}, nil
}
// CountTrafficPackagePrices 计算流量包价格项数量
func (this *TrafficPackagePriceService) CountTrafficPackagePrices(ctx context.Context, req *pb.CountTrafficPackagePricesRequest) (*pb.RPCCountResponse, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
count, err := models.SharedTrafficPackagePriceDAO.CountPackagePrices(tx, req.TrafficPackageId)
if err != nil {
return nil, err
}
return this.SuccessCount(count)
}
// FindTrafficPackagePrices 查找流量包价格
func (this *TrafficPackagePriceService) FindTrafficPackagePrices(ctx context.Context, req *pb.FindTrafficPackagePricesRequest) (*pb.FindTrafficPackagePricesResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
prices, err := models.SharedTrafficPackagePriceDAO.FindPackagePrices(tx, req.TrafficPackageId)
if err != nil {
return nil, err
}
var pbPrices = []*pb.TrafficPackagePrice{}
for _, price := range prices {
pbPrices = append(pbPrices, &pb.TrafficPackagePrice{
TrafficPackageId: int64(price.PackageId),
NodeRegionId: int64(price.RegionId),
TrafficPackagePeriodId: int64(price.PeriodId),
Price: price.Price,
})
}
return &pb.FindTrafficPackagePricesResponse{
TrafficPackagePrices: pbPrices,
}, nil
}
// FindAllTrafficPackagePrices 查找所有流量包价格
func (this *TrafficPackagePriceService) FindAllTrafficPackagePrices(ctx context.Context, req *pb.FindAllTrafficPackagePricesRequest) (*pb.FindAllTrafficPackagePricesResponse, error) {
_, _, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
prices, err := models.SharedTrafficPackagePriceDAO.FindAllPackagePrices(tx)
if err != nil {
return nil, err
}
var pbPrices = []*pb.TrafficPackagePrice{}
for _, price := range prices {
pbPrices = append(pbPrices, &pb.TrafficPackagePrice{
TrafficPackageId: int64(price.PackageId),
NodeRegionId: int64(price.RegionId),
TrafficPackagePeriodId: int64(price.PeriodId),
Price: price.Price,
})
}
return &pb.FindAllTrafficPackagePricesResponse{
TrafficPackagePrices: pbPrices,
}, nil
}

View File

@@ -0,0 +1,295 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
//go:build plus
package trafficpackages
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/accounts"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
"strings"
)
// UserTrafficPackageService 用户流量包服务
type UserTrafficPackageService struct {
services.BaseService
}
// CreateUserTrafficPackage 创建用户流量包
func (this *UserTrafficPackageService) CreateUserTrafficPackage(ctx context.Context, req *pb.CreateUserTrafficPackageRequest) (*pb.CreateUserTrafficPackageResponse, error) {
adminId, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
// TODO 检查各项参数有效性
if req.TrafficPackageId <= 0 {
return nil, errors.New("invalid 'trafficPackageId'")
}
if req.NodeRegionId <= 0 {
return nil, errors.New("invalid 'nodeRegionId'")
}
if req.TrafficPackagePeriodId <= 0 {
return nil, errors.New("invalid 'trafficPackagePeriodId'")
}
if req.Count <= 0 {
return nil, errors.New("invalid 'count'")
}
var userPackageIds = []int64{}
for i := 1; i <= int(req.Count); i++ {
userPackageId, err := models.SharedUserTrafficPackageDAO.CreateUserPackage(tx, req.UserId, adminId, req.TrafficPackageId, req.NodeRegionId, req.TrafficPackagePeriodId)
if err != nil {
return nil, err
}
userPackageIds = append(userPackageIds, userPackageId)
}
return &pb.CreateUserTrafficPackageResponse{
UserTrafficPackageIds: userPackageIds,
}, nil
}
// BuyUserTrafficPackage 购买用户流量包
func (this *UserTrafficPackageService) BuyUserTrafficPackage(ctx context.Context, req *pb.BuyUserTrafficPackageRequest) (*pb.BuyUserTrafficPackageResponse, error) {
adminId, userId, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
if userId > 0 {
req.UserId = userId
}
userId = req.UserId
// TODO 检查各项参数有效性
if req.TrafficPackageId <= 0 {
return nil, errors.New("invalid 'trafficPackageId'")
}
if req.NodeRegionId <= 0 {
return nil, errors.New("invalid 'nodeRegionId'")
}
if req.TrafficPackagePeriodId <= 0 {
return nil, errors.New("invalid 'trafficPackagePeriodId'")
}
if req.Count <= 0 {
return nil, errors.New("invalid 'count'")
}
// check count
// TODO 改成设置的默认值
if req.Count >= 20 {
req.Count = 20
}
var userPackageIds = []int64{}
err = this.RunTx(func(tx *dbs.Tx) error {
// check package
p, err := models.SharedTrafficPackageDAO.FindEnabledTrafficPackage(tx, req.TrafficPackageId)
if err != nil {
return err
}
if p == nil || !p.IsOn {
return errors.New("invalid 'trafficPackageId'")
}
// check region
region, err := models.SharedNodeRegionDAO.FindEnabledNodeRegion(tx, req.NodeRegionId)
if err != nil {
return err
}
if region == nil || !region.IsOn {
return errors.New("invalid 'nodeRegionId'")
}
// check period
period, err := models.SharedTrafficPackagePeriodDAO.FindEnabledTrafficPackagePeriod(tx, req.TrafficPackagePeriodId)
if err != nil {
return err
}
if period == nil || !period.IsOn {
return errors.New("invalid 'trafficPackagePeriodId'")
}
// 获取价格
price, err := models.SharedTrafficPackagePriceDAO.FindPackagePrice(tx, req.TrafficPackageId, req.NodeRegionId, req.TrafficPackagePeriodId)
if err != nil {
return err
}
if price == 0 {
return errors.New("invalid package price")
}
var amount = price * float64(req.Count)
// 先减少余额
account, err := accounts.SharedUserAccountDAO.FindUserAccountWithUserId(tx, userId)
if err != nil {
return err
}
if account == nil || account.Total < amount {
return errors.New("no enough balance to buy the traffic package")
}
err = accounts.SharedUserAccountDAO.UpdateUserAccount(tx, int64(account.Id), -amount, userconfigs.AccountEventTypeBuyTrafficPackage, "购买流量包\""+types.String(p.Size)+strings.ToUpper(p.Unit)+" / "+region.Name+" / "+types.String(period.Count)+userconfigs.TrafficPackagePeriodUnitName(period.Unit)+"\" x "+types.String(req.Count), maps.Map{
"trafficPackageId": req.TrafficPackageId,
"nodeRegionId": req.NodeRegionId,
"trafficPackagePeriodId": req.TrafficPackagePeriodId,
"trafficPackagePeriodCount": period.Count,
"trafficPackagePeriodUnit": period.Unit,
"count": req.Count,
})
if err != nil {
return err
}
for i := 1; i <= int(req.Count); i++ {
userPackageId, err := models.SharedUserTrafficPackageDAO.CreateUserPackage(tx, req.UserId, adminId, req.TrafficPackageId, req.NodeRegionId, req.TrafficPackagePeriodId)
if err != nil {
return err
}
userPackageIds = append(userPackageIds, userPackageId)
}
return nil
})
if err != nil {
return nil, err
}
return &pb.BuyUserTrafficPackageResponse{
UserTrafficPackageIds: userPackageIds,
}, nil
}
// CountUserTrafficPackages 查询当前流量包数量
func (this *UserTrafficPackageService) CountUserTrafficPackages(ctx context.Context, req *pb.CountUserTrafficPackagesRequest) (*pb.RPCCountResponse, error) {
_, userId, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
if userId > 0 {
req.UserId = userId
}
var tx = this.NullTx()
count, err := models.SharedUserTrafficPackageDAO.CountUserPackages(tx, req.TrafficPackageId, req.UserId, req.NodeRegionId, req.TrafficPackagePeriodId, req.ExpiresDay, req.AvailableOnly)
if err != nil {
return nil, err
}
return this.SuccessCount(count)
}
// ListUserTrafficPackages 列出单页流量包
func (this *UserTrafficPackageService) ListUserTrafficPackages(ctx context.Context, req *pb.ListUserTrafficPackagesRequest) (*pb.ListUserTrafficPackagesResponse, error) {
_, userId, err := this.ValidateAdminAndUser(ctx, false)
if err != nil {
return nil, err
}
if userId > 0 {
req.UserId = userId
}
var tx = this.NullTx()
userPackages, err := models.SharedUserTrafficPackageDAO.ListUserPackages(tx, req.TrafficPackageId, req.UserId, req.NodeRegionId, req.TrafficPackagePeriodId, req.ExpiresDay, req.AvailableOnly, req.Offset, req.Size)
if err != nil {
return nil, err
}
var pbUserPackages = []*pb.UserTrafficPackage{}
for _, userPackage := range userPackages {
// package
p, err := models.SharedTrafficPackageDAO.FindEnabledTrafficPackage(tx, int64(userPackage.PackageId))
if err != nil {
return nil, err
}
var pbPackage *pb.TrafficPackage
if p != nil {
pbPackage = &pb.TrafficPackage{
Id: int64(p.Id),
Size: int32(p.Size),
Unit: p.Unit,
Bytes: int64(p.Bytes),
IsOn: p.IsOn,
}
}
// node region
region, err := models.SharedNodeRegionDAO.FindEnabledNodeRegion(tx, int64(userPackage.RegionId))
if err != nil {
return nil, err
}
var pbRegion *pb.NodeRegion
if region != nil {
pbRegion = &pb.NodeRegion{
Id: int64(region.Id),
IsOn: region.IsOn,
Name: region.Name,
Description: region.Description,
}
}
// user
var pbUser *pb.User
user, err := models.SharedUserDAO.FindEnabledBasicUser(tx, int64(userPackage.UserId))
if err != nil {
return nil, err
}
if user != nil {
pbUser = &pb.User{
Id: int64(user.Id),
Username: user.Username,
Fullname: user.Fullname,
}
}
pbUserPackages = append(pbUserPackages, &pb.UserTrafficPackage{
Id: int64(userPackage.Id),
UserId: int64(userPackage.UserId),
TrafficPackageId: int64(userPackage.PackageId),
TotalBytes: int64(userPackage.TotalBytes),
UsedBytes: int64(userPackage.UsedBytes),
NodeRegionId: int64(userPackage.RegionId),
TrafficPackagePeriodId: int64(userPackage.PeriodId),
TrafficPackagePeriodCount: int32(userPackage.PeriodCount),
TrafficPackagePeriodUnit: userPackage.PeriodUnit,
DayFrom: userPackage.DayFrom,
DayTo: userPackage.DayTo,
CreatedAt: int64(userPackage.CreatedAt),
TrafficPackage: pbPackage,
NodeRegion: pbRegion,
User: pbUser,
CanDelete: userPackage.AdminId > 0,
})
}
return &pb.ListUserTrafficPackagesResponse{
UserTrafficPackages: pbUserPackages,
}, nil
}
// DeleteUserTrafficPackage 删除流量包
func (this *UserTrafficPackageService) DeleteUserTrafficPackage(ctx context.Context, req *pb.DeleteUserTrafficPackageRequest) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var tx = this.NullTx()
err = models.SharedUserTrafficPackageDAO.DisableUserTrafficPackage(tx, req.UserTrafficPackageId)
if err != nil {
return nil, err
}
return this.Success()
}