/
user_mixin.go
48 lines (42 loc) 路 1.41 KB
/
user_mixin.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
package models
import (
"context"
"strings"
"cloud.google.com/go/spanner"
"github.com/MixinNetwork/bot-api-go-client"
"github.com/MixinNetwork/ocean.one/example/config"
"github.com/MixinNetwork/ocean.one/example/session"
"github.com/MixinNetwork/ocean.one/example/uuid"
)
func (current *User) ConnectMixin(ctx context.Context, authorizationCode string) (*User, error) {
accessToken, scope, _, err := bot.OAuthGetAccessToken(ctx, config.ClientId, config.ClientSecret, authorizationCode, "", "")
if err != nil {
return nil, session.ServerError(ctx, err)
}
if !strings.Contains(scope, "PROFILE:READ") {
return nil, session.ForbiddenError(ctx)
}
me, err := bot.UserMe(ctx, accessToken)
if err != nil {
return nil, session.ServerError(ctx, err)
}
userId, err := uuid.FromString(me.UserId)
if err != nil {
return nil, session.ForbiddenError(ctx)
}
current.MixinId = spanner.NullString{Valid: true, StringVal: userId.String() + ":" + me.IdentityNumber}
err = session.Database(ctx).Apply(ctx, []*spanner.Mutation{
spanner.Update("users", []string{"user_id", "mixin_id"}, []interface{}{current.UserId, current.MixinId}),
}, "users", "UPDATE", "ConnectMixin")
if err != nil {
return nil, session.TransactionError(ctx, err)
}
return current, nil
}
func (current *User) MixinIdentityNumber() string {
pair := strings.Split(current.MixinId.StringVal, ":")
if len(pair) == 1 {
return ""
}
return pair[1]
}