11package cassandradb
22
33import (
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
3167func (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
3798func (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
42105func (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
47139func (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
54150func (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