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
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
|
|
}
|