Skip to content

Commit aaf0831

Browse files
committed
feat: add users queries
1 parent 27cb41c commit aaf0831

File tree

1 file changed

+104
-4
lines changed
  • server/db/providers/cassandradb

1 file changed

+104
-4
lines changed

server/db/providers/cassandradb/user.go

Lines changed: 104 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package cassandradb
22

33
import (
4+
"encoding/json"
5+
"fmt"
6+
"reflect"
47
"strings"
58
"time"
69

710
"github.com/authorizerdev/authorizer/server/constants"
811
"github.com/authorizerdev/authorizer/server/db/models"
912
"github.com/authorizerdev/authorizer/server/envstore"
1013
"github.com/authorizerdev/authorizer/server/graph/model"
14+
"github.com/gocql/gocql"
1115
"github.com/google/uuid"
1216
)
1317

@@ -24,35 +28,131 @@ func (p *provider) AddUser(user models.User) (models.User, error) {
2428
user.CreatedAt = time.Now().Unix()
2529
user.UpdatedAt = time.Now().Unix()
2630

31+
bytes, err := json.Marshal(user)
32+
if err != nil {
33+
return user, err
34+
}
35+
userMap := map[string]interface{}{}
36+
json.Unmarshal(bytes, &userMap)
37+
38+
fields := "("
39+
values := "("
40+
for key, value := range userMap {
41+
if value != nil {
42+
fields += key + ","
43+
44+
valueType := reflect.TypeOf(value)
45+
if valueType.Kind() == reflect.String {
46+
values += "'" + value.(string) + "',"
47+
} else {
48+
values += fmt.Sprintf("%v", value) + ","
49+
}
50+
}
51+
}
52+
53+
fields = fields[:len(fields)-1] + ")"
54+
values = values[:len(values)-1] + ")"
55+
56+
query := fmt.Sprintf("INSERT INTO %s %s VALUES %s", KeySpace+"."+models.Collections.User, fields, values)
57+
58+
err = p.db.Query(query).Exec()
59+
if err != nil {
60+
return user, err
61+
}
62+
2763
return user, nil
2864
}
2965

3066
// UpdateUser to update user information in database
3167
func (p *provider) UpdateUser(user models.User) (models.User, error) {
3268
user.UpdatedAt = time.Now().Unix()
69+
bytes, err := json.Marshal(user)
70+
if err != nil {
71+
return user, err
72+
}
73+
userMap := map[string]interface{}{}
74+
json.Unmarshal(bytes, &userMap)
75+
76+
updateFields := ""
77+
for key, value := range userMap {
78+
if value != nil {
79+
valueType := reflect.TypeOf(value)
80+
if valueType.Kind() == reflect.String {
81+
updateFields += key + " = '" + value.(string) + "',"
82+
} else {
83+
updateFields += key + " = " + fmt.Sprintf("%v", value) + ","
84+
}
85+
}
86+
}
87+
88+
query := fmt.Sprintf("UPDATE %s SET %s WHERE id = '%s'", KeySpace+"."+models.Collections.User, updateFields, user.ID)
89+
err = p.db.Query(query).Exec()
90+
if err != nil {
91+
return user, err
92+
}
93+
3394
return user, nil
3495
}
3596

3697
// DeleteUser to delete user information from database
3798
func (p *provider) DeleteUser(user models.User) error {
38-
return nil
99+
query := fmt.Sprintf("DELETE FROM %s WHERE id = '%s'", KeySpace+"."+models.Collections.User, user.ID)
100+
101+
return p.db.Query(query).Exec()
39102
}
40103

41104
// ListUsers to get list of users from database
42105
func (p *provider) ListUsers(pagination model.Pagination) (*model.Users, error) {
43-
return nil, nil
106+
responseUsers := []*model.User{}
107+
paginationClone := pagination
108+
totalCountQuery := fmt.Sprintf(`SELECT COUNT(*) FROM %s`, KeySpace+"."+models.Collections.User)
109+
err := p.db.Query(totalCountQuery).Consistency(gocql.One).Scan(&paginationClone.Total)
110+
if err != nil {
111+
return nil, err
112+
}
113+
114+
// there is no offset in cassandra
115+
// so we fetch till limit + offset
116+
// and return the results from offset to limit
117+
query := fmt.Sprintf("SELECT id, email, email_verified_at, password, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, created_at, updated_at FROM %s ORDER BY created_at DESC LIMIT %d", KeySpace+"."+models.Collections.User, pagination.Limit+pagination.Offset)
118+
119+
scanner := p.db.Query(query).Iter().Scanner()
120+
counter := int64(0)
121+
for scanner.Next() {
122+
if counter >= pagination.Offset {
123+
var user models.User
124+
err := scanner.Scan(&user.ID, &user.Email, &user.EmailVerifiedAt, &user.Password, &user.SignupMethods, &user.GivenName, &user.FamilyName, &user.MiddleName, &user.Nickname, &user.Birthdate, &user.PhoneNumber, &user.PhoneNumberVerifiedAt, &user.Picture, &user.Roles, &user.RevokedTimestamp, &user.CreatedAt, &user.UpdatedAt)
125+
if err != nil {
126+
return nil, err
127+
}
128+
responseUsers = append(responseUsers, user.AsAPIUser())
129+
}
130+
counter++
131+
}
132+
return &model.Users{
133+
Users: responseUsers,
134+
Pagination: &paginationClone,
135+
}, nil
44136
}
45137

46138
// GetUserByEmail to get user information from database using email address
47139
func (p *provider) GetUserByEmail(email string) (models.User, error) {
48140
var user models.User
49-
141+
query := fmt.Sprintf("SELECT id, email, email_verified_at, password, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, created_at, updated_at FROM %s WHERE email = '%s' LIMIT 1", KeySpace+"."+models.Collections.User, email)
142+
err := p.db.Query(query).Consistency(gocql.One).Scan(&user.ID, &user.Email, &user.EmailVerifiedAt, &user.Password, &user.SignupMethods, &user.GivenName, &user.FamilyName, &user.MiddleName, &user.Nickname, &user.Birthdate, &user.PhoneNumber, &user.PhoneNumberVerifiedAt, &user.Picture, &user.Roles, &user.RevokedTimestamp, &user.CreatedAt, &user.UpdatedAt)
143+
if err != nil {
144+
return user, err
145+
}
50146
return user, nil
51147
}
52148

53149
// GetUserByID to get user information from database using user ID
54150
func (p *provider) GetUserByID(id string) (models.User, error) {
55151
var user models.User
56-
152+
query := fmt.Sprintf("SELECT id, email, email_verified_at, password, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, created_at, updated_at FROM %s WHERE id = '%s' LIMIT 1", KeySpace+"."+models.Collections.User, id)
153+
err := p.db.Query(query).Consistency(gocql.One).Scan(&user.ID, &user.Email, &user.EmailVerifiedAt, &user.Password, &user.SignupMethods, &user.GivenName, &user.FamilyName, &user.MiddleName, &user.Nickname, &user.Birthdate, &user.PhoneNumber, &user.PhoneNumberVerifiedAt, &user.Picture, &user.Roles, &user.RevokedTimestamp, &user.CreatedAt, &user.UpdatedAt)
154+
if err != nil {
155+
return user, err
156+
}
57157
return user, nil
58158
}

0 commit comments

Comments
 (0)