/
user.go
108 lines (83 loc) · 2.65 KB
/
user.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
package store
import (
"github.com/mpieczaba/nimbus/models"
"github.com/mpieczaba/nimbus/store/scopes"
"github.com/mpieczaba/nimbus/utils"
"github.com/vektah/gqlparser/v2/gqlerror"
"gorm.io/gorm"
)
type UserStore struct {
db *gorm.DB
}
func NewUserStore(db *gorm.DB) *UserStore {
return &UserStore{
db: db,
}
}
func (s *UserStore) GetUser(query interface{}, args ...interface{}) (*models.User, error) {
var user models.User
if err := s.db.Where(query, args...).First(&user).Error; err != nil {
return nil, gqlerror.Errorf("User not found!")
}
return &user, nil
}
func (s *UserStore) GetAllUsers(after, before *string, first, last *int, username *string) (*models.UserConnection, error) {
var userConnection models.UserConnection
var users []*models.User
if err := s.db.Scopes(
scopes.NameLike(models.User{}, "username", username),
scopes.Paginate(after, before, first, last),
).Find(&users).Error; err != nil {
return nil, gqlerror.Errorf("Invalid pagination input or internal database error occurred while getting all users!")
}
pageInfo := models.PageInfo{
HasNextPage: false,
HasPreviousPage: false,
}
if len(users) > 0 {
userConnection.Nodes = users
for _, user := range users {
cursor, err := utils.EncodeCursor(user.ID)
if err != nil {
return nil, gqlerror.Errorf("An error occurred while getting all users!")
}
userConnection.Edges = append(userConnection.Edges, &models.UserEdge{
Cursor: cursor,
Node: user,
})
}
if err := s.db.Scopes(
scopes.NameLike(models.User{}, "username", username),
scopes.GetBefore(users[0].ID),
).First(&models.User{}).Error; err == nil {
pageInfo.HasPreviousPage = true
}
if err := s.db.Scopes(
scopes.NameLike(models.User{}, "username", username),
scopes.GetAfter(users[len(users)-1].ID),
).First(&models.User{}).Error; err == nil {
pageInfo.HasNextPage = true
}
}
userConnection.PageInfo = &pageInfo
return &userConnection, nil
}
func (s *UserStore) CreateUser(user *models.User) (*models.User, error) {
if err := s.db.Create(user).Error; err != nil {
return nil, gqlerror.Errorf("Incorrect form data or user already exists!")
}
return user, nil
}
func (s *UserStore) UpdateUser(user *models.User) (*models.User, error) {
if err := s.db.Save(user).Error; err != nil {
return nil, gqlerror.Errorf("Incorrect form data or user already exists!")
}
return user, nil
}
func (s *UserStore) DeleteUser(query interface{}, args ...interface{}) (*models.User, error) {
var user models.User
if err := s.db.Where(query, args...).First(&user).Delete(&user).Error; err != nil {
return nil, gqlerror.Errorf("User not found!")
}
return &user, nil
}