Files
saasapi/cmd/saastool/exp_get.go
2025-10-16 12:44:37 +08:00

181 lines
4.2 KiB
Go

package main
import (
"flag"
"fmt"
"net/http"
"os"
"slices"
"strconv"
"strings"
"git.algo.com.cn/public/saasapi"
"git.algo.com.cn/public/saasapi/pkg/saashttp"
"google.golang.org/protobuf/encoding/protojson"
)
type getExpParams struct {
saasHttp *saashttp.SaasClient
bucketIDs []uint32
beginDay uint64
endDay uint64
target string
advertiserIDs []uint64
groupBy []string
totalFlag bool
extFields []string
}
func RunExpGet(args ...string) error {
fs := flag.NewFlagSet("get", flag.ExitOnError)
cfgFile := paramConfig(fs)
beginDay := paramWhereBeginDay(fs)
endDay := paramWhereEndDay(fs)
bucketIDs := paramWhereBucketIds(fs)
target := paramWhereTarget(fs)
advertiserIDs := paramWhereAdvertiserId(fs)
groupBy := paramGroupBy(fs)
totalFlag := paramTotalFlag(fs)
extFields := paramExtFields(fs)
if err := fs.Parse(args); err != nil {
fmt.Fprintln(os.Stderr, "command line parse error", "err", err)
return err
}
if fs.NArg() > 0 {
fs.PrintDefaults()
return nil
}
bucketIDsNumSlice := []uint32{}
if *bucketIDs != "" {
expIDsSlice := strings.Split(*bucketIDs, ",")
for _, id := range expIDsSlice {
idNum, err := strconv.ParseUint(id, 10, 32)
if err != nil {
fmt.Fprintln(os.Stderr, "expid parse error", "err", err)
return err
}
if idNum == 0 || idNum > 10 {
fmt.Fprintln(os.Stderr, "expid range error")
return nil
}
bucketIDsNumSlice = append(bucketIDsNumSlice, uint32(idNum))
}
}
if *beginDay < 20250101 || *beginDay > 21001231 || *endDay < 20250101 || *endDay > 21001231 {
fmt.Fprintln(os.Stderr, "begin/end day error")
return nil
}
if *target == "" {
fmt.Fprintln(os.Stderr, "target error")
return nil
}
uidNumSlice := []uint64{}
if *advertiserIDs != "" {
uidSlice := strings.Split(*advertiserIDs, ",")
for _, id := range uidSlice {
idNum, err := strconv.ParseUint(id, 10, 64)
if err != nil {
fmt.Fprintln(os.Stderr, "advertiser id parse error", "err", err)
return err
}
if idNum == 0 {
fmt.Fprintln(os.Stderr, "advertiser id error")
return nil
}
uidNumSlice = append(uidNumSlice, idNum)
}
}
groupBySlice := []string{}
if *groupBy != "" {
validGroupBy := map[string]bool{"advertiser_id": true, "user_weight_factor": true}
groupBySlice := strings.Split(*groupBy, ",")
for _, group := range groupBySlice {
if !validGroupBy[group] {
fmt.Fprintln(os.Stderr, "group by error", "group", group)
return nil
}
}
}
extFieldsSlice := []string{}
if *extFields != "" {
extFieldsSlice = strings.Split(*extFields, ",")
if slices.Contains(extFieldsSlice, "") {
fmt.Fprintln(os.Stderr, "ext field error")
return nil
}
}
cfg, err := LoadConfigFile(*cfgFile)
if err != nil {
fmt.Fprintln(os.Stderr, "LoadConfigFile error", "err", err)
return err
}
getExpParams := getExpParams{
saasHttp: &saashttp.SaasClient{
Client: &http.Client{},
ApiUrls: saashttp.InitAPIUrl(&cfg.ApiUrls),
Auth: &cfg.Auth,
},
bucketIDs: bucketIDsNumSlice,
beginDay: *beginDay,
endDay: *endDay,
target: *target,
advertiserIDs: uidNumSlice,
groupBy: groupBySlice,
totalFlag: *totalFlag,
extFields: extFieldsSlice,
}
return doExpGet(getExpParams)
}
func doExpGet(getExpParams getExpParams) error {
totalFlag := uint32(0)
if getExpParams.totalFlag {
totalFlag = 1
}
saasReq := &saasapi.SaasReq{
Cmd: &saasapi.SaasReq_ExpGet{
ExpGet: &saasapi.ExpGet{
WhereBucketId: getExpParams.bucketIDs,
WhereBeginDay: getExpParams.beginDay,
WhereEndDay: getExpParams.endDay,
WhereTarget: getExpParams.target,
WhereAdvertiserId: getExpParams.advertiserIDs,
GroupBy: getExpParams.groupBy,
TotalFlag: totalFlag,
ExtFields: getExpParams.extFields,
},
},
}
res, err := getExpParams.saasHttp.ExpGet(saasReq)
if err != nil {
fmt.Fprintln(os.Stderr, "submit GetExp error", "err", err)
return err
}
if res.Code != saasapi.ErrorCode_SUCC {
fmt.Fprintln(os.Stderr, "get exp failed", "code", res.Code, "status", res.Status)
return nil
}
getExpRes := res.GetExpGetRes()
fmt.Printf("exp res: %v\n", protojson.Format(getExpRes))
return nil
}