@@ -32,28 +32,39 @@ func (p *provider) AddUser(user models.User) (models.User, error) {
3232 if err != nil {
3333 return user , err
3434 }
35+
36+ // use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling
37+ decoder := json .NewDecoder (strings .NewReader (string (bytes )))
38+ decoder .UseNumber ()
3539 userMap := map [string ]interface {}{}
36- json .Unmarshal (bytes , & userMap )
40+ err = decoder .Decode (& userMap )
41+ if err != nil {
42+ return user , err
43+ }
3744
3845 fields := "("
3946 values := "("
4047 for key , value := range userMap {
4148 if value != nil {
42- fields += key + ","
49+ if key == "_id" {
50+ fields += "id,"
51+ } else {
52+ fields += key + ","
53+ }
4354
4455 valueType := reflect .TypeOf (value )
45- if valueType .Kind () == reflect . String {
46- values += "'" + value .(string ) + "',"
56+ if valueType .Name () == "string" {
57+ values += fmt . Sprintf ( "'%s'," , value .(string ))
4758 } else {
48- values += fmt .Sprintf ("%v" , value ) + ","
59+ values += fmt .Sprintf ("%v, " , value )
4960 }
5061 }
5162 }
5263
5364 fields = fields [:len (fields )- 1 ] + ")"
5465 values = values [:len (values )- 1 ] + ")"
5566
56- query := fmt .Sprintf ("INSERT INTO %s %s VALUES %s" , KeySpace + "." + models .Collections .User , fields , values )
67+ query := fmt .Sprintf ("INSERT INTO %s %s VALUES %s IF NOT EXISTS " , KeySpace + "." + models .Collections .User , fields , values )
5768
5869 err = p .db .Query (query ).Exec ()
5970 if err != nil {
@@ -66,26 +77,46 @@ func (p *provider) AddUser(user models.User) (models.User, error) {
6677// UpdateUser to update user information in database
6778func (p * provider ) UpdateUser (user models.User ) (models.User , error ) {
6879 user .UpdatedAt = time .Now ().Unix ()
80+
6981 bytes , err := json .Marshal (user )
7082 if err != nil {
7183 return user , err
7284 }
85+ // use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling
86+ decoder := json .NewDecoder (strings .NewReader (string (bytes )))
87+ decoder .UseNumber ()
7388 userMap := map [string ]interface {}{}
74- json .Unmarshal (bytes , & userMap )
89+ err = decoder .Decode (& userMap )
90+ if err != nil {
91+ return user , err
92+ }
7593
7694 updateFields := ""
7795 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- }
96+ if value != nil && key != "_id" {
97+ }
98+
99+ if key == "_id" {
100+ continue
101+ }
102+
103+ if value == nil {
104+ updateFields += fmt .Sprintf ("%s = null," , key )
105+ continue
106+ }
107+
108+ valueType := reflect .TypeOf (value )
109+ if valueType .Name () == "string" {
110+ updateFields += fmt .Sprintf ("%s = '%s', " , key , value .(string ))
111+ } else {
112+ updateFields += fmt .Sprintf ("%s = %v, " , key , value )
85113 }
86114 }
115+ updateFields = strings .Trim (updateFields , " " )
116+ updateFields = strings .TrimSuffix (updateFields , "," )
87117
88118 query := fmt .Sprintf ("UPDATE %s SET %s WHERE id = '%s'" , KeySpace + "." + models .Collections .User , updateFields , user .ID )
119+
89120 err = p .db .Query (query ).Exec ()
90121 if err != nil {
91122 return user , err
@@ -97,8 +128,8 @@ func (p *provider) UpdateUser(user models.User) (models.User, error) {
97128// DeleteUser to delete user information from database
98129func (p * provider ) DeleteUser (user models.User ) error {
99130 query := fmt .Sprintf ("DELETE FROM %s WHERE id = '%s'" , KeySpace + "." + models .Collections .User , user .ID )
100-
101- return p . db . Query ( query ). Exec ()
131+ err := p . db . Query ( query ). Exec ()
132+ return err
102133}
103134
104135// ListUsers to get list of users from database
@@ -114,7 +145,7 @@ func (p *provider) ListUsers(pagination model.Pagination) (*model.Users, error)
114145 // there is no offset in cassandra
115146 // so we fetch till limit + offset
116147 // 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 )
148+ 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 LIMIT %d" , KeySpace + "." + models .Collections .User , pagination .Limit + pagination .Offset )
118149
119150 scanner := p .db .Query (query ).Iter ().Scanner ()
120151 counter := int64 (0 )
0 commit comments