From 22ae3bca540978cd2381db2afb422173e24134d9 Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Sat, 23 Jul 2022 16:06:52 +0530 Subject: [PATCH] feat: add otp implementation for arangodb --- server/db/providers/arangodb/otp.go | 49 +++++++++++++++++++++++- server/db/providers/arangodb/provider.go | 14 +++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/server/db/providers/arangodb/otp.go b/server/db/providers/arangodb/otp.go index 77fc675..0b546c5 100644 --- a/server/db/providers/arangodb/otp.go +++ b/server/db/providers/arangodb/otp.go @@ -2,6 +2,7 @@ package arangodb import ( "context" + "fmt" "time" "github.com/authorizerdev/authorizer/server/db/models" @@ -18,21 +19,67 @@ func (p *provider) AddOTP(ctx context.Context, otp *models.OTP) (*models.OTP, er otp.CreatedAt = time.Now().Unix() otp.UpdatedAt = time.Now().Unix() + otpCollection, _ := p.db.Collection(ctx, models.Collections.OTP) + _, err := otpCollection.CreateDocument(ctx, otp) + if err != nil { + return nil, err + } + return otp, nil } // UpdateOTP to update otp for a given email address func (p *provider) UpdateOTP(ctx context.Context, otp *models.OTP) (*models.OTP, error) { otp.UpdatedAt = time.Now().Unix() + + otpCollection, _ := p.db.Collection(ctx, models.Collections.OTP) + meta, err := otpCollection.UpdateDocument(ctx, otp.Key, otp) + if err != nil { + return nil, err + } + + otp.Key = meta.Key + otp.ID = meta.ID.String() return otp, nil } // GetOTPByEmail to get otp for a given email address func (p *provider) GetOTPByEmail(ctx context.Context, emailAddress string) (*models.OTP, error) { - return nil, nil + var otp *models.OTP + query := fmt.Sprintf("FOR d in %s FILTER d.email == @email RETURN d", models.Collections.OTP) + bindVars := map[string]interface{}{ + "email": emailAddress, + } + + cursor, err := p.db.Query(ctx, query, bindVars) + if err != nil { + return nil, err + } + defer cursor.Close() + + for { + if !cursor.HasMore() { + if otp.Key == "" { + return nil, fmt.Errorf("email template not found") + } + break + } + _, err := cursor.ReadDocument(ctx, otp) + if err != nil { + return nil, err + } + } + + return otp, nil } // DeleteOTP to delete otp func (p *provider) DeleteOTP(ctx context.Context, otp *models.OTP) error { + otpCollection, _ := p.db.Collection(ctx, models.Collections.OTP) + _, err := otpCollection.RemoveDocument(ctx, otp.ID) + if err != nil { + return err + } + return nil } diff --git a/server/db/providers/arangodb/provider.go b/server/db/providers/arangodb/provider.go index a228cf8..6c26525 100644 --- a/server/db/providers/arangodb/provider.go +++ b/server/db/providers/arangodb/provider.go @@ -148,6 +148,20 @@ func NewProvider() (*provider, error) { Sparse: true, }) + otpCollectionExists, err := arangodb.CollectionExists(ctx, models.Collections.OTP) + if !otpCollectionExists { + _, err = arangodb.CreateCollection(ctx, models.Collections.OTP, nil) + if err != nil { + return nil, err + } + } + + otpCollection, _ := arangodb.Collection(nil, models.Collections.OTP) + otpCollection.EnsureHashIndex(ctx, []string{"email"}, &arangoDriver.EnsureHashIndexOptions{ + Unique: true, + Sparse: true, + }) + return &provider{ db: arangodb, }, err