Merge branch 'develop' of gitee.com:fusenpack/fusenapi into develop

This commit is contained in:
momo
2023-09-11 13:59:36 +08:00
9 changed files with 202 additions and 71 deletions

150
utils/fssql/metadata.go Normal file
View File

@@ -0,0 +1,150 @@
package fssql
import (
"encoding/json"
"fmt"
"reflect"
"gorm.io/gorm"
)
// func MetadataPATCH(tx *gorm.DB, module string, tableStructPointer any, updateMetadata any, rawID int64) error {
// stype := reflect.TypeOf(tableStructPointer)
// if stype.Kind() == reflect.Pointer {
// stype = stype.Elem()
// }
// updatesql := `UPDATE %s
// SET metadata = CASE
// WHEN metadata IS NULL THEN ?
// ELSE JSON_MERGE_PATCH(metadata, ?)
// END
// WHERE module = '%s' and id = ?;`
// var err error
// var metadata []byte
// switch mdata := updateMetadata.(type) {
// case []byte:
// metadata = mdata
// case string:
// metadata = []byte(mdata)
// default:
// metadata, err = json.Marshal(updateMetadata)
// if err != nil {
// return err
// }
// }
// updatesql = fmt.Sprintf(updatesql, tx.NamingStrategy.TableName(stype.Name()), module)
// logx.Error(updatesql)
// err = tx.Exec(updatesql, metadata, metadata, rawID).Error
// if err != nil {
// return err
// }
// return nil
// }
// tableStructPointer 表结构 updateMetadata 可以是json的[]byte也可以结构体
func MetadataModulePATCH(tx *gorm.DB, module string, tableStructPointer any, updateMetadata any, WhereKeysCond string, values ...any) error {
stype := reflect.TypeOf(tableStructPointer)
if stype.Kind() == reflect.Pointer {
stype = stype.Elem()
}
updatesql := `UPDATE %s
SET metadata = CASE
WHEN metadata IS NULL THEN ?
ELSE JSON_MERGE_PATCH(metadata, ?)
END
WHERE module = '%s' and %s;`
var err error
var metadata []byte
switch mdata := updateMetadata.(type) {
case []byte:
metadata = mdata
case string:
metadata = []byte(mdata)
default:
metadata, err = json.Marshal(updateMetadata)
if err != nil {
return err
}
}
var args []any
args = append(args, metadata, metadata)
args = append(args, values...)
updatesql = fmt.Sprintf(updatesql, tx.NamingStrategy.TableName(stype.Name()), module, WhereKeysCond)
// logx.Error(updatesql)
err = tx.Exec(updatesql, args...).Error
if err != nil {
return err
}
return nil
}
func MetadataResourcePATCH(tx *gorm.DB, rid string, updateMetadata any, values ...any) error {
// stype := reflect.TypeOf(tableStructPointer)
// if stype.Kind() == reflect.Pointer {
// stype = stype.Elem()
// }
var updatesql string
if len(values) == 0 {
updatesql = `UPDATE fs_resource
SET metadata = CASE
WHEN metadata IS NULL THEN ?
ELSE JSON_MERGE_PATCH(metadata, ?)
END
WHERE resource_id = '%s';`
} else {
cond, ok := values[0].(string)
if !ok {
return fmt.Errorf("values[0] must be wherecond")
}
updatesql = `UPDATE fs_resource
SET metadata = CASE
WHEN metadata IS NULL THEN ?
ELSE JSON_MERGE_PATCH(metadata, ?)
END
cond, ok := values[0].(string)
WHERE resource_id = '%s'` + " and " + cond + `;`
}
var err error
var metadata []byte
switch mdata := updateMetadata.(type) {
case []byte:
metadata = mdata
case string:
metadata = []byte(mdata)
default:
metadata, err = json.Marshal(updateMetadata)
if err != nil {
return err
}
}
var args []any
args = append(args, metadata, metadata)
args = append(args, values...)
updatesql = fmt.Sprintf(updatesql, rid)
// logx.Error(updatesql)
err = tx.Exec(updatesql, args...).Error
if err != nil {
return err
}
return nil
}

View File

@@ -0,0 +1,28 @@
package fssql_test
import (
"fusenapi/initalize"
"fusenapi/model/gmodel"
"fusenapi/utils/fssql"
"testing"
)
func TestCase1(t *testing.T) {
u := gmodel.UserProfile{
FirstName: "h",
LastName: "sm",
}
conn := initalize.InitMysql("fsreaderwriter:XErSYmLELKMnf3Dh@tcp(fusen.cdmigcvz3rle.us-east-2.rds.amazonaws.com:3306)/fusen")
err := fssql.MetadataModulePATCH(conn, "logo", gmodel.FsChangeCode{}, u, "id = ?", 6)
if err != nil {
panic(err)
}
err = fssql.MetadataResourcePATCH(conn,
"f8932c0379fa5aa3397dc0a963696ca90536cc273ea10119b0137fd15ecfe673", u)
if err != nil {
panic(err)
}
}

View File

@@ -1,5 +1,11 @@
package template_switch_info
import (
"encoding/json"
"errors"
"github.com/zeromicro/go-zero/core/logx"
)
type GetTemplateSwitchInfoRsp struct {
Id int64 `json:"id"`
Material string `json:"material"`
@@ -36,36 +42,72 @@ type Logo struct {
Material string `json:"material"`
}
// 模板开关信息简单结构
type TemplateSimpleParseInfo struct {
MaterialList []MaterialItem `json:"materialList"`
}
type MaterialItem struct {
Type string `json:"type"`
Tag string `json:"tag"`
Visible bool `json:"visible"`
Text string `json:"text"`
}
// 获取模板开关信息(目前写死,以后后台做好了功能再更新变动)
func GetTemplateSwitchInfo(templateId int64, templateMaterialImg string) GetTemplateSwitchInfoRsp {
return GetTemplateSwitchInfoRsp{
func GetTemplateSwitchInfo(templateId int64, templateJsonStr *string, templateMaterialImg string) (resp GetTemplateSwitchInfoRsp, err error) {
if templateJsonStr == nil || *templateJsonStr == "" {
return GetTemplateSwitchInfoRsp{}, nil
}
var templateJsonInfo TemplateSimpleParseInfo
if err = json.Unmarshal([]byte(*templateJsonStr), &templateJsonInfo); err != nil {
logx.Error(err)
return GetTemplateSwitchInfoRsp{}, errors.New("解析模板json获取DIY开关设置失败")
}
mapSwitchInfo := GetTemplateSwitchInfoRsp{
Id: templateId,
Material: templateMaterialImg,
MaterialData: MaterialData{
QRcode: QRcode{
IfShow: true,
Text: "qrcode",
DefaultValue: "default qrcode",
},
Website: Website{
IfShow: true,
Text: "website",
DefaultValue: "default website",
},
Address: Address{
IfShow: true,
Text: "address",
DefaultValue: "default address",
},
Phone: Phone{
IfShow: true,
Text: "phone",
DefaultValue: "17557283679",
},
Logo: Logo{
Material: "/image/logo/aHnT1_rzubdwax_scale.png",
},
},
}
for _, v := range templateJsonInfo.MaterialList {
if v.Type == "combine" && !v.Visible {
return GetTemplateSwitchInfoRsp{
MaterialData: MaterialData{
Logo: Logo{
Material: "/image/logo/aHnT1_rzubdwax_scale.png",
},
},
}, nil
}
switch v.Tag {
case "Phone": //电话
mapSwitchInfo.MaterialData.Phone = Phone{
IfShow: v.Visible,
Text: v.Text,
DefaultValue: "xxx xxx xxx xxxx",
}
case "Address": //地址
mapSwitchInfo.MaterialData.Address = Address{
IfShow: v.Visible,
Text: v.Text,
DefaultValue: "USA",
}
case "Website":
mapSwitchInfo.MaterialData.Website = Website{
IfShow: v.Visible,
Text: v.Text,
DefaultValue: "https://www.xxxxxx.com",
}
case "QRcode":
mapSwitchInfo.MaterialData.QRcode = QRcode{
IfShow: v.Visible,
Text: v.Text,
DefaultValue: "xxxxxxx",
}
}
}
return mapSwitchInfo, nil
}