You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
3.3 KiB
Go

package containers
import (
"joybuywork/internal/app"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/cmm"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_fission_web"
"joybuywork/proto/go_proto/workerr"
ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice"
)
type FissionWebAdsUser struct {
logic.Logic
Req *pb.AdsUserReq
Res *pb.AdsUserRes
}
func (s *FissionWebAdsUser) Run() error {
return logic.Run(s)
}
func (s *FissionWebAdsUser) Exec() (err error) {
cpn, channel, err := s.campaign()
if err != nil {
return
}
wbu, err := s.webUser(cpn, channel)
if err != nil {
return
}
err = s.reward(cpn, wbu)
if err != nil {
return
}
return
}
func (s *FissionWebAdsUser) campaign() (cpn *model.FissionCampaign, channel *model.FissionCampaignChannel, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || cpn.IsDel == mtype.Yes {
err = workerr.NotFound("campaign not found")
return
}
// 用户要绑定的渠道
channel, err = cmm.NewCMM(s.Ctx, s.GetDao()).UserBindChannel(cpn.ID, s.Req.GetCid())
if err != nil {
return
}
return
}
// 生成web用户
func (s *FissionWebAdsUser) webUser(cpn *model.FissionCampaign, channel *model.FissionCampaignChannel) (wbu *model.FissionWebUser, err error) {
cc := cache.NewFissionWebUser(s.Ctx)
wbu, err = cc.FindByWebId(cpn.ID, s.Req.GetWebId())
if err != nil {
err = s.BE().CacheError(err)
return
}
defer s.AddAfterRun(func() (err error) {
s.Res.Id = wbu.ID
return
})
m := s.GetDao().FissionWebUser
if wbu != nil {
if wbu.UserID == 0 && wbu.ChannelID != channel.ID {
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(wbu.ID)).UpdateSimple(m.ChannelID.Value(channel.ID))
if err != nil {
err = s.BE().MysqlError(err)
return
}
_ = cc.Clear(wbu)
}
return
}
var ip = s.Req.GetIp()
var ipCity string
if ip != "" {
res, _ := app.NewDeepLinkDevice().FindIpAreaCode(s.Ctx, &ddevicepb.FindIpAreaCodeReq{Ip: s.Req.GetIp()})
ipCity = res.GetAreaCode()
}
wbu = withdefault.FissionWebUser(&model.FissionWebUser{
CampaignID: cpn.ID,
ChannelID: channel.ID,
WebID: s.Req.GetWebId(),
IP: ip,
IPCity: ipCity,
})
err = m.WithContext(s.Ctx).Create(wbu)
if err != nil {
err = s.BE().MysqlError(err)
return
}
return
}
// 是否拿了奖品
func (s *FissionWebAdsUser) reward(cpn *model.FissionCampaign, wbu *model.FissionWebUser) (err error) {
if wbu.RewardID == 0 {
return
}
m := s.GetDao().FissionCampaignReward
reward, err := m.WithContext(s.Ctx).Where(m.ID.Eq(wbu.RewardID), m.CampaignID.Eq(cpn.ID)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if reward == nil {
return
}
preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, reward.RewardID)
if err != nil {
return
}
info, _ := preward.InfoAutoLang(reward.RewardID, cpn.GetLangMarks()[0])
s.AddAfterRun(func() (err error) {
s.Res.RewardId = wbu.RewardID
s.Res.Title = info.Title
s.Res.ImgUrl = info.ImgUrl
return
})
return
}