2022-04-21 07:06:22 +00:00
package cassandradb
import (
"fmt"
"log"
"github.com/authorizerdev/authorizer/server/constants"
"github.com/authorizerdev/authorizer/server/db/models"
"github.com/authorizerdev/authorizer/server/envstore"
cansandraDriver "github.com/gocql/gocql"
)
type provider struct {
db * cansandraDriver . Session
}
2022-04-21 12:24:33 +00:00
// KeySpace for the cassandra database
var KeySpace string
2022-04-21 07:06:22 +00:00
// NewProvider to initialize arangodb connection
func NewProvider ( ) ( * provider , error ) {
dbURL := envstore . EnvStoreObj . GetStringStoreEnvVariable ( constants . EnvKeyDatabaseURL )
2022-04-21 12:24:33 +00:00
KeySpace = envstore . EnvStoreObj . GetStringStoreEnvVariable ( constants . EnvKeyDatabaseName )
2022-04-21 07:06:22 +00:00
cassandraClient := cansandraDriver . NewCluster ( dbURL )
2022-04-21 12:24:33 +00:00
2022-04-21 07:06:22 +00:00
cassandraClient . RetryPolicy = & cansandraDriver . SimpleRetryPolicy {
NumRetries : 3 ,
}
cassandraClient . Consistency = cansandraDriver . Quorum
session , err := cassandraClient . CreateSession ( )
if err != nil {
log . Println ( "Error while creating connection to cassandra db" , err )
return nil , err
}
keyspaceQuery := fmt . Sprintf ( "CREATE KEYSPACE IF NOT EXISTS %s WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor':1}" ,
2022-04-21 12:24:33 +00:00
KeySpace )
2022-04-21 07:06:22 +00:00
err = session . Query ( keyspaceQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create keyspace:" , err )
return nil , err
}
// make sure collections are present
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))" ,
2022-04-21 12:24:33 +00:00
KeySpace , models . Collections . Env )
2022-04-21 07:06:22 +00:00
err = session . Query ( envCollectionQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create env collection:" , err )
return nil , err
}
2022-04-21 12:24:33 +00:00
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 )
2022-04-21 07:06:22 +00:00
err = session . Query ( sessionCollectionQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create session collection:" , err )
return nil , err
}
2022-04-22 14:26:55 +00:00
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, nickname 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))" , KeySpace , models . Collections . User )
2022-04-21 07:06:22 +00:00
err = session . Query ( userCollectionQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create user collection:" , err )
return nil , err
}
2022-04-22 14:26:55 +00:00
userIndexQuery := fmt . Sprintf ( "CREATE INDEX IF NOT EXISTS authorizer_user_email ON %s.%s (email)" , KeySpace , models . Collections . User )
err = session . Query ( userIndexQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create user index:" , err )
return nil , err
}
2022-04-21 07:06:22 +00:00
// token is reserved keyword in cassandra, hence we need to use jwt_token
2022-04-22 14:26:55 +00:00
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))" , KeySpace , models . Collections . VerificationRequest )
2022-04-21 07:06:22 +00:00
err = session . Query ( verificationRequestCollectionQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create verification request collection:" , err )
return nil , err
}
2022-04-22 14:26:55 +00:00
verificationRequestIndexQuery := fmt . Sprintf ( "CREATE INDEX IF NOT EXISTS authorizer_verification_request_email ON %s.%s (email)" , KeySpace , models . Collections . VerificationRequest )
err = session . Query ( verificationRequestIndexQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create verification_requests index:" , err )
return nil , err
}
verificationRequestIndexQuery = fmt . Sprintf ( "CREATE INDEX IF NOT EXISTS authorizer_verification_request_identifier ON %s.%s (identifier)" , KeySpace , models . Collections . VerificationRequest )
err = session . Query ( verificationRequestIndexQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create verification_requests index:" , err )
return nil , err
}
verificationRequestIndexQuery = fmt . Sprintf ( "CREATE INDEX IF NOT EXISTS authorizer_verification_request_jwt_token ON %s.%s (jwt_token)" , KeySpace , models . Collections . VerificationRequest )
err = session . Query ( verificationRequestIndexQuery ) . Exec ( )
if err != nil {
log . Println ( "Unable to create verification_requests index:" , err )
return nil , err
}
2022-04-21 07:06:22 +00:00
return & provider {
db : session ,
} , err
}