[
  {
    "path": ".gitignore",
    "content": "/bin/\n.idea/\n*.iml"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Memo Chou\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n\n## Creative AIGC Suite\n### Summary\nCreativity is a crucial factor in the success of streaming media, and advancements in Generative AI are making content creation more accessible, efficient, and seamless. These innovations empower creators to produce meaningful content at scale.  \n\nGenerative AI refers to AI-powered systems and models that generate new content—such as audio, images, text, and videos—also known as AI-Generated Content (AIGC).  \n\nThis project features the latest Generative AI products, capabilities, and solutions to help your clients and partners elevate creative productivity.  \n\n\n### What is Creative AIGC Suite?\nCreative AIGC Suite is a powerful suite of generative AI solutions designed to enhance your content creation journey.  \nFrom scriptwriting to video production and asset optimization, Creative AIGC Suite streamlines every step, making content creation effortless and efficient—helping businesses produce impactful content that drives success. \nBuilt specifically for branded content, Creative AIGC Suite empowers brands to:\n\n* Democratize creativity – Simplifying the creative process from concept to execution, making high-quality content creation more accessible.\n* Maximize efficiency – Leveraging generative AI to scale content production, enable hyper-personalization, and facilitate continuous iteration.\n* Unlock strategic insights – Going beyond content generation to identify cultural and industry trends, extract campaign learnings, and refine creative strategies for better decision-making.\n\n### Creative AI Assistant \nCreative Assistant is a virtual assistant designed to collaborate intelligently with to shape creative direction.  \n\nDrawing from extensive creative expertise, it provides valuable insights, inspiration, script generation and refinement, best practices, and tailored solution recommendations—empowering users to produce high-quality, impactful content with ease.\n\n### Creative Studio \nCreative Studio is an AI-powered video generation platform that transforms minimal user input into high-quality videos in minutes.  \n\nEasily convert product information or a URL into a compelling video, enhance storytelling with a digital avatar narrating your script, and expand your reach by localizing content through AI-driven translation and dubbing capabilities.\n\n### Build\n\n```shell script\n./build.sh\n```\n\n## License\n\n[MIT](LICENSE)"
  },
  {
    "path": "app/application/consts.go",
    "content": "package app\n"
  },
  {
    "path": "app/application/initclient.go",
    "content": "package app\n\nimport (\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tRedisCli      *redis.Client\n\tCreativeDBCli *gorm.DB\n\tEsCli         *es.Client\n\t//DynamicConfigGetter = &DynamicConfig{}\n\tNotificationSendProducer eventbus.Producer\n\tRmqProducer              *rocket.Producer\n)\n\nfunc InitClients() {\n\t//initRedis()\n\t//// initEs()\n\tinitCreativeDB()\n\tinitProducer()\n\tinitRocketMQ()\n\t//initRPC()\n\t//initTCC()\n}\n\nfunc initCreativeDB() {\n\tvar err error\n\tdbConfig := &ServiceConf.CreativeDB\n\n\tCreativeDBCli, err = mysql.NewClient(dbConfig)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initRocketMQ() {\n\tvar err error\n\tRmqProducer, err = rocket.NewProducer(&ServiceConf.TTCXNotificationProducer)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initProducer() {\n\tvar err error\n\tif !strings.IsBlank(ServiceConf.NotificationSendProducer.EventName) && !env.IsBoe() {\n\t\tNotificationSendProducer, err = eventbus2.NewProducer(&ServiceConf.NotificationSendProducer)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n\nfunc CloseProducer() {\n\tif NotificationSendProducer != nil {\n\t\t_ = NotificationSendProducer.Close()\n\t}\n}\n"
  },
  {
    "path": "app/application/rpc.go",
    "content": "package app\n\nvar ()\n\nfunc initRPC() {\n\n}\n"
  },
  {
    "path": "app/application/tcc.go",
    "content": "package app\n\n//\n//import (\n//\t\"code.byted.org/gopkg/confx\"\n//)\n//\n//func initTCC() {\n//\terr := confx.Init(DynamicConfigGetter)\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//}\n//\n//type DynamicConfig struct{}\n"
  },
  {
    "path": "app/initclient.go",
    "content": "package app\n\nimport (\n\t\"gorm.io/gorm\"\n)\n\nvar (\n\tRedisCli            *redis.Client\n\tCreativeDBCli       *gorm.DB\n\tEsCli               *es.Client\n\tDynamicConfigGetter = &DynamicConfig{}\n)\n\nfunc InitClients() {\n\tinitRedis()\n\tinitEs()\n\tinitCreativeDB()\n\tinitProducer()\n\tinitRPC()\n\tinitTCC()\n}\n\nfunc initRedis() {\n\tvar err error\n\tRedisCli, err = redis.NewClient(&ServiceConf.Redis)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initDB() {\n\tvar err error\n\tdbConfig := &ServiceConf.CreativeDB\n\n\tCreativeDBCli, err = mysql.NewClient(dbConfig)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initProducer() {\n\tvar err error\n\tif !strings.IsBlank(ServiceConf.NotificationSendProducer.EventName) && !env.IsBoe() {\n\t\tNotificationSendProducer, err = eventbus2.NewProducer(&ServiceConf.NotificationSendProducer)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n\nfunc CloseProducer() {\n\tif NotificationSendProducer != nil {\n\t\t_ = NotificationSendProducer.Close()\n\t}\n}\n"
  },
  {
    "path": "application/.gitkeep",
    "content": ""
  },
  {
    "path": "application/service/campaign/brief.go",
    "content": "package campaign\n\nimport (\n\t\"context\"\n\t\"sort\"\n\t\"strconv\"\n\t\"time\"\n)\n\nfunc ClientDraftCampaignDetail(ctx context.Context, aioClientID int64, campaignID int64) (resp *rpcClientCampaignDraftDetailResp, err error) {\n\tresp = &rpcClientCampaignDraftDetailResp{BaseResp: base.NewBaseResp()}\n\tif aioClientID == 0 || campaignID == 0 {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"Invalid input\").WithStack()\n\t\treturn\n\t}\n\n\tbriefModel, err := custom.GetCampaignDraftByID(ctx, campaignID, aioClientID)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"fail to get campaign draft of campaign id %d with err: %+v\", campaignID, err)\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"Invalid input\").WithStack()\n\t\treturn\n\t}\n\n\tcampaignInfo, err := service.ConvertBriefModelToCampaignResp(ctx, briefModel, nil)\n\tif err != nil {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to convert\").WithStack()\n\t\treturn\n\t}\n\n\tresp.SetCampaignInfo(campaignInfo)\n\treturn\n}\n\nfunc ClientCreateCampaignDraft(ctx context.Context, req *rpcClientCreateCampaignDraftReq) (resp *rpcClientCreateCampaignDraftResp, err error) {\n\tresp = &rpcClientCreateCampaignDraftResp{BaseResp: base.NewBaseResp()}\n\n\tif req.GetCampaignInfo() == nil {\n\t\tlogs.CtxError(ctx, \"campaign draft info is null\")\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"empty campaign\").WithStack()\n\t\treturn\n\t}\n\treq.GetCampaignInfo().SetBriefID(nil)\n\treq.GetCampaignInfo().SetCampaignID(nil)\n\tbriefID, ttoCampaignID, updatedAt, err := ClientCreateUpdateCampaignDraft(ctx, req.GetCampaignInfo(), req.GetParam(), req.GetAioClientID(), req.GetCoreUserID())\n\tif err != nil {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to create draft\").WithStack()\n\t\treturn\n\t}\n\n\tresp.SetBriefID(briefID)\n\tresp.SetCampaignID(ttoCampaignID)\n\tresp.SetUpdatedAt(updatedAt.Unix())\n\n\treturn\n}\n\nfunc ClientUpdateCampaignDraft(ctx context.Context, req *rpcClientUpdateCampaignDraftReq) (resp *rpcClientUpdateCampaignDraftResp, err error) {\n\tresp = &rpcClientUpdateCampaignDraftResp{BaseResp: base.NewBaseResp()}\n\n\tbriefID, ttoCampaignID, updatedAt, err := ClientCreateUpdateCampaignDraft(ctx, req.GetCampaignInfo(), req.GetParam(), req.GetAioClientID(), req.GetCoreUserID())\n\tif err != nil {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to update draft\").WithStack()\n\t\treturn\n\t}\n\n\tresp.SetBriefID(briefID)\n\tresp.SetCampaignID(ttoCampaignID)\n\tresp.SetUpdatedAt(updatedAt.Unix())\n\n\treturn\n}\n\nfunc ClientCreateUpdateCampaignDraft(ctx context.Context, campaign *rpcCampaignInfo, param *common_param.ClientCommonParam, aioClientID int64, coreUserID int64) (briefID int64, ttoCampaignID int64, updatedAt time.Time, err error) {\n\tcampaign.SetAioClientID(&aioClientID)\n\tcampaign.SetCoreUserID(&coreUserID)\n\n\t//TODO: wrap to separate method\n\tif len(campaign.CampaignName) == 0 {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"invalid brief\").WithStack()\n\t\treturn\n\t}\n\n\tvar createCampaign = campaign.GetCampaignID() == 0\n\tif campaign.GetCampaignID() != 0 {\n\t\texistingBrief, err := custom.GetCampaignDraftByID(ctx, campaign.GetCampaignID(), campaign.GetAioClientID())\n\t\tif err == nil {\n\t\t\tcreateCampaign = false\n\t\t\tcampaign.SetBriefID(gptr.Of(existingBrief.ID))\n\t\t}\n\t}\n\n\tbriefModel := service.ConvertCampaignEntityToBriefModel(ctx, campaign, param)\n\n\tq := query.Session(clients.LegoDBCli)\n\terr = q.Transaction(func(tx *query.Query) error {\n\t\tif createCampaign {\n\t\t\tttoCampaignID, err = RPC.ClientCreateCampaignDraft(ctx, campaign, param.IsTest)\n\t\t\tif err != nil {\n\t\t\t\tlogs.CtxError(ctx, \"fail to create campaign in tto with err: %+v\", err)\n\t\t\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to create/update tto campaign draft\").WithStack()\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tbriefModel.TtoCampaignID = ttoCampaignID\n\n\t\t} else {\n\t\t\tttoCampaignID = briefModel.TtoCampaignID\n\t\t\terr = RPC.ClientUpdateCampaignDraft(ctx, briefModel.TtoCampaignID, campaign, param.IsTest)\n\t\t\tif err != nil {\n\t\t\t\tlogs.CtxError(ctx, \"fail to create campaign in tto with err: %+v\", err)\n\t\t\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to create/update tto campaign draft\").WithStack()\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\terr = custom.CreateUpdateCampaignDraft(ctx, tx, briefModel)\n\t\tif err != nil {\n\t\t\tlogs.CtxError(ctx, \"fail to update/create brief with err: %+v\", err)\n\t\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to update/create brief\").WithStack()\n\t\t\treturn err\n\t\t}\n\n\t\terr = RPC.InnerUpdatetCampaign(ctx, aioClientID, briefModel.TtoCampaignID, nil, &briefModel.ID, nil, &briefModel.OrderName, nil)\n\t\tif err != nil {\n\t\t\tlogs.CtxError(ctx, \"fail to sync campaign %d in tto, err: %+v\", briefModel.TtoCampaignID, err)\n\t\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to sync tto campaign draft\").WithStack()\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tbriefModel, err = custom.GetCampaignDraftByBriefID(ctx, briefModel.ID)\n\tif err != nil {\n\t\tupdatedAt = time.Now()\n\t} else {\n\t\tupdatedAt = briefModel.UpdatedAt\n\t}\n\n\treturn briefModel.ID, ttoCampaignID, updatedAt, nil\n}\n\nfunc ClientSubmitCampaign(ctx context.Context, req *rpcClientSubmittCampaignReq) (resp *rpcClientSubmittCampaignResp, err error) {\n\tresp = &rpcClientSubmittCampaignResp{BaseResp: base.NewBaseResp()}\n\n\tbrief, err := custom.GetCampaignDraftByID(ctx, req.GetCampaignID(), req.GetAioClientID())\n\tif err != nil {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"Invalid input\").WithStack()\n\t\treturn\n\t}\n\n\tcampaign, err := service.ConvertBriefModelToCampaignResp(ctx, brief, nil)\n\tif err != nil {\n\t\treturn\n\t}\n\tif !service.CheckCampaignKeyField(ctx, campaign) {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"Invalid input\").WithStack()\n\t\treturn\n\t}\n\n\torderID, isTest, err := handlers.SubmitTTOCampaign(ctx, brief.ID, req.GetCoreUserID(), req.GetCouponID(), 0, true, req.Param.GetIsTest())\n\tif err != nil && orderID == 0 {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, \"fail to submit campaign\").WithStack()\n\t\treturn\n\t}\n\n\tresp.SettOrderID(orderID)\n\tresp.SetIsTest(isTest)\n\tresp.SetCampaignID(brief.TtoCampaignID)\n\n\treturn\n}\n\nfunc ClientCampaignIndustries(ctx context.Context) (resp *rpcClientCampaignIndustriesResp, err error) {\n\tresp = &rpcClientCampaignIndustriesResp{BaseResp: base.NewBaseResp()}\n\n\tindustryConf := clients.DynamicConfigGetter.IndustryConf()\n\n\tvar industries []*rpcIndustryConfig\n\tfor _, item := range industryConf.FirstIndustries {\n\t\tindustry := rpcIndustryConfig{\n\t\t\tIndustryID: item.IndustryID,\n\t\t}\n\t\tindustries = append(industries, &industry)\n\t}\n\tresp.SetIndustries(industries)\n\treturn\n}\n\nfunc ClientCampaignLanguages(ctx context.Context, req *rpcClientCampaignLanguagesReq) (resp *rpcClientCampaignLanguagesResp, err error) {\n\tresp = &rpcClientCampaignLanguagesResp{BaseResp: base.NewBaseResp()}\n\n\tpartnerInfos, err := RPC.PartnerGetProfileInfoList(ctx, req.GetRegion(), req.Param.GetIsTest(), 1, 1000)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"[ClientCampaignLanguages], failed to get partner infos from es. error: %v\", err)\n\t\treturn\n\t}\n\n\tvar languageMap = make(map[string]bool)\n\tfor _, partner := range partnerInfos {\n\t\tif partner.FormData == nil || len(partner.FormData.CreativeSupportedLanguages) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, language := range partner.FormData.CreativeSupportedLanguages {\n\t\t\tlanguageMap[language] = true\n\t\t}\n\t}\n\n\tvar allLanguagesSupported []string\n\tfor language := range languageMap {\n\t\tallLanguagesSupported = append(allLanguagesSupported, language)\n\t}\n\tsort.Strings(allLanguagesSupported)\n\tresp.SetLanguages(allLanguagesSupported)\n\n\treturn\n}\n\nfunc ClientCampaignMarkets(ctx context.Context, req *rpcClientCampaignMarketsReq) (resp *rpcClientCampaignMarketsResp, err error) {\n\tresp = &rpcClientCampaignMarketsResp{BaseResp: base.NewBaseResp()}\n\n\tif req.GetRegion() == \"\" {\n\t\treturn\n\t}\n\n\trpcResp, err := rpc.GetBriefSupportedMarkets(ctx, req.GetRegion(), req.Param.GetIsTest())\n\tif err != nil {\n\t\treturn\n\t}\n\n\tmarkets := []*rpcSupportedRegionAndMarkets{}\n\n\tfor _, item := range rpcResp.GetSupportedMarkets() {\n\t\tmarket := rpcSupportedRegionAndMarkets{\n\t\t\tSupportedRegion: item.GetSupportedRegion(),\n\t\t\tMarkets:         item.GetMarkets(),\n\t\t}\n\t\tmarkets = append(markets, &market)\n\t}\n\n\tresp.SetSupportedMarkets(markets)\n\treturn\n}\n\nfunc ClientCampaignAdvertiserInfo(ctx context.Context, req *rpcClientCampaignAdvertiserInfoReq) (resp *rpcClientCampaignAdvertiserInfoResp, err error) {\n\tresp = &rpcClientCampaignAdvertiserInfoResp{BaseResp: base.NewBaseResp()}\n\n\tif req.GetCoreUserID() == 0 {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"Invalid input\").WithStack()\n\t\treturn\n\t}\n\n\tadvAllowedInfo, isAllowed, err := qualification.IsAdvQualified(ctx, req.GetCoreUserID())\n\tif err != nil {\n\t\treturn\n\t}\n\n\tadvList := []model.tAdvAccountInfo{}\n\tresp.SetRegion(gptr.Of(\"Unknown\"))\n\tresp.SetIsWhitelisted(gptr.Of(false))\n\tif isAllowed {\n\t\tadvList, err = account.GetClientAdvInfo(ctx, req.GetCoreUserID(), req.GetNeedCouponInfo(), true, isAllowed, advAllowedInfo.Region)\n\t\tresp.SetRegion(&advAllowedInfo.Region)\n\t\tresp.SetIsWhitelisted(gptr.Of(true))\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tadvList, err = account.GetClientAdvInfo(ctx, req.GetCoreUserID(), req.GetNeedCouponInfo(), true, isAllowed, \"\")\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif err = setIsJBPCoupon(ctx, advList); err != nil {\n\t\treturn\n\t}\n\n\tif err = setCanSubmitSubscription(ctx, advList, req.GetCoreUserID()); err != nil {\n\t\treturn\n\t}\n\n\tres := []*rpctAdvAccountInfo{}\n\tsupportedRegions := []string{}\n\tfor _, item := range advList {\n\t\tadvInfo := rpctAdvAccountInfo{\n\t\t\tId:                    item.ID,\n\t\t\tName:                  item.Name,\n\t\t\tHasCoupon:             conv.BoolPtr(item.HasCoupon),\n\t\t\tIncentiveType:         conv.Int32Ptr(int32(item.IncentiveType)),\n\t\t\tBaseRegion:            conv.StringPtr(item.BaseRegion),\n\t\t\tIsJBP:                 conv.BoolPtr(item.IsJBP),\n\t\t\tCanSubmitSubscription: conv.BoolPtr(item.CanSubmitSubscription),\n\t\t}\n\t\tsupportedRegions = append(supportedRegions, item.BaseRegion)\n\t\tres = append(res, &advInfo)\n\t}\n\n\tresp.SetSupportedGARegion(gslice.Uniq(supportedRegions))\n\tresp.SetAccountInfo(res)\n\n\treturn\n}\n\nfunc setIsJBPCoupon(ctx context.Context, advList []model.tAdvAccountInfo) error {\n\tadvIDs := gslice.Map(advList, func(info model.tAdvAccountInfo) int64 {\n\t\tadvID, err := strconv.ParseInt(info.ID, 10, 64)\n\t\tif err != nil {\n\t\t\tlogs.CtxError(ctx, \"parse AdvID error: %+v\", err)\n\t\t}\n\t\treturn advID\n\t})\n\n\tadvToCoupon := make(map[string][]*t.CreativeCoupon)\n\n\tfor _, subAdvIDs := range gslice.Chunk(advIDs, 100) {\n\t\tcouponMap, err := rpc.MGetAdvCouponList(ctx, subAdvIDs)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor key, value := range couponMap {\n\t\t\tadvToCoupon[strconv.FormatInt(key, 10)] = value\n\t\t}\n\t}\n\n\tfor i, adv := range advList {\n\t\tadvList[i].IsJBP = len(advToCoupon[adv.ID]) > 0\n\t}\n\n\treturn nil\n}\n\nfunc setCanSubmitSubscription(ctx context.Context, advList []model.tAdvAccountInfo, coreUserId int64) error {\n\tGARegions := clients.DynamicConfigGetter.FeatureGARegions()[\"subscription\"]\n\tallowedIdMap, err := rpc.GetAllObjectIdsInAllowList(ctx, core.AllowListModuleType_tGeneralModule, core.AllowListEntityType_Subscription, 0)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"[CheckUserInAllowList] get all users in allowList for subscription failed, err: [%+v]\", err)\n\t\treturn bizerr.ErrInternalError\n\t}\n\n\tvar baseRegion string\n\tadvertiserInfo, _, err := qualification.IsAdvQualified(ctx, coreUserId)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor i, adv := range advList {\n\t\tif advertiserInfo != nil {\n\t\t\tbaseRegion = advertiserInfo.Region\n\t\t} else {\n\t\t\tbaseRegion = adv.BaseRegion\n\t\t}\n\n\t\tif gslice.Contains(GARegions, baseRegion) {\n\t\t\tadvList[i].CanSubmitSubscription = true\n\t\t} else if _, ok := allowedIdMap[adv.ID]; ok {\n\t\t\tadvList[i].CanSubmitSubscription = true\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc ClientRecommendPartner(ctx context.Context, req *rpcClientRecommendPartnerReq) (resp *rpcClientRecommendPartnerResp, err error) {\n\tresp = &rpcClientRecommendPartnerResp{BaseResp: base.NewBaseResp()}\n\n\tvar (\n\t\trecommendPartnerInfos  []params.PartnerProfile\n\t\tpreSelectedPartnerInfo *params.PreSelectedPartnerProfile\n\t)\n\tif req.GetCampaignInfo() != nil && req.GetCampaignInfo().GettOrderID() != 0 {\n\t\tlogs.CtxInfo(ctx, \"[ClientRecommendPartner] advertiser reselect partner for campaign %d\", req.GetCampaignInfo().CampaignID)\n\t\torderID := req.GetCampaignInfo().GettOrderID()\n\t\trecommendPartnerInfos, preSelectedPartnerInfo, err = match_algo.GetRecommendProfilerImpl(ctx, orderID, false)\n\t\tif err != nil {\n\t\t\tlogs.CtxError(ctx, \"fail to get recommend partner for campaign %d with err: %+v\", req.GetCampaignInfo().CampaignID, err)\n\t\t\treturn\n\t\t}\n\t\tif preSelectedPartnerInfo != nil {\n\t\t\tresp.SetSelectedPartnerInfo(service.ConvertToSelectPartnerProfile(preSelectedPartnerInfo))\n\t\t}\n\n\t\tresp.SetRecommendPartnerInfo(service.ConvertToPartnerProfile(recommendPartnerInfos))\n\t\treturn\n\t}\n\n\tif req.CampaignInfo == nil ||\n\t\treq.CampaignInfo.Region == nil ||\n\t\treq.CampaignInfo.AdvertiserID == nil ||\n\t\treq.CampaignInfo.GetServicePackageID() == 0 ||\n\t\tlen(req.CampaignInfo.GetTargetMarkets()) == 0 ||\n\t\treq.CampaignInfo.IndustryCategory == nil ||\n\t\tlen(req.CampaignInfo.Objective) == 0 ||\n\t\tlen(req.CampaignInfo.CreativeLanguages) == 0 {\n\t\terr = errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"Invalid input\").WithStack()\n\t\treturn\n\t}\n\n\tif req.CampaignInfo.GetRegion() == \"CNOB\" {\n\t\treturn\n\t}\n\n\taddOnIds := []int64{}\n\tfor _, item := range req.CampaignInfo.AddOns {\n\t\taddOnIds = append(addOnIds, item.GetId())\n\t}\n\n\tobjectives := []int64{}\n\tfor _, item := range req.CampaignInfo.Objective {\n\t\tobjectives = append(objectives, int64(item))\n\t}\n\tformData := &core.BriefFormData{\n\t\tAdvertiserId:      req.CampaignInfo.AdvertiserID,\n\t\tTargetMarkets:     req.CampaignInfo.TargetMarkets,\n\t\tCreativeLanguage:  req.CampaignInfo.CreativeLanguages,\n\t\tServicePackageId:  req.CampaignInfo.ServicePackageID,\n\t\tIndustryCategory:  req.CampaignInfo.IndustryCategory,\n\t\tObjective:         objectives,\n\t\tSelectedPartnerId: req.CampaignInfo.SelectedPartnerID,\n\t}\n\n\tlogs.CtxInfo(ctx, \"[ClientRecommendPartner] ClientRecommendPartner request: [%+v]\", req)\n\n\trecommendPartnerInfos, preSelectedPartnerInfo, err = match_algo.GetTTORecommendPartnersFromBriefImpl(ctx, false, addOnIds, req.GetIsFunded(), req.GetPreSelectedPartnerID(), req.GetCoreUserID(), req.Param.GetIsTest(), req.CampaignInfo.GetRegion(), formData)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif preSelectedPartnerInfo != nil {\n\t\tresp.SetSelectedPartnerInfo(service.ConvertToSelectPartnerProfile(preSelectedPartnerInfo))\n\t}\n\n\tresp.SetRecommendPartnerInfo(service.ConvertToPartnerProfile(recommendPartnerInfos))\n\n\treturn\n}\n"
  },
  {
    "path": "application/service/campaign/util.go",
    "content": "package campaign\n\nimport (\n\t\"context\"\n\n\t\"code.byted.org/ad/creative_one_partner_business/domain/campaign/campaign_aggregate/entity\"\n\t\"code.byted.org/ad/creative_one_partner_business/kitex_gen/ad/creative_one/partner_business\"\n)\n\nfunc ConvertCampaignInfoToNewEntity(ctx context.Context, campaignInfo *partner_business.CampaignInfo, AIOClientID int64) (campaignEntity entity.ICampaignEntity, err error) {\n\treturn nil, nil\n}\n\nfunc ConvertCampaignEntityToDTO(ctx context.Context, campaignEntity entity.ICampaignEntity) (campaignInfo *partner_business.CampaignInfo, err error) {\n\treturn nil, nil\n}\n"
  },
  {
    "path": "application/service/campaign/validation.go",
    "content": "package campaign\n\nimport (\n\t\"context\"\n)\n\nfunc CheckAIOAccountStatus(ctx context.Context, aioAccountID int64, accountType client.AccountType) error {\n\taccount, err := rpc.GetClientInfo(ctx, aioAccountID)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"failed to get info for account id: %v\", aioAccountID)\n\t\treturn err\n\t}\n\tif account.GetAccountType() != accountType {\n\t\treturn errors.NewEMPErrorWithMsg(creative_one.CommonParamCheckError, \"AIO account type does not match expected account type\")\n\t}\n\treturn nil\n}\n\nfunc GetAIOAccount(ctx context.Context, aioAccountID int64) (account *client.AIOAccount, err error) {\n\taccount, err = rpc.GetClientInfo(ctx, aioAccountID)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"failed to get info for account id: %v\", aioAccountID)\n\t\treturn nil, err\n\t}\n\treturn\n}\n"
  },
  {
    "path": "application/service/global_framework/add_on.go",
    "content": "package global_framework\n\nimport (\n\t\"context\"\n)\n\nfunc ClientUpdateAddOns(ctx context.Context, req ClientUpdateTTCXCampaignAddonReq) (resp CommonEmptyResp, err error) {\n\n}\n\nfunc ClientValidateAddOns(ctx context.Context, req ClientValidateAddonReq) (resp CommonEmptyResp, err error) {\n\n}\n\nfunc ClientCampaignAddOns(ctx context.Context, req ClientCampaignAddonReq) (resp ClientCampaignAddonResp, err error) {\n\n}\n"
  },
  {
    "path": "application/service/global_framework/service_package.go",
    "content": "package global_framework\n\nimport (\n\t\"context\"\n)\n\nfunc ClientCampaignServicePackages(ctx context.Context, req *partner_business.ClientCampaignServicePackageReq) (resp *partner_business.ClientCampaignServicePackageResp, err error) {\n\tresp = &partner_business.ClientCampaignServicePackageResp{BaseResp: base.NewBaseResp()}\n\n\tservicePackages, err := rpc.GetBriefAvailableSPV2s(\n\t\tctx, req.BriefRegion, req.CoreUserID, req.SelectedAdvertiserID, conv.BoolPtr(false), req.IsSubscription, req.IndustryType)\n\tif err != nil {\n\t\treturn\n\t}\n\tisJBP, err := ttcxrpc.IsJBPAdvertiser(ctx, req.GetSelectedAdvertiserID())\n\tif err != nil {\n\t\treturn\n\t}\n\tif isJBP && !gslice.Contains(clients.DynamicConfigGetter.JBPVCPDisableMinimumSpendRegion(), req.BriefRegion) {\n\t\tfor _, pck := range append(servicePackages.NetNewPackages, servicePackages.RemixPackages...) {\n\t\t\tpck.MinSpend = 0\n\t\t\tpck.SubscriptionMinSpend = gptr.Of(0.0)\n\t\t\tpck.OriginalMinSpend = gptr.Of(0.0)\n\t\t\tpck.AffiliatedMediaFee = gptr.Of(0.0)\n\t\t}\n\t\tfor header, pcks := range servicePackages.GetServicePackages() {\n\t\t\tfor _, pck := range pcks {\n\t\t\t\tpck.MinSpend = 0\n\t\t\t\tpck.SubscriptionMinSpend = gptr.Of(0.0)\n\t\t\t\tpck.OriginalMinSpend = gptr.Of(0.0)\n\t\t\t\tpck.AffiliatedMediaFee = gptr.Of(0.0)\n\t\t\t\tif header == \"net_new_packages\" || header == \"remix_packages\" {\n\t\t\t\t\tpck.Price = 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tservicePackageMap := map[string][]*partner_business.ServicePackageCardInfo{}\n\tfor key, value := range servicePackages.ServicePackages {\n\t\tservicePackageList := []*partner_business.ServicePackageCardInfo{}\n\t\tfor _, item := range value {\n\t\t\tservicePackageList = append(servicePackageList, service.ConvertServicePackageCardInfo(item))\n\t\t}\n\n\t\tservicePackageMap[key] = servicePackageList\n\t}\n\n\tmaps := &partner_business.BriefAvailableSPV2sRespMaps{\n\t\tHeaderMap:           map[string]*partner_business.PackageHeaderDesc{},\n\t\tPackageMap:          map[string][]string{},\n\t\tBusinessTypeDescMap: map[string]*partner_business.BusinessTypeDesc{},\n\t}\n\n\tif servicePackages.Maps != nil {\n\t\tmaps.SetPackageMap(servicePackages.GetMaps().PackageMap)\n\t\theaderMap := map[string]*partner_business.PackageHeaderDesc{}\n\t\tbusinessTypeDescMap := map[string]*partner_business.BusinessTypeDesc{}\n\t\tif servicePackages.GetMaps().HeaderMap != nil {\n\t\t\tfor key, value := range servicePackages.Maps.HeaderMap {\n\t\t\t\theaderMap[key] = service.ConvertPackageHeaderDesc(value)\n\t\t\t}\n\t\t}\n\n\t\tif servicePackages.GetMaps().BusinessTypeDescMap != nil {\n\t\t\tfor key, value := range servicePackages.Maps.BusinessTypeDescMap {\n\t\t\t\tbusinessTypeDescMap[key] = &partner_business.BusinessTypeDesc{\n\t\t\t\t\tTitleDesc:       value.TitleDesc,\n\t\t\t\t\tContentDesc:     value.ContentDesc,\n\t\t\t\t\tDisclaimerDesc:  value.DisclaimerDesc,\n\t\t\t\t\tStartingPrice:   value.StartingPrice,\n\t\t\t\t\tCrossedOutPrice: value.CrossedOutPrice,\n\t\t\t\t\tCurrency:        value.Currency,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tmaps.SetHeaderMap(headerMap)\n\t\tmaps.SetBusinessTypeDescMap(businessTypeDescMap)\n\t}\n\n\tresp.SetServicePackages(servicePackageMap)\n\tresp.SetMaps(maps)\n\treturn\n}\n"
  },
  {
    "path": "application/service/util.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\tbasicJSON \"encoding/json\"\n)\n\nfunc ConvertBriefModelToCampaignEntity(ctx context.Context, brief *BriefDraft) (campaignInfo *CampaignInfo, err error) {\n\n}\n\nfunc ConvertCampaignEntityToBriefModel(ctx context.Context, campaignInfo *CampaignInfo, param *ClientCommonParam) (brief *ttcxmodel.BriefDraft) {\n\n}\n\n// OverwriteFields overwrites the fields of target with the same fields of source\nfunc OverwriteFields(ctx context.Context, target interface{}, source interface{}) error {\n\tlogs.CtxDebug(ctx, \"OverwriteFields, target: %v, source: %v\", target, source)\n\tif source == nil {\n\t\treturn nil\n\t}\n\n\tsourceData, err := basicJSON.Marshal(source)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"overwrite fields failed. unable to marshal the source, err: %v\", err)\n\t\treturn err\n\t}\n\terr = basicJSON.Unmarshal(sourceData, target)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"overwrite fields failed. unable to unmarshal the target, err: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "biz/fsm/callback/charging_callback.go",
    "content": "package callback\n\nfunc ApproveCallbackAfterTran(transitionCtx *bfsm.TransitionCtx) {\n\tctx := transitionCtx.Ctx\n\targs := transitionCtx.Args\n\tcampaignEntity := args[1].(entity.ICampaignEntity)\n\n\tif err := rpc.CreateChargingTicketForPartnerCampaign(ctx, campaignEntity); err != nil {\n\t\ttransitionCtx.Cancel(err)\n\t\tlogs(ctx, \"CallbackAfterTran error=%v partnerCampaign=%+v\", err, campaignEntity)\n\t}\n\n\terr := NotifyClientCampaignCompleted(ctx, campaignEntity)\n\tif err != nil {\n\t\tlogs(ctx, \"fail to send tto email notification for %d with err: %+v\", campaignEntity.GetCampaignID(), err)\n\t}\n}\n"
  },
  {
    "path": "biz/fsm/callback/notification_callback.go",
    "content": "package callback\n\nimport (\n\t\"context\"\n)\n\nfunc ClientCampaignCompleted(ctx context.Context, campaignEntity entity.ICampaignEntity) error {\n\t//Email Notification\n\tplaceHolder := eventbus.TTONotificationPlaceHolder{\n\t\tClientName:  gptr.Of(campaignEntity.GetDemanderName()),\n\t\tProjectName: gptr.Of(campaignEntity.GetName()),\n\t\tCampaignID:  gptr.Of(campaignEntity.GetCampaignID()),\n\t\tPartnerName: gptr.Of(campaignEntity.GetPartnerName()),\n\t}\n\n\terr := eventbus.SendEmailNotification(ctx, eventbus.REVIEW_PARTNER_CLIENT_EMAIL_NOTIFICATION, campaignEntity.GetCampaignID(), campaignEntity.GetAIOClientID(), placeHolder)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"fail to send tto email notification for %d with err: %+v\", campaignEntity.GetCampaignID(), err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc ClientCampaignCompletedCallBack(transitionCtx *bfsm.TransitionCtx) {\n\tctx := transitionCtx.Ctx\n\targs := transitionCtx.Args\n\tcampaignEntity := args[1].(entity.ICampaignEntity)\n\n\terr := NotifyClientCampaignCompleted(ctx, campaignEntity)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"fail to send tto email notification for %d with err: %+v\", campaignEntity.GetCampaignID(), err)\n\t}\n}\n\nfunc ClientPartnerCompleteCampaign(transitionCtx *bfsm.TransitionCtx) {\n\tctx := transitionCtx.Ctx\n\targs := transitionCtx.Args\n\tcampaignEntity := args[1].(entity.ICampaignEntity)\n\n\t//Email Notification\n\tplaceHolder := eventbus.TTONotificationPlaceHolder{\n\t\tClientName:  gptr.Of(campaignEntity.GetDemanderName()),\n\t\tProjectName: gptr.Of(campaignEntity.GetName()),\n\t\tCampaignID:  gptr.Of(campaignEntity.GetCampaignID()),\n\t\tPartnerName: gptr.Of(campaignEntity.GetPartnerName()),\n\t}\n\terr := eventbus.SendEmailNotification(ctx, eventbus.PARTNER_COMPLETE_CAMPAIGN_CLIENT_EMAIL_NOTIFICATION, campaignEntity.GetCampaignID(), campaignEntity.GetAIOClientID(), placeHolder)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"fail to send tto email notification for %d with err: %+v\", campaignEntity.GetCampaignID(), err)\n\t}\n}\n\nfunc ClientPartnerAcceptInvite(transitionCtx *bfsm.TransitionCtx) {\n\tctx := transitionCtx.Ctx\n\targs := transitionCtx.Args\n\tcampaignEntity := args[1].(entity.ICampaignEntity)\n\n\t//Email Notification\n\tplaceHolder := eventbus.TTONotificationPlaceHolder{\n\t\tClientName:  gptr.Of(campaignEntity.GetDemanderName()),\n\t\tProjectName: gptr.Of(campaignEntity.GetName()),\n\t\tCampaignID:  gptr.Of(campaignEntity.GetCampaignID()),\n\t\tPartnerName: gptr.Of(campaignEntity.GetPartnerName()),\n\t}\n\n\terr := eventbus.SendEmailNotification(ctx, eventbus.PARTNER_ACCEPT_ASSIGN_CLIENT_EMAIL_NOTIFICATION, campaignEntity.GetCampaignID(), campaignEntity.GetAIOClientID(), placeHolder)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"fail to send tto email notification for %d with err: %+v\", campaignEntity.GetCampaignID(), err)\n\t}\n}\n\nfunc NotifyClientPartnerRejectInvite(transitionCtx *bfsm.TransitionCtx) {\n\tctx := transitionCtx.Ctx\n\targs := transitionCtx.Args\n\tcampaignEntity := args[1].(entity.ICampaignEntity)\n\n\t//Email Notification\n\tplaceHolder := eventbus.TTONotificationPlaceHolder{\n\t\tClientName:  gptr.Of(campaignEntity.GetDemanderName()),\n\t\tProjectName: gptr.Of(campaignEntity.GetName()),\n\t\tCampaignID:  gptr.Of(campaignEntity.GetCampaignID()),\n\t\tPartnerName: gptr.Of(campaignEntity.GetPartnerName()),\n\t}\n\n\terr := eventbus.SendEmailNotification(ctx, eventbus.PARTNER_DENY_ASSIGN_CLIENT_EMAIL_NOTIFICATION, campaignEntity.GetCampaignID(), campaignEntity.GetAIOClientID(), placeHolder)\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"fail to send tto email notification for %d with err: %+v\", campaignEntity.GetCampaignID(), err)\n\t}\n}\n"
  },
  {
    "path": "biz/fsm/callback/order_logging_callback.go",
    "content": "package callback\n\nimport (\n\t\"context\"\n)\n\nfunc CreateTTCXOrderLog(ctx context.Context, campaignEntity entity.ICampaignEntity) error {\n\treturn order_dal.CreateOrderLogModel(ctx, campaignEntity.GetTTCXOrderID(), campaignEntity.GetOperatorID(), campaignEntity.GetUserRole(), campaignEntity.GetTTCXOperationType(), campaignEntity.GetPreviousStatus(), int(campaignEntity.GetCampaignStatus()), campaignEntity.GetContent(), model.CustomInfo{}, campaignEntity.GetIsTest())\n}\n"
  },
  {
    "path": "biz/fsm/callback/rpc_callback.go",
    "content": "package callback\n\nfunc RollbackCoupon(transitionCtx *bfsm.TransitionCtx) {\n\tctx := transitionCtx.Ctx\n\targs := transitionCtx.Args\n\tcampaignEntity := args[1].(entity.ICampaignEntity)\n\n\tpayment := campaignEntity.GetCampaignPayment()\n\tif payment == nil {\n\t\tlogs.CtxError(ctx, \"missing payment information for campaign %d\", campaignEntity.GetCampaignID())\n\t\treturn\n\t}\n\n\terr := rpc.RollbackCoupon(ctx, payment.GetCouponID(), 1, campaignEntity.GetOperatorID())\n\tif err != nil {\n\t\tlogs.CtxError(ctx, \"rollback coupon %d with error: %v\", payment.GetCouponID(), err)\n\t}\n}\n"
  },
  {
    "path": "biz/fsm/factory/bfsm_factory.go",
    "content": "package factory\n\nconst MatchParamsKey = \"matchParams\"\n\n// MatchParamsVal condition 判断条件，以map <key, MatchParamsVal>传入，key 指定未`matchParams`\ntype MatchParamsVal struct {\n\tIsClientSelect     bool\n\tNeedPartnerInvoice bool\n}\n\nfunc NewPartnerCampaignBFSM(agent entity.IAgentEntity) (FSM *bfsm.FSM, err error) {\n\tFSM, err = bfsm.NewFSM(agentBase, agent.GetCampaignStatus().String())\n\tif err != nil {\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "biz/fsm/factory/callback.go",
    "content": "package factory\n\nimport (\n\t\"context\"\n)\n\nfunc SaveAndUpdateCampaignAndStatus(transitionCtx *bfsm.TransitionCtx) {\n\targs := transitionCtx.Args\n\tctx := args[0].(context.Context)\n\tcampaignEntity := args[1].(entity.AgentEntity)\n\tvar err error\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ttransitionCtx.Err = err\n\t\t} else {\n\t\t\tlogs(ctx, \"[SaveAndUpdateCampaignAndStatus] common after trans callback\")\n\t\t\t//Create TTCX Legacy Order Log\n\t\t\tif campaignEntity.GetOperatorID() != 0 && campaignEntity.GetTTCXOperationType() != 0 {\n\t\t\t\terr = callback.CreateTTCXOrderLog(ctx, campaignEntity)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlogs(ctx, \"[SaveAndUpdateCampaignAndStatus] create order log fail, err is %+v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\tif campaignEntity.GetRequestID() == 0 {\n\t\t// 初始化创建的case\n\t\tid, err := idgenerator.NewIdLong2(ctx)\n\t\tif err != nil {\n\t\t\ttransitionCtx.Err = err\n\t\t\tlogs(ctx, \"[SaveAndUpdateCampaignAndStatus] generate campaign id fail, err is %+v\", err)\n\t\t\treturn\n\t\t}\n\t\tcampaignEntity.SetTTCXOrderID(int64(id))\n\t}\n\terr = setCampaignStatus(campaignEntity, transitionCtx)\n\tif err != nil {\n\t\tlogsError(ctx, \"[SaveAndUpdateCampaignAndStatus] set campaign status err: %+v\", err)\n\t\treturn\n\t}\n\terr = repository.CampaignRepo.CreateUpdateCampaign(ctx, campaignEntity)\n\treturn\n}\n\nfunc setCampaignStatus(campaignEntity entity.AgentEntity, transitionCtx *bfsm.TransitionCtx) (err error) {\n\tif transitionCtx == nil {\n\t\t// TODO: 错误码\n\t\terr = errors.NewEmpErrorWithStack(creative_one.CommonParamCheckError)\n\t\treturn\n\t}\n\targs := transitionCtx.Args\n\tctx := args[0].(context.Context)\n\n\tdstStatus, err := collaboration.PartnerCampaignStatusFromString(transitionCtx.Dst)\n\tif err != nil {\n\t\treturn\n\t}\n\tsrcStatus, err := collaboration.PartnerCampaignStatusFromString(transitionCtx.Src)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tlogsInfo(ctx, \"[setCampaignStatus] set campaign product_domain status, product_domain id: %v, src status: %v, dst status: %v\", campaignEntity.GetCampaignID(), srcStatus, dstStatus)\n\tcampaignEntity.SetCampaignStatus(dstStatus)\n\tcampaignEntity.SetPreviousStatus(int(srcStatus))\n\treturn\n}\n"
  },
  {
    "path": "biz/fsm/factory/config.go",
    "content": "package factory\n\nconst AgentBase = \"agent_base\"\n\nvar CreatorAgentFsmConfig = map[string]bfsm.BizDesc{\n\tAgentBase: {\n\t\tCommonDstCallback: SaveAndUpdateCampaignAndStatus,\n\t\tTransDescList: []bfsm.TransDesc{\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_ClientSelectingPartner.String(), collaboration.CreatorAgentStatus_PSOAssignPartner.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_ClientCancelCampaign.String(),\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_Cancelled.String(),\n\t\t\t\t\t\tAfterTransCallback: callback.RollbackCoupon,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_PartnerReviewingAssignment.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_PartnerAcceptInvitation.String(), //partner approve\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_PartnerMakingProduct.String(),\n\t\t\t\t\t\tAfterTransCallback: callback.NotifyClientPartnerAcceptInvite,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_PartnerReviewingAssignment.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_PartnerRejectInvitation.String(), //partner reject\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_ClientSelectingPartner.String(),\n\t\t\t\t\t\tCondition:          \"matchParams.IsClientSelect\",\n\t\t\t\t\t\tAfterTransCallback: callback.NotifyClientPartnerRejectInvite,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_PSOAssignPartner.String(),\n\t\t\t\t\t\tCondition:          \"!matchParams.IsClientSelect\",\n\t\t\t\t\t\tAfterTransCallback: callback.NotifyClientPartnerRejectInvite,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_PartnerMakingProduct.String(), collaboration.CreatorAgentStatus_ProductUpload.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_PartnerUploadCreatives.String(),\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst: collaboration.CreatorAgentStatus_ProductUpload.String(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_ClientConfirmingProduct.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_PartnerUploadCreatives.String(),\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst: collaboration.CreatorAgentStatus_ClientConfirmingProduct.String(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_ProductComplete.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_PartnerUploadCreatives.String(),\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst: collaboration.CreatorAgentStatus_ProductComplete.String(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_ProductUpload.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_PartnerCompleteCampaign.String(),\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_ClientConfirmingProduct.String(),\n\t\t\t\t\t\tAfterTransCallback: callback.NotifyClientPartnerCompleteCampaign,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_ClientConfirmingProduct.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_ClientRejectCompletion.String(), //partner complete order\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_ProductUpload.String(),\n\t\t\t\t\t\tAfterTransCallback: nil,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tSrc:                 []string{collaboration.CreatorAgentStatus_ClientConfirmingProduct.String()},\n\t\t\t\tEvent:               partner_business.CampaignOperationEvent_ClientCompleteCampaign.String(), //partner complete order\n\t\t\t\tBeforeTransCallback: nil,\n\t\t\t\tSrcCallback:         nil,\n\t\t\t\tMatchers: []bfsm.Matcher{\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_ProductComplete.String(),\n\t\t\t\t\t\tCondition:          \"!matchParams.NeedPartnerInvoice\",\n\t\t\t\t\t\tAfterTransCallback: callback.NotifyClientCampaignCompletedCallBack,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tDst:                collaboration.CreatorAgentStatus_ProductComplete.String(),\n\t\t\t\t\t\tCondition:          \"matchParams.NeedPartnerInvoice\",\n\t\t\t\t\t\tAfterTransCallback: callback.CreatorAgentApproveCallbackAfterTran,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "biz/fsm/factory/trigger.go",
    "content": "package trigger\n\nimport (\n\t\"context\"\n)\n\nfunc TransferCampaignWorkFlow(ctx context.Context, agentEntity entity.IAgentEntity, matchParams map[string]interface{}, params ...interface{}) (valid bool, err error) {\n\tfsm, err := factory.NewPartnerCampaignBFSM(campaignEntity)\n\tif err != nil {\n\t\treturn\n\t}\n\tcallbackParams := []interface{}{ctx, campaignEntity}\n\tcallbackParams = append(callbackParams, params...)\n\terr = fsm.Fire(ctx, campaignEntity.GetCampaignOperationEvent().String(), matchParams, callbackParams...)\n\tif err != nil {\n\t\treturn\n\t}\n\tvalid = true\n\treturn\n}\n"
  },
  {
    "path": "build.sh",
    "content": "#!/usr/bin/env bash\nRUN_NAME=\"ad.creative_one.partner_business\"\n\nmkdir -p output/bin output/conf\ncp script/* output/\ncp conf/* output/conf/\nchmod +x output/bootstrap.sh\n\nif [ \"$IS_SYSTEM_TEST_ENV\" != \"1\" ]; then\n    go build -o output/bin/${RUN_NAME}\nelse\n    go test -c -covermode=set -o output/bin/${RUN_NAME} -coverpkg=./...\nfi\n"
  },
  {
    "path": "db/custom/collaboration_campaign_info.go",
    "content": "package custom\n\nimport (\n\t\"context\"\n)\n\nfunc CreateUpdateCampaign(ctx context.Context, campaignModel *model.CollaborationCampaignInfo) error {\n\tif campaignModel.ID == 0 {\n\t\tcampaignID, err := idgenerator.NewIdLong2(ctx)\n\t\tif err != nil {\n\t\t\tlogs.CtxError(ctx, \"CreateUpdateCampaign id generate fail, err is %+v\", err)\n\t\t\treturn err\n\t\t}\n\t\tcampaignModel.ID = int64(campaignID)\n\t}\n\treturn query.CreativeSession(ctx).CollaborationCampaignInfo.WithContext(ctx).Save(campaignModel)\n}\n\nfunc GetCampaignByIDWithClient(ctx context.Context, campaignID int64, AIOClientID int64) (campaignModel *model.CollaborationCampaignInfo, err error) {\n\tif AIOClientID == 0 {\n\t\treturn GetCampaignByIDWithoutClient(ctx, campaignID)\n\t}\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\treturn q.WithContext(ctx).Where(q.ID.Eq(campaignID)).Where(q.AioClientID.Eq(AIOClientID)).First()\n}\n\nfunc GetCampaignByIDWithoutClient(ctx context.Context, campaignID int64) (campaignModel *model.CollaborationCampaignInfo, err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\treturn q.WithContext(ctx).Where(q.ID.Eq(campaignID)).First()\n}\n\nfunc MGetCampaignByIDs(ctx context.Context, campaignIDs []int64) (campaignModel []*model.CollaborationCampaignInfo, err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\treturn q.WithContext(ctx).Where(q.ID.In(campaignIDs...)).Find()\n}\n\nfunc DeleteCampaignByID(ctx context.Context, campaignID int64) (err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\t_, err = q.WithContext(ctx).Where(q.ID.Eq(campaignID)).Unscoped().Delete()\n\treturn\n}\n\nfunc GetCampaignListWithPageByCondition(ctx context.Context, campaignID *int64, AIOClientID *int64, matchMode *collaboration.MatchMode, seatType *collaboration.SeatType, statusList []int32) (campaignModelList []*model.CollaborationCampaignInfo, err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\tsearch := q.WithContext(ctx)\n\tif campaignID != nil {\n\t\tsearch = search.Where(q.ID.Eq(*campaignID))\n\t}\n\tif AIOClientID != nil {\n\t\tsearch = search.Where(q.AioClientID.Eq(*AIOClientID))\n\t}\n\tif matchMode != nil {\n\t\tsearch = search.Where(q.MatchingMode.Eq(matchMode))\n\t}\n\tif seatType != nil {\n\t\tsearch = search.Where(q.SeatType.Eq(int32(*seatType)))\n\t}\n\tif len(statusList) != 0 {\n\t\tsearch = search.Where(q.Status.In(statusList...))\n\t}\n\treturn search.Find()\n}\n\nfunc GetCampaignCountGroupByStatus(ctx context.Context, aioClientID int64, matchingMode *collaboration.MatchMode, groupStatus []int32) (ret map[collaboration.CampaignStatus]int32, err error) {\n\ttype result struct {\n\t\tStatus int32\n\t\tTotal  int32\n\t}\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\trows, err := q.WithContext(ctx).Select(q.Status, q.ID.Count()).Group(q.Status).\n\t\tWhere(q.AioClientID.Eq(aioClientID)).\n\t\tWhere(q.MatchingMode.Eq(matchingMode)).\n\t\tWhere(q.Status.In(groupStatus...)).Rows()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret = make(map[collaboration.CampaignStatus]int32)\n\tfor rows.Next() {\n\t\tvar r result\n\t\terr = rows.Scan(&r.Status, &r.Total)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret[collaboration.CampaignStatus(r.Status)] = r.Total\n\t}\n\treturn\n}\n\nfunc GetCampaignIDsByPage(ctx context.Context, page, limit int32) ([]int64, error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\trows, err := q.WithContext(ctx).Where(q.ID.Gt(0)).Order(q.ID).Limit(int(limit)).Offset(int((page - 1) * limit)).Find()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcampaignIDs := make([]int64, 0, len(rows))\n\tfor _, row := range rows {\n\t\tcampaignIDs = append(campaignIDs, row.ID)\n\t}\n\treturn campaignIDs, nil\n}\n\nfunc GetEUSolutionYCampaignsByPage(ctx context.Context, euCountries []string, page, limit int) (campaigns []*model.CollaborationCampaignInfo, err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\trows, _, err := q.WithContext(ctx).\n\t\tWhere(q.SolutionType.Eq(gptr.Of(collaboration.SolutionType_SolutionY))).\n\t\tWhere(q.CampaignCountry.In(euCountries...)).\n\t\tFindByPage((page-1)*limit, limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcampaigns = make([]*model.CollaborationCampaignInfo, 0, len(rows))\n\tfor _, row := range rows {\n\t\tcampaigns = append(campaigns, row)\n\t}\n\treturn\n}\n\nfunc GetSolutionXRunningOACCampaignsByPage(ctx context.Context, offset, limit int) (campaigns []*model.CollaborationCampaignInfo, err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\tcampaigns, _, err = q.WithContext(ctx).\n\t\tWhere(q.SolutionType.Eq(gptr.Of(collaboration.SolutionType_SolutionX))).\n\t\tWhere(q.Status.Eq(int32(collaboration.CampaignStatus_Running))).\n\t\tWhere(q.MatchingMode.Eq(gptr.Of(collaboration.MatchMode_DIAndOAC))).\n\t\tFindByPage(offset, limit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn campaigns, nil\n}\n\n//func IsCampaignExists(ctx context.Context, campaignID int64, aioClientID int64) (isExists bool, err error) {\n//\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n//\n//\tf := q.WithContext(ctx).Select(q.ID).Where(q.ID.Eq(campaignID))\n//\tif aioClientID != 0 {\n//\t\tf = f.Where(q.AioClientID.Eq(aioClientID))\n//\t}\n//\tret, err := f.First()\n//\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n//\t\tlog.V2.Error().With(ctx).Str(\"IsCampaignExists error\").KV(\"ret\", ret).Error(err).Emit()\n//\t\terr = error1.NewEMPErrorWithMsg(creative_one.CommonInternalSystemError, err.Error()).WithStack()\n//\t\treturn\n//\t}\n//\treturn ret != nil, nil\n//}\n\nfunc GetCampaignClientID(ctx context.Context, campaignID int64) int64 {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\tcampaignModel, err := q.WithContext(ctx).Select(q.AioClientID).Where(q.ID.Eq(campaignID)).First()\n\tif err != nil {\n\t\tlog.V2.Warn().With(ctx).Str(\"[GetCampaignClientID]error\").Error(err).Emit()\n\t\treturn 0\n\t}\n\treturn campaignModel.AioClientID\n}\n\nfunc ScanCampaignByCursor(ctx context.Context, campaignID int64, limit int) (campaigns []*model.CollaborationCampaignInfo, err error) {\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\treturn q.WithContext(ctx).Where(q.ID.Gte(campaignID)).Order(q.ID).Limit(limit).Find()\n}\n\nfunc UpdateCampaignDataCenter(ctx context.Context, campaignID int64, dataCenter common_param.DataCenter, write bool) error {\n\tif !write {\n\t\tlog.V2.Warn().With(ctx).Str(\"[write=false]campaign update data center\").KVs(\"campaign id\", campaignID, \"data center\", dataCenter).Emit()\n\t\treturn nil\n\t}\n\tq := query.CreativeSession(ctx).CollaborationCampaignInfo\n\t_, err := q.WithContext(ctx).Where(q.ID.Eq(campaignID)).Update(q.DataCenter, dataCenter)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "db/custom/collaboration_partner_campaign.go",
    "content": "package custom\n\nimport (\n\t\"context\"\n\t\"database/sql/driver\"\n\n\t\"gorm.io/gen\"\n)\n\nfunc CreateUpdatePartnerCampaign(ctx context.Context, campaignModel *model.CollaborationPartnerCampaign) (err error) {\n\tif campaignModel.ID == 0 {\n\t\topportunityID, err := idgenerator.NewIdLong2(ctx)\n\t\tif err != nil {\n\t\t\tlogs.CtxError(ctx, \"[CreateUpdatePartnerCampaign] id generate fail, err is %+v\", err)\n\t\t\treturn err\n\t\t}\n\t\tcampaignModel.ID = int64(opportunityID)\n\t}\n\treturn query.CreativeSession(ctx).CollaborationPartnerCampaign.WithContext(ctx).Save(campaignModel)\n}\n\nfunc BatchCreateUpdatePartnerCampaign(ctx context.Context, campaignModelList []*model.CollaborationPartnerCampaign) (err error) {\n\tfor _, campaignModel := range campaignModelList {\n\t\tif campaignModel.ID == 0 {\n\t\t\tpartnerCampaignID, err := idgenerator.NewIdLong2(ctx)\n\t\t\tif err != nil {\n\t\t\t\tlogs.CtxError(ctx, \"[CreateUpdatePartnerCampaign] id generate fail, err is %+v\", err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcampaignModel.ID = int64(partnerCampaignID)\n\t\t}\n\t}\n\treturn query.CreativeSession(ctx).CollaborationPartnerCampaign.WithContext(ctx).Save(campaignModelList...)\n}\n\nfunc GetPartnerCampaignByCampaignID(ctx context.Context, campaignID int64) (campaign *model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\treturn q.WithContext(ctx).Where(q.CampaignID.Eq(campaignID)).First()\n}\n\nfunc GetPartnerCampaignByID(ctx context.Context, id int64) (campaign *model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\treturn q.WithContext(ctx).Where(q.ID.Eq(id)).First()\n}\n\nfunc GetPartnerCampaignMapByIDs(ctx context.Context, ids []int64) (partnerCampaignMap map[int64]*model.CollaborationPartnerCampaign, err error) {\n\tif len(ids) == 0 {\n\t\treturn map[int64]*model.CollaborationPartnerCampaign{}, nil\n\t}\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\tpartnerCampaignList, err := q.WithContext(ctx).Where(q.ID.In(ids...)).Find()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpartnerCampaignMap = make(map[int64]*model.CollaborationPartnerCampaign, len(partnerCampaignList))\n\tfor _, partnerCampaign := range partnerCampaignList {\n\t\tpartnerCampaignMap[partnerCampaign.ID] = partnerCampaign\n\t}\n\treturn partnerCampaignMap, nil\n}\n\nfunc GetPartnerCampaignWithPartner(ctx context.Context, campaignID, partnerID int64) (campaign *model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\treturn q.WithContext(ctx).Where(q.CampaignID.Eq(campaignID)).Where(q.AioPartnerID.Eq(partnerID)).First()\n}\n\nfunc GetPartnerCampaignWithClient(ctx context.Context, campaignID, clientID int64) (campaign *model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\treturn q.WithContext(ctx).Where(q.CampaignID.Eq(campaignID)).Where(q.AioClientID.Eq(clientID)).First()\n}\n\nfunc GetPartnerCampaignWithPartnerAndClient(ctx context.Context, campaignID, partnerID, clientID int64) (campaign *model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\treturn q.WithContext(ctx).\n\t\tWhere(q.CampaignID.Eq(campaignID)).\n\t\tWhere(q.AioClientID.Eq(clientID)).\n\t\tWhere(q.AioPartnerID.Eq(partnerID)).\n\t\tFirst()\n}\n\nfunc GetPartnerCampaignWithCampaignAndStatus(ctx context.Context, campaignID int64, statusList []collaboration.PartnerCampaignStatus) (parterCampaignList []*model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\tfilter := q.WithContext(ctx).Where(q.CampaignID.Eq(campaignID))\n\tvar statusFieldPtr []driver.Valuer\n\tfor _, status := range statusList {\n\t\tstatusFieldPtr = append(statusFieldPtr, &status)\n\t}\n\tif len(statusFieldPtr) > 0 {\n\t\tfilter = filter.Where(q.Status.In(statusFieldPtr...))\n\t}\n\treturn filter.Find()\n}\n\nfunc GetPartnerCampaignByPartnerAndStatus(ctx context.Context, aioPartnerIds []int64, statusList []collaboration.PartnerCampaignStatus) (parterCampaignList []*model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\tfilter := q.WithContext(ctx).Where(q.AioPartnerID.In(aioPartnerIds...))\n\tvar statusFieldPtr []driver.Valuer\n\tfor _, status := range statusList {\n\t\tstatusFieldPtr = append(statusFieldPtr, &status)\n\t}\n\tif len(statusFieldPtr) > 0 {\n\t\tfilter = filter.Where(q.Status.In(statusFieldPtr...))\n\t}\n\treturn filter.Find()\n}\n\nfunc SearchPartnerCampaignWithAcceptRate(ctx context.Context, campaignID int64, statusList []collaboration.PartnerCampaignStatus, acceptRate100kLt *int64, acceptRate100kGt *int64) (parterCampaignList []*model.CollaborationPartnerCampaign, err error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\tfilter := q.WithContext(ctx).Where(q.CampaignID.Eq(campaignID))\n\tvar statusFieldPtr []driver.Valuer\n\tfor _, status := range statusList {\n\t\tstatusFieldPtr = append(statusFieldPtr, &status)\n\t}\n\tif len(statusFieldPtr) > 0 {\n\t\tfilter = filter.Where(q.Status.In(statusFieldPtr...))\n\t}\n\tif acceptRate100kGt != nil {\n\t\tfilter = filter.Where(q.AcceptRate100K.Gt(*acceptRate100kGt))\n\t}\n\tif acceptRate100kLt != nil {\n\t\tfilter = filter.Where(q.AcceptRate100K.Lt(*acceptRate100kLt))\n\t}\n\treturn filter.Find()\n}\n\nfunc ScanPartnerCampaignByCampaignID(ctx context.Context, campaignID int64) ([]*model.CollaborationPartnerCampaign, error) {\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\tbatchSize := 200\n\tresult := make([]*model.CollaborationPartnerCampaign, 0, batchSize)\n\ttotalResult := make([]*model.CollaborationPartnerCampaign, 0)\n\terr := q.WithContext(ctx).Where(q.CampaignID.Eq(campaignID)).FindInBatches(&result, batchSize, func(tx gen.Dao, batch int) error {\n\t\ttotalResult = append(totalResult, result...)\n\t\treturn nil\n\t})\n\treturn totalResult, err\n}\n\nfunc UpdatePartnerCampaignDataCenter(ctx context.Context, id int64, dataCenter common_param.DataCenter, write bool) error {\n\tif !write {\n\t\tlog.V2.Warn().With(ctx).Str(\"[write=false]partner campaign update data center\").KVs(\"partner campaign id\", id, \"data center\", dataCenter).Emit()\n\t\treturn nil\n\t}\n\tq := query.CreativeSession(ctx).CollaborationPartnerCampaign\n\t_, err := q.WithContext(ctx).Where(q.ID.Eq(id)).Update(q.DataCenter, dataCenter)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "domain/campaign/campaign_aggregate/entity/campaign.go",
    "content": "package entity\n\ntype ICampaignEntity interface {\n}\n"
  },
  {
    "path": "domain/campaign/campaign_aggregate/repository/brief.go",
    "content": "package repository\n\nimport (\n\t\"code.byted.org/ad/creative_one_partner_business/domain/campaign/campaign_aggregate/entity\"\n\t\"context\"\n)\n\nvar (\n\tBriefRepo BriefRepository\n)\n\ntype BriefRepository interface {\n\tCreateUpdateCampaignBrief(ctx context.Context, brief entity.ICampaignEntity) (err error)\n\tGetCampaignBriefDetail(ctx context.Context, brief entity.ICampaignEntity) (err error)\n}\n"
  },
  {
    "path": "domain/campaign/service/campaign_impl.go",
    "content": "package service\n\nimport (\n\t\"code.byted.org/ad/creative_one_partner_business/domain/campaign/campaign_aggregate/entity\"\n\t\"context\"\n)\n\ntype campaignDraftServiceImpl struct{}\n\nfunc (c *campaignDraftServiceImpl) CreateCampaignDraft(ctx context.Context, campaignDraftEntity entity.ICampaignEntity) (err error) {\n\treturn\n}\n\nfunc (c *campaignDraftServiceImpl) UpdateCampaignDraft(ctx context.Context, campaignDraftEntity entity.ICampaignEntity) (err error) {\n\treturn\n}\n\nfunc (c *campaignDraftServiceImpl) GetCampaignDraftDetail(ctx context.Context, campaignDraftID int64) (campaignDraftEntity entity.ICampaignEntity, err error) {\n\treturn\n}\n"
  },
  {
    "path": "domain/campaign/service/init.go",
    "content": "package service\n\nvar campaignDraftDomainService ICampaignDraftService\n\nfunc InitDomain() {\n\tcampaignDraftDomainService = &campaignDraftServiceImpl{}\n}\n"
  },
  {
    "path": "domain/campaign/service/service.go",
    "content": "package service\n\nimport (\n\t\"code.byted.org/ad/creative_one_partner_business/domain/campaign/campaign_aggregate/entity\"\n\t\"context\"\n)\n\ntype ICampaignDraftService interface {\n\tCreateCampaignDraft(ctx context.Context, campaignDraftEntity entity.ICampaignEntity) (err error)\n\tUpdateCampaignDraft(ctx context.Context, campaignDraftEntity entity.ICampaignEntity) (err error)\n\tGetCampaignDraftDetail(ctx context.Context, campaignDraftID int64) (campaignDraftEntity entity.ICampaignEntity, err error)\n}\n\nfunc GetService() ICampaignDraftService {\n\treturn campaignDraftDomainService\n}\n"
  },
  {
    "path": "go.mod",
    "content": ""
  },
  {
    "path": "go.sum",
    "content": ""
  },
  {
    "path": "rpc/bc_rpc.go",
    "content": "package rpc\n\nimport (\n\t\"context\"\n)\n\nfunc GetBusinessCenterListInfo(ctx context.Context, userId int64) ([]*i18n_bc_rpc.BusinessCenterUserInfo, error) {\n\treqCtx := &rpc.BaseContext{\n\t\tUID:    &userId,\n\t\tSource: 4,\n\t}\n\treq := &rpc.GetBusinessCenterListReq{\n\t\tContext: reqCtx,\n\t\tPage:    1,\n\t\tLimit:   50,\n\t}\n\tlogs.info(ctx, \"GetBusinessCenterListReq req: %s\", req)\n\tadvResp, err := BcClient.GetBusinessCenterList(ctx, req)\n\tlogs.info(ctx, \"GetBusinessCenterListReq response: %+v\", advResp)\n\terr = middleware.TransformError(advResp, err)\n\tif err != nil {\n\t\tlogs.error(ctx, \"[GetBusinessCenterListReq] get bc info error: %+v\", err)\n\t\treturn nil, errors.newError(err)\n\t}\n\tif len(advResp.BusinessCenterUserList) == 0 {\n\t\tlogs.info(ctx, \"uid [%d] doesn't have bc account\", userId)\n\t\treturn nil, nil\n\t}\n\treturn advResp.BusinessCenterUserList, nil\n}\n"
  }
]