host.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package service
  2. import (
  3. "context"
  4. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  7. "github.com/spf13/cast"
  8. "strings"
  9. )
  10. // HostService 接口定义
  11. type HostService interface {
  12. GetHost(ctx context.Context, id int64) (*model.Host, error)
  13. GetGameShieldConfig(ctx context.Context, hostId int) (v1.GameShieldHostBackendConfigResponse, error)
  14. GetGlobalLimitConfig(ctx context.Context, hostId int) (v1.GlobalLimitConfigResponse, error)
  15. GetTcpLimitConfig(ctx context.Context, hostId int) (v1.TcpLimitRequest, error)
  16. GetUdpLimitConfig(ctx context.Context, hostId int) (v1.UdpLimitRequest, error)
  17. GetWebLimitConfig(ctx context.Context, hostId int) (v1.WebLimitRequest, error)
  18. }
  19. func NewHostService(
  20. service *Service,
  21. hostRepository repository.HostRepository,
  22. ) HostService {
  23. return &hostService{
  24. Service: service,
  25. hostRepository: hostRepository,
  26. }
  27. }
  28. // 常量定义,包含新增的配置项名称
  29. const (
  30. ConfigOnlineDevices = "在线设备数"
  31. ConfigRuleEntries = "规则条目"
  32. ConfigMaxBandwidth = "高带宽转发规则条目"
  33. ConfigSourceMachines = "支持源机"
  34. ConfigBps = "最大带宽"
  35. ConfigMaxBytesMonth = "每月流量"
  36. ConfigTcpConnCount = "TCP连接次数"
  37. ConfigTcpConnDuration = "TCP连接时长"
  38. ConfigTcpMaxConnCount = "TCP最大连接数"
  39. ConfigUdpQosPacketCount = "UDPQPS包数"
  40. ConfigUdpQosPacketDuration = "UDPQPS周期"
  41. ConfigUdpMaxConnCount = "UDP最大会话数"
  42. ConfigWebQpsCount = "WebQPS连接次数"
  43. ConfigWebQpsDuration = "WebQPS周期"
  44. )
  45. // unitSuffixMap 存储需要去除的单位后缀
  46. var unitSuffixMap = map[string]string{
  47. ConfigOnlineDevices: "个",
  48. ConfigRuleEntries: "个",
  49. ConfigMaxBandwidth: "条",
  50. }
  51. type hostService struct {
  52. *Service
  53. hostRepository repository.HostRepository
  54. }
  55. func (s *hostService) GetHost(ctx context.Context, id int64) (*model.Host, error) {
  56. return s.hostRepository.GetHost(ctx, id)
  57. }
  58. // GetHostConfig 保持不变,它是一个通用的底层数据获取方法。
  59. func (s *hostService) GetHostConfig(ctx context.Context, hostId int) ([]map[string]string, error) {
  60. configOptions, err := s.hostRepository.GetHostConfig(ctx, hostId)
  61. if err != nil {
  62. return nil, err
  63. }
  64. // 2. 收集ID和建立映射关系
  65. var configIDs []int
  66. var optionIDs []int
  67. optionMap := make(map[int]int)
  68. for _, item := range configOptions {
  69. configIDs = append(configIDs, item.Configid)
  70. optionIDs = append(optionIDs, item.Optionid)
  71. optionMap[item.Configid] = item.Optionid
  72. }
  73. // 3. 获取配置和选项数据
  74. var configs []v1.ProductConfigOption
  75. if len(configIDs) > 0 {
  76. configs, err = s.hostRepository.GetProductConfigOption(ctx, configIDs)
  77. if err != nil {
  78. return nil, err
  79. }
  80. }
  81. var options []v1.ProductConfigOptionSub
  82. if len(optionIDs) > 0 {
  83. options, err = s.hostRepository.GetProductConfigOptionSub(ctx, optionIDs)
  84. if err != nil {
  85. return nil, err
  86. }
  87. }
  88. // 4. 转换选项为关联数组
  89. optionsByID := make(map[int]v1.ProductConfigOptionSub)
  90. for _, option := range options {
  91. optionsByID[option.ID] = option
  92. }
  93. // 5. 构建结果数据
  94. var data []map[string]string
  95. for _, config := range configs {
  96. optionID := optionMap[config.ID]
  97. var optionName string
  98. if opt, ok := optionsByID[optionID]; ok {
  99. optionName = opt.OptionName
  100. }
  101. data = append(data, map[string]string{
  102. "config_name": config.OptionName,
  103. "option_name": optionName,
  104. })
  105. }
  106. return data, nil
  107. }
  108. // cleanConfigOptionName 简化后的清理函数,直接返回清理后的字符串。
  109. func (s *hostService) cleanConfigOptionName(configName string, optionName string) string {
  110. // 根据配置名称去除相应的单位后缀
  111. if suffix, ok := unitSuffixMap[configName]; ok {
  112. optionName = strings.TrimSuffix(optionName, suffix)
  113. }
  114. return optionName
  115. }
  116. // getHostConfigsMap 新增的辅助函数,用于获取所有清理后的配置映射。
  117. func (s *hostService) getHostConfigsMap(ctx context.Context, hostId int) (map[string]string, error) {
  118. baseData, err := s.GetHostConfig(ctx, hostId)
  119. if err != nil {
  120. return nil, err
  121. }
  122. configsMap := make(map[string]string)
  123. for _, item := range baseData {
  124. configName := item["config_name"]
  125. optionName := item["option_name"]
  126. // 将清理后的值存储到 map 中
  127. configsMap[configName] = s.cleanConfigOptionName(configName, optionName)
  128. }
  129. return configsMap, nil
  130. }
  131. func (s *hostService) GetGameShieldConfig(ctx context.Context, hostId int) (v1.GameShieldHostBackendConfigResponse, error) {
  132. // 调用新辅助函数获取处理好的配置映射
  133. configsMap, err := s.getHostConfigsMap(ctx, hostId)
  134. if err != nil {
  135. return v1.GameShieldHostBackendConfigResponse{}, err
  136. }
  137. var data v1.GameShieldHostBackendConfigResponse
  138. var parseErr error // 用于统一处理类型转换错误
  139. // 从映射中获取值并进行类型转换
  140. if val, ok := configsMap[ConfigOnlineDevices]; ok {
  141. data.OnlineDevicesCount, parseErr = cast.ToInt64E(val)
  142. if parseErr != nil {
  143. return data, parseErr
  144. }
  145. }
  146. if val, ok := configsMap[ConfigRuleEntries]; ok {
  147. data.RuleEntriesCount, parseErr = cast.ToInt64E(val)
  148. if parseErr != nil {
  149. return data, parseErr
  150. }
  151. }
  152. if val, ok := configsMap[ConfigMaxBandwidth]; ok {
  153. data.MaxBandwidthCount, parseErr = cast.ToInt64E(val)
  154. if parseErr != nil {
  155. return data, parseErr
  156. }
  157. }
  158. if val, ok := configsMap[ConfigSourceMachines]; ok {
  159. data.SourceMachinesCount, parseErr = cast.ToInt64E(val)
  160. if parseErr != nil {
  161. return data, parseErr
  162. }
  163. }
  164. return data, nil
  165. }
  166. func (s *hostService) GetGlobalLimitConfig(ctx context.Context, hostId int) (v1.GlobalLimitConfigResponse, error) {
  167. configsMap, err := s.getHostConfigsMap(ctx, hostId)
  168. if err != nil {
  169. return v1.GlobalLimitConfigResponse{}, err
  170. }
  171. data := v1.GlobalLimitConfigResponse{
  172. MaxBytesMonth: "0",
  173. Bps: "0",
  174. }
  175. if val, ok := configsMap[ConfigBps]; ok {
  176. data.Bps = val
  177. }
  178. if val, ok := configsMap[ConfigMaxBytesMonth]; ok {
  179. data.MaxBytesMonth = val
  180. }
  181. return data, nil
  182. }
  183. // GetTcpLimitConfig 修正返回类型,并使用新的辅助函数
  184. func (s *hostService) GetTcpLimitConfig(ctx context.Context, hostId int) (v1.TcpLimitRequest, error) {
  185. configsMap, err := s.getHostConfigsMap(ctx, hostId)
  186. if err != nil {
  187. return v1.TcpLimitRequest{}, err
  188. }
  189. data := v1.TcpLimitRequest{
  190. ConnCount: 0,
  191. ConnDuration: "0s",
  192. MaxConnCount: 0,
  193. }
  194. var parseErr error
  195. if val, ok := configsMap[ConfigTcpConnCount]; ok {
  196. data.ConnCount, parseErr = cast.ToIntE(val)
  197. if parseErr != nil {
  198. return data, parseErr
  199. }
  200. }
  201. if val, ok := configsMap[ConfigTcpConnDuration]; ok {
  202. data.ConnDuration = val
  203. }
  204. if val, ok := configsMap[ConfigTcpMaxConnCount]; ok {
  205. data.MaxConnCount, parseErr = cast.ToIntE(val)
  206. if parseErr != nil {
  207. return data, parseErr
  208. }
  209. }
  210. return data, nil // 返回结构体
  211. }
  212. // GetUdpLimitConfig
  213. func (s *hostService) GetUdpLimitConfig(ctx context.Context, hostId int) (v1.UdpLimitRequest, error) {
  214. configsMap, err := s.getHostConfigsMap(ctx, hostId)
  215. if err != nil {
  216. return v1.UdpLimitRequest{}, err
  217. }
  218. data := v1.UdpLimitRequest{
  219. QosPacketCount: 0,
  220. QosPacketDuration: "0s",
  221. MaxConnCount: 0,
  222. }
  223. var parseErr error
  224. if val, ok := configsMap[ConfigUdpQosPacketCount]; ok {
  225. data.QosPacketCount, parseErr = cast.ToIntE(val)
  226. if parseErr != nil {
  227. return data, parseErr
  228. }
  229. }
  230. if val, ok := configsMap[ConfigUdpQosPacketDuration]; ok {
  231. data.QosPacketDuration = val
  232. }
  233. if val, ok := configsMap[ConfigUdpMaxConnCount]; ok {
  234. data.MaxConnCount, parseErr = cast.ToIntE(val)
  235. if parseErr != nil {
  236. return data, parseErr
  237. }
  238. }
  239. return data, nil
  240. }
  241. // GetWebLimitConfig 修正返回类型,并使用新的辅助函数
  242. func (s *hostService) GetWebLimitConfig(ctx context.Context, hostId int) (v1.WebLimitRequest, error) {
  243. configsMap, err := s.getHostConfigsMap(ctx, hostId)
  244. if err != nil {
  245. return v1.WebLimitRequest{}, err
  246. }
  247. data := v1.WebLimitRequest{
  248. QpsCount: 0,
  249. QpsDuration: "0s",
  250. }
  251. var parseErr error
  252. if val, ok := configsMap[ConfigWebQpsCount]; ok {
  253. data.QpsCount, parseErr = cast.ToIntE(val)
  254. if parseErr != nil {
  255. return data, parseErr
  256. }
  257. }
  258. if val, ok := configsMap[ConfigWebQpsDuration]; ok {
  259. data.QpsDuration = val
  260. }
  261. return data, nil
  262. }