forked from aiyi/go-user
/
bind_weibo_to.go
109 lines (98 loc) · 2.32 KB
/
bind_weibo_to.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package model
import (
"errors"
"fmt"
"github.com/chanxuehong/go-user/db"
)
// 绑定微博新注册账户到指定账户, 密码以指定账户为准.
// 调用该函数前, 请确认:
// 1. toUserId != userId
// 2. toUserId 存在并且 verified
// 3. userId 存在并且没有 verified
// 4. toUserId 未绑定微博
// 5. userId 是微博新注册账户
func BindWeiboUserTo(toUserId, userId int64) (err error) {
if err = removeFromCache(toUserId); err != nil {
return
}
if err = removeFromCache(userId); err != nil {
return
}
if err = bindWeiboUserTo(toUserId, userId); err != nil {
return
}
return syncToCache(toUserId)
}
func bindWeiboUserTo(toUserId, userId int64) (err error) {
if toUserId == userId {
return errors.New("toUserId 不能等于 userId")
}
para := struct {
ToUserId int64 `sqlx:"to_user_id"`
UserId int64 `sqlx:"user_id"`
BindType BindType `sqlx:"bind_type"`
}{
ToUserId: toUserId,
UserId: userId,
BindType: BindTypeWeibo,
}
tx, err := db.GetDB().Beginx()
if err != nil {
return
}
// user 更新 ToUserId
stmt1, err := tx.PrepareNamed("update user set bind_types = bind_types|:bind_type where id=:to_user_id and verified=1 and bind_types&:bind_type=0")
if err != nil {
tx.Rollback()
return
}
rslt1, err := stmt1.Exec(para)
if err != nil {
tx.Rollback()
return
}
rowsAffected1, err := rslt1.RowsAffected()
if err != nil {
tx.Rollback()
return
}
// user 删除 UserId
stmt2, err := tx.PrepareNamed("delete from user where id=:user_id and verified=0 and bind_types=:bind_type")
if err != nil {
tx.Rollback()
return
}
rslt2, err := stmt2.Exec(para)
if err != nil {
tx.Rollback()
return
}
rowsAffected2, err := rslt2.RowsAffected()
if err != nil {
tx.Rollback()
return
}
// user_weibo 更新 item
stmt3, err := tx.PrepareNamed("update user_weibo set user_id=:to_user_id, verified=1 where user_id=:user_id and verified=0")
if err != nil {
tx.Rollback()
return
}
rslt3, err := stmt3.Exec(para)
if err != nil {
tx.Rollback()
return
}
rowsAffected3, err := rslt3.RowsAffected()
if err != nil {
tx.Rollback()
return
}
if rowsAffected1 != rowsAffected2 || rowsAffected1 != rowsAffected3 {
err = fmt.Errorf("绑定用户 %d 到用户 %d 失败", para.UserId, para.ToUserId)
tx.Rollback()
return
}
err = tx.Commit()
return
}