Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add support for surreal-db #299

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions server/constants/db_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ const (
DbTypePlanetScaleDB = "planetscale"
// DbTypeDynamoDB is the Dynamo database type
DbTypeDynamoDB = "dynamodb"
// DbTypeSurrealDB is the SurrealDB database type
DbTypeSurrealDB = "surrealdb"
)
13 changes: 12 additions & 1 deletion server/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/authorizerdev/authorizer/server/db/providers/dynamodb"
"github.com/authorizerdev/authorizer/server/db/providers/mongodb"
"github.com/authorizerdev/authorizer/server/db/providers/sql"
"github.com/authorizerdev/authorizer/server/db/providers/surrealdb"
"github.com/authorizerdev/authorizer/server/memorystore"
)

Expand All @@ -21,11 +22,12 @@ func InitDB() error {

envs := memorystore.RequiredEnvStoreObj.GetRequiredEnv()

isSQL := envs.DatabaseType != constants.DbTypeArangodb && envs.DatabaseType != constants.DbTypeMongodb && envs.DatabaseType != constants.DbTypeCassandraDB && envs.DatabaseType != constants.DbTypeScyllaDB && envs.DatabaseType != constants.DbTypeDynamoDB
isSQL := envs.DatabaseType != constants.DbTypeArangodb && envs.DatabaseType != constants.DbTypeMongodb && envs.DatabaseType != constants.DbTypeCassandraDB && envs.DatabaseType != constants.DbTypeScyllaDB && envs.DatabaseType != constants.DbTypeDynamoDB && envs.DatabaseType != constants.DbTypeSurrealDB
isArangoDB := envs.DatabaseType == constants.DbTypeArangodb
isMongoDB := envs.DatabaseType == constants.DbTypeMongodb
isCassandra := envs.DatabaseType == constants.DbTypeCassandraDB || envs.DatabaseType == constants.DbTypeScyllaDB
isDynamoDB := envs.DatabaseType == constants.DbTypeDynamoDB
isSurrealDB := envs.DatabaseType == constants.DbTypeSurrealDB

if isSQL {
log.Info("Initializing SQL Driver for: ", envs.DatabaseType)
Expand Down Expand Up @@ -72,5 +74,14 @@ func InitDB() error {
}
}

if isSurrealDB {
log.Info("Initializing Surreal Driver")
Provider, err = surrealdb.NewProvider()
if err != nil {
log.Fatal("Failed to initialize Surreal driver: ", err)
return err
}
}

return nil
}
8 changes: 8 additions & 0 deletions server/db/models/email_templates.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package models

import (
"encoding/json"
"strings"

"github.com/authorizerdev/authorizer/server/graph/model"
Expand Down Expand Up @@ -35,3 +36,10 @@ func (e *EmailTemplate) AsAPIEmailTemplate() *model.EmailTemplate {
UpdatedAt: refs.NewInt64Ref(e.UpdatedAt),
}
}

func (e *EmailTemplate) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(e) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
9 changes: 9 additions & 0 deletions server/db/models/env.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package models

import "encoding/json"

// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation

// Env model for db
Expand All @@ -11,3 +13,10 @@ type Env struct {
UpdatedAt int64 `json:"updated_at" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"`
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at" dynamo:"created_at"`
}

func (env *Env) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(env) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
4 changes: 4 additions & 0 deletions server/db/models/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ type CollectionList struct {
}

var (
// DB/Namespace
DBNamespace = "authorizer"
// Identifier field used for surreal db
SurrealDbIdentifier = "identifier"
// Prefix for table name / collection names
Prefix = "authorizer_"
// Collections / Tables available for authorizer in the database (used for dbs other than gorm)
Expand Down
9 changes: 9 additions & 0 deletions server/db/models/otp.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package models

import "encoding/json"

// OTP model for database
type OTP struct {
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty" dynamo:"key,omitempty"` // for arangodb
Expand All @@ -14,3 +16,10 @@ type OTP struct {
type Paging struct {
ID string `json:"id,omitempty" dynamo:"id,hash"`
}

func (o *OTP) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(o) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
9 changes: 9 additions & 0 deletions server/db/models/session.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package models

import "encoding/json"

// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation

// Session model for db
Expand All @@ -12,3 +14,10 @@ type Session struct {
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at" dynamo:"created_at"`
UpdatedAt int64 `json:"updated_at" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"`
}

func (s *Session) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(s) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
8 changes: 8 additions & 0 deletions server/db/models/verification_requests.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package models

import (
"encoding/json"
"strings"

"github.com/authorizerdev/authorizer/server/graph/model"
Expand Down Expand Up @@ -41,3 +42,10 @@ func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequ
UpdatedAt: refs.NewInt64Ref(v.UpdatedAt),
}
}

func (v *VerificationRequest) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(v) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
7 changes: 7 additions & 0 deletions server/db/models/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,10 @@ func (w *Webhook) AsAPIWebhook() *model.Webhook {
UpdatedAt: refs.NewInt64Ref(w.UpdatedAt),
}
}

func (w *Webhook) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(w) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
8 changes: 8 additions & 0 deletions server/db/models/webhook_log.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package models

import (
"encoding/json"
"strings"

"github.com/authorizerdev/authorizer/server/graph/model"
Expand Down Expand Up @@ -37,3 +38,10 @@ func (w *WebhookLog) AsAPIWebhookLog() *model.WebhookLog {
UpdatedAt: refs.NewInt64Ref(w.UpdatedAt),
}
}

func (w *WebhookLog) ToMap() map[string]interface{} {
res := map[string]interface{}{}
data, _ := json.Marshal(w) // Convert to a json string
json.Unmarshal(data, &res) // Convert to a map
return res
}
48 changes: 48 additions & 0 deletions server/db/providers/surrealdb/email_template.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package surrealdb

import (
"context"
"time"

"github.com/authorizerdev/authorizer/server/db/models"
"github.com/authorizerdev/authorizer/server/graph/model"
"github.com/google/uuid"
)

// AddEmailTemplate to add EmailTemplate
func (p *provider) AddEmailTemplate(ctx context.Context, emailTemplate models.EmailTemplate) (*model.EmailTemplate, error) {
if emailTemplate.ID == "" {
emailTemplate.ID = uuid.New().String()
}

emailTemplate.Key = emailTemplate.ID
emailTemplate.CreatedAt = time.Now().Unix()
emailTemplate.UpdatedAt = time.Now().Unix()
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()
return emailTemplate.AsAPIEmailTemplate(), nil
}

// ListEmailTemplates to list EmailTemplate
func (p *provider) ListEmailTemplate(ctx context.Context, pagination model.Pagination) (*model.EmailTemplates, error) {
return nil, nil
}

// GetEmailTemplateByID to get EmailTemplate by id
func (p *provider) GetEmailTemplateByID(ctx context.Context, emailTemplateID string) (*model.EmailTemplate, error) {
return nil, nil
}

// GetEmailTemplateByEventName to get EmailTemplate by event_name
func (p *provider) GetEmailTemplateByEventName(ctx context.Context, eventName string) (*model.EmailTemplate, error) {
return nil, nil
}

// DeleteEmailTemplate to delete EmailTemplate
func (p *provider) DeleteEmailTemplate(ctx context.Context, emailTemplate *model.EmailTemplate) error {
return nil
}
68 changes: 68 additions & 0 deletions server/db/providers/surrealdb/env.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package surrealdb

import (
"context"
"fmt"
"time"

"github.com/authorizerdev/authorizer/server/db/models"
"github.com/google/uuid"
"github.com/surrealdb/surrealdb.go"
)

// AddEnv to save environment information in database
func (p *provider) AddEnv(ctx context.Context, env models.Env) (models.Env, error) {
if env.ID == "" {
env.ID = uuid.New().String()
}

env.CreatedAt = time.Now().Unix()
env.UpdatedAt = time.Now().Unix()

mapData := env.ToMap()
mapData[models.SurrealDbIdentifier] = env.ID

_, err := p.db.Create(models.Collections.Env, mapData)
if err != nil {
return env, err
}
return env, nil
}

// UpdateEnv to update environment information in database
func (p *provider) UpdateEnv(ctx context.Context, env models.Env) (models.Env, error) {
env.UpdatedAt = time.Now().Unix()

mapData := env.ToMap()
mapData[models.SurrealDbIdentifier] = env.ID

_, err := p.db.Update(models.Collections.Env, mapData)
if err != nil {
return env, err
}
return env, nil
}

// GetEnv to get environment information from database
func (p *provider) GetEnv(ctx context.Context) (models.Env, error) {
var env models.Env

mapData, err := p.db.Select(models.Collections.Env)
if err != nil {
return env, err
}

envs := []models.Env{}
err = surrealdb.Unmarshal(mapData, &envs)
if err != nil {
return env, err
}

if len(envs) > 0 {
env = envs[0]
} else {
return env, fmt.Errorf("env record not found")
}

return env, nil
}
22 changes: 22 additions & 0 deletions server/db/providers/surrealdb/otp.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package surrealdb

import (
"context"

"github.com/authorizerdev/authorizer/server/db/models"
)

// UpsertOTP to add or update otp
func (p *provider) UpsertOTP(ctx context.Context, otp *models.OTP) (*models.OTP, error) {
return nil, 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
}

// DeleteOTP to delete otp
func (p *provider) DeleteOTP(ctx context.Context, otp *models.OTP) error {
return nil
}
42 changes: 42 additions & 0 deletions server/db/providers/surrealdb/provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package surrealdb

import (
"github.com/authorizerdev/authorizer/server/db/models"
"github.com/authorizerdev/authorizer/server/memorystore"
"github.com/surrealdb/surrealdb.go"
)

// TODO change following provider to new db provider
type provider struct {
db *surrealdb.DB
}

// NewProvider returns a new SQL provider
// TODO change following provider to new db provider
func NewProvider() (*provider, error) {
dbURL := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseURL
db, err := surrealdb.New(dbURL)
if err != nil {
return nil, err
}

dbUsername := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseUsername
dbPassword := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabasePassword

_, err = db.Signin(map[string]interface{}{
"user": dbUsername,
"pass": dbPassword,
})
if err != nil {
return nil, err
}

_, err = db.Use(models.DBNamespace, models.DBNamespace)
if err != nil {
return nil, err
}

return &provider{
db: db,
}, nil
}
25 changes: 25 additions & 0 deletions server/db/providers/surrealdb/session.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package surrealdb

import (
"context"
"time"

"github.com/authorizerdev/authorizer/server/db/models"
"github.com/google/uuid"
)

// AddSession to save session information in database
func (p *provider) AddSession(ctx context.Context, session models.Session) error {
if session.ID == "" {
session.ID = uuid.New().String()
}

session.CreatedAt = time.Now().Unix()
session.UpdatedAt = time.Now().Unix()
return nil
}

// DeleteSession to delete session information from database
func (p *provider) DeleteSession(ctx context.Context, userId string) error {
return nil
}
Loading