Skip to content

Commit 7f47177

Browse files
authored
Merge pull request #359 from MussieT/feat/sms_confirmation
Feat/sms confirmation
2 parents 6c9b359 + 9fb0054 commit 7f47177

26 files changed

+1134
-7
lines changed

server/constants/env.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,13 @@ const (
176176
// EnvKeyDefaultAuthorizeResponseMode key for env variable DEFAULT_AUTHORIZE_RESPONSE_MODE
177177
// This env is used for setting default response mode in authorize handler
178178
EnvKeyDefaultAuthorizeResponseMode = "DEFAULT_AUTHORIZE_RESPONSE_MODE"
179+
180+
// Phone verification setting
181+
EnvKeyDisablePhoneVerification = "DISABLE_PHONE_VERIFICATION"
182+
183+
// Twilio env variables
184+
EnvKeyTwilioAPIKey = "TWILIO_API_KEY"
185+
EnvKeyTwilioAPISecret = "TWILIO_API_SECRET"
186+
EnvKeyTwilioAccountSID = "TWILIO_ACCOUNT_SID"
187+
EnvKeyTwilioSenderFrom = "TWILIO_SENDER_FROM"
179188
)

server/db/models/model.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type CollectionList struct {
1010
WebhookLog string
1111
EmailTemplate string
1212
OTP string
13+
SMSVerificationRequest string
1314
}
1415

1516
var (
@@ -25,5 +26,6 @@ var (
2526
WebhookLog: Prefix + "webhook_logs",
2627
EmailTemplate: Prefix + "email_templates",
2728
OTP: Prefix + "otps",
29+
SMSVerificationRequest: Prefix + "sms_verification_requests",
2830
}
2931
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package models
2+
3+
// SMS verification requests model for database
4+
type SMSVerificationRequest struct {
5+
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id" dynamo:"id,hash"`
6+
PhoneNumber string `gorm:"unique" json:"phone_number" bson:"phone_number" cql:"phone_number" dynamo:"phone_number" index:"phone_number,hash"`
7+
Code string `json:"code" bson:"code" cql:"code" dynamo:"code"`
8+
CodeExpiresAt int64 `json:"code_expires_at" bson:"code_expires_at" cql:"code_expires_at" dynamo:"code_expires_at"`
9+
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at" dynamo:"created_at"`
10+
UpdatedAt int64 `json:"updated_at" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"`
11+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package arangodb
2+
3+
import (
4+
"context"
5+
6+
"github.com/authorizerdev/authorizer/server/db/models"
7+
8+
)
9+
10+
// SMS verification Request
11+
func (p *provider) UpsertSMSRequest(ctx context.Context, sms_code *models.SMSVerificationRequest) (*models.SMSVerificationRequest, error) {
12+
return sms_code, nil
13+
}
14+
15+
func (p *provider) GetCodeByPhone(ctx context.Context, phoneNumber string) (*models.SMSVerificationRequest, error) {
16+
var sms_verification_request models.SMSVerificationRequest
17+
18+
return &sms_verification_request, nil
19+
}
20+
21+
func(p *provider) DeleteSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) error {
22+
return nil
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cassandradb
2+
3+
import (
4+
"context"
5+
6+
"github.com/authorizerdev/authorizer/server/db/models"
7+
8+
)
9+
10+
// SMS verification Request
11+
func (p *provider) UpsertSMSRequest(ctx context.Context, sms_code *models.SMSVerificationRequest) (*models.SMSVerificationRequest, error) {
12+
return sms_code, nil
13+
}
14+
15+
func (p *provider) GetCodeByPhone(ctx context.Context, phoneNumber string) (*models.SMSVerificationRequest, error) {
16+
var sms_verification_request models.SMSVerificationRequest
17+
18+
return &sms_verification_request, nil
19+
}
20+
21+
func(p *provider) DeleteSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) error {
22+
return nil
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package couchbase
2+
3+
import (
4+
"context"
5+
6+
"github.com/authorizerdev/authorizer/server/db/models"
7+
8+
)
9+
10+
// SMS verification Request
11+
func (p *provider) UpsertSMSRequest(ctx context.Context, sms_code *models.SMSVerificationRequest) (*models.SMSVerificationRequest, error) {
12+
return sms_code, nil
13+
}
14+
15+
func (p *provider) GetCodeByPhone(ctx context.Context, phoneNumber string) (*models.SMSVerificationRequest, error) {
16+
var sms_verification_request models.SMSVerificationRequest
17+
18+
return &sms_verification_request, nil
19+
}
20+
21+
func(p *provider) DeleteSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) error {
22+
return nil
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dynamodb
2+
3+
import (
4+
"context"
5+
6+
"github.com/authorizerdev/authorizer/server/db/models"
7+
8+
)
9+
10+
// SMS verification Request
11+
func (p *provider) UpsertSMSRequest(ctx context.Context, sms_code *models.SMSVerificationRequest) (*models.SMSVerificationRequest, error) {
12+
return sms_code, nil
13+
}
14+
15+
func (p *provider) GetCodeByPhone(ctx context.Context, phoneNumber string) (*models.SMSVerificationRequest, error) {
16+
var sms_verification_request models.SMSVerificationRequest
17+
18+
return &sms_verification_request, nil
19+
}
20+
21+
func(p *provider) DeleteSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) error {
22+
return nil
23+
}

server/db/providers/mongodb/provider.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,15 @@ func NewProvider() (*provider, error) {
119119
},
120120
}, options.CreateIndexes())
121121

122+
mongodb.CreateCollection(ctx, models.Collections.SMSVerificationRequest, options.CreateCollection())
123+
smsCollection := mongodb.Collection(models.Collections.SMSVerificationRequest, options.Collection())
124+
smsCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{
125+
{
126+
Keys: bson.M{"phone_number": 1},
127+
Options: options.Index().SetUnique(true).SetSparse(true),
128+
},
129+
}, options.CreateIndexes())
130+
122131
return &provider{
123132
db: mongodb,
124133
}, nil
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package mongodb
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/authorizerdev/authorizer/server/db/models"
8+
"github.com/google/uuid"
9+
"go.mongodb.org/mongo-driver/bson"
10+
"go.mongodb.org/mongo-driver/mongo/options"
11+
)
12+
13+
// SMS verification Request
14+
func (p *provider) UpsertSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) (*models.SMSVerificationRequest, error) {
15+
smsVerificationRequest, _ := p.GetCodeByPhone(ctx, smsRequest.PhoneNumber)
16+
shouldCreate := false
17+
18+
if smsVerificationRequest == nil {
19+
id := uuid.NewString()
20+
21+
smsVerificationRequest = &models.SMSVerificationRequest{
22+
ID: id,
23+
CreatedAt: time.Now().Unix(),
24+
Code: smsRequest.Code,
25+
PhoneNumber: smsRequest.PhoneNumber,
26+
CodeExpiresAt: smsRequest.CodeExpiresAt,
27+
}
28+
shouldCreate = true
29+
}
30+
31+
smsVerificationRequest.UpdatedAt = time.Now().Unix()
32+
smsRequestCollection := p.db.Collection(models.Collections.SMSVerificationRequest, options.Collection())
33+
34+
var err error
35+
if shouldCreate {
36+
_, err = smsRequestCollection.InsertOne(ctx, smsVerificationRequest)
37+
} else {
38+
_, err = smsRequestCollection.UpdateOne(ctx, bson.M{"phone_number": bson.M{"$eq": smsRequest.PhoneNumber}}, bson.M{"$set": smsVerificationRequest}, options.MergeUpdateOptions())
39+
}
40+
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
return smsVerificationRequest, nil
46+
}
47+
48+
func (p *provider) GetCodeByPhone(ctx context.Context, phoneNumber string) (*models.SMSVerificationRequest, error) {
49+
var smsVerificationRequest models.SMSVerificationRequest
50+
51+
smsRequestCollection := p.db.Collection(models.Collections.SMSVerificationRequest, options.Collection())
52+
err := smsRequestCollection.FindOne(ctx, bson.M{"phone_number": phoneNumber}).Decode(&smsVerificationRequest)
53+
54+
if err != nil {
55+
return nil, err
56+
}
57+
58+
return &smsVerificationRequest, nil
59+
}
60+
61+
func (p *provider) DeleteSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) error {
62+
smsVerificationRequests := p.db.Collection(models.Collections.SMSVerificationRequest, options.Collection())
63+
_, err := smsVerificationRequests.DeleteOne(nil, bson.M{"_id": smsRequest.ID}, options.Delete())
64+
if err != nil {
65+
return err
66+
}
67+
68+
return nil
69+
}

server/db/providers/providers.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,11 @@ type Provider interface {
8484
GetOTPByEmail(ctx context.Context, emailAddress string) (*models.OTP, error)
8585
// DeleteOTP to delete otp
8686
DeleteOTP(ctx context.Context, otp *models.OTP) error
87+
88+
// Upsert SMS code request
89+
UpsertSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) (*models.SMSVerificationRequest, error)
90+
// Get sms code by phone number
91+
GetCodeByPhone(ctx context.Context, phoneNumber string) (*models.SMSVerificationRequest, error)
92+
// Delete sms
93+
DeleteSMSRequest(ctx context.Context, smsRequest *models.SMSVerificationRequest) error
8794
}

0 commit comments

Comments
 (0)