generated from broadinstitute/golang-project-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
middleware_user_store.go
74 lines (69 loc) · 2.18 KB
/
middleware_user_store.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
package v2models
import (
go_errors "errors"
"fmt"
"github.com/broadinstitute/sherlock/internal/auth/auth_models"
"github.com/broadinstitute/sherlock/internal/errors"
"github.com/jackc/pgconn"
"github.com/jackc/pgerrcode"
"github.com/rs/zerolog/log"
"gorm.io/gorm"
)
func NewMiddlewareUserStore(db *gorm.DB) *MiddlewareUserStore {
return &MiddlewareUserStore{
modelStore: &ModelStore[User]{db: db, internalModelStore: userStore},
}
}
type MiddlewareUserStore struct {
modelStore *ModelStore[User]
}
func (s *MiddlewareUserStore) GetOrCreateUser(email, googleID string) (User, error) {
query := User{
StoredControlledUserFields: auth_models.StoredControlledUserFields{
Email: email,
},
}
existing, err := s.modelStore.getIfExists(s.modelStore.db, query)
if err != nil {
return User{}, err
} else if existing != nil {
if existing.GoogleID != googleID {
return User{}, fmt.Errorf("(%s) incoming google ID '%s' mismatched with stored '%s', please contact DevOps", errors.BadRequest, googleID, existing.GoogleID)
} else {
return *existing, nil
}
} else {
log.Info().Msgf("AUTH | automatically adding new user %s (ID %s)", email, googleID)
user, _, err := s.modelStore.create(s.modelStore.db, User{
StoredControlledUserFields: auth_models.StoredControlledUserFields{
Email: email,
GoogleID: googleID,
},
}, nil)
if err != nil {
var pgErr *pgconn.PgError
if go_errors.As(err, &pgErr) && pgErr != nil && pgerrcode.UniqueViolation == pgErr.Code {
existing, err = s.modelStore.getIfExists(s.modelStore.db, query)
if err != nil {
return User{}, err
} else if existing != nil {
if existing.GoogleID != googleID {
return User{}, fmt.Errorf("(%s) incoming google ID '%s' mismatched with stored '%s', please contact DevOps", errors.BadRequest, googleID, existing.GoogleID)
} else {
return *existing, nil
}
}
}
return User{}, err
}
return user, nil
}
}
func (s *MiddlewareUserStore) GetGithubUserIfExists(githubID string) (*User, error) {
query := User{
StoredControlledUserFields: auth_models.StoredControlledUserFields{
GithubID: &githubID,
},
}
return s.modelStore.getIfExists(s.modelStore.db, query)
}