package main
import (
"errors"
"fmt"
"github.com/boltdb/bolt"
"github.com/timshannon/bolthold"
)
const (
boltUserKey = "User_ID:%d" //user 表 key
boltUserIDIncrementKey = "User_ID_Increment" //user 表 ID 计数
)
// User 用户基础数据表
type User struct {
ID int64 `json:"id"`
OpenID string `json:"-" boltholdIndex:"OpenID"` // 用户的唯一标识
Nickname string `json:"nickName"` // 用户昵称
}
func init() {
Registr2Bolt(&User{})
}
// GetUserByIDFromBolt GetUserByID returns the user object by given ID if exists.
func GetUserByIDFromBolt(id int64) (*User, error) {
if id <= 0 {
return nil, errors.New("userID nil")
}
u := new(User)
key := fmt.Sprintf(boltUserKey, id)
err := BoltX.Get(key, u)
if err != nil {
if BoltX.IsNotFoundError(err) {
return nil, &ErrDataNotExist{
Data: &struct{ UserID int64 }{id},
}
}
return nil, err
}
return u, nil
}
// GetUserByOpenIDFromBolt Get UserInfo By OpenID
func GetUserByOpenIDFromBolt(openID string) (*User, error) {
if len(openID) <= 0 {
return nil, errors.New("openID nil")
}
var result []*User
err := BoltX.Find(&result, bolthold.Where("OpenID").Eq(openID))
if BoltX.IsNotFoundError(err) || len(result) <= 0 {
return nil, &ErrDataNotExist{
Data: &struct{ OpenID string }{openID},
}
}
if err != nil {
return nil, err
}
u := result[0]
return u, nil
}
// AddOrUpdateBoltUserInfo 添加或者更新用户
func AddOrUpdateBoltUserInfo(u *User) (*User, error) {
if len(u.OpenID) <= 0 {
return nil, NewParamsError("OpenID")
}
var err error
var has bool
user := new(User)
user, err = GetUserByOpenIDFromBolt(u.OpenID)
if err != nil && !IsErrDataNotExist(err) {
return nil, err
}
if user != nil && user.ID > 0 {
has = true
}
bx := BoltX
var tx *bolt.Tx
if tx, err = bx.Bolt().Begin(true); err != nil {
return nil, err
}
if has { //更新用户资料
key := fmt.Sprintf(boltUserKey, user.ID)
user.Nickname = u.Nickname
if err = bx.TxUpdate(tx, key, user); err != nil {
tx.Rollback()
return nil, err
}
} else { //添加新用户
// 生成新的 UserID
var nextID int64
if nextID, err = bx.GeNextBoltID(tx, boltUserIDIncrementKey); err != nil {
tx.Rollback()
return nil, err
}
key := fmt.Sprintf(boltUserKey, nextID)
user = &User{
ID: nextID,
OpenID: u.OpenID,
Nickname: u.Nickname,
}
if err := bx.TxInsert(tx, key, user); err != nil {
tx.Rollback()
return nil, err
}
}
if err = tx.Commit(); err != nil {
return nil, err
}
return user, nil
}
ft_authoradmin ft_create_time2017-08-18 10:47
ft_update_time2017-08-18 10:47
ft_update_time2017-08-18 10:47