finclip-app-manager/domain/service/qr_code_info.go

276 lines
8.4 KiB
Go

package service
import (
"context"
"encoding/base64"
"errors"
"finclip-app-manager/domain/entity"
"finclip-app-manager/domain/entity/proto"
"finclip-app-manager/domain/entity/proto/apiproto"
"finclip-app-manager/domain/repository"
"finclip-app-manager/infrastructure/config"
impl "finclip-app-manager/infrastructure/db/repo"
"finclip-app-manager/infrastructure/utils"
"fmt"
)
const (
qrcodePrefix = "-f-"
qrcodeSuffix = "--"
)
type QrCodeInfoService struct {
qrcodeRepo repository.IQrCodeInfoRepo
buildInfoRepo repository.IAppBuildInfoRepo
}
func NewQrCodeInfoService() *QrCodeInfoService {
return &QrCodeInfoService{
qrcodeRepo: impl.InitQrCodeInfoRepo(),
buildInfoRepo: impl.InitBuildInfoRepo(),
}
}
func (q *QrCodeInfoService) GenQrcodeInfo(ctx context.Context, req proto.GenQrcodeReq) (*entity.QrCodeInfo, error) {
var (
info *entity.QrCodeInfo
err error
)
//首先查看是否已经存在uuid
switch req.Type {
case entity.QrCodeTypeReview:
info, err = q.qrcodeRepo.GetReviewInfo(ctx, req.AppId, req.Sequence)
case entity.QrCodeTypeRelease:
info, err = q.qrcodeRepo.GetReleaseInfo(ctx, req.AppId)
case entity.QrCodeTypeTrial:
info, err = q.qrcodeRepo.GetTrialInfo(ctx, req.AppId)
case entity.QrCodeTypeTemporary:
info, err = q.qrcodeRepo.GetTemporaryInfo(ctx, req.AppId, req.Sequence)
case entity.QrCodeTypeRomoteDebug:
info, err = q.qrcodeRepo.GetRemoteDebugInfo(ctx, req.AppId, req.Sequence)
default:
return nil, errors.New("type err")
}
if err != nil {
if !q.qrcodeRepo.NotFound(err) {
return nil, err
}
//不存在则进行插入
info, err = q.insertQrcodeInfo(ctx, req)
if err != nil {
log.Errorf("insertQrcodeInfo err:%s", err.Error())
return nil, err
}
return info, nil
}
//ide 临时小程序更新二维码时需更新过期时间
if info.Type == entity.QrCodeTypeTemporary || info.Type == entity.QrCodeTypeRomoteDebug || info.Type == entity.QrCodeTypeReview {
expTime := int64(0)
if info.Type == entity.QrCodeTypeReview {
expTime = utils.GetNowMs() + int64(config.GetConfig().ReviewQRcodeExpireTime*1e3)
} else {
expTime = utils.GetNowMs() + int64(config.GetConfig().QRcodeExpireTime*1e3)
}
err = q.qrcodeRepo.UpdateInfo(ctx, info.Uuid, map[string]interface{}{"expire_time": expTime})
if err != nil {
return nil, err
}
info.ExpireTime = expTime
if req.Type == entity.QrCodeTypeTemporary {
path := req.StartParams.Path
query := req.StartParams.Query
appStartParams := entity.AppStartParams{}
if len(query) > 0 {
appStartParams.PathAndQuery = path + "?" + query
} else {
appStartParams.PathAndQuery = path
}
err = q.qrcodeRepo.UpdateStartParamsByUuid(ctx, info.Uuid, appStartParams)
if err != nil {
return nil, err
}
}
}
if req.ApiServer != info.ApiServer {
err = q.qrcodeRepo.UpdateApiServer(ctx, info.Uuid, req.ApiServer)
if err != nil {
log.Errorf("GenQrcodeInfo UpdateApiServer err:%s", err.Error())
return nil, err
}
info.ApiServer = req.ApiServer
}
return info, nil
}
func (q *QrCodeInfoService) insertQrcodeInfo(ctx context.Context, req proto.GenQrcodeReq) (*entity.QrCodeInfo, error) {
//首先查看是否已经存在uuid
var (
qrCodeInfo *entity.QrCodeInfo
nowMs = utils.GetNowMs()
)
path := req.StartParams.Path
query := req.StartParams.Query
appStartParams := entity.AppStartParams{}
if len(query) > 0 {
appStartParams.PathAndQuery = path + "?" + query
} else {
appStartParams.PathAndQuery = path
}
switch req.Type {
case entity.QrCodeTypeReview:
//生成该版本的二维码信息
qrCodeInfo = &entity.QrCodeInfo{
Type: entity.QrCodeTypeReview,
Uuid: GenReviewQrCodeUuid(req.AppId, req.Sequence),
AppId: req.AppId,
Sequence: req.Sequence,
ApiServer: req.ApiServer,
CodeId: req.CodeId,
StartParams: appStartParams,
CreateTime: nowMs,
DebugInfo: req.DebugInfo,
ExpireTime: nowMs + int64(config.GetConfig().ReviewQRcodeExpireTime*1e3),
}
case entity.QrCodeTypeRelease:
qrCodeInfo = &entity.QrCodeInfo{
Type: entity.QrCodeTypeRelease,
Uuid: GenReleaseQrCodeUuid(req.AppId),
AppId: req.AppId,
Sequence: req.Sequence,
ApiServer: req.ApiServer,
StartParams: appStartParams,
ExpireTime: 0,
CreateTime: nowMs,
DebugInfo: req.DebugInfo,
}
case entity.QrCodeTypeTrial:
qrCodeInfo = &entity.QrCodeInfo{
Type: entity.QrCodeTypeTrial,
Uuid: GenTrialQrCodeUuid(req.AppId),
AppId: req.AppId,
Sequence: 0,
ApiServer: req.ApiServer,
CodeId: req.CodeId,
//todo ccc
StartParams: appStartParams,
CreateTime: nowMs,
DebugInfo: req.DebugInfo,
}
case entity.QrCodeTypeTemporary:
qrCodeInfo = &entity.QrCodeInfo{
Type: entity.QrCodeTypeTemporary,
Uuid: GenTemporaryQrCodeUuid(req.AppId, entity.AppTempDefSequence),
AppId: req.AppId,
Sequence: entity.AppTempDefSequence,
ApiServer: req.ApiServer,
CodeId: "",
StartParams: appStartParams,
ExpireTime: nowMs + int64(config.GetConfig().QRcodeExpireTime*1e3),
CreateTime: nowMs,
DebugInfo: req.DebugInfo,
}
case entity.QrCodeTypeRomoteDebug:
qrCodeInfo = &entity.QrCodeInfo{
Type: entity.QrCodeTypeRomoteDebug,
Uuid: GenRemoteDebugQrCodeUuid(req.AppId, entity.AppTempDefSequence),
AppId: req.AppId,
Sequence: entity.AppTempDefSequence,
ApiServer: req.ApiServer,
CodeId: "",
StartParams: appStartParams,
ExpireTime: nowMs + int64(config.GetConfig().QRcodeExpireTime*1e3),
CreateTime: nowMs,
DebugInfo: req.DebugInfo,
}
default:
return nil, errors.New("type err")
}
return qrCodeInfo, q.qrcodeRepo.Insert(ctx, qrCodeInfo)
}
func (q *QrCodeInfoService) DeleteWechatQrcode(ctx context.Context, req apiproto.DeleteWechatInfoReq) error {
//wechatT := db.NewTable(db.TableWechatInfo)
//params := map[string]interface{}{"qrcodeUrl": "", "qrcodeDownloadUrl": "", "updated": time.Now().UnixNano() / 1e6}
//wechatT.UpdateOne(ctx, bson.M{"appId": req.AppId}, bson.M{"$set": params})
//s.ResetWechatHint(ctx, req.AppId)
err := hCaller.DeleteWechatQrcode(ctx, req)
if err != nil {
return err
}
return nil
}
func (q *QrCodeInfoService) GetQrcodeInfo(ctx context.Context, uuid string) (*entity.QrCodeInfo, error) {
repo := impl.InitQrCodeInfoRepo()
info, err := repo.GetInfoByUuid(ctx, uuid)
if err != nil {
if repo.NotFound(err) {
return nil, entity.NotFoundErr
}
return nil, err
}
return info, nil
}
func (q *QrCodeInfoService) UpdateTrialStartParams(ctx context.Context, codeId string, params entity.AppStartParams) error {
_, err := q.qrcodeRepo.GetInfoByCodeId(ctx, codeId)
if err != nil {
if !repository.NotFound(err) {
return err
}
buildInfo, err := q.buildInfoRepo.GetInfoById(ctx, codeId)
if err != nil {
return err
}
newQrcodeInfo := &entity.QrCodeInfo{
Type: entity.QrCodeTypeTrial,
Uuid: GenTrialQrCodeUuid(buildInfo.AppID),
AppId: buildInfo.AppID,
Sequence: 0,
ApiServer: config.Cfg.ApiServer,
CodeId: codeId,
//todo ccc
StartParams: params,
CreateTime: utils.GetNowMs(),
}
err = q.qrcodeRepo.Insert(ctx, newQrcodeInfo)
if err != nil {
return err
}
}
return q.qrcodeRepo.UpdateTrialStartParams(ctx, codeId, params)
}
func GenReviewQrCodeUuid(appId string, seq int) string {
s := utils.Gen16Md5(fmt.Sprintf("type=%s&appId=%s&sequence=%d", entity.QrCodeTypeReview, appId, seq))
return UuidJoinFix(base64.RawURLEncoding.EncodeToString([]byte(s)))
}
func GenReleaseQrCodeUuid(appId string) string {
s := utils.Gen16Md5(fmt.Sprintf("type=%s&appId=%s", entity.QrCodeTypeRelease, appId))
return UuidJoinFix(base64.RawURLEncoding.EncodeToString([]byte(s)))
}
func GenTrialQrCodeUuid(appId string) string {
s := utils.Gen16Md5(fmt.Sprintf("type=%s&appId=%s", entity.QrCodeTypeTrial, appId))
return UuidJoinFix(base64.RawURLEncoding.EncodeToString([]byte(s)))
}
func GenTemporaryQrCodeUuid(appId string, seq int) string {
s := utils.Gen16Md5(fmt.Sprintf("type=%s&appId=%s&sequence=%d", entity.QrCodeTypeTemporary, appId, seq))
return UuidJoinFix(base64.RawURLEncoding.EncodeToString([]byte(s)))
}
func GenRemoteDebugQrCodeUuid(appId string, seq int) string {
s := utils.Gen16Md5(fmt.Sprintf("type=%s&appId=%s&sequence=%d", entity.QrCodeTypeRomoteDebug, appId, seq))
return UuidJoinFix(base64.RawURLEncoding.EncodeToString([]byte(s)))
}
func UuidJoinFix(id string) string {
return qrcodePrefix + id + qrcodeSuffix
}