package business import ( "context" "kra/internal/biz/business" "kra/internal/service/dto" ) type ServerAnalysisUsecase interface { List(context.Context, business.ServerAnalysisFilter, int, int) (*business.ServerAnalysisPage, error) Servers(context.Context, []string, []string, string, int) ([]*business.ServerOption, error) } type ServerAnalysisService struct{ uc ServerAnalysisUsecase } func NewServerAnalysisService(uc *business.ServerAnalysisUsecase) *ServerAnalysisService { return &ServerAnalysisService{uc: uc} } func serverAnalysisResponse(row *business.ServerAnalysisRow, summary bool) *dto.ServerAnalysisRow { out := &dto.ServerAnalysisRow{SourceDB: row.SourceDB, SourceDBLabel: business.PlatformName(row.SourceDB), GameName: row.GameName, ServerOptionResponse: dto.ServerOptionResponse{Number: row.ServerNum, Name: row.ServerName, OpenTime: row.OpenTime}, Register: row.Counts.Register, Active: row.Counts.Active, PayUsers: row.Counts.Pay, Pay: row.Pay, ARPU: row.ARPU} if !summary { out.GameID = &row.GameID } return out } func (s *ServerAnalysisService) List(ctx context.Context, req *dto.ServerAnalysisQuery) (*dto.ServerAnalysisPage, error) { if req == nil { return nil, business.ErrAnalyticsInput } f, err := analyticsRequest(&dto.AnalyticsQuery{Sources: req.Sources, GameNames: req.GameNames, BeginTime: req.BeginTime, EndTime: req.EndTime, SortField: req.SortField, SortOrder: req.SortOrder}) if err != nil { return nil, err } page, err := s.uc.List(ctx, business.ServerAnalysisFilter{AnalyticsFilter: f, ServerNum: req.ServerNum}, req.Page, req.PageSize) if err != nil { return nil, err } out := &dto.ServerAnalysisPage{Rows: []*dto.ServerAnalysisRow{}, Total: page.Total, Begin: page.Begin, End: page.End, Available: page.Available} for _, row := range page.Rows { out.Rows = append(out.Rows, serverAnalysisResponse(row, false)) } if page.Summary != nil { out.Summary = serverAnalysisResponse(page.Summary, true) } return out, nil } func (s *ServerAnalysisService) Servers(ctx context.Context, req *dto.ServerOptionQuery) ([]*dto.ServerOptionResponse, error) { if req == nil { return nil, business.ErrAnalyticsInput } sources, err := normalizePlatforms(req.Sources) if err != nil { return nil, err } rows, err := s.uc.Servers(ctx, sources, splitQueryValues(req.GameNames), req.Keyword, req.Limit) if err != nil { return nil, err } out := make([]*dto.ServerOptionResponse, 0, len(rows)) for _, row := range rows { out = append(out, &dto.ServerOptionResponse{Number: row.Number, Name: row.Name, OpenTime: row.OpenTime}) } return out, nil }