go_dreamfactory/modules/model_comp.go
2022-06-15 19:25:55 +08:00

161 lines
4.0 KiB
Go

package modules
import (
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/core/cbase"
"go_dreamfactory/lego/sys/log"
"go_dreamfactory/lego/sys/mgo"
"go_dreamfactory/lego/sys/redis"
"go_dreamfactory/sys/cache"
"go_dreamfactory/sys/db"
"reflect"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"google.golang.org/protobuf/proto"
)
/*
基础组件 缓存组件 读写缓存数据
DB组件也封装进来
*/
type Model_Comp struct {
cbase.ModuleCompBase
Redis redis.ISys
DB mgo.ISys
Prefix string //redis key前缀
}
const (
DB_ModelTable core.SqlTable = "model_log"
)
//组件初始化接口
func (this *Model_Comp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
this.ModuleCompBase.Init(service, module, comp, options)
this.Redis = cache.Redis()
this.DB = db.Mgo()
return
}
func (this *Model_Comp) Start() (err error) {
err = this.ModuleCompBase.Start()
return
}
func (this *Model_Comp) InsertModelLogs(table string, uID string, target interface{}) (err error) {
data := &comm.Autogenerated{
ID: primitive.NewObjectID().Hex(),
UID: uID,
Act: string(comm.LogHandleType_Insert),
}
data.D = append(data.D, table) // D[0]
data.D = append(data.D, target) // D[1]
_, err = this.DB.InsertOne(DB_ModelTable, data)
if err != nil {
log.Errorf("insert model db err %v", err)
}
return err
}
func (this *Model_Comp) DeleteModelLogs(table string, uID string, where interface{}) (err error) {
data := &comm.Autogenerated{
ID: primitive.NewObjectID().Hex(),
UID: uID,
Act: string(comm.LogHandleType_Delete),
}
data.D = append(data.D, table) // D[0]
data.D = append(data.D, where) // D[1]
_, err = this.DB.InsertOne(DB_ModelTable, data)
if err != nil {
log.Errorf("insert model db err %v", err)
}
return err
}
func (this *Model_Comp) UpdateModelLogs(table string, uID string, where interface{}, target interface{}) (err error) {
data := &comm.Autogenerated{
ID: primitive.NewObjectID().Hex(),
UID: uID,
Act: string(comm.LogHandleType_Update),
}
data.D = append(data.D, table) // D[0]
data.D = append(data.D, where) // D[1]
data.D = append(data.D, target) // D[2]
_, err = this.DB.InsertOne(DB_ModelTable, data)
if err != nil {
log.Errorf("insert model db err %v", err)
}
return err
}
func (this *Model_Comp) SetObj(uid string, data proto.Message, isnew, islog bool) error {
err := this.Redis.Set(fmt.Sprintf("%s:%s", this.Prefix, uid), data, 0)
if err != nil {
log.Errorf("set err:%v", err)
return err
}
if islog {
if isnew {
return this.InsertModelLogs(this.Prefix, uid, data)
} else {
return this.UpdateModelLogs(this.Prefix, uid, bson.M{"_id": uid}, data)
}
}
return nil
}
//更新缓存字段
//isnew true insertlog , false updatelog
func (this *Model_Comp) Set(uid string, v map[string]interface{}, isnew, islog bool) error {
err := this.Redis.HMSet(fmt.Sprintf("%s:%s", this.Prefix, uid), v)
if err != nil {
log.Errorf("set err:%v", err)
return err
}
if islog {
if isnew {
return this.InsertModelLogs(this.Prefix, uid, v)
} else {
return this.UpdateModelLogs(this.Prefix, uid, bson.M{"_id": uid}, v)
}
}
return nil
}
func (this *Model_Comp) GetObj(uid string, v interface{}) error {
return this.Redis.Get(fmt.Sprintf("%s:%s", this.Prefix, uid), v)
}
//获取对象数据
func (this *Model_Comp) Get(uid string, v reflect.Type, fields ...string) ([]interface{}, error) {
return this.Redis.HMGet(fmt.Sprintf("%s:%s", this.Prefix, uid), v, fields...)
}
//获取字段数据
func (this *Model_Comp) GetField(uid string, field string, v interface{}) error {
return this.Redis.HGet(fmt.Sprintf("%s:%s", this.Prefix, uid), field, v)
}
//删除一条数据
func (this *Model_Comp) Del(uid string) error {
err := this.Redis.HDel(fmt.Sprintf("%s:%s", this.Prefix, uid))
if err != nil {
log.Errorf("del err:%v", err)
return err
}
return this.DeleteModelLogs(this.Prefix, uid, bson.M{"_id": uid})
}