@@ -15,6 +15,7 @@ import (
1515 "github.com/authorizerdev/authorizer/server/db/models"
1616 "github.com/authorizerdev/authorizer/server/graph/model"
1717 "github.com/authorizerdev/authorizer/server/memorystore"
18+ "github.com/authorizerdev/authorizer/server/refs"
1819)
1920
2021// AddUser to save user information in database
@@ -32,6 +33,12 @@ func (p *provider) AddUser(ctx context.Context, user models.User) (models.User,
3233 user .Roles = defaultRoles
3334 }
3435
36+ if user .PhoneNumber != nil && strings .TrimSpace (refs .StringValue (user .PhoneNumber )) != "" {
37+ if u , _ := p .GetUserByPhoneNumber (ctx , refs .StringValue (user .PhoneNumber )); u != nil && u .ID != user .ID {
38+ return user , fmt .Errorf ("user with given phone number already exists" )
39+ }
40+ }
41+
3542 user .CreatedAt = time .Now ().Unix ()
3643 user .UpdatedAt = time .Now ().Unix ()
3744 userCollection , _ := p .db .Collection (ctx , models .Collections .User )
@@ -48,6 +55,7 @@ func (p *provider) AddUser(ctx context.Context, user models.User) (models.User,
4855// UpdateUser to update user information in database
4956func (p * provider ) UpdateUser (ctx context.Context , user models.User ) (models.User , error ) {
5057 user .UpdatedAt = time .Now ().Unix ()
58+
5159 collection , _ := p .db .Collection (ctx , models .Collections .User )
5260 meta , err := collection .UpdateDocument (ctx , user .Key , user )
5361 if err != nil {
@@ -211,3 +219,34 @@ func (p *provider) UpdateUsers(ctx context.Context, data map[string]interface{},
211219
212220 return nil
213221}
222+
223+ // GetUserByPhoneNumber to get user information from database using phone number
224+ func (p * provider ) GetUserByPhoneNumber (ctx context.Context , phoneNumber string ) (* models.User , error ) {
225+ var user models.User
226+
227+ query := fmt .Sprintf ("FOR d in %s FILTER d.phone_number == @phone_number RETURN d" , models .Collections .User )
228+ bindVars := map [string ]interface {}{
229+ "phone_number" : phoneNumber ,
230+ }
231+
232+ cursor , err := p .db .Query (ctx , query , bindVars )
233+ if err != nil {
234+ return nil , err
235+ }
236+ defer cursor .Close ()
237+
238+ for {
239+ if ! cursor .HasMore () {
240+ if user .Key == "" {
241+ return nil , fmt .Errorf ("user not found" )
242+ }
243+ break
244+ }
245+ _ , err := cursor .ReadDocument (ctx , & user )
246+ if err != nil {
247+ return nil , err
248+ }
249+ }
250+
251+ return & user , nil
252+ }
0 commit comments