Skip to content

Commit 1c948ab

Browse files
committed
feat: add email and phone fields to user model with enhanced OAuth sync
- Add email and phone columns to convo_user table via database migration - Extend UserBasic and UserSet models with Email and Phone fields for contact information - Introduce IUser interface to abstract user operations with GetEmail/GetPhone methods - Add wecomUID context support for WeCom integration metadata tracking - Update OAuth user synchronization to capture email, phone and WeCom UID metadata - Enhance user query capabilities with email/phone filtering and sorting - Upgrade staffio-client dependency to v0.2.11 for improved OAuth user handling - Fix ignored error return in Feishu logger handler
1 parent 27d0188 commit 1c948ab

12 files changed

Lines changed: 153 additions & 38 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
ALTER TABLE IF EXISTS convo_user ADD IF NOT EXISTS email varchar(43) NOT NULl DEFAULT '';
3+
ALTER TABLE IF EXISTS convo_user ADD IF NOT EXISTS phone varchar(15) NOT NULl DEFAULT '';

docs/convo.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,19 @@ models:
152152
type: string
153153
tags: {json: 'avatar,omitempty', pg: 'avatar,notnull,type:varchar(125)'}
154154
isset: true
155+
- comment: '邮箱'
156+
name: Email
157+
type: string
158+
tags: {json: 'email,omitempty', pg: "email,notnull,use_zero,type:varchar(43)"}
159+
isset: true
160+
query: 'match'
161+
sortable: true
162+
- comment: '电话'
163+
name: Phone
164+
type: string
165+
tags: {json: 'phone,omitempty', pg: "phone,notnull,use_zero,type:varchar(15)"}
166+
isset: true
167+
query: 'match'
155168

156169
- type: comm.MetaField
157170

docs/example.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,15 @@ fetch('/api/m/mcp/servers/fi-54ionou2hq0w/activate', {
2525
.then(console.log);
2626

2727
```
28+
29+
```bash
30+
curl -X POST 'http://localhost:3002/api/m/mcp/servers' \
31+
-H 'Content-Type: application/json' \
32+
-d '{
33+
"name": "webpawm",
34+
"transport": "streamable",
35+
"url": "http://localhost:8087/mcp",
36+
"remark": "用于搜索"
37+
}'
38+
39+
```

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ require (
1515
github.com/kelseyhightower/envconfig v1.4.0
1616
github.com/larksuite/oapi-sdk-go/v3 v3.5.3
1717
github.com/liut/simpauth v0.1.18
18-
github.com/liut/staffio-client v0.2.10
18+
github.com/liut/staffio-client v0.2.11
1919
github.com/marcsv/go-binder v0.0.0-20160121205837-a8bae0b66e09
2020
github.com/mark3labs/mcp-go v0.45.0
2121
github.com/pmezard/go-difflib v1.0.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ github.com/larksuite/oapi-sdk-go/v3 v3.5.3 h1:xvf8Dv29kBXC5/DNDCLhHkAFW8l/0LlQJi
8282
github.com/larksuite/oapi-sdk-go/v3 v3.5.3/go.mod h1:ZEplY+kwuIrj/nqw5uSCINNATcH3KdxSN7y+UxYY5fI=
8383
github.com/liut/simpauth v0.1.18 h1:uPAeefL8mBXpOv1Cn5r3cHqzv/wuIyFFHGtpFJai8l4=
8484
github.com/liut/simpauth v0.1.18/go.mod h1:7DBCXACVqthUCo3T8rLX7v3DpMwQWctEhWpInmaphc4=
85-
github.com/liut/staffio-client v0.2.10 h1:CR7I7jJmozpNVuI4R82oePl6GM+pcZNbvVBsVp+wZPk=
86-
github.com/liut/staffio-client v0.2.10/go.mod h1:wExiAH2XNWx7VGxaugifjj941BPv54DvgiPs3YhXkAE=
85+
github.com/liut/staffio-client v0.2.11 h1:yczPjic/6x3hlCPFMJkmq/nzWlyzagGch4/h8cUxw8Y=
86+
github.com/liut/staffio-client v0.2.11/go.mod h1:wExiAH2XNWx7VGxaugifjj941BPv54DvgiPs3YhXkAE=
8787
github.com/mailru/easyjson v0.9.2 h1:dX8U45hQsZpxd80nLvDGihsQ/OxlvTkVUXH2r/8cb2M=
8888
github.com/mailru/easyjson v0.9.2/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
8989
github.com/marcsv/go-binder v0.0.0-20160121205837-a8bae0b66e09 h1:CjqjGVBDBV81zs1g3OiST9+GKeJJkUiy9e87940tVWQ=

pkg/models/convo/convo_gen.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,10 @@ type UserBasic struct {
387387
Nickname string `bun:"nickname,notnull,type:varchar(45)" extensions:"x-order=B" form:"nickname" json:"nickname" pg:"nickname,notnull,type:varchar(45)"`
388388
// 头像路径
389389
AvatarPath string `bun:"avatar,notnull,type:varchar(125)" extensions:"x-order=C" form:"avatar" json:"avatar,omitempty" pg:"avatar,notnull,type:varchar(125)"`
390+
// 邮箱
391+
Email string `bun:"email,notnull,type:varchar(43)" extensions:"x-order=D" form:"email" json:"email,omitempty" pg:"email,notnull,use_zero,type:varchar(43)"`
392+
// 电话
393+
Phone string `bun:"phone,notnull,type:varchar(15)" extensions:"x-order=E" form:"phone" json:"phone,omitempty" pg:"phone,notnull,use_zero,type:varchar(15)"`
390394
// for meta update
391395
MetaDiff *comm.MetaDiff `bson:"-" bun:"-" json:"metaUp,omitempty" pg:"-" swaggerignore:"true"`
392396
} // @name convoUserBasic
@@ -425,6 +429,10 @@ type UserSet struct {
425429
Nickname *string `extensions:"x-order=B" json:"nickname"`
426430
// 头像路径
427431
AvatarPath *string `extensions:"x-order=C" form:"avatar" json:"avatar,omitempty"`
432+
// 邮箱
433+
Email *string `extensions:"x-order=D" form:"email" json:"email,omitempty"`
434+
// 电话
435+
Phone *string `extensions:"x-order=E" form:"phone" json:"phone,omitempty"`
428436
// for meta update
429437
MetaDiff *comm.MetaDiff `json:"metaUp,omitempty" swaggerignore:"true"`
430438
} // @name convoUserSet
@@ -442,6 +450,14 @@ func (z *User) SetWith(o UserSet) {
442450
z.LogChangeValue("avatar", z.AvatarPath, o.AvatarPath)
443451
z.AvatarPath = *o.AvatarPath
444452
}
453+
if o.Email != nil && z.Email != *o.Email {
454+
z.LogChangeValue("email", z.Email, o.Email)
455+
z.Email = *o.Email
456+
}
457+
if o.Phone != nil && z.Phone != *o.Phone {
458+
z.LogChangeValue("phone", z.Phone, o.Phone)
459+
z.Phone = *o.Phone
460+
}
445461
if o.MetaDiff != nil && z.MetaUp(o.MetaDiff) {
446462
z.SetChange("meta")
447463
}

pkg/services/channels/feishu/log.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (l *myLogger) logInternal(ctx context.Context, level slog.Level, args ...an
3131
Message: msg + extra,
3232
PC: pcs[0],
3333
}
34-
l.log.Handler().Handle(ctx, *r)
34+
_ = l.log.Handler().Handle(ctx, *r)
3535
}
3636

3737
func (l *myLogger) Debug(ctx context.Context, args ...any) {

pkg/services/stores/auth.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,27 @@ func tokenUserKey(token string) string {
2020
return "tk-o-user-" + token
2121
}
2222

23+
type IUser interface {
24+
auth.IUser
25+
26+
GetEmail() string
27+
GetPhone() string
28+
}
29+
30+
type Encoder = auth.Encoder
2331
type User = auth.User
2432

2533
// UserFromContext gets user information from context
26-
func UserFromContext(ctx context.Context) (*User, bool) {
27-
return auth.UserFromContext(ctx)
34+
func UserFromContext(ctx context.Context) (user *User, ok bool) {
35+
if iu, iok := auth.UserFromContext(ctx); iok {
36+
if user, ok = iu.(*User); ok {
37+
return
38+
}
39+
au := auth.ToUser(iu)
40+
user = &au
41+
ok = true
42+
}
43+
return
2844
}
2945

3046
// IsKeeper checks if the user in the current context has keeper role or UID
@@ -59,7 +75,7 @@ func OAuthContextWithToken(ctx context.Context, token string) context.Context {
5975
}
6076

6177
// SaveUserWithToken saves user.Encode() into redis
62-
func SaveUserWithToken(ctx context.Context, user *User, token string) error {
78+
func SaveUserWithToken(ctx context.Context, user Encoder, token string) error {
6379
s, err := user.Encode()
6480
if err != nil {
6581
logger().Infow("encode user failed", "err", err)
@@ -99,6 +115,19 @@ func DeleteUserToken(ctx context.Context, token string) error {
99115
return nil
100116
}
101117

118+
type wecomUIDKey struct{}
119+
120+
func WecomUIDFromContext(ctx context.Context) string {
121+
if uid, ok := ctx.Value(wecomUIDKey{}).(string); ok {
122+
return uid
123+
}
124+
return ""
125+
}
126+
127+
func ContextWithWecomUID(ctx context.Context, uid string) context.Context {
128+
return context.WithValue(ctx, wecomUIDKey{}, uid)
129+
}
130+
102131
type ModelMeta = comm.ModelMeta
103132

104133
// ModelMetaCreator is the model metadata creator interface

pkg/services/stores/convo_gen.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,29 @@ type ConvoUserSpec struct {
9696
Username string `extensions:"x-order=A" form:"username" json:"username"`
9797
// 昵称
9898
Nickname string `extensions:"x-order=B" form:"nickname" json:"nickname"`
99+
// 邮箱
100+
Email string `extensions:"x-order=C" form:"email" json:"email,omitempty"`
101+
// 电话
102+
Phone string `extensions:"x-order=D" form:"phone" json:"phone,omitempty"`
99103
}
100104

101105
func (spec *ConvoUserSpec) Sift(q *ormQuery) *ormQuery {
102106
q = spec.ModelSpec.Sift(q)
103107
q, _ = siftMatch(q, "username", spec.Username, false)
104108
q, _ = siftMatch(q, "nickname", spec.Nickname, false)
109+
q, _ = siftMatch(q, "email", spec.Email, false)
110+
q, _ = siftMatch(q, "phone", spec.Phone, false)
105111

106112
return q
107113
}
114+
func (spec *ConvoUserSpec) CanSort(k string) bool {
115+
switch k {
116+
case "email":
117+
return true
118+
default:
119+
return spec.ModelSpec.CanSort(k)
120+
}
121+
}
108122

109123
type ConvoMemorySpec struct {
110124
PageSpec

pkg/services/stores/convo_x.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
type ConvoStoreX interface {
1818
SaveSession(ctx context.Context, sess *convo.Session) error
1919
SaveUser(ctx context.Context, user *ConvoUser) error
20-
SyncUserFromOAuth(ctx context.Context, user *User) error
20+
SyncUserFromOAuth(ctx context.Context, user IUser) error
2121

2222
GetMyMemoryWithKey(ctx context.Context, key string) (*convo.Memory, error)
2323
ListMyMomory(ctx context.Context, spec *ConvoMemorySpec) (convo.Memories, error)
@@ -61,9 +61,12 @@ func (s *convoStore) SaveUser(ctx context.Context, user *convo.User) error {
6161
existing.SetWith(convo.UserSet{
6262
Nickname: &user.Nickname,
6363
AvatarPath: &user.AvatarPath,
64+
Email: &user.Email,
65+
Phone: &user.Phone,
6466
})
67+
existing.MergeMeta(user.Meta)
6568
dbMetaUp(ctx, s.w.db, existing)
66-
return dbUpdate(ctx, s.w.db, existing)
69+
return dbUpdate(ctx, s.w.db, existing, "meta")
6770
}
6871

6972
if errors.Is(err, ErrNoRows) || errors.Is(err, ErrNotFound) {
@@ -77,16 +80,24 @@ func (s *convoStore) SaveUser(ctx context.Context, user *convo.User) error {
7780
return err
7881
}
7982

80-
func (s *convoStore) SyncUserFromOAuth(ctx context.Context, user *User) error {
81-
cuser := convo.NewUserWithBasic(convo.UserBasic{
82-
Username: user.UID,
83-
Nickname: user.Name,
84-
AvatarPath: user.Avatar,
85-
})
86-
_ = cuser.SetID(user.OID)
83+
func (s *convoStore) SyncUserFromOAuth(ctx context.Context, user IUser) error {
84+
cub := convo.UserBasic{
85+
Username: user.GetUID(),
86+
Nickname: user.GetName(),
87+
AvatarPath: user.GetAvatar(),
88+
Email: user.GetEmail(),
89+
Phone: user.GetPhone(),
90+
}
91+
if wuid := WecomUIDFromContext(ctx); len(wuid) > 0 {
92+
logger().Infow("got wecomUID", "uid", wuid)
93+
cub.MetaAddKVs("wecomUID", wuid)
94+
}
95+
cuser := convo.NewUserWithBasic(cub)
96+
id := user.GetOID()
97+
_ = cuser.SetID(id)
8798
if err := s.SaveUser(ctx, cuser); err != nil {
8899
logger().Infow("save user failed", "err", err,
89-
"oid", user.OID, "uid", user.UID)
100+
"oid", id, "uid", user.GetUID())
90101
return err
91102
}
92103
return nil

0 commit comments

Comments
 (0)