finclip-app-manager/infrastructure/db/repo/mysql/app.go

1695 lines
55 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package mysql
import (
"context"
"encoding/json"
"finclip-app-manager/domain/entity"
"finclip-app-manager/domain/entity/proto/apiproto"
"finclip-app-manager/infrastructure/db/entity/sql"
"finclip-app-manager/infrastructure/utils"
"strings"
"time"
"gorm.io/gorm"
)
type AppRepo struct {
}
func NewAppRepo() *AppRepo {
return &AppRepo{}
}
func (ar *AppRepo) AppCount(ctx context.Context, organId string) (int, error) {
var (
total int64
err error
)
if organId != "" {
err = DB.Model(&sql.App{}).Where("organ_id=? and is_forbidden=?", organId, 0).Count(&total).Error
} else {
err = DB.Model(&sql.App{}).Where("is_forbidden=?", 0).Count(&total).Error
}
return int(total), err
}
func (ar *AppRepo) InsertApp(ctx context.Context, info entity.App) error {
sqlInfo := tr.CovertAppToSql(&info)
sqlInfoV2 := tr.CovertAppToAppV2(sqlInfo)
err := DB.WithContext(ctx).Model(&sql.AppV2{}).Create(sqlInfoV2).Error
if err != nil {
return err
}
return DB.WithContext(ctx).Model(&sql.AppStatusInfo{}).Create(&sqlInfo.StatusInfo).Error
}
func (ar *AppRepo) GetAppInfo(ctx context.Context, appId string) (entity.App, error) {
info := sql.App{}
err := DB.WithContext(ctx).
//Joins("StatusInfo").
Where("apps.app_id=?", appId).
First(&info).Error
if err != nil {
return entity.App{}, err
}
statusInfo, _ := ar.GetAppStatusInfo(ctx, appId)
info.StatusInfo = statusInfo
return *tr.CovertAppToEntity(&info), nil
}
func (ar *AppRepo) UpdateApp(ctx context.Context, info entity.App) error {
sqlInfo := tr.CovertAppToSql(&info)
data := make(map[string]interface{})
data["app_class"] = sqlInfo.AppClass
data["app_tag"] = sqlInfo.AppTag
data["app_type"] = sqlInfo.AppType
data["name"] = sqlInfo.Name
data["logo"] = sqlInfo.Logo
data["desc"] = sqlInfo.Desc
data["detail_desc"] = sqlInfo.DetailDesc
data["class"] = sqlInfo.Class
data["created_by"] = sqlInfo.CreatedBy
data["developer_id"] = sqlInfo.DeveloperId
data["group_id"] = sqlInfo.GroupId
data["is_rollback"] = sqlInfo.IsRollback
data["ext"] = sqlInfo.Ext
data["is_forbidden"] = sqlInfo.IsForbidden
data["privacy_setting_type"] = sqlInfo.PrivacySettingType
data["expire"] = sqlInfo.Expire
data["create_time"] = sqlInfo.CreateTime
data["update_time"] = sqlInfo.UpdateTime
return DB.Model(&sql.App{}).Where("app_id=?", info.AppID).Updates(data).Error
}
func (ar *AppRepo) GetAppStatusInfo(ctx context.Context, appId string) (sql.AppStatusInfo, error) {
tmpQuery := "app_id = ?"
tmpArgs := []interface{}{appId}
var appStatusInfo sql.AppStatusInfo
err := DB.Model(&sql.AppStatusInfo{}).Where(tmpQuery, tmpArgs...).First(&appStatusInfo).Error
return appStatusInfo, err
}
func (ar *AppRepo) GetAppBuildInfoAndAppVersionStatusInfo(ctx context.Context, buildInfoId string, appId string, sequence int) (sql.AppBuildInfo, sql.AppVersionStatusInfo, error) {
tmpQuery := "trace_id = ? or build_info_id = ?"
tmpArgs := []interface{}{buildInfoId, buildInfoId}
var appBuildInfo sql.AppBuildInfo
err := DB.Model(&sql.AppBuildInfo{}).Where(tmpQuery, tmpArgs...).First(&appBuildInfo).Error
tmpQuery = "app_id = ? AND sequence = ?"
tmpArgs = []interface{}{appId, sequence}
var appVersionStatusInfo sql.AppVersionStatusInfo
err = DB.Model(&sql.AppVersionStatusInfo{}).Where(tmpQuery, tmpArgs...).First(&appVersionStatusInfo).Error
return appBuildInfo, appVersionStatusInfo, err
}
func (ar *AppRepo) GetAppBuildInfoAndAppVersionStatusInfoV2(ctx context.Context, appId, appVer string, sequence int) (sql.AppBuildInfo, sql.AppVersionStatusInfo, error) {
tmpQuery := "app_id = ? and version = ? and buildStatus = ?"
tmpArgs := []interface{}{appId, appVer, "success"}
var appBuildInfo sql.AppBuildInfo
var appVersionStatusInfo sql.AppVersionStatusInfo
var buildInfo sql.BuildInfo
err := DB.Model(&sql.BuildInfo{}).Where(tmpQuery, tmpArgs...).
Order("create_time DESC").
First(&buildInfo).Error
if err != nil {
return appBuildInfo, appVersionStatusInfo, err
}
tmpQuery = "app_id = ? AND sequence = ?"
tmpArgs = []interface{}{appId, sequence}
err = DB.Model(&sql.AppVersionStatusInfo{}).Where(tmpQuery, tmpArgs...).First(&appVersionStatusInfo).Error
appBuildInfo.AppId = appId
appBuildInfo.UserId = buildInfo.UserId
appBuildInfo.CreatedBy = buildInfo.Username
appBuildInfo.Status = true
appBuildInfo.Version = appVer
appBuildInfo.VersionDescription = buildInfo.VersionRemark
appBuildInfo.Name = "app.zip"
appBuildInfo.Url = buildInfo.FileUrl
appBuildInfo.EncryptedUrl = buildInfo.EncryptedUrl
appBuildInfo.Packages = buildInfo.Packages
appBuildInfo.EncryptPackages = buildInfo.EncryptPackage
appBuildInfo.CreateTime = buildInfo.CreateTime
appBuildInfo.UpdateTime = buildInfo.UpdateTime
return appBuildInfo, appVersionStatusInfo, err
}
func (ar *AppRepo) GetAppVerInfo(ctx context.Context, appId string, seq int) (entity.AppVersion, error) {
sqlInfo := sql.AppVersion{}
err := DB.WithContext(ctx).
Where("app_versions.app_id=? AND app_versions.sequence=?", appId, seq).
//Joins("StatusInfo").
//Joins("BuildInfo").
Find(&sqlInfo).Error
if sqlInfo.AppId == "" {
err = gorm.ErrRecordNotFound
}
if sqlInfo.BuildInfoId != "" {
appBuildInfo, appVersionStatusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
sqlInfo.StatusInfo = appVersionStatusInfo
} else {
appBuildInfo, appVersionStatusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfoV2(ctx, sqlInfo.AppId, sqlInfo.Version, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
sqlInfo.StatusInfo = appVersionStatusInfo
}
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
func (ar *AppRepo) GetOnlineAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
sqlInfo := sql.AppVersion{}
/*err := DB.WithContext(ctx).
Joins("StatusInfo").
Joins("BuildInfo").
Where("StatusInfo.app_id=? AND StatusInfo.status_value=?", appId, entity.StPublished).
First(&sqlInfo).Error*/
statusInfo := sql.AppVersionStatusInfo{}
err := DB.WithContext(ctx).
Where("app_version_status_infos.app_id=? AND app_version_status_infos.status_value=?", appId, entity.StPublished).
First(&statusInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
err = DB.WithContext(ctx).
Where("app_versions.app_id=? AND app_versions.sequence=?", appId, statusInfo.Sequence).
First(&sqlInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
sqlInfo.StatusInfo = statusInfo
if sqlInfo.BuildInfoId != "" {
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
} else {
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfoV2(ctx, sqlInfo.AppId, sqlInfo.Version, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
}
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
func (ar *AppRepo) GetLatestPubAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
sqlInfo := sql.AppVersion{}
/*err := DB.WithContext(ctx).
Joins("StatusInfo").
Joins("BuildInfo").
Where("StatusInfo.app_id=? AND StatusInfo.published_update_time<>0", appId).
Order("StatusInfo.published_update_time DESC").
First(&sqlInfo).Error*/
statusInfo := sql.AppVersionStatusInfo{}
err := DB.WithContext(ctx).
Where("app_version_status_infos.app_id=? AND app_version_status_infos.published_update_time<>0", appId).
Order("app_version_status_infos.published_update_time DESC").
First(&statusInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
err = DB.WithContext(ctx).
Where("app_versions.app_id=? AND app_versions.sequence=?", appId, statusInfo.Sequence).
First(&sqlInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
sqlInfo.StatusInfo = statusInfo
if sqlInfo.BuildInfoId != "" {
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
} else {
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfoV2(ctx, sqlInfo.AppId, sqlInfo.Version, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
}
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
func (ar *AppRepo) UpdateAppVerAppName(ctx context.Context, appId, appName string) error {
data := make(map[string]interface{})
data["name"] = appName
return DB.Model(&sql.AppVersionV2{}).Where("app_id=?", appId).Updates(data).Error
}
func (ar *AppRepo) GetNowPubAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
sqlInfo := sql.AppVersion{}
/*err := DB.WithContext(ctx).
Joins("StatusInfo").
Joins("BuildInfo").
Where("StatusInfo.app_id=? AND StatusInfo.status_value=?", appId, entity.StPublished).
Order("sequence DESC").
First(&sqlInfo).Error*/
statusInfo := sql.AppVersionStatusInfo{}
err := DB.WithContext(ctx).
Where("app_version_status_infos.app_id=? AND app_version_status_infos.status_value=?", appId, entity.StPublished).
Order("app_version_status_infos.sequence DESC").
First(&statusInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
err = DB.WithContext(ctx).
Where("app_versions.app_id=? AND app_versions.sequence=?", appId, statusInfo.Sequence).
First(&sqlInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
sqlInfo.StatusInfo = statusInfo
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
func (ar *AppRepo) GetLatestReviewAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
sqlInfo := sql.AppVersion{}
/*err := DB.WithContext(ctx).
Joins("StatusInfo").
Joins("BuildInfo").
Where("app_versions.app_id=? AND StatusInfo.publishing_update_time <> 0", appId).
Order("app_versions.sequence DESC").
First(&sqlInfo).Error*/
statusInfo := sql.AppVersionStatusInfo{}
err := DB.WithContext(ctx).
Where("app_version_status_infos.app_id=? AND app_version_status_infos.publishing_update_time <> 0", appId).
Order("app_version_status_infos.publishing_update_time DESC").
First(&statusInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
err = DB.WithContext(ctx).
Where("app_versions.app_id=?", appId).
Order("app_versions.sequence DESC").
First(&sqlInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
sqlInfo.StatusInfo = statusInfo
if sqlInfo.BuildInfoId != "" {
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
} else {
appBuildInfo, _, _ := ar.GetAppBuildInfoAndAppVersionStatusInfoV2(ctx, sqlInfo.AppId, sqlInfo.Version, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
}
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
func (ar *AppRepo) GetAllPermitGrayPubVers(ctx context.Context, appId string, maxSeq int) ([]entity.AppVersion, error) {
statusList := make([]sql.AppVersionStatusInfo, 0)
/*err := DB.WithContext(ctx).
Joins("StatusInfo").
Where("StatusInfo.app_id=? AND StatusInfo.status_value=? AND StatusInfo.sequence>?", appId, entity.StPublishApproved, maxSeq).
Find(&list).Error*/
err := DB.WithContext(ctx).
Where("app_version_status_infos.app_id=? AND app_version_status_infos.status_value=? AND app_version_status_infos.sequence>?", appId, entity.StPublishApproved, maxSeq).
Find(&statusList).Error
if err != nil {
return nil, err
}
result := make([]entity.AppVersion, 0)
for _, v := range statusList {
sqlInfo := sql.AppVersion{}
err = DB.WithContext(ctx).
Where("app_versions.app_id=? AND app_versions.sequence=?", appId, v.Sequence).
First(&sqlInfo).Error
if err == nil {
result = append(result, *tr.CovertAppVerToEntity(&sqlInfo))
}
}
return result, nil
}
func (ar *AppRepo) GetMaxSeqAppVer(ctx context.Context, appId string) (entity.AppVersion, error) {
sqlInfo := sql.AppVersion{}
err := DB.WithContext(ctx).
//Joins("StatusInfo").
//Joins("BuildInfo").
Where("app_versions.app_id=?", appId).
Order("sequence DESC").
First(&sqlInfo).Error
if err != nil {
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
sqlInfo.StatusInfo = statusInfo
return *tr.CovertAppVerToEntity(&sqlInfo), err
}
func (ar *AppRepo) SubmitApp(ctx context.Context, req entity.SubmitAppReq, expire int64, userId string) error {
nowMaxSeq := 0
maxAppVerInfo, err := ar.GetMaxSeqAppVer(ctx, req.AppId)
if err == nil {
nowMaxSeq = maxAppVerInfo.Sequence
} else {
if !DbNotFound(err) {
return err
}
}
buildInfo, err := NewAppBuildInfoMysqlRepo().GetInfoById(ctx, req.BuildId)
if DbNotFound(err) {
buildInfo, err = NewAppBuildInfoMysqlRepo().GetInfoByBuildId(ctx, req.BuildId)
if err != nil {
return err
}
}
appInfo, err := ar.GetAppInfo(ctx, req.AppId)
if err != nil {
return err
}
now := utils.GetNowMs()
appVerInfo := sql.AppVersion{
AppId: appInfo.AppID,
Sequence: nowMaxSeq + 1,
Name: appInfo.Name,
Logo: appInfo.Logo,
Version: buildInfo.Version,
Desc: appInfo.CoreDescription,
DetailDesc: appInfo.CustomData.DetailDescription,
Class: appInfo.AppClass,
Tag: strings.Join(appInfo.AppTag, ","),
AppType: appInfo.AppType,
DeveloperId: userId,
GroupId: appInfo.GroupID,
AutoPub: req.NeedAutoPub,
InGrayRelease: false,
BuildInfoId: req.BuildId,
StatusInfo: sql.AppVersionStatusInfo{
AppId: appInfo.AppID,
Sequence: nowMaxSeq + 1,
StatusValue: entity.StPublishing,
StatusReason: "",
StatusUpdateTime: now,
StatusUpdater: req.Account,
PublishingReason: "",
PublishingUpdateTime: now,
PublishingUpdater: req.Account,
PublishedReason: "",
PublishedUpdateTime: 0,
PublishedUpdater: "",
UnpublishedReason: "",
UnpublishedUpdateTime: 0,
UnpublishedUpdater: "",
UnpublishedType: "",
ApprovalReason: "",
ApprovalUpdateTime: 0,
ApprovalUpdater: "",
ActionReason: "",
ActionUpdater: req.Account,
ActionUpdateTime: now,
PublishingApprovalReason: "",
PublishingApprovalUpdateTime: 0,
PublishingApprovalUpdater: "",
CreateTime: now,
},
CreatedBy: req.Account,
IsRollback: false,
ExpireTime: expire,
CreateTime: now,
TestInfo: "",
}
testInfoByte, _ := json.Marshal(req.TestInfo)
appVerInfo.TestInfo = string(testInfoByte)
appVerInfoV2 := tr.CovertAppVerToAppVerV2(&appVerInfo)
err = DB.WithContext(ctx).Model(&sql.AppVersionV2{}).Create(appVerInfoV2).Error
if err != nil {
return err
}
return DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).Create(&appVerInfo.StatusInfo).Error
}
func (ar *AppRepo) WithdrawPubApp(ctx context.Context, appId string, seq int, account string) error {
now := utils.GetNowMs()
params := map[string]interface{}{
"status_value": entity.StPublishWithdrawed,
"status_update_time": now,
"status_updater": account,
}
return DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).Where("app_id=? AND sequence=?", appId, seq).Updates(params).Error
}
/*
//结束所有低版本的灰度
err := appVerTable.UpdateAll(ctx, bson.M{"appId": appId, "sequence": bson.M{"$lte": seq}}, bson.M{"$set": bson.M{"inGrayRelease": false}})
if err != nil {
return err
}
now := time.Now().UnixNano() / 1e6
//下架之前上架的小程序版本
oldAppVer, err := ar.GetNowPubAppVer(ctx, appId)
if err != nil && !NotFound(err) {
return err
}
if !NotFound(err) {
unpublishedStatus := mongo.UnpublishedStatus{
LastUpdated: now,
ModifiedBy: account,
Type: entity.TypeUnpublishedDueToNewSeq, // Mark the type.
}
//if !isDev {
// unpublishedStatus.Type = entity.TypeUnpublishedByAdmin
//}
unPubUpInfo := map[string]interface{}{
"unpublishedStatus": unpublishedStatus,
"status": mongo.Status{
Value: entity.StUnpublished,
LastUpdated: now,
ModifiedBy: account,
},
}
err = appVerTable.UpdateOne(ctx, bson.M{"appId": oldAppVer.AppID, "sequence": oldAppVer.Sequence}, bson.M{"$set": unPubUpInfo})
if err != nil {
return err
}
}
//上架当前小程序版本
upInfo := make(map[string]interface{})
upInfo["status"] = mongo.Status{
Value: entity.StPublished,
Reason: "",
LastUpdated: now,
ModifiedBy: account,
}
upInfo["publishedStatus"] = mongo.SpecificStatus{
Reason: "",
LastUpdated: now,
ModifiedBy: account,
}
upInfo["actionStatus"] = mongo.SpecificStatus{
LastUpdated: now,
ModifiedBy: account,
}
//修改小程序元数据信息
err = appTable.UpdateOne(ctx, bson.M{"appId": appId}, bson.M{"$set": upInfo})
if err != nil {
return err
}
upInfo["isRollback"] = isRollback
err = appVerTable.UpdateOne(ctx, bson.M{"appId": appId, "sequence": seq}, bson.M{"$set": upInfo})
if err != nil {
return err
}
return nil
*/
func (ar *AppRepo) PubApp(ctx context.Context, appId string, seq int, account string, isDev, isRollback bool) error {
now := utils.GetNowMs()
oldAppVer, oldPubAppErr := ar.GetNowPubAppVer(ctx, appId)
if oldPubAppErr != nil && !DbNotFound(oldPubAppErr) {
return oldPubAppErr
}
return DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
var err error
//下架之前上架的小程序版本
if !DbNotFound(oldPubAppErr) {
updateInfos := map[string]interface{}{
"unpublished_update_time": now,
"unpublished_updater": account,
"unpublished_type": entity.TypeUnpublishedDueToNewSeq,
"status_value": entity.StUnpublished,
"status_update_time": now,
"status_updater": account,
}
//if !isDev {
// updateInfos["unpublished_type"] = entity.TypeUnpublishedByAdmin
//}
err = tx.WithContext(ctx).
Model(&sql.AppVersionStatusInfo{}).
Where("app_id=? AND sequence=?", oldAppVer.AppID, oldAppVer.Sequence).
Updates(updateInfos).Error
if err != nil {
return err
}
}
//结束所有低版本的灰度
err = tx.WithContext(ctx).
Model(&sql.AppVersion{}).
Where("app_id=? AND sequence<=?", appId, seq).
Update("in_gray_release", false).Error
if err != nil {
return err
}
//上架当前小程序版本
upInfo := map[string]interface{}{
"status_value": entity.StPublished,
"status_update_time": now,
"status_updater": account,
"published_reason": "",
"published_update_time": now,
"published_updater": account,
"action_update_time": now,
"action_updater": account,
}
err = tx.WithContext(ctx).
Model(&sql.AppStatusInfo{}).
Where("app_id=?", appId).
Updates(upInfo).Error
if err != nil {
return err
}
err = tx.WithContext(ctx).
Model(&sql.AppVersionStatusInfo{}).
Where("app_id=? AND sequence=?", appId, seq).
Updates(upInfo).Error
if err != nil {
return err
}
if isRollback {
err = tx.WithContext(ctx).
Model(&sql.AppVersionV2{}).
Where("app_id=? AND sequence=?", appId, seq).
Update("is_rollback", isRollback).Error
if err != nil {
return err
}
}
return nil
})
}
func (ar *AppRepo) ListApps(ctx context.Context, groupId string, pageNo, pageSize int, searchText string, sortType, pullType string) (int, []entity.App, error) {
var (
list []sql.App
sort string
query string
total int64
queryList []interface{}
err error
)
switch sortType {
case "created":
sort = "apps.create_time"
case "-created":
sort = "apps.create_time DESC"
case "updated":
sort = "app_status_infos.status_update_time"
case "-updated":
sort = "app_status_infos.status_update_time DESC"
default:
sort = "app_status_infos.status_update_time DESC"
}
if groupId != "" {
query = genQuery(query, "AND", "apps.group_id=? ")
queryList = append(queryList, groupId)
}
switch pullType {
case "published":
//已上架
query = genQuery(query, "AND", "app_status_infos.status_value=? ")
queryList = append(queryList, entity.StPublished)
case "inDevelopment":
//未上架
query = genQuery(query, "AND", "app_status_infos.status_value=? ")
queryList = append(queryList, entity.StInDevelopment)
case "unPublished":
//已下架
query = genQuery(query, "AND", "app_status_infos.status_value=? ")
queryList = append(queryList, entity.StUnpublished)
}
if searchText != "" {
s := "%" + searchText + "%"
query = genQuery(query, "AND", "( apps.app_id LIKE ? OR apps.name LIKE ? )")
queryList = append(queryList, s, s)
}
if query != "" {
err = DB.WithContext(ctx).Debug().Model(&sql.App{}).
//Joins("StatusInfo").
Joins("left join app_status_infos on apps.app_id = app_status_infos.app_id").
Where(query, queryList...).
Order(sort).
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
} else {
if sortType == "updated" || sortType == "-updated" {
err = DB.WithContext(ctx).Debug().Model(&sql.App{}).
Joins("left join app_status_infos on apps.app_id = app_status_infos.app_id").
Order(sort).
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
} else {
err = DB.WithContext(ctx).Debug().Model(&sql.App{}).
//Joins("StatusInfo").
Order(sort).
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
}
}
if err != nil {
return 0, nil, err
}
if query != "" {
err = DB.WithContext(ctx).Model(&sql.App{}).
Joins("left join app_status_infos on apps.app_id = app_status_infos.app_id").
Where(query, queryList...).
Count(&total).Error
} else {
err = DB.WithContext(ctx).Model(&sql.App{}).
Count(&total).Error
}
if err != nil {
return 0, nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return int(total), result, err
}
func (ar *AppRepo) ListAppVers(ctx context.Context, pageNo, pageSize int, searchText string, t string, groupId string) (int, []entity.AppVersion, error) {
var (
list []sql.AppVersion
sort string
query string
total int64
queryList []interface{}
err error
)
sort = "app_version_status_infos.publishing_update_time DESC"
switch t {
case "pendingReview": //待审核
query += "app_version_status_infos.status_value IN (?) "
queryList = append(queryList, []string{entity.StPublishing, entity.StUnpublishing})
case "reviewed": //已审核
query += "app_version_status_infos.status_value NOT IN (?) "
queryList = append(queryList, []string{entity.StPublishing, entity.StPublishWithdrawed})
case "revoked": //已撤销
query += "app_version_status_infos.status_value IN (?)"
queryList = append(queryList, []string{entity.StPublishWithdrawed})
}
if searchText != "" {
query = genQuery(query, "AND", "(app_versions.name LIKE ? OR app_versions.app_id LIKE ? )")
//query += "(app_versions.name LIKE ? OR app_versions.app_id LIKE ?)"
queryList = append(queryList, "%"+searchText+"%", "%"+searchText+"%")
}
if groupId != "" {
query = genQuery(query, "AND", "app_versions.group_id = ?")
queryList = append(queryList, groupId)
}
if query != "" {
err = DB.Debug().Model(&sql.AppVersion{}).
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where(query, queryList...).
Order(sort).
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
} else {
err = DB.Debug().Model(&sql.AppVersion{}).
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Order(sort).
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
}
/*if query != "" {
err = DB.WithContext(ctx).
Model(&sql.AppVersion{}).
Order(sort).
Joins("StatusInfo").
Joins("BuildInfo").
Where(query, queryList...).
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
} else {
err = DB.WithContext(ctx).
Model(&sql.AppVersion{}).
Order(sort).
Joins("StatusInfo").
Joins("BuildInfo").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
}*/
if err != nil {
return 0, nil, err
}
if query != "" {
err = DB.WithContext(ctx).
Model(&sql.AppVersion{}).
//Joins("StatusInfo").
//Joins("BuildInfo").
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where(query, queryList...).
Count(&total).Error
} else {
err = DB.WithContext(ctx).
Model(&sql.AppVersion{}).
//Joins("StatusInfo").
//Joins("BuildInfo").
Count(&total).Error
}
result := make([]entity.AppVersion, 0)
for _, v := range list {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, v.BuildInfoId, v.AppId, v.Sequence)
v.BuildInfo = appBuildInfo
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return int(total), result, err
}
func (ar *AppRepo) UnpubApp(ctx context.Context, appId string, seq int, account, reason string, isDev bool) error {
var err error
unpublishedType := ""
if isDev {
unpublishedType = entity.TypeUnpublishedByDev
} else {
unpublishedType = entity.TypeUnpublishedByAdmin
}
now := time.Now().UnixNano() / 1e6
params := map[string]interface{}{
"status_value": entity.StUnpublished,
"status_updater": account,
"status_update_time": now,
"status_reason": reason,
"unpublished_updater": account,
"unpublished_update_time": now,
"unpublished_reason": reason,
"action_updater": account,
"action_update_time": now,
"action_reason": reason,
}
return DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
//更新app
err = tx.Model(&sql.AppStatusInfo{}).
Where("app_id=?", appId).
Updates(params).Error
if err != nil {
return err
}
//更新app_version
params["unpublished_type"] = unpublishedType
err = tx.Model(&sql.AppVersionStatusInfo{}).
Where("app_id=? AND sequence=?", appId, seq).Updates(params).Error
if err != nil {
return err
}
return nil
})
}
func (ar *AppRepo) ListAppVersByAppId(ctx context.Context, appId string, pageNo, pageSize int) (int, []entity.AppVersion, error) {
var (
list = make([]sql.AppVersion, 0)
total int64
err error
)
err = DB.WithContext(ctx).
//Joins("StatusInfo").
//Joins("BuildInfo").
Where("app_versions.app_id=?", appId).
Order("sequence DESC").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
if err != nil {
return 0, nil, err
}
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Where("app_id=?", appId).
Count(&total).Error
if err != nil {
return 0, nil, err
}
result := make([]entity.AppVersion, 0)
for _, v := range list {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, v.BuildInfoId, v.AppId, v.Sequence)
v.BuildInfo = appBuildInfo
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return int(total), result, err
}
func (ar *AppRepo) GetAppReviews(ctx context.Context, req apiproto.AdminGetAppReviewsReq) (int, []entity.AppVersion, error) {
return 0, nil, nil
}
func (ar *AppRepo) GetAllPublishedVerList(ctx context.Context, appId string) ([]entity.AppVersion, int, error) {
var (
//list = make([]sql.AppVersion, 0)
statusList = make([]sql.AppVersionStatusInfo, 0)
total int64
err error
)
/*err = DB.WithContext(ctx).
Joins("StatusInfo").
Joins("BuildInfo").
Where("app_versions.app_id=? AND StatusInfo.status_value=?", appId, entity.StPublished).
Order("sequence DESC").
Find(&list).Error*/
err = DB.WithContext(ctx).
Where("app_version_status_infos.app_id=? AND app_version_status_infos.status_value=?", appId, entity.StPublished).
Order("sequence DESC").
Find(&statusList).Error
if err != nil {
return nil, 0, err
}
result := make([]entity.AppVersion, 0)
for _, v := range statusList {
sqlInfo := sql.AppVersion{}
err = DB.WithContext(ctx).
Where("app_versions.app_id=? AND app_versions.sequence=?", appId, v.Sequence).
First(&sqlInfo).Error
if err == nil {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, sqlInfo.BuildInfoId, sqlInfo.AppId, sqlInfo.Sequence)
sqlInfo.BuildInfo = appBuildInfo
sqlInfo.StatusInfo = statusInfo
result = append(result, *tr.CovertAppVerToEntity(&sqlInfo))
}
}
return result, int(total), err
}
func (ar *AppRepo) GetPublishedAppList(ctx context.Context, pageNo, pageSize int, searchText string) ([]entity.AppVersion, int, error) {
var (
err error
total int64
list = make([]sql.AppVersion, 0)
)
if searchText != "" {
s := genLike(searchText)
/*err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("StatusInfo").
Joins("BuildInfo").
Where("StatusInfo.status_value=? AND app_versions.name LIKE ? OR app_versions.app_id LIKE ?", entity.StPublished, s, s).
Find(&list).Error*/
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where("app_version_status_infos.status_value=? AND (app_versions.name LIKE ? OR app_versions.app_id LIKE ?)", entity.StPublished, s, s).
Order("app_versions.create_time desc").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
} else {
/*err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("StatusInfo").
Joins("BuildInfo").
Where("StatusInfo.status_value=?", entity.StPublished).
Find(&list).Error*/
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where("app_version_status_infos.status_value=?", entity.StPublished).
Order("app_versions.create_time desc").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
}
if err != nil {
return nil, 0, err
}
if searchText != "" {
s := genLike(searchText)
/*err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("StatusInfo").
Where("StatusInfo.status_value=? AND app_versions.name LIKE ? OR app_versions.app_id LIKE ?", entity.StPublished, s, s).
Count(&total).Error*/
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where("app_version_status_infos.status_value=? AND app_versions.name LIKE ? OR app_versions.app_id LIKE ?", entity.StPublished, s, s).
Count(&total).Error
} else {
/*err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("StatusInfo").
Where("StatusInfo.status_value=?", entity.StPublished).
Count(&total).Error*/
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where("app_version_status_infos.status_value=?", entity.StPublished).
Count(&total).Error
}
if err != nil {
return nil, 0, err
}
result := make([]entity.AppVersion, 0)
for _, v := range list {
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return result, int(total), nil
}
func (ar *AppRepo) GetAllVers(ctx context.Context, appId string) ([]entity.AppVersion, int, error) {
var (
list = make([]sql.AppVersion, 0)
total int64
err error
)
err = DB.WithContext(ctx).
//Joins("StatusInfo").
//Joins("BuildInfo").
Where("app_versions.app_id=?", appId).
Order("app_versions.sequence DESC").
Find(&list).Error
if err != nil {
return nil, 0, err
}
result := make([]entity.AppVersion, 0)
for _, v := range list {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, v.BuildInfoId, v.AppId, v.Sequence)
v.BuildInfo = appBuildInfo
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return result, int(total), err
}
func (ar *AppRepo) GetAppsByAppIds(ctx context.Context, appIds []string) ([]entity.App, error) {
list := make([]sql.App, 0)
err := DB.WithContext(ctx).
Model(&sql.App{}).
Where("apps.app_id IN (?)", appIds).
//Joins("StatusInfo").
Order("apps.create_time DESC").
Find(&list).Error
if err != nil {
return nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return result, nil
}
func (ar *AppRepo) GetAppsByGroupIds(ctx context.Context, groupIds []string) (int, []entity.App, error) {
list := make([]sql.App, 0)
var total int64
err := DB.WithContext(ctx).Model(&sql.App{}).
Where("group_id IN (?)", groupIds).
Count(&total).
Order("create_time DESC").
Find(&list).Error
if err != nil {
return 0, nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return int(total), result, nil
}
func (ar *AppRepo) GetAppsToBinding(ctx context.Context, bindingId string, pageNo, pageSize int, searchText string) (int, []entity.App, error) {
br := NewBindingByMysqlRepo()
bindingInfo, err := br.GetBindingByBindingId(ctx, bindingId)
if err != nil {
return 0, nil, err
}
//获取应用关联的小程序Id
assAppIdList := make([]string, 0)
for _, v := range bindingInfo.AppInfos {
assAppIdList = append(assAppIdList, v.AppID)
}
query := "apps.group_id=? "
queryList := []interface{}{bindingInfo.GroupID}
if len(assAppIdList) != 0 {
query = genQuery(query, "AND", "apps.app_id NOT IN (?) ")
queryList = append(queryList, assAppIdList)
}
if searchText != "" {
query = genQuery(query, "AND", "apps.name LIKE ?")
queryList = append(queryList, "%"+searchText+"%")
}
list := make([]sql.App, 0)
var total int64
err = DB.WithContext(ctx).
Model(&sql.App{}).
Where(query, queryList...).
Count(&total).
Find(&list).Error
if err != nil {
return 0, nil, err
}
err = DB.WithContext(ctx).
Model(&sql.App{}).
//Joins("StatusInfo").
Where(query, queryList...).
Order("apps.create_time DESC").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
if err != nil {
return 0, nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return int(total), result, nil
}
func (ar *AppRepo) GetLinkAppsByBindingId(ctx context.Context, bindingId string, pageNo, pageSize int, searchText string) (int, []entity.App, error) {
br := NewBindingByMysqlRepo()
bindingInfo, err := br.GetBindingByBindingId(ctx, bindingId)
if err != nil {
return 0, nil, err
}
//获取应用关联的小程序Id
assAppIdList := make([]string, 0)
for _, v := range bindingInfo.AppInfos {
assAppIdList = append(assAppIdList, v.AppID)
}
list := make([]sql.App, 0)
var total int64
err = DB.WithContext(ctx).Model(&sql.App{}).
Where("group_id=? AND app_id IN (?)", bindingInfo.GroupID, assAppIdList).
Count(&total).
Order("create_time DESC").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
if err != nil {
return 0, nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return int(total), result, nil
}
func (ar *AppRepo) GetLinkAppsBySDKKey(ctx context.Context, sdkKey string, pageNo, pageSize int) (int, []entity.App, error) {
br := NewBindingByMysqlRepo()
//bindingInfo, err := br.GetBindingByBindingId(ctx, bindingId)
bindingInfos, err := br.GetBindListBySdkKey(ctx, sdkKey)
if err != nil {
return 0, nil, err
}
//获取应用关联的小程序Id
assAppIdList := make([]string, 0)
for _, v := range bindingInfos {
for _, y := range v.AppInfos {
assAppIdList = append(assAppIdList, y.AppID)
}
}
list := make([]sql.App, 0)
var total int64
err = DB.WithContext(ctx).Model(&sql.App{}).
Joins("left join app_status_infos on apps.app_id = app_status_infos.app_id").
Where("app_status_infos.status_value=? and apps.app_id IN (?)", entity.StPublished, assAppIdList).
Count(&total).
Order("create_time DESC").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
if err != nil {
return 0, nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return int(total), result, nil
}
func (ar *AppRepo) AdminGetLinkApps(ctx context.Context, pageNo, pageSize int, searchText string) (int, []entity.AdminGetLinkAppsRspItem, error) {
type temp struct {
AppId string `gorm:"column:app_id"`
AppName string `gorm:"column:app_name"`
AssTime int64 `gorm:"column:ass_time"`
BindingId string `gorm:"column:binding_id"`
GroupName string `gorm:"column:group_name"`
BindingName string `gorm:"column:binding_name"`
}
var (
err error
list = make([]temp, 0)
total int64
)
// 和mongo保持一致mongo 0 代表的第一页客户端的pageNo也是从0开始的
pageNo = pageNo + 1
if searchText != "" {
s := genLike(searchText)
err = DB.WithContext(ctx).
Table("link_app_infos l").
Joins("JOIN apps a ON l.app_id=a.app_id").
Joins("JOIN binding b ON l.binding_id=b.binding_id").
Joins("JOIN app_status_infos c ON l.app_id=c.app_id").
Where("c.status_value =? and (a.name LIKE ? OR b.name LIKE ? OR b.group_name LIKE ? )", entity.StPublished, s, s, s).
Select("l.app_id AS app_id,a.name AS app_name,l.associated_at AS ass_time," +
"l.binding_id AS binding_id,b.group_name AS group_name,b.name AS binding_name").
Order("l.associated_at DESC").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
} else {
err = DB.WithContext(ctx).
Table("link_app_infos l").
Joins("JOIN apps a ON l.app_id=a.app_id").
Joins("JOIN binding b ON l.binding_id=b.binding_id").
Joins("JOIN app_status_infos c ON l.app_id=c.app_id").
Where("c.status_value =? ", entity.StPublished).
Select("l.app_id AS app_id,a.name AS app_name,l.associated_at AS ass_time," +
"l.binding_id AS binding_id,b.group_name AS group_name,b.name AS binding_name").
Order("l.associated_at DESC").
Offset(genOffset(pageNo, pageSize)).Limit(pageSize).
Find(&list).Error
}
if err != nil {
return 0, nil, err
}
if searchText != "" {
s := genLike(searchText)
err = DB.WithContext(ctx).
Table("link_app_infos l").
Joins("JOIN apps a ON l.app_id=a.app_id").
Joins("JOIN binding b ON l.binding_id=b.binding_id").
Joins("JOIN app_status_infos c ON l.app_id=c.app_id").
Where("c.status_value =? and (a.name LIKE ? OR b.name LIKE ? OR b.group_name LIKE ? )", entity.StPublished, s, s, s).
Count(&total).Error
} else {
err = DB.WithContext(ctx).
Table("link_app_infos l").
Joins("JOIN app_status_infos c ON l.app_id=c.app_id").
Where("c.status_value =? ", entity.StPublished).
Count(&total).Error
}
if err != nil {
return 0, nil, err
}
result := make([]entity.AdminGetLinkAppsRspItem, 0)
for _, v := range list {
item := entity.AdminGetLinkAppsRspItem{}
item.Id = v.BindingId
item.AppIdDetail.AppId = v.AppId
item.AppIdDetail.Name = v.AppName
item.AppIdDetail.Sequence = 0
item.AppInfos.AssociatedAt = v.AssTime
item.BindingId = v.BindingId
item.GroupName = v.GroupName
item.Name = v.BindingName
result = append(result, item)
}
return int(total), result, nil
}
func (ar *AppRepo) ApproveApp(ctx context.Context, appId string, seq int, account, reason string, isPass bool) error {
now := utils.GetNowMs()
params := map[string]interface{}{
"status_update_time": now,
"status_updater": account,
"status_reason": reason,
"publishing_approval_update_time": now,
"publishing_approval_updater": account,
"publishing_approval_reason": reason,
"approval_update_time": now,
"approval_updater": account,
"approval_reason": reason,
}
if isPass {
params["status_value"] = entity.StPublishApproved
} else {
params["status_value"] = entity.StPublishRejected
}
return DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).
Where("app_id=? AND sequence=?", appId, seq).
Updates(params).Error
}
func (ar *AppRepo) GetRollbackAbleList(ctx context.Context, groupId, appId string, latestPubSeq int) ([]entity.AppVersion, error) {
appVers := make([]sql.AppVersion, 0)
limitVersion := 5 // 最近5个版本, 不是最近下架的5个版本
/*query := "app_versions.app_id=? AND app_versions.group_id=? AND " +
"StatusInfo.app_id=? AND StatusInfo.status_value=? AND " +
"StatusInfo.sequence>=? AND StatusInfo.sequence<? AND " +
"(StatusInfo.unpublished_type=? OR StatusInfo.unpublished_type=?)"*/
query := "app_versions.app_id=? AND app_versions.group_id=? AND " +
"app_version_status_infos.app_id=? AND app_version_status_infos.status_value=? AND " +
"app_version_status_infos.sequence>=? AND app_version_status_infos.sequence<? AND " +
"(app_version_status_infos.unpublished_type=? OR app_version_status_infos.unpublished_type=?)"
queryList := []interface{}{appId, groupId, appId, entity.StUnpublished, latestPubSeq - limitVersion, latestPubSeq, entity.TypeUnpublishedByDev, entity.TypeUnpublishedDueToNewSeq}
err := DB.WithContext(ctx).Model(&sql.AppVersion{}).
Where(query, queryList...).
//Joins("StatusInfo").
//Joins("BuildInfo").
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Order("app_versions.sequence DESC").
Find(&appVers).Error
if err != nil {
return nil, err
}
result := make([]entity.AppVersion, 0)
for _, v := range appVers {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, v.BuildInfoId, v.AppId, v.Sequence)
v.BuildInfo = appBuildInfo
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return result, nil
}
func (ar *AppRepo) UpdateGrayStatus(ctx context.Context, appId string, seq int, status bool) error {
return DB.WithContext(ctx).Model(&sql.AppVersion{}).Where("app_id=? AND sequence=?", appId, seq).Update("in_gray_release", status).Error
}
func (ar *AppRepo) UpdateExpire(ctx context.Context, appId string, expire int64) error {
return DB.WithContext(ctx).Model(&sql.App{}).Where("app_id=? ", appId).Update("expire", expire).Error
}
func (ar *AppRepo) UpdateExpireAppVersion(ctx context.Context, appId string, seq int, expire int64) error {
return DB.WithContext(ctx).Model(&sql.AppVersion{}).Where("app_id=? AND sequence=?", appId, seq).Update("expire", expire).Error
}
func (ar *AppRepo) GetCreatedStatistics(ctx context.Context, startTime, endTime int64, groupId string, isForbidden int) (int, error) {
/*
filter := bson.M{}
if groupId != "" {
filter["groupId"] = groupId
}
if startTime != -1 && startTime != 0 {
filter["created"] = bson.M{"$gt": startTime}
}
if endTime != -1 && endTime != 0 {
if _, ok := filter["created"]; ok {
filter["created"] = bson.M{"$gt": startTime, "$lte": endTime}
}
}
log.Debugf("GetCreatedStatistics filter:%+v", filter)
return appTable.Count(ctx, filter)
*/
var (
query = ""
queryList = make([]interface{}, 0)
err error
total int64
)
if groupId != "" {
query += "group_id = ? "
queryList = append(queryList, groupId)
}
if startTime > 0 {
query = genQuery(query, "AND", "create_time>? ")
queryList = append(queryList, startTime)
}
if endTime > 0 {
query = genQuery(query, "AND", "create_time<=? ")
queryList = append(queryList, endTime)
}
switch isForbidden {
case entity.APP_FORBIDDEN_NOT_STATUS, entity.APP_FORBIDDEN_IS_STATUS:
query = genQuery(query, "AND", "is_forbidden=? ")
queryList = append(queryList, isForbidden)
}
if query != "" {
err = DB.WithContext(ctx).
Model(&sql.App{}).
Where(query, queryList...).
Count(&total).Error
} else {
err = DB.WithContext(ctx).
Model(&sql.App{}).
Count(&total).Error
}
return int(total), err
}
func (ar *AppRepo) GetPublishedStatistics(ctx context.Context, startTime, endTime int64, groupId string) (int, error) {
var (
query = ""
queryList = make([]interface{}, 0)
err error
total int64
)
query += "status_value=? "
queryList = append(queryList, entity.StPublished)
if groupId != "" {
query += "group_id = ? "
queryList = append(queryList, groupId)
}
if startTime > 0 {
query = genQuery(query, "AND", "published_update_time>? ")
queryList = append(queryList, startTime)
}
if endTime > 0 {
query = genQuery(query, "AND", "published_update_time<=? ")
queryList = append(queryList, endTime)
}
if query != "" {
err = DB.WithContext(ctx).Model(&sql.AppStatusInfo{}).
Where(query, queryList...).
Count(&total).Error
} else {
err = DB.WithContext(ctx).Model(&sql.AppStatusInfo{}).Count(&total).Error
}
return int(total), err
}
//GetSubmittedStatistics 累计审核的小程序----只要小程序被审核过都算
func (ar *AppRepo) GetSubmittedStatistics(ctx context.Context, startTime, endTime int64, groupId string, distinct bool) (int, error) {
var (
query = ""
queryList = make([]interface{}, 0)
err error
total int64
)
query += "status_value<>? "
queryList = append(queryList, entity.StInDevelopment)
if groupId != "" {
query += "AND group_id = ? "
queryList = append(queryList, groupId)
}
if startTime > 0 {
query = genQuery(query, "AND", "publishing_update_time>? ")
queryList = append(queryList, startTime)
}
if endTime > 0 {
query = genQuery(query, "AND", "publishing_update_time<=? ")
queryList = append(queryList, endTime)
}
if distinct {
if query != "" {
err = DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).
Where(query, queryList...).
Select("count(distinct app_id)").
Count(&total).Error
} else {
err = DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).
Select("count(distinct app_id)").
Count(&total).Error
}
} else {
if query != "" {
err = DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).
Where(query, queryList...).
Count(&total).Error
} else {
err = DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).
Count(&total).Error
}
}
return int(total), err
}
//审核通过小程序
func (ar *AppRepo) GetApprovedStatistics(ctx context.Context, startTime, endTime int64, groupId string, distinct bool) (int, error) {
var (
query = ""
queryList = make([]interface{}, 0)
err error
total int64
)
query += "status_value IN (?) "
queryList = append(queryList, []string{entity.StPublishApproved, entity.StPublished, entity.StUnpublishing, entity.StUnpublishApproved, entity.StUnpublishRejected, entity.StUnpublished})
if groupId != "" {
query += "AND group_id = ? "
queryList = append(queryList, groupId)
}
if startTime > 0 {
query = genQuery(query, "AND", "published_update_time>? ")
queryList = append(queryList, startTime)
}
if endTime > 0 {
query = genQuery(query, "AND", "published_update_time<=? ")
queryList = append(queryList, endTime)
}
if distinct {
if query != "" {
err = DB.WithContext(ctx).Debug().
Model(&sql.AppVersionStatusInfo{}).
Where(query, queryList...).
Select("COUNT(DISTINCT app_id)").
Count(&total).Error
} else {
err = DB.WithContext(ctx).Debug().
Model(&sql.AppVersionStatusInfo{}).
Select("COUNT(DISTINCT app_id)").
Count(&total).Error
}
} else {
if query != "" {
err = DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).Where(query, queryList...).Count(&total).Error
} else {
err = DB.WithContext(ctx).Model(&sql.AppVersionStatusInfo{}).Count(&total).Error
}
}
return int(total), err
}
func (ar *AppRepo) GetAppClassPer(ctx context.Context, status string) ([]entity.AppClassPerRsp, error) {
//先获取所有的class
_, typeConfigList, err := NewTypeConfigByMysqlRepo().GetAll(ctx)
if err != nil {
return nil, err
}
type TempRsp struct {
AppClass string `gorm:"column:app_class"`
Count int `gorm:"column:count"`
}
rspList := make([]TempRsp, 0)
if status == "published" {
err = DB.WithContext(ctx).Model(&sql.App{}).
Joins("StatusInfo").
Where("StatusInfo.status_value = ?", entity.StPublished).
Select("apps.app_class as app_class ,count(apps.class) as count").
Group("app_class").Find(&rspList).Error
if err != nil {
return nil, err
}
} else {
err = DB.WithContext(ctx).Model(&sql.App{}).
Select("app_class,count(*) as count").
Group("app_class").Find(&rspList).Error
if err != nil {
return nil, err
}
}
typeConfigListMap := make(map[string]string)
for _, v := range typeConfigList {
typeConfigListMap[v.Value] = v.CustomData.Chinese
}
result := make([]entity.AppClassPerRsp, 0)
for _, v := range rspList {
item := entity.AppClassPerRsp{
Class: v.AppClass,
Count: v.Count,
}
if name, ok := typeConfigListMap[v.AppClass]; ok {
item.Name = []string{name}
}
result = append(result, item)
}
return result, err
}
func (ar *AppRepo) GetAppVerLimitByIdentity(ctx context.Context, t, appId, identity string, limit int) ([]entity.AppVersion, error) {
var (
list = make([]sql.AppVersion, 0)
query = ""
err error
)
query = "app_build_infos.file_md5=?"
if t == "sha256" {
query = "app_build_infos.encrypted_file_sha256=?"
}
err = DB.WithContext(ctx).
//Joins("BuildInfo").
//Joins("StatusInfo").
Joins("left join app_build_infos on app_versions.build_info_id = app_build_infos.trace_id").
Where(query, identity).
Order("sequence DESC").
Limit(limit).Find(&list).Error
if err != nil {
return nil, err
}
result := make([]entity.AppVersion, 0)
for _, v := range list {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, v.BuildInfoId, v.AppId, v.Sequence)
v.BuildInfo = appBuildInfo
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return result, nil
}
func (ar *AppRepo) GetGrayStatisticsVerList(ctx context.Context, appId string, seq int, begin, end int64) (int, []entity.AppVersion, error) {
var (
list = make([]sql.AppVersion, 0)
total int64
query = ""
queryList = make([]interface{}, 0)
err error
)
query = "app_versions.app_id=? AND app_versions.sequence<=? "
queryList = append(queryList, appId, seq)
if end == 0 {
query += "AND (app_version_status_infos.status_value=? OR (app_version_status_infos.status_value=? AND app_version_status_infos.unpublished_update_time >=?) ) "
queryList = append(queryList, entity.StPublished, entity.StUnpublished, begin)
} else {
query += "AND ( (app_version_status_infos.status_value=? AND app_version_status_infos.published_update_time<=?) OR " +
"(app_version_status_infos.status_value=? AND ((app_version_status_infos.published_update_time >=? AND app_version_status_infos.published_update_time<=?) " +
"OR (app_version_status_infos.unpublished_update_time>=? AND app_version_status_infos.unpublished_update_time<=?)))) "
queryList = append(queryList, entity.StPublished, end, entity.StUnpublished, begin, end, begin, end)
}
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).Debug().
//Joins("BuildInfo").
//Joins("StatusInfo").
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where(query, queryList...).
Order("app_versions.sequence ASC").
Find(&list).Error
if err != nil {
return 0, nil, err
}
err = DB.WithContext(ctx).Model(&sql.AppVersion{}).
//Joins("BuildInfo").
//Joins("StatusInfo").
Joins("left join app_version_status_infos on concat(app_versions.app_id,app_versions.sequence)=concat(app_version_status_infos.app_id,app_version_status_infos.sequence)").
Where(query, queryList...).
Count(&total).Error
if err != nil {
return 0, nil, err
}
result := make([]entity.AppVersion, 0)
for _, v := range list {
appBuildInfo, statusInfo, _ := ar.GetAppBuildInfoAndAppVersionStatusInfo(ctx, v.BuildInfoId, v.AppId, v.Sequence)
v.BuildInfo = appBuildInfo
v.StatusInfo = statusInfo
temp := v
result = append(result, *tr.CovertAppVerToEntity(&temp))
}
return int(total), result, nil
}
func (ar *AppRepo) GetAppClassList(ctx context.Context) ([]entity.CItem, error) {
apps := make([]sql.App, 0)
err := DB.Model(&sql.App{}).
Select("apps.app_class").Group("apps.app_class").
Find(&apps).Error
if err != nil {
return make([]entity.CItem, 0), err
}
cItems := make([]entity.CItem, 0)
for _, v := range apps {
cItem := entity.CItem{
Id: v.AppClass,
}
cItems = append(cItems, cItem)
}
return cItems, nil
}
func (ar *AppRepo) GetAppTagList(ctx context.Context) ([]entity.TagItem, error) {
apps := make([]sql.App, 0)
err := DB.Model(&sql.App{}).
Select("apps.app_tag").Group("apps.app_tag").
Find(&apps).Error
if err != nil {
return make([]entity.TagItem, 0), err
}
tagItem := make([]entity.TagItem, 0)
for _, v := range apps {
var id []string
appTags := strings.Split(v.AppTag, ",")
for _, x := range appTags {
id = append(id, x)
}
tag := entity.TagItem{
Id: id,
}
tagItem = append(tagItem, tag)
}
return tagItem, nil
}
func (ar *AppRepo) GetAppsBySearchText(ctx context.Context, searchText string) ([]entity.App, error) {
list := make([]sql.App, 0)
err := DB.WithContext(ctx).Model(&sql.App{}).
Where("app_id LIKE ? OR name LIKE ?", "%"+searchText+"%", "%"+searchText+"%").
Find(&list).Error
if err != nil {
return nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
/*statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo*/
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return result, nil
}
func (ar *AppRepo) GetAppByCreator(ctx context.Context, phone string) ([]entity.App, error) {
list := make([]sql.App, 0)
err := DB.WithContext(ctx).Model(&sql.App{}).
Where("created_by = ? ", phone).
Find(&list).Error
if err != nil {
return nil, err
}
result := make([]entity.App, 0)
for _, v := range list {
/*statusInfo, _ := ar.GetAppStatusInfo(ctx, v.AppId)
v.StatusInfo = statusInfo*/
temp := v
result = append(result, *tr.CovertAppToEntity(&temp))
}
return result, nil
}