Skip to content

Commit fd52d6e

Browse files
committed
feat: add casandradb provider
1 parent 325aa88 commit fd52d6e

File tree

12 files changed

+106
-65
lines changed

12 files changed

+106
-65
lines changed

server/constants/db_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ const (
1818
// DbTypeMariaDB is the mariadb database type
1919
DbTypeMariaDB = "mariadb"
2020
// DbTypeCassandra is the cassandra database type
21-
DbTypeCassandra = "cassandra"
21+
DbTypeCassandraDB = "cassandradb"
2222
)

server/db/db.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"github.com/authorizerdev/authorizer/server/constants"
55
"github.com/authorizerdev/authorizer/server/db/providers"
66
"github.com/authorizerdev/authorizer/server/db/providers/arangodb"
7+
"github.com/authorizerdev/authorizer/server/db/providers/cassandradb"
78
"github.com/authorizerdev/authorizer/server/db/providers/mongodb"
89
"github.com/authorizerdev/authorizer/server/db/providers/sql"
910
"github.com/authorizerdev/authorizer/server/envstore"
@@ -15,9 +16,10 @@ var Provider providers.Provider
1516
func InitDB() error {
1617
var err error
1718

18-
isSQL := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeArangodb && envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeMongodb
19+
isSQL := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeArangodb && envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeMongodb && envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) != constants.DbTypeCassandraDB
1920
isArangoDB := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) == constants.DbTypeArangodb
2021
isMongoDB := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) == constants.DbTypeMongodb
22+
isCassandra := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseType) == constants.DbTypeCassandraDB
2123

2224
if isSQL {
2325
Provider, err = sql.NewProvider()
@@ -40,5 +42,12 @@ func InitDB() error {
4042
}
4143
}
4244

45+
if isCassandra {
46+
Provider, err = cassandradb.NewProvider()
47+
if err != nil {
48+
return err
49+
}
50+
}
51+
4352
return nil
4453
}

server/db/models/env.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package models
22

3+
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
4+
35
// Env model for db
46
type Env struct {
57
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty"` // for arangodb

server/db/models/session.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package models
22

3+
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
4+
35
// Session model for db
46
type Session struct {
57
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty"` // for arangodb

server/db/models/user.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"github.com/authorizerdev/authorizer/server/graph/model"
77
)
88

9+
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
10+
911
// User model for db
1012
type User struct {
1113
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty"` // for arangodb
@@ -25,9 +27,9 @@ type User struct {
2527
PhoneNumberVerifiedAt *int64 `json:"phone_number_verified_at" bson:"phone_number_verified_at" cql:"phone_number_verified_at"`
2628
Picture *string `gorm:"type:text" json:"picture" bson:"picture" cql:"picture"`
2729
Roles string `json:"roles" bson:"roles" cql:"roles"`
30+
RevokedTimestamp *int64 `json:"revoked_timestamp" bson:"revoked_timestamp" cql:"revoked_timestamp"`
2831
UpdatedAt int64 `json:"updated_at" bson:"updated_at" cql:"updated_at"`
2932
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at"`
30-
RevokedTimestamp *int64 `json:"revoked_timestamp" bson:"revoked_timestamp" cql:"revoked_timestamp"`
3133
}
3234

3335
func (user *User) AsAPIUser() *model.User {
@@ -53,8 +55,8 @@ func (user *User) AsAPIUser() *model.User {
5355
PhoneNumberVerified: &isPhoneVerified,
5456
Picture: user.Picture,
5557
Roles: strings.Split(user.Roles, ","),
58+
RevokedTimestamp: revokedTimestamp,
5659
CreatedAt: &createdAt,
5760
UpdatedAt: &updatedAt,
58-
RevokedTimestamp: revokedTimestamp,
5961
}
6062
}

server/db/models/verification_requests.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ package models
22

33
import "github.com/authorizerdev/authorizer/server/graph/model"
44

5+
// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation
6+
57
// VerificationRequest model for db
68
type VerificationRequest struct {
79
Key string `json:"_key,omitempty" bson:"_key" cql:"_key,omitempty"` // for arangodb
810
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id"`
9-
Token string `gorm:"type:text" json:"token" bson:"token" cql:"token"`
11+
Token string `gorm:"type:text" json:"token" bson:"token" cql:"jwt_token"` // token is reserved keyword in cassandra
1012
Identifier string `gorm:"uniqueIndex:idx_email_identifier;type:varchar(64)" json:"identifier" bson:"identifier" cql:"identifier"`
1113
ExpiresAt int64 `json:"expires_at" bson:"expires_at" cql:"expires_at"`
12-
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at"`
13-
UpdatedAt int64 `json:"updated_at" bson:"updated_at" cql:"updated_at"`
1414
Email string `gorm:"uniqueIndex:idx_email_identifier;type:varchar(256)" json:"email" bson:"email" cql:"email"`
1515
Nonce string `gorm:"type:text" json:"nonce" bson:"nonce" cql:"nonce"`
1616
RedirectURI string `gorm:"type:text" json:"redirect_uri" bson:"redirect_uri" cql:"redirect_uri"`
17+
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at"`
18+
UpdatedAt int64 `json:"updated_at" bson:"updated_at" cql:"updated_at"`
1719
}
1820

1921
func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequest {
@@ -30,10 +32,10 @@ func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequ
3032
Token: &token,
3133
Identifier: &identifier,
3234
Expires: &expires,
33-
CreatedAt: &createdAt,
34-
UpdatedAt: &updatedAt,
3535
Email: &email,
3636
Nonce: &nonce,
3737
RedirectURI: &redirectURI,
38+
CreatedAt: &createdAt,
39+
UpdatedAt: &updatedAt,
3840
}
3941
}

server/db/providers/cassandra/provider.go

Lines changed: 0 additions & 52 deletions
This file was deleted.

server/db/providers/cassandra/env.go renamed to server/db/providers/cassandradb/env.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cassandra
1+
package cassandradb
22

33
import (
44
"time"
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package cassandradb
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/authorizerdev/authorizer/server/constants"
8+
"github.com/authorizerdev/authorizer/server/db/models"
9+
"github.com/authorizerdev/authorizer/server/envstore"
10+
cansandraDriver "github.com/gocql/gocql"
11+
)
12+
13+
type provider struct {
14+
db *cansandraDriver.Session
15+
}
16+
17+
// NewProvider to initialize arangodb connection
18+
func NewProvider() (*provider, error) {
19+
dbURL := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseURL)
20+
keySpace := envstore.EnvStoreObj.GetStringStoreEnvVariable(constants.EnvKeyDatabaseName)
21+
cassandraClient := cansandraDriver.NewCluster(dbURL)
22+
// cassandraClient.Keyspace = keySpace
23+
cassandraClient.RetryPolicy = &cansandraDriver.SimpleRetryPolicy{
24+
NumRetries: 3,
25+
}
26+
cassandraClient.Consistency = cansandraDriver.Quorum
27+
28+
session, err := cassandraClient.CreateSession()
29+
if err != nil {
30+
log.Println("Error while creating connection to cassandra db", err)
31+
return nil, err
32+
}
33+
34+
keyspaceQuery := fmt.Sprintf("CREATE KEYSPACE IF NOT EXISTS %s WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor':1}",
35+
keySpace)
36+
err = session.Query(keyspaceQuery).Exec()
37+
if err != nil {
38+
log.Println("Unable to create keyspace:", err)
39+
return nil, err
40+
}
41+
42+
// make sure collections are present
43+
envCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, env text, hash text, updated_at bigint, created_at bigint, PRIMARY KEY (id))",
44+
keySpace, models.Collections.Env)
45+
err = session.Query(envCollectionQuery).Exec()
46+
if err != nil {
47+
log.Println("Unable to create env collection:", err)
48+
return nil, err
49+
}
50+
51+
sessionCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, user_id text, user_agent text, ip text, updated_at bigint, created_at bigint, PRIMARY KEY (id))", keySpace, models.Collections.Session)
52+
err = session.Query(sessionCollectionQuery).Exec()
53+
if err != nil {
54+
log.Println("Unable to create session collection:", err)
55+
return nil, err
56+
}
57+
58+
userCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, email text, email_verified_at bigint, password text, signup_methods text, given_name text, family_name text, middle_name text, nick_name text, gender text, birthdate text, phone_number text, phone_number_verified_at bigint, picture text, roles text, updated_at bigint, created_at bigint, revoked_timestamp bigint, PRIMARY KEY (id, email))", keySpace, models.Collections.User)
59+
err = session.Query(userCollectionQuery).Exec()
60+
if err != nil {
61+
log.Println("Unable to create user collection:", err)
62+
return nil, err
63+
}
64+
65+
// token is reserved keyword in cassandra, hence we need to use jwt_token
66+
verificationRequestCollectionQuery := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s.%s (id text, jwt_token text, identifier text, expires_at bigint, email text, nonce text, redirect_uri text, created_at bigint, updated_at bigint, PRIMARY KEY (id, identifier, email))", keySpace, models.Collections.VerificationRequest)
67+
err = session.Query(verificationRequestCollectionQuery).Exec()
68+
if err != nil {
69+
log.Println("Unable to create verification request collection:", err)
70+
return nil, err
71+
}
72+
73+
return &provider{
74+
db: session,
75+
}, err
76+
}

server/db/providers/cassandra/session.go renamed to server/db/providers/cassandradb/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cassandra
1+
package cassandradb
22

33
import (
44
"time"

0 commit comments

Comments
 (0)