-
Notifications
You must be signed in to change notification settings - Fork 5
/
accounts.go
117 lines (100 loc) · 3.25 KB
/
accounts.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
110
111
112
113
114
115
116
117
package impl
import (
"context"
"fmt"
"git.containerum.net/ch/user-manager/pkg/clients"
"git.containerum.net/ch/user-manager/pkg/db"
"git.containerum.net/ch/user-manager/pkg/models"
cherry "git.containerum.net/ch/user-manager/pkg/umErrors"
"github.com/containerum/utils/httputil"
"github.com/sirupsen/logrus"
)
func (u *serverImpl) AddBoundAccount(ctx context.Context, request models.OAuthLoginRequest) error {
userID := httputil.MustGetUserID(ctx)
u.log.WithFields(logrus.Fields{
"userID": userID,
"resource": request.Resource,
"access_token": request.AccessToken,
}).Infof("adding bound account: %#v", request)
user, err := u.svc.DB.GetUserByID(ctx, userID)
if err := u.handleDBError(err); err != nil {
u.log.WithError(err)
return cherry.ErrUnableBindAccount()
}
if err := u.loginUserChecks(ctx, user); err != nil {
return err
}
resource, exist := clients.OAuthClientByResource(request.Resource)
if !exist {
u.log.WithError(fmt.Errorf(resourceNotSupported, request.Resource))
return cherry.ErrUnableBindAccount().AddDetailsErr(fmt.Errorf(resourceNotSupported, request.Resource))
}
info, err := resource.GetUserInfo(ctx, request.AccessToken)
if err != nil {
u.log.WithError(err)
return cherry.ErrUnableBindAccount()
}
err = u.svc.DB.Transactional(ctx, func(ctx context.Context, tx db.DB) error {
return tx.BindAccount(ctx, user, models.OAuthResource(request.Resource), info.UserID)
})
if err := u.handleDBError(err); err != nil {
u.log.WithError(err)
return cherry.ErrUnableBindAccount()
}
return nil
}
func (u *serverImpl) GetBoundAccounts(ctx context.Context) (models.BoundAccounts, error) {
userID := httputil.MustGetUserID(ctx)
u.log.WithField("userId", userID).Infof("getting bound accounts")
user, err := u.svc.DB.GetUserByID(ctx, userID)
if err := u.handleDBError(err); err != nil {
u.log.WithError(err)
return nil, cherry.ErrUnableGetUserInfo()
}
if err := u.loginUserChecks(ctx, user); err != nil {
u.log.WithError(err)
return nil, err
}
var accounts *db.Accounts
accounts, err = u.svc.DB.GetUserBoundAccounts(ctx, user)
if err != nil {
u.log.WithError(err)
return nil, cherry.ErrUnableGetUserInfo()
}
accs := make(map[string]string)
if accounts != nil {
if accounts.Google.String != "" {
accs["google"] = accounts.Google.String
}
if accounts.Facebook.String != "" {
accs["facebook"] = accounts.Facebook.String
}
if accounts.Github.String != "" {
accs["github"] = accounts.Github.String
}
}
return accs, nil
}
func (u *serverImpl) DeleteBoundAccount(ctx context.Context, request models.BoundAccountDeleteRequest) error {
userID := httputil.MustGetUserID(ctx)
u.log.WithField("userId", userID).WithFields(logrus.Fields{
"resource": request.Resource,
}).Infof("deleting bound account: %#v", request)
user, err := u.svc.DB.GetUserByID(ctx, userID)
if err := u.handleDBError(err); err != nil {
u.log.WithError(err)
return err
}
if err := u.loginUserChecks(ctx, user); err != nil {
u.log.WithError(err)
return err
}
err = u.svc.DB.Transactional(ctx, func(ctx context.Context, tx db.DB) error {
return tx.DeleteBoundAccount(ctx, user, models.OAuthResource(request.Resource))
})
if err := u.handleDBError(err); err != nil {
u.log.WithError(err)
return err
}
return nil
}