package shared import ( "context" "fusenapi/model/gmodel" "fusenapi/utils/auth" "log" "time" "github.com/lni/dragonboat/v4" "gorm.io/gorm" ) type SharedState struct { shardID uint64 replicaID uint64 nh *dragonboat.NodeHost } func GetUserState(UserId int64, gdb *gorm.DB) (us *UserState, err error) { models := gmodel.NewAllModels(gdb) user, err := models.FsUser.FindUserById(context.TODO(), UserId) if err != nil { log.Println(err) return nil, err } userState := &UserState{ UserId: UserId, PwdHash: auth.StringToHash(*user.PasswordHash), UpdateAt: time.Now(), } return userState, nil } func (ss *SharedState) GetUserState(Userid int64) (us *UserState, err error) { ius, err := ss.nh.SyncRead(context.TODO(), ss.shardID, Userid) if err != nil { log.Println(err) return nil, err } if ius != nil { return ius.(*UserState), nil } cs := ss.nh.GetNoOPSession(128) cmd := &CmdUpdate{UserId: Userid} cmdBuf, err := FsPasser.PackToBytes(cmd) if err != nil { return nil, err } result, err := ss.nh.SyncPropose(context.TODO(), cs, cmdBuf) if err != nil { return nil, err } us = &UserState{} err = us.Decode(result.Data) if err != nil { return nil, err } return us, err }