From 1f7eee43e286acdb018ef1690104d90e02c06554 Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Sun, 17 Jul 2022 11:37:04 +0530 Subject: [PATCH] feat: add email template implementation for arangodb provider --- .../db/providers/arangodb/email_template.go | 113 +++++++++++++++++- 1 file changed, 108 insertions(+), 5 deletions(-) diff --git a/server/db/providers/arangodb/email_template.go b/server/db/providers/arangodb/email_template.go index 6e1f25a..4e64762 100644 --- a/server/db/providers/arangodb/email_template.go +++ b/server/db/providers/arangodb/email_template.go @@ -2,8 +2,11 @@ package arangodb import ( "context" + "fmt" "time" + "github.com/arangodb/go-driver" + arangoDriver "github.com/arangodb/go-driver" "github.com/authorizerdev/authorizer/server/db/models" "github.com/authorizerdev/authorizer/server/graph/model" "github.com/google/uuid" @@ -18,31 +21,131 @@ func (p *provider) AddEmailTemplate(ctx context.Context, emailTemplate models.Em emailTemplate.Key = emailTemplate.ID emailTemplate.CreatedAt = time.Now().Unix() emailTemplate.UpdatedAt = time.Now().Unix() + + emailTemplateCollection, _ := p.db.Collection(ctx, models.Collections.EmailTemplate) + _, err := emailTemplateCollection.CreateDocument(ctx, emailTemplate) + if err != nil { + return nil, err + } return emailTemplate.AsAPIEmailTemplate(), nil } // UpdateEmailTemplate to update EmailTemplate func (p *provider) UpdateEmailTemplate(ctx context.Context, emailTemplate models.EmailTemplate) (*model.EmailTemplate, error) { emailTemplate.UpdatedAt = time.Now().Unix() + + emailTemplateCollection, _ := p.db.Collection(ctx, models.Collections.EmailTemplate) + meta, err := emailTemplateCollection.UpdateDocument(ctx, emailTemplate.Key, emailTemplate) + if err != nil { + return nil, err + } + + emailTemplate.Key = meta.Key + emailTemplate.ID = meta.ID.String() return emailTemplate.AsAPIEmailTemplate(), nil } // ListEmailTemplates to list EmailTemplate func (p *provider) ListEmailTemplate(ctx context.Context, pagination model.Pagination) (*model.EmailTemplates, error) { - return nil, nil + emailTemplates := []*model.EmailTemplate{} + + query := fmt.Sprintf("FOR d in %s SORT d.created_at DESC LIMIT %d, %d RETURN d", models.Collections.EmailTemplate, pagination.Offset, pagination.Limit) + + sctx := driver.WithQueryFullCount(ctx) + cursor, err := p.db.Query(sctx, query, nil) + if err != nil { + return nil, err + } + defer cursor.Close() + + paginationClone := pagination + paginationClone.Total = cursor.Statistics().FullCount() + + for { + var emailTemplate models.EmailTemplate + meta, err := cursor.ReadDocument(ctx, &emailTemplate) + + if arangoDriver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + + if meta.Key != "" { + emailTemplates = append(emailTemplates, emailTemplate.AsAPIEmailTemplate()) + } + } + + return &model.EmailTemplates{ + Pagination: &paginationClone, + EmailTemplates: emailTemplates, + }, nil } // GetEmailTemplateByID to get EmailTemplate by id -func (p *provider) GetEmailTemplateByID(ctx context.Context, EmailTemplateID string) (*model.EmailTemplate, error) { - return nil, nil +func (p *provider) GetEmailTemplateByID(ctx context.Context, emailTemplateID string) (*model.EmailTemplate, error) { + var emailTemplate models.EmailTemplate + query := fmt.Sprintf("FOR d in %s FILTER d._key == @email_template_id RETURN d", models.Collections.EmailTemplate) + bindVars := map[string]interface{}{ + "email_template_id": emailTemplateID, + } + + cursor, err := p.db.Query(ctx, query, bindVars) + if err != nil { + return nil, err + } + defer cursor.Close() + + for { + if !cursor.HasMore() { + if emailTemplate.Key == "" { + return nil, fmt.Errorf("email template not found") + } + break + } + _, err := cursor.ReadDocument(ctx, &emailTemplate) + if err != nil { + return nil, err + } + } + return emailTemplate.AsAPIEmailTemplate(), nil } // GetEmailTemplateByEventName to get EmailTemplate by event_name func (p *provider) GetEmailTemplateByEventName(ctx context.Context, eventName string) (*model.EmailTemplate, error) { - return nil, nil + var emailTemplate models.EmailTemplate + query := fmt.Sprintf("FOR d in %s FILTER d.event_name == @event_name RETURN d", models.Collections.EmailTemplate) + bindVars := map[string]interface{}{ + "event_name": eventName, + } + + cursor, err := p.db.Query(ctx, query, bindVars) + if err != nil { + return nil, err + } + defer cursor.Close() + + for { + if !cursor.HasMore() { + if emailTemplate.Key == "" { + return nil, fmt.Errorf("email template not found") + } + break + } + _, err := cursor.ReadDocument(ctx, &emailTemplate) + if err != nil { + return nil, err + } + } + return emailTemplate.AsAPIEmailTemplate(), nil } // DeleteEmailTemplate to delete EmailTemplate -func (p *provider) DeleteEmailTemplate(ctx context.Context, EmailTemplate *model.EmailTemplate) error { +func (p *provider) DeleteEmailTemplate(ctx context.Context, emailTemplate *model.EmailTemplate) error { + eventTemplateCollection, _ := p.db.Collection(ctx, models.Collections.EmailTemplate) + _, err := eventTemplateCollection.RemoveDocument(ctx, emailTemplate.ID) + if err != nil { + return err + } return nil }