forked from aiyi/go-user
/
unbind_phone.go
79 lines (70 loc) · 1.54 KB
/
unbind_phone.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
package model
import (
"fmt"
"github.com/aiyi/go-user/db"
)
// 解绑手机认证.
// 调用该函数前, 请确认:
// 1. 该用户存在并且 verified
// 2. 该用户除了手机认证还有别的认证
func UnbindPhone(userId int64) (err error) {
if err = removeFromCache(userId); err != nil {
return
}
if err = unbindPhone(userId); err != nil {
return
}
return syncToCache(userId)
}
func unbindPhone(userId int64) (err error) {
para := struct {
UserId int64 `sqlx:"user_id"`
NotBindType BindType `sqlx:"not_bind_type"`
}{
UserId: userId,
NotBindType: BindTypeMask &^ BindTypePhone,
}
tx, err := db.GetDB().Beginx()
if err != nil {
return
}
// user_phone 表删除一个 item
stmt1, err := tx.Prepare("delete from user_phone where user_id=? and verified=1")
if err != nil {
tx.Rollback()
return
}
rslt1, err := stmt1.Exec(para.UserId)
if err != nil {
tx.Rollback()
return
}
rowsAffected1, err := rslt1.RowsAffected()
if err != nil {
tx.Rollback()
return
}
// user 更新 item
stmt2, err := tx.PrepareNamed("update user set bind_types = bind_types&:not_bind_type where id=:user_id and verified=1 and bind_types&:not_bind_type<>0")
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
}
if rowsAffected1 != rowsAffected2 {
err = fmt.Errorf("用户 %d 解绑手机失败", para.UserId)
tx.Rollback()
return
}
err = tx.Commit()
return
}