diff --git a/server/constants/db_types.go b/server/constants/db_types.go index 9cdef99..9298bbd 100644 --- a/server/constants/db_types.go +++ b/server/constants/db_types.go @@ -13,4 +13,6 @@ const ( DbTypeArangodb = "arangodb" // DbTypeMongodb is the mongodb database type DbTypeMongodb = "mongodb" + // DbTypeFaunadb is the faunadb database type + DbTypeFaunadb = "faunadb" ) diff --git a/server/db/db.go b/server/db/db.go index ca14e16..e4a44a5 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -6,6 +6,7 @@ import ( "github.com/authorizerdev/authorizer/server/constants" "github.com/authorizerdev/authorizer/server/db/providers" "github.com/authorizerdev/authorizer/server/db/providers/arangodb" + "github.com/authorizerdev/authorizer/server/db/providers/faunadb" "github.com/authorizerdev/authorizer/server/db/providers/mongodb" "github.com/authorizerdev/authorizer/server/db/providers/sql" "github.com/authorizerdev/authorizer/server/envstore" @@ -17,9 +18,10 @@ var Provider providers.Provider func InitDB() { var err error - isSQL := envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeArangodb && envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeMongodb + isSQL := envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeArangodb && envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeMongodb && envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeFaunadb isArangoDB := envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) == constants.DbTypeArangodb isMongoDB := envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) == constants.DbTypeMongodb + isFaunaDB := envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) == constants.DbTypeFaunadb if isSQL { Provider, err = sql.NewProvider() @@ -41,4 +43,11 @@ func InitDB() { log.Fatal("=> error setting arangodb provider:", err) } } + + if isFaunaDB { + Provider, err = faunadb.NewProvider() + if err != nil { + log.Fatal("=> error setting arangodb provider:", err) + } + } } diff --git a/server/db/providers/faunadb/env.go b/server/db/providers/faunadb/env.go new file mode 100644 index 0000000..10a4b42 --- /dev/null +++ b/server/db/providers/faunadb/env.go @@ -0,0 +1,51 @@ +package faunadb + +import ( + "log" + "time" + + f "github.com/fauna/faunadb-go/v5/faunadb" + "github.com/google/uuid" + + "github.com/authorizerdev/authorizer/server/db/models" +) + +// AddEnv to save environment information in database +func (p *provider) AddEnv(env models.Env) (models.Env, error) { + if env.ID == "" { + env.ID = uuid.New().String() + env.Key = env.ID + } + + env.CreatedAt = time.Now().Unix() + env.UpdatedAt = time.Now().Unix() + + _, err := p.db.Query( + f.Create( + f.Collection(models.Collections.Env), + f.Obj{ + "data": env, + }, + ), + ) + if err != nil { + log.Println("error adding env:", err) + return env, err + } + + return env, nil +} + +// UpdateEnv to update environment information in database +func (p *provider) UpdateEnv(env models.Env) (models.Env, error) { + env.UpdatedAt = time.Now().Unix() + + return env, nil +} + +// GetEnv to get environment information from database +func (p *provider) GetEnv() (models.Env, error) { + var env models.Env + + return env, nil +} diff --git a/server/db/providers/faunadb/faunadb.go b/server/db/providers/faunadb/faunadb.go new file mode 100644 index 0000000..a724904 --- /dev/null +++ b/server/db/providers/faunadb/faunadb.go @@ -0,0 +1,164 @@ +package faunadb + +import ( + "errors" + "log" + "strings" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/envstore" + f "github.com/fauna/faunadb-go/v5/faunadb" +) + +type provider struct { + db *f.FaunaClient +} + +// NewProvider returns a new faunadb provider +func NewProvider() (*provider, error) { + secret := "" + dbURL := "https://db.fauna.com" + + // secret,url is stored in DATABASE_URL + dbURLSplit := strings.Split(envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseURL), ":") + secret = dbURLSplit[0] + + if len(dbURLSplit) > 1 { + dbURL = dbURLSplit[1] + } + + client := f.NewFaunaClient(secret, f.Endpoint(dbURL)) + if client == nil { + return nil, errors.New("failed to create faunadb client") + } + + _, err := client.Query( + f.CreateCollection(f.Obj{"name": models.Collections.Env})) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "env_id", + "source": f.Collection(models.Collections.Env), + "values": "_id", + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "env_key", + "source": f.Collection(models.Collections.Env), + "values": "_key", + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateCollection(f.Obj{"name": models.Collections.User})) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "_id", + "source": f.Collection(models.Collections.User), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "_key", + "source": f.Collection(models.Collections.User), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "email", + "source": f.Collection(models.Collections.User), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateCollection(f.Obj{"name": models.Collections.Session})) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "_id", + "source": f.Collection(models.Collections.Session), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "_key", + "source": f.Collection(models.Collections.Session), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateCollection(f.Obj{"name": models.Collections.VerificationRequest})) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "_id", + "source": f.Collection(models.Collections.VerificationRequest), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + _, err = client.Query( + f.CreateIndex( + f.Obj{ + "name": "_key", + "source": f.Collection(models.Collections.VerificationRequest), + "unique": true, + })) + if err != nil { + log.Println("error:", err) + } + + return &provider{ + db: client, + }, nil +} diff --git a/server/db/providers/faunadb/session.go b/server/db/providers/faunadb/session.go new file mode 100644 index 0000000..ca1a35e --- /dev/null +++ b/server/db/providers/faunadb/session.go @@ -0,0 +1,25 @@ +package faunadb + +import ( + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/google/uuid" +) + +// AddSession to save session information in database +func (p *provider) AddSession(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(userId string) error { + return nil +} diff --git a/server/db/providers/faunadb/user.go b/server/db/providers/faunadb/user.go new file mode 100644 index 0000000..038f9bc --- /dev/null +++ b/server/db/providers/faunadb/user.go @@ -0,0 +1,60 @@ +package faunadb + +import ( + "strings" + "time" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/envstore" + "github.com/google/uuid" +) + +// AddUser to save user information in database +func (p *provider) AddUser(user models.User) (models.User, error) { + if user.ID == "" { + user.ID = uuid.New().String() + } + + if user.Roles == "" { + user.Roles = strings.Join(envstore.EnvInMemoryStoreObj.GetSliceStoreEnvVariable(constants.EnvKeyDefaultRoles), ",") + } + + user.CreatedAt = time.Now().Unix() + user.UpdatedAt = time.Now().Unix() + + return user, nil +} + +// UpdateUser to update user information in database +func (p *provider) UpdateUser(user models.User) (models.User, error) { + user.UpdatedAt = time.Now().Unix() + + return user, nil +} + +// DeleteUser to delete user information from database +func (p *provider) DeleteUser(user models.User) error { + return nil +} + +// ListUsers to get list of users from database +func (p *provider) ListUsers() ([]models.User, error) { + var users []models.User + + return users, nil +} + +// GetUserByEmail to get user information from database using email address +func (p *provider) GetUserByEmail(email string) (models.User, error) { + var user models.User + + return user, nil +} + +// GetUserByID to get user information from database using user ID +func (p *provider) GetUserByID(id string) (models.User, error) { + var user models.User + + return user, nil +} diff --git a/server/db/providers/faunadb/verification_requests.go b/server/db/providers/faunadb/verification_requests.go new file mode 100644 index 0000000..a6f2410 --- /dev/null +++ b/server/db/providers/faunadb/verification_requests.go @@ -0,0 +1,46 @@ +package faunadb + +import ( + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/google/uuid" +) + +// AddVerification to save verification request in database +func (p *provider) AddVerificationRequest(verificationRequest models.VerificationRequest) (models.VerificationRequest, error) { + if verificationRequest.ID == "" { + verificationRequest.ID = uuid.New().String() + } + + verificationRequest.CreatedAt = time.Now().Unix() + verificationRequest.UpdatedAt = time.Now().Unix() + + return verificationRequest, nil +} + +// GetVerificationRequestByToken to get verification request from database using token +func (p *provider) GetVerificationRequestByToken(token string) (models.VerificationRequest, error) { + var verificationRequest models.VerificationRequest + + return verificationRequest, nil +} + +// GetVerificationRequestByEmail to get verification request by email from database +func (p *provider) GetVerificationRequestByEmail(email string, identifier string) (models.VerificationRequest, error) { + var verificationRequest models.VerificationRequest + + return verificationRequest, nil +} + +// ListVerificationRequests to get list of verification requests from database +func (p *provider) ListVerificationRequests() ([]models.VerificationRequest, error) { + var verificationRequests []models.VerificationRequest + + return verificationRequests, nil +} + +// DeleteVerificationRequest to delete verification request from database +func (p *provider) DeleteVerificationRequest(verificationRequest models.VerificationRequest) error { + return nil +} diff --git a/server/go.mod b/server/go.mod index 0ca8653..2857063 100644 --- a/server/go.mod +++ b/server/go.mod @@ -6,6 +6,7 @@ require ( github.com/99designs/gqlgen v0.14.0 github.com/arangodb/go-driver v1.2.1 github.com/coreos/go-oidc/v3 v3.1.0 + github.com/fauna/faunadb-go/v5 v5.0.0-beta // indirect github.com/gin-contrib/location v0.0.2 github.com/gin-gonic/gin v1.7.2 github.com/go-playground/validator/v10 v10.8.0 // indirect diff --git a/server/go.sum b/server/go.sum index 5f7a7f4..1b80f5a 100644 --- a/server/go.sum +++ b/server/go.sum @@ -79,6 +79,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fauna/faunadb-go/v5 v5.0.0-beta h1:qjig7OPEsDPH/DJuHWIrOboreYd5aLQnSCzLgHDpnck= +github.com/fauna/faunadb-go/v5 v5.0.0-beta/go.mod h1:eoEA8JUERBnzK5/8Rxnetzx326ImTZ8c++wi2GQwrEU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -456,6 +458,7 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=