Initial commit (code only without large binaries)
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user