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.
508 lines
12 KiB
Go
508 lines
12 KiB
Go
package service
|
|
|
|
import (
|
|
"joybuywork/internal/app"
|
|
"joybuywork/internal/consts/ckey"
|
|
"joybuywork/internal/plugins/encrypt"
|
|
"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/containers"
|
|
"joybuywork/internal/service/provider"
|
|
"joybuywork/internal/utils/logic"
|
|
pb "joybuywork/proto/go_proto/w_project"
|
|
"joybuywork/proto/go_proto/workerr"
|
|
"time"
|
|
)
|
|
|
|
type WProject struct {
|
|
Service
|
|
}
|
|
|
|
// Select 选择列表
|
|
func (s *WProject) Select(req *pb.SelectReq, res *pb.SelectRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
m := s.GetDao().Project
|
|
|
|
var list []*model.Project
|
|
if req.ShowUser {
|
|
relateM := s.GetDao().UserProjectRelate
|
|
var projectIds []int64
|
|
|
|
err = relateM.WithContext(s.ctx).Where(relateM.UserID.Eq(req.GetUserId()), relateM.IsDel.Eq(mtype.No)).Pluck(relateM.ProjectID, &projectIds)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if len(projectIds) > 0 {
|
|
list, err = m.WithContext(s.ctx).Where(m.ID.In(projectIds...), m.IsDel.Eq(mtype.No)).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
}
|
|
|
|
} else {
|
|
list, err = m.WithContext(s.ctx).Where(m.CompanyID.Eq(req.GetCompanyId()), m.IsDel.Eq(mtype.No)).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
}
|
|
|
|
*res = pb.SelectRes{
|
|
List: make([]*pb.SelectRes_One, 0, len(list)),
|
|
}
|
|
|
|
for _, v := range list {
|
|
res.List = append(res.List, &pb.SelectRes_One{
|
|
Id: v.ID,
|
|
HashId: v.HashID,
|
|
Title: v.Title,
|
|
Scene: int32(v.Scene),
|
|
LogoUrl: v.LogoURL,
|
|
IsTest: int32(v.IsTest),
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// List 用户列表
|
|
func (s *WProject) List(req *pb.ListReq, res *pb.ListRes) (err error) {
|
|
defer s.checkErr()
|
|
*res = pb.ListRes{}
|
|
|
|
container := new(containers.ProjectList)
|
|
{
|
|
container.Init(s.ctx)
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|
|
|
|
// Store 创建项目
|
|
func (s *WProject) Store(req *pb.StoreReq, res *pb.StoreRes) (err error) {
|
|
defer s.checkErr()
|
|
*res = pb.StoreRes{}
|
|
container := new(containers.ProjectStore)
|
|
{
|
|
container.Init(s.ctx, logic.WithTran())
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|
|
|
|
// Update 更新项目
|
|
func (s *WProject) Update(req *pb.UpdateReq, res *pb.UpdateRes) (err error) {
|
|
defer s.checkErr()
|
|
*res = pb.UpdateRes{}
|
|
|
|
container := new(containers.ProjectUpdate)
|
|
{
|
|
container.Init(s.ctx, logic.WithTran())
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|
|
|
|
// Destroy 删除项目
|
|
func (s *WProject) Destroy(req *pb.DestroyReq, res *pb.DestroyRes) (err error) {
|
|
defer s.checkErr()
|
|
*res = pb.DestroyRes{}
|
|
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().Project
|
|
|
|
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(project.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
err = cache.NewProject(s.ctx).Clear(project)
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// Cert 项目认证
|
|
func (s *WProject) Cert(req *pb.CertReq, res *pb.CertRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("not found project")
|
|
}
|
|
|
|
// 找没有删除的project 密钥,并且七天内删除的密钥
|
|
secretM := s.GetDao().ProjectSecret
|
|
secrets, err := secretM.WithContext(s.ctx).
|
|
Where(
|
|
secretM.ProjectID.Eq(project.ID),
|
|
).Where(
|
|
secretM.WithContext(s.ctx).
|
|
Where(secretM.IsDel.Eq(mtype.No)).
|
|
Or(
|
|
secretM.WithContext(s.ctx).Where(
|
|
secretM.UpdatedAt.Gte(time.Now().AddDate(0, 0, -7).Unix()),
|
|
secretM.IsDel.Eq(mtype.Yes),
|
|
),
|
|
)).
|
|
Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.CertRes{
|
|
Id: project.ID,
|
|
HashId: project.HashID,
|
|
Title: project.Title,
|
|
EncryptStr: project.EncryptStr,
|
|
Scene: int32(project.Scene),
|
|
CertSecrets: make([]*pb.CertRes_CertSecret, 0, len(secrets)),
|
|
}
|
|
|
|
for _, v := range secrets {
|
|
one := &pb.CertRes_CertSecret{
|
|
Secret: v.AccessSecret,
|
|
ExpiredAt: 0,
|
|
}
|
|
|
|
if v.IsDel == mtype.Yes {
|
|
one.ExpiredAt = v.UpdatedAt - time.Now().AddDate(0, 0, -7).Unix()
|
|
}
|
|
|
|
res.CertSecrets = append(res.CertSecrets, one)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// ProjectSecret 项目私钥
|
|
func (s *WProject) ProjectSecret(req *pb.ProjectSecretReq, res *pb.ProjectSecretRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("not found project")
|
|
}
|
|
|
|
m := s.GetDao().ProjectSecret
|
|
secret, err := m.WithContext(s.ctx).Where(m.ProjectID.Eq(project.ID), m.IsDel.Eq(mtype.No)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if secret == nil {
|
|
return nil
|
|
}
|
|
|
|
*res = pb.ProjectSecretRes{
|
|
Secret: secret.AccessSecret,
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// ChangeSecret 修改密钥
|
|
func (s *WProject) ChangeSecret(req *pb.ChangeSecretReq, res *pb.ChangeSecretRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("project not found")
|
|
}
|
|
|
|
//保证只有一个账号被创建
|
|
onceKey := ckey.ProjectSecretOnce(project.ID)
|
|
lc := app.NewRedisLock(s.ctx, onceKey)
|
|
defer lc.Release()
|
|
if !lc.SoftLock() {
|
|
return workerr.OnceLockError
|
|
}
|
|
|
|
m := s.GetDao().ProjectSecret
|
|
old, err := m.WithContext(s.ctx).Where(m.ProjectID.Eq(project.ID), m.IsDel.Eq(mtype.No)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
userM := s.GetDao().User
|
|
user, err := userM.WithContext(s.ctx).Where(userM.Username.Eq(req.GetUsername()), userM.IsDel.Eq(mtype.No)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
if user == nil || user.IsAdmin == mtype.No {
|
|
return workerr.ChangAuthError
|
|
}
|
|
|
|
verify, err := encrypt.CheckUserPasswd(req.GetPasswd(), user.Passwd)
|
|
if err != nil || !verify {
|
|
return workerr.ChangAuthError
|
|
}
|
|
|
|
if old != nil {
|
|
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(old.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
}
|
|
|
|
secret := withdefault.ProjectSecret(&model.ProjectSecret{
|
|
CreatorID: req.GetId(),
|
|
ProjectID: project.ID,
|
|
AccessSecret: encrypt.ProjectSecret(project.ID),
|
|
})
|
|
|
|
err = m.WithContext(s.ctx).Create(secret)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.ChangeSecretRes{
|
|
Secret: secret.AccessSecret,
|
|
}
|
|
return
|
|
}
|
|
|
|
// Show 项目详情
|
|
func (s *WProject) Show(req *pb.ShowReq, res *pb.ShowRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("project not found")
|
|
}
|
|
|
|
*res = pb.ShowRes{
|
|
Id: project.ID,
|
|
HashId: project.HashID,
|
|
Title: project.Title,
|
|
Domain: project.Domain,
|
|
CompanyId: project.CompanyID,
|
|
NotifyToken: project.NotifyToken,
|
|
EncryptStr: project.EncryptStr,
|
|
Scene: int32(project.Scene),
|
|
ThirdSecret: project.ThirdSecret,
|
|
FissionCertType: int32(project.FissionCertType),
|
|
ThirdUrl: project.ThirdURL,
|
|
ThirdReboostUrl: project.ThirdReboostURL,
|
|
}
|
|
return
|
|
}
|
|
|
|
// DomainList 获取项目域名绑定的项目
|
|
func (s *WProject) DomainList(req *pb.DomainListReq, res *pb.DomainListRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
m := s.GetDao().Project
|
|
list, err := m.WithContext(s.ctx).Where(m.Domain.Eq(req.GetDomain())).Find()
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
*res = pb.DomainListRes{
|
|
List: make([]*pb.DomainListRes_One, 0, len(list)),
|
|
}
|
|
|
|
for _, v := range list {
|
|
res.List = append(res.List, &pb.DomainListRes_One{
|
|
Id: v.ID,
|
|
HashId: v.HashID,
|
|
CompanyId: v.CompanyID,
|
|
Title: v.Title,
|
|
Domain: v.Domain,
|
|
CreatedTime: v.CreatedAt,
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// ChangeOplatform 修改开放平台
|
|
func (s *WProject) ChangeOplatform(req *pb.ChangeOplatformReq, res *pb.ChangeOplatformRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("project not found")
|
|
}
|
|
p := s.GetDao().Project
|
|
_, err = p.WithContext(s.ctx).Where(p.HashID.Eq(req.GetHashId())).UpdateSimple(p.ThirdURL.Value(req.GetThirdUrl()))
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
// 清理缓存
|
|
cache.NewProject(s.ctx).Clear(project)
|
|
|
|
*res = pb.ChangeOplatformRes{}
|
|
return
|
|
}
|
|
|
|
// SaveAdsConfig 保存广告修改
|
|
func (s *WProject) SaveAdsConfig(req *pb.SaveAdsConfigReq, res *pb.SaveAdsConfigRes) (err error) {
|
|
defer s.checkErr()
|
|
*res = pb.SaveAdsConfigRes{}
|
|
container := new(containers.ProjectSaveAdsConfig)
|
|
{
|
|
container.Init(s.ctx, logic.WithTran(), logic.WithOnce(ckey.ProjectAdsOnce(req.GetProjectHashId())), logic.WithOl())
|
|
container.Req = req
|
|
container.Res = res
|
|
}
|
|
|
|
return container.Run()
|
|
}
|
|
|
|
// AdsConfig 获取广告配置
|
|
func (s *WProject) AdsConfig(req *pb.AdsConfigReq, res *pb.AdsConfigRes) (err error) {
|
|
defer s.checkErr()
|
|
|
|
project, err := s.ProjectErrNil(req.GetProjectHashId())
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
ads, err := cache.NewProjectAd(s.ctx).FindByProjectId(project.ID)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
}
|
|
|
|
if ads == nil {
|
|
return
|
|
}
|
|
|
|
*res = pb.AdsConfigRes{
|
|
OpenAd: int32(ads.OpenAd),
|
|
CampaignAd: int32(ads.CampaignAd),
|
|
AdCustomUrl: int32(ads.AdCustomURL),
|
|
}
|
|
return
|
|
}
|
|
|
|
// ChangeRebootUrl 修改开放平台的活动回调地址
|
|
func (s *WProject) ChangeRebootUrl(req *pb.ChangeRebootUrlReq, res *pb.ChangeRebootUrlRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetId(), req.GetHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil || project.IsDel == mtype.Yes {
|
|
return workerr.NotFound("project not found")
|
|
}
|
|
p := s.GetDao().Project
|
|
_, err = p.WithContext(s.ctx).Where(p.ID.Eq(project.ID)).UpdateSimple(p.ThirdReboostURL.Value(req.GetThirdReboostUrl()))
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
// 清理缓存
|
|
cache.NewProject(s.ctx).Clear(project)
|
|
*res = pb.ChangeRebootUrlRes{}
|
|
return
|
|
}
|
|
|
|
// FissionConfig 获取广告配置
|
|
func (s *WProject) FissionConfig(req *pb.FissionConfigReq, res *pb.FissionConfigRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetProjectHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
if project == nil {
|
|
return
|
|
}
|
|
|
|
conf, err := provider.NewFissionConfig(s.ctx, project)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
*res = pb.FissionConfigRes{
|
|
PushVisit: int32(conf.Config().PushVisit),
|
|
PushCampaignTask: int32(conf.Config().PushCampaignTask),
|
|
}
|
|
return
|
|
}
|
|
|
|
// SetPushVisit 设置活动访问推送开关
|
|
func (s *WProject) SetPushVisit(req *pb.SetPushVisitReq, res *pb.SetPushVisitRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetProjectHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
conf, err := provider.NewFissionConfig(s.ctx, project)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = conf.SetPushVisit(req.GetPushVisit())
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
*res = pb.SetPushVisitRes{}
|
|
return
|
|
}
|
|
|
|
// SetPushCampaignTask 设置活动任务完成推送开关
|
|
func (s *WProject) SetPushCampaignTask(req *pb.SetPushCampaignTaskReq, res *pb.SetPushCampaignTaskRes) (err error) {
|
|
defer s.checkErr()
|
|
project, err := finder.Project(s.ctx, req.GetProjectHashId())
|
|
if err != nil {
|
|
return s.BE().CacheError(err)
|
|
}
|
|
|
|
conf, err := provider.NewFissionConfig(s.ctx, project)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = conf.SetPushCampaignTask(req.GetPushCampaignTask())
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
*res = pb.SetPushCampaignTaskRes{}
|
|
return
|
|
}
|