From d35db163aef32a698ec61951e4424bae2dec74df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Thu, 6 Jan 2022 16:25:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9F=8E=E5=B8=82/ISP?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/regions/region_city_dao.go | 23 ++++-- .../models/regions/region_city_model_ext.go | 17 +++++ .../db/models/regions/region_provider_dao.go | 23 ++++-- .../regions/region_provider_model_ext.go | 17 +++++ internal/nodes/api_node_services.go | 10 +++ internal/rpc/services/service_base.go | 5 ++ internal/rpc/services/service_region_city.go | 70 +++++++++++++++++++ .../rpc/services/service_region_country.go | 13 ++-- .../rpc/services/service_region_provider.go | 68 ++++++++++++++++++ .../rpc/services/service_region_province.go | 15 ++-- internal/rpc/services/service_server_group.go | 19 ++++- ...ice_server_region_provider_monthly_stat.go | 2 +- 12 files changed, 251 insertions(+), 31 deletions(-) create mode 100644 internal/rpc/services/service_region_city.go create mode 100644 internal/rpc/services/service_region_provider.go diff --git a/internal/db/models/regions/region_city_dao.go b/internal/db/models/regions/region_city_dao.go index 576f7e45..d77aa557 100644 --- a/internal/db/models/regions/region_city_dao.go +++ b/internal/db/models/regions/region_city_dao.go @@ -38,7 +38,7 @@ func init() { }) } -// 启用条目 +// EnableRegionCity 启用条目 func (this *RegionCityDAO) EnableRegionCity(tx *dbs.Tx, id uint32) error { _, err := this.Query(tx). Pk(id). @@ -47,7 +47,7 @@ func (this *RegionCityDAO) EnableRegionCity(tx *dbs.Tx, id uint32) error { return err } -// 禁用条目 +// DisableRegionCity 禁用条目 func (this *RegionCityDAO) DisableRegionCity(tx *dbs.Tx, id uint32) error { _, err := this.Query(tx). Pk(id). @@ -56,7 +56,7 @@ func (this *RegionCityDAO) DisableRegionCity(tx *dbs.Tx, id uint32) error { return err } -// 查找启用中的条目 +// FindEnabledRegionCity 查找启用中的条目 func (this *RegionCityDAO) FindEnabledRegionCity(tx *dbs.Tx, id int64) (*RegionCity, error) { result, err := this.Query(tx). Pk(id). @@ -68,7 +68,7 @@ func (this *RegionCityDAO) FindEnabledRegionCity(tx *dbs.Tx, id int64) (*RegionC return result.(*RegionCity), err } -// 根据主键查找名称 +// FindRegionCityName 根据主键查找名称 func (this *RegionCityDAO) FindRegionCityName(tx *dbs.Tx, id uint32) (string, error) { return this.Query(tx). Pk(id). @@ -76,7 +76,7 @@ func (this *RegionCityDAO) FindRegionCityName(tx *dbs.Tx, id uint32) (string, er FindStringCol("") } -// 根据数据ID查找城市 +// FindCityWithDataId 根据数据ID查找城市 func (this *RegionCityDAO) FindCityWithDataId(tx *dbs.Tx, dataId string) (int64, error) { return this.Query(tx). Attr("dataId", dataId). @@ -84,7 +84,7 @@ func (this *RegionCityDAO) FindCityWithDataId(tx *dbs.Tx, dataId string) (int64, FindInt64Col(0) } -// 创建城市 +// CreateCity 创建城市 func (this *RegionCityDAO) CreateCity(tx *dbs.Tx, provinceId int64, name string, dataId string) (int64, error) { op := NewRegionCityOperator() op.ProvinceId = provinceId @@ -105,7 +105,7 @@ func (this *RegionCityDAO) CreateCity(tx *dbs.Tx, provinceId int64, name string, return types.Int64(op.Id), nil } -// 根据城市名查找城市ID +// FindCityIdWithNameCacheable 根据城市名查找城市ID func (this *RegionCityDAO) FindCityIdWithNameCacheable(tx *dbs.Tx, provinceId int64, cityName string) (int64, error) { key := cityName + "@" + numberutils.FormatInt64(provinceId) @@ -132,3 +132,12 @@ func (this *RegionCityDAO) FindCityIdWithNameCacheable(tx *dbs.Tx, provinceId in return cityId, nil } + +// FindAllEnabledCities 获取所有城市信息 +func (this *RegionCityDAO) FindAllEnabledCities(tx *dbs.Tx) (result []*RegionCity, err error) { + _, err = this.Query(tx). + State(RegionCityStateEnabled). + Slice(&result). + FindAll() + return +} diff --git a/internal/db/models/regions/region_city_model_ext.go b/internal/db/models/regions/region_city_model_ext.go index 3ff6c9c0..70278565 100644 --- a/internal/db/models/regions/region_city_model_ext.go +++ b/internal/db/models/regions/region_city_model_ext.go @@ -1 +1,18 @@ package regions + +import ( + "encoding/json" + "github.com/iwind/TeaGo/logs" +) + +func (this *RegionCity) DecodeCodes() []string { + if len(this.Codes) == 0 { + return []string{} + } + result := []string{} + err := json.Unmarshal([]byte(this.Codes), &result) + if err != nil { + logs.Error(err) + } + return result +} diff --git a/internal/db/models/regions/region_provider_dao.go b/internal/db/models/regions/region_provider_dao.go index 5c404ee8..424b2d39 100644 --- a/internal/db/models/regions/region_provider_dao.go +++ b/internal/db/models/regions/region_provider_dao.go @@ -36,7 +36,7 @@ func init() { }) } -// 启用条目 +// EnableRegionProvider 启用条目 func (this *RegionProviderDAO) EnableRegionProvider(tx *dbs.Tx, id uint32) error { _, err := this.Query(tx). Pk(id). @@ -45,7 +45,7 @@ func (this *RegionProviderDAO) EnableRegionProvider(tx *dbs.Tx, id uint32) error return err } -// 禁用条目 +// DisableRegionProvider 禁用条目 func (this *RegionProviderDAO) DisableRegionProvider(tx *dbs.Tx, id uint32) error { _, err := this.Query(tx). Pk(id). @@ -54,8 +54,8 @@ func (this *RegionProviderDAO) DisableRegionProvider(tx *dbs.Tx, id uint32) erro return err } -// 查找启用中的条目 -func (this *RegionProviderDAO) FindEnabledRegionProvider(tx *dbs.Tx, id uint32) (*RegionProvider, error) { +// FindEnabledRegionProvider 查找启用中的条目 +func (this *RegionProviderDAO) FindEnabledRegionProvider(tx *dbs.Tx, id int64) (*RegionProvider, error) { result, err := this.Query(tx). Pk(id). Attr("state", RegionProviderStateEnabled). @@ -66,7 +66,7 @@ func (this *RegionProviderDAO) FindEnabledRegionProvider(tx *dbs.Tx, id uint32) return result.(*RegionProvider), err } -// 根据主键查找名称 +// FindRegionProviderName 根据主键查找名称 func (this *RegionProviderDAO) FindRegionProviderName(tx *dbs.Tx, id uint32) (string, error) { return this.Query(tx). Pk(id). @@ -74,7 +74,7 @@ func (this *RegionProviderDAO) FindRegionProviderName(tx *dbs.Tx, id uint32) (st FindStringCol("") } -// 根据服务商名称查找服务商ID +// FindProviderIdWithNameCacheable 根据服务商名称查找服务商ID func (this *RegionProviderDAO) FindProviderIdWithNameCacheable(tx *dbs.Tx, providerName string) (int64, error) { SharedCacheLocker.RLock() providerId, ok := regionProviderNameAndIdCacheMap[providerName] @@ -100,7 +100,7 @@ func (this *RegionProviderDAO) FindProviderIdWithNameCacheable(tx *dbs.Tx, provi return providerId, nil } -// 创建Provider +// CreateProvider 创建Provider func (this *RegionProviderDAO) CreateProvider(tx *dbs.Tx, name string) (int64, error) { op := NewRegionProviderOperator() op.Name = name @@ -112,3 +112,12 @@ func (this *RegionProviderDAO) CreateProvider(tx *dbs.Tx, name string) (int64, e op.Codes = codesJSON return this.SaveInt64(tx, op) } + +// FindAllEnabledProviders 查找所有服务商 +func (this *RegionProviderDAO) FindAllEnabledProviders(tx *dbs.Tx) (result []*RegionProvider, err error) { + _, err = this.Query(tx). + State(RegionProviderStateEnabled). + Slice(&result). + FindAll() + return +} diff --git a/internal/db/models/regions/region_provider_model_ext.go b/internal/db/models/regions/region_provider_model_ext.go index 3ff6c9c0..b19f2f73 100644 --- a/internal/db/models/regions/region_provider_model_ext.go +++ b/internal/db/models/regions/region_provider_model_ext.go @@ -1 +1,18 @@ package regions + +import ( + "encoding/json" + "github.com/iwind/TeaGo/logs" +) + +func (this *RegionProvider) DecodeCodes() []string { + if len(this.Codes) == 0 { + return []string{} + } + result := []string{} + err := json.Unmarshal([]byte(this.Codes), &result) + if err != nil { + logs.Error(err) + } + return result +} diff --git a/internal/nodes/api_node_services.go b/internal/nodes/api_node_services.go index 85f3db45..ced9c989 100644 --- a/internal/nodes/api_node_services.go +++ b/internal/nodes/api_node_services.go @@ -263,6 +263,16 @@ func (this *APINode) registerServices(server *grpc.Server) { pb.RegisterRegionProvinceServiceServer(server, instance) this.rest(instance) } + { + instance := this.serviceInstance(&services.RegionCityService{}).(*services.RegionCityService) + pb.RegisterRegionCityServiceServer(server, instance) + this.rest(instance) + } + { + instance := this.serviceInstance(&services.RegionProviderService{}).(*services.RegionProviderService) + pb.RegisterRegionProviderServiceServer(server, instance) + this.rest(instance) + } { instance := this.serviceInstance(&services.IPListService{}).(*services.IPListService) pb.RegisterIPListServiceServer(server, instance) diff --git a/internal/rpc/services/service_base.go b/internal/rpc/services/service_base.go index 65669160..ad07b72f 100644 --- a/internal/rpc/services/service_base.go +++ b/internal/rpc/services/service_base.go @@ -102,6 +102,11 @@ func (this *BaseService) ValidateAuthorityNode(ctx context.Context) (nodeId int6 // ValidateNodeId 获取节点ID func (this *BaseService) ValidateNodeId(ctx context.Context, roles ...rpcutils.UserType) (role rpcutils.UserType, nodeIntId int64, err error) { + // 默认包含大部分节点 + if len(roles) == 0 { + roles = []rpcutils.UserType{rpcutils.UserTypeNode, rpcutils.UserTypeCluster, rpcutils.UserTypeAdmin, rpcutils.UserTypeUser, rpcutils.UserTypeDNS, rpcutils.UserTypeReport, rpcutils.UserTypeMonitor, rpcutils.UserTypeLog} + } + if ctx == nil { err = errors.New("context should not be nil") role = rpcutils.UserTypeNone diff --git a/internal/rpc/services/service_region_city.go b/internal/rpc/services/service_region_city.go new file mode 100644 index 00000000..36b9e8aa --- /dev/null +++ b/internal/rpc/services/service_region_city.go @@ -0,0 +1,70 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package services + +import ( + "context" + "github.com/TeaOSLab/EdgeAPI/internal/db/models/regions" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +// RegionCityService 城市相关服务 +type RegionCityService struct { + BaseService +} + +// FindAllEnabledRegionCities 查找所有城市 +func (this *RegionCityService) FindAllEnabledRegionCities(ctx context.Context, req *pb.FindAllEnabledRegionCitiesRequest) (*pb.FindAllEnabledRegionCitiesResponse, error) { + _, _, err := this.ValidateNodeId(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + cities, err := regions.SharedRegionCityDAO.FindAllEnabledCities(tx) + if err != nil { + return nil, err + } + + var pbCities = []*pb.RegionCity{} + for _, city := range cities { + pbCities = append(pbCities, &pb.RegionCity{ + Id: int64(city.Id), + Name: city.Name, + Codes: city.DecodeCodes(), + RegionProvinceId: int64(city.ProvinceId), + }) + } + + return &pb.FindAllEnabledRegionCitiesResponse{ + RegionCities: pbCities, + }, nil +} + +// FindEnabledRegionCity 查找单个城市信息 +func (this *RegionCityService) FindEnabledRegionCity(ctx context.Context, req *pb.FindEnabledRegionCityRequest) (*pb.FindEnabledRegionCityResponse, error) { + _, _, err := this.ValidateNodeId(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + city, err := regions.SharedRegionCityDAO.FindEnabledRegionCity(tx, req.RegionCityId) + if err != nil { + return nil, err + } + if city == nil { + return &pb.FindEnabledRegionCityResponse{ + RegionCity: nil, + }, nil + } + + return &pb.FindEnabledRegionCityResponse{ + RegionCity: &pb.RegionCity{ + Id: int64(city.Id), + Name: city.Name, + Codes: city.DecodeCodes(), + RegionProvinceId: int64(city.ProvinceId), + }, + }, nil +} diff --git a/internal/rpc/services/service_region_country.go b/internal/rpc/services/service_region_country.go index b126d77d..3ad9b8ff 100644 --- a/internal/rpc/services/service_region_country.go +++ b/internal/rpc/services/service_region_country.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/db/models/regions" - rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" ) @@ -16,7 +15,7 @@ type RegionCountryService struct { // FindAllEnabledRegionCountries 查找所有的国家列表 func (this *RegionCountryService) FindAllEnabledRegionCountries(ctx context.Context, req *pb.FindAllEnabledRegionCountriesRequest) (*pb.FindAllEnabledRegionCountriesResponse, error) { // 校验请求 - _, _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeNode) + _, _, err := this.ValidateNodeId(ctx) if err != nil { return nil, err } @@ -47,29 +46,29 @@ func (this *RegionCountryService) FindAllEnabledRegionCountries(ctx context.Cont }) } return &pb.FindAllEnabledRegionCountriesResponse{ - Countries: result, + RegionCountries: result, }, nil } // FindEnabledRegionCountry 查找单个国家信息 func (this *RegionCountryService) FindEnabledRegionCountry(ctx context.Context, req *pb.FindEnabledRegionCountryRequest) (*pb.FindEnabledRegionCountryResponse, error) { // 校验请求 - _, _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeNode) + _, _, err := this.ValidateNodeId(ctx) if err != nil { return nil, err } tx := this.NullTx() - country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, req.CountryId) + country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, req.RegionCountryId) if err != nil { return nil, err } if country == nil { - return &pb.FindEnabledRegionCountryResponse{Country: nil}, nil + return &pb.FindEnabledRegionCountryResponse{RegionCountry: nil}, nil } - return &pb.FindEnabledRegionCountryResponse{Country: &pb.RegionCountry{ + return &pb.FindEnabledRegionCountryResponse{RegionCountry: &pb.RegionCountry{ Id: int64(country.Id), Name: country.Name, Codes: country.DecodeCodes(), diff --git a/internal/rpc/services/service_region_provider.go b/internal/rpc/services/service_region_provider.go new file mode 100644 index 00000000..782842f4 --- /dev/null +++ b/internal/rpc/services/service_region_provider.go @@ -0,0 +1,68 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package services + +import ( + "context" + "github.com/TeaOSLab/EdgeAPI/internal/db/models/regions" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +// RegionProviderService ISP相关服务 +type RegionProviderService struct { + BaseService +} + +// FindAllEnabledRegionProviders 查找所有ISP +func (this *RegionProviderService) FindAllEnabledRegionProviders(ctx context.Context, req *pb.FindAllEnabledRegionProvidersRequest) (*pb.FindAllEnabledRegionProvidersResponse, error) { + _, _, err := this.ValidateNodeId(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + providers, err := regions.SharedRegionProviderDAO.FindAllEnabledProviders(tx) + if err != nil { + return nil, err + } + + var pbProviders = []*pb.RegionProvider{} + for _, provider := range providers { + pbProviders = append(pbProviders, &pb.RegionProvider{ + Id: int64(provider.Id), + Name: provider.Name, + Codes: provider.DecodeCodes(), + }) + } + + return &pb.FindAllEnabledRegionProvidersResponse{ + RegionProviders: pbProviders, + }, nil +} + +// FindEnabledRegionProvider 查找单个ISP信息 +func (this *RegionProviderService) FindEnabledRegionProvider(ctx context.Context, req *pb.FindEnabledRegionProviderRequest) (*pb.FindEnabledRegionProviderResponse, error) { + _, _, err := this.ValidateNodeId(ctx) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + provider, err := regions.SharedRegionProviderDAO.FindEnabledRegionProvider(tx, req.RegionProviderId) + if err != nil { + return nil, err + } + if provider == nil { + return &pb.FindEnabledRegionProviderResponse{ + RegionProvider: nil, + }, nil + } + + return &pb.FindEnabledRegionProviderResponse{ + RegionProvider: &pb.RegionProvider{ + Id: int64(provider.Id), + Name: provider.Name, + Codes: provider.DecodeCodes(), + }, + }, nil +} diff --git a/internal/rpc/services/service_region_province.go b/internal/rpc/services/service_region_province.go index 829790d6..c1a7bac2 100644 --- a/internal/rpc/services/service_region_province.go +++ b/internal/rpc/services/service_region_province.go @@ -3,7 +3,6 @@ package services import ( "context" "github.com/TeaOSLab/EdgeAPI/internal/db/models/regions" - rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" ) @@ -15,14 +14,14 @@ type RegionProvinceService struct { // FindAllEnabledRegionProvincesWithCountryId 查找所有省份 func (this *RegionProvinceService) FindAllEnabledRegionProvincesWithCountryId(ctx context.Context, req *pb.FindAllEnabledRegionProvincesWithCountryIdRequest) (*pb.FindAllEnabledRegionProvincesWithCountryIdResponse, error) { // 校验请求 - _, _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeNode) + _, _, err := this.ValidateNodeId(ctx) if err != nil { return nil, err } tx := this.NullTx() - provinces, err := regions.SharedRegionProvinceDAO.FindAllEnabledProvincesWithCountryId(tx, req.CountryId) + provinces, err := regions.SharedRegionProvinceDAO.FindAllEnabledProvincesWithCountryId(tx, req.RegionCountryId) if err != nil { return nil, err } @@ -36,30 +35,30 @@ func (this *RegionProvinceService) FindAllEnabledRegionProvincesWithCountryId(ct } return &pb.FindAllEnabledRegionProvincesWithCountryIdResponse{ - Provinces: result, + RegionProvinces: result, }, nil } // FindEnabledRegionProvince 查找单个省份信息 func (this *RegionProvinceService) FindEnabledRegionProvince(ctx context.Context, req *pb.FindEnabledRegionProvinceRequest) (*pb.FindEnabledRegionProvinceResponse, error) { // 校验请求 - _, _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeNode) + _, _, err := this.ValidateNodeId(ctx) if err != nil { return nil, err } tx := this.NullTx() - province, err := regions.SharedRegionProvinceDAO.FindEnabledRegionProvince(tx, req.ProvinceId) + province, err := regions.SharedRegionProvinceDAO.FindEnabledRegionProvince(tx, req.RegionProvinceId) if err != nil { return nil, err } if province == nil { - return &pb.FindEnabledRegionProvinceResponse{Province: nil}, nil + return &pb.FindEnabledRegionProvinceResponse{RegionProvince: nil}, nil } return &pb.FindEnabledRegionProvinceResponse{ - Province: &pb.RegionProvince{ + RegionProvince: &pb.RegionProvince{ Id: int64(province.Id), Name: province.Name, Codes: province.DecodeCodes(), diff --git a/internal/rpc/services/service_server_group.go b/internal/rpc/services/service_server_group.go index 19e190b8..641bc182 100644 --- a/internal/rpc/services/service_server_group.go +++ b/internal/rpc/services/service_server_group.go @@ -377,13 +377,30 @@ func (this *ServerGroupService) UpdateServerGroupUDPReverseProxy(ctx context.Con // FindEnabledServerGroupConfigInfo 取得分组的配置概要信息 func (this *ServerGroupService) FindEnabledServerGroupConfigInfo(ctx context.Context, req *pb.FindEnabledServerGroupConfigInfoRequest) (*pb.FindEnabledServerGroupConfigInfoResponse, error) { // 校验请求 - _, err := this.ValidateAdmin(ctx, 0) + _, userId, err := this.ValidateAdminAndUser(ctx, 0, 0) if err != nil { return nil, err } tx := this.NullTx() + // 检查用户权限 + if userId > 0 { + if req.ServerId > 0 { + err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId) + if err != nil { + return nil, err + } + } + + if req.ServerGroupId > 0 { + err = models.SharedServerGroupDAO.CheckUserGroup(tx, userId, req.ServerGroupId) + if err != nil { + return nil, err + } + } + } + var group *models.ServerGroup if req.ServerGroupId > 0 { group, err = models.SharedServerGroupDAO.FindEnabledServerGroup(tx, req.ServerGroupId) diff --git a/internal/rpc/services/service_server_region_provider_monthly_stat.go b/internal/rpc/services/service_server_region_provider_monthly_stat.go index ba65955c..6d661554 100644 --- a/internal/rpc/services/service_server_region_provider_monthly_stat.go +++ b/internal/rpc/services/service_server_region_provider_monthly_stat.go @@ -37,7 +37,7 @@ func (this *ServerRegionProviderMonthlyStatService) FindTopServerRegionProviderM pbStat := &pb.FindTopServerRegionProviderMonthlyStatsResponse_Stat{ Count: int64(stat.Count), } - provider, err := regions.SharedRegionProviderDAO.FindEnabledRegionProvider(tx, stat.ProviderId) + provider, err := regions.SharedRegionProviderDAO.FindEnabledRegionProvider(tx, int64(stat.ProviderId)) if err != nil { return nil, err }