130 lines
3.2 KiB
Go
130 lines
3.2 KiB
Go
package db
|
|
|
|
import (
|
|
"log"
|
|
|
|
arangoDriver "github.com/arangodb/go-driver"
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
|
"github.com/authorizerdev/authorizer/server/enum"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/driver/sqlserver"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/schema"
|
|
)
|
|
|
|
type Manager interface {
|
|
AddUser(user User) (User, error)
|
|
UpdateUser(user User) (User, error)
|
|
DeleteUser(user User) error
|
|
GetUsers() ([]User, error)
|
|
GetUserByEmail(email string) (User, error)
|
|
GetUserByID(email string) (User, error)
|
|
AddVerification(verification VerificationRequest) (VerificationRequest, error)
|
|
GetVerificationByToken(token string) (VerificationRequest, error)
|
|
DeleteVerificationRequest(verificationRequest VerificationRequest) error
|
|
GetVerificationRequests() ([]VerificationRequest, error)
|
|
GetVerificationByEmail(email string, identifier string) (VerificationRequest, error)
|
|
AddSession(session Session) error
|
|
DeleteUserSession(userId string) error
|
|
}
|
|
|
|
type manager struct {
|
|
sqlDB *gorm.DB
|
|
arangodb arangoDriver.Database
|
|
mongodb *mongo.Database
|
|
}
|
|
|
|
// mainly used by nosql dbs
|
|
type CollectionList struct {
|
|
User string
|
|
VerificationRequest string
|
|
Session string
|
|
}
|
|
|
|
var (
|
|
IsORMSupported bool
|
|
IsArangoDB bool
|
|
IsMongoDB bool
|
|
Mgr Manager
|
|
Prefix = "authorizer_"
|
|
Collections = CollectionList{
|
|
User: Prefix + "users",
|
|
VerificationRequest: Prefix + "verification_requests",
|
|
Session: Prefix + "sessions",
|
|
}
|
|
)
|
|
|
|
func InitDB() {
|
|
var sqlDB *gorm.DB
|
|
var err error
|
|
|
|
IsORMSupported = constants.DATABASE_TYPE != enum.Arangodb.String() && constants.DATABASE_TYPE != enum.Mongodb.String()
|
|
IsArangoDB = constants.DATABASE_TYPE == enum.Arangodb.String()
|
|
IsMongoDB = constants.DATABASE_TYPE == enum.Mongodb.String()
|
|
|
|
// sql db orm config
|
|
ormConfig := &gorm.Config{
|
|
NamingStrategy: schema.NamingStrategy{
|
|
TablePrefix: Prefix,
|
|
},
|
|
}
|
|
|
|
log.Println("db type:", constants.DATABASE_TYPE)
|
|
|
|
switch constants.DATABASE_TYPE {
|
|
case enum.Postgres.String():
|
|
sqlDB, err = gorm.Open(postgres.Open(constants.DATABASE_URL), ormConfig)
|
|
break
|
|
case enum.Sqlite.String():
|
|
sqlDB, err = gorm.Open(sqlite.Open(constants.DATABASE_URL), ormConfig)
|
|
break
|
|
case enum.Mysql.String():
|
|
sqlDB, err = gorm.Open(mysql.Open(constants.DATABASE_URL), ormConfig)
|
|
break
|
|
case enum.SQLServer.String():
|
|
sqlDB, err = gorm.Open(sqlserver.Open(constants.DATABASE_URL), ormConfig)
|
|
break
|
|
case enum.Arangodb.String():
|
|
arangodb, err := initArangodb()
|
|
if err != nil {
|
|
log.Fatal("error initializing arangodb:", err)
|
|
}
|
|
|
|
Mgr = &manager{
|
|
sqlDB: nil,
|
|
arangodb: arangodb,
|
|
mongodb: nil,
|
|
}
|
|
|
|
break
|
|
case enum.Mongodb.String():
|
|
mongodb, err := initMongodb()
|
|
if err != nil {
|
|
log.Fatal("error initializing mongodb connection:", err)
|
|
}
|
|
|
|
Mgr = &manager{
|
|
sqlDB: nil,
|
|
arangodb: nil,
|
|
mongodb: mongodb,
|
|
}
|
|
}
|
|
|
|
// common for all sql dbs that are configured via go-orm
|
|
if IsORMSupported {
|
|
if err != nil {
|
|
log.Fatal("Failed to init sqlDB:", err)
|
|
} else {
|
|
sqlDB.AutoMigrate(&User{}, &VerificationRequest{}, &Session{})
|
|
}
|
|
Mgr = &manager{
|
|
sqlDB: sqlDB,
|
|
arangodb: nil,
|
|
mongodb: nil,
|
|
}
|
|
}
|
|
}
|