111 lines
2.6 KiB
Go
111 lines
2.6 KiB
Go
package db
|
|
|
|
import (
|
|
"log"
|
|
|
|
arangoDriver "github.com/arangodb/go-driver"
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
|
"github.com/authorizerdev/authorizer/server/enum"
|
|
"github.com/google/uuid"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/schema"
|
|
)
|
|
|
|
type Manager interface {
|
|
SaveUser(user User) (User, error)
|
|
UpdateUser(user User) (User, error)
|
|
GetUsers() ([]User, error)
|
|
GetUserByEmail(email string) (User, error)
|
|
GetUserByID(email string) (User, error)
|
|
UpdateVerificationTime(verifiedAt int64, id uuid.UUID) error
|
|
AddVerification(verification VerificationRequest) (VerificationRequest, error)
|
|
GetVerificationByToken(token string) (VerificationRequest, error)
|
|
DeleteToken(email string) error
|
|
GetVerificationRequests() ([]VerificationRequest, error)
|
|
GetVerificationByEmail(email string) (VerificationRequest, error)
|
|
DeleteUser(email string) error
|
|
SaveRoles(roles []Role) error
|
|
SaveSession(session Session) error
|
|
}
|
|
|
|
type manager struct {
|
|
sqlDB *gorm.DB
|
|
arangodb *arangoDriver.Database
|
|
}
|
|
|
|
// mainly used by nosql dbs
|
|
type CollectionList struct {
|
|
User string
|
|
VerificationRequest string
|
|
Role string
|
|
Session string
|
|
}
|
|
|
|
var (
|
|
Mgr Manager
|
|
Prefix = "authorizer_"
|
|
Collections = CollectionList{
|
|
User: Prefix + "users",
|
|
VerificationRequest: Prefix + "verification_requests",
|
|
Role: Prefix + "roles",
|
|
Session: Prefix + "sessions",
|
|
}
|
|
)
|
|
|
|
func isSQL() bool {
|
|
return constants.DATABASE_TYPE != enum.Arangodb.String()
|
|
}
|
|
|
|
func InitDB() {
|
|
var sqlDB *gorm.DB
|
|
var err error
|
|
|
|
// sql db orm config
|
|
ormConfig := &gorm.Config{
|
|
NamingStrategy: schema.NamingStrategy{
|
|
TablePrefix: Prefix,
|
|
},
|
|
}
|
|
|
|
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.Arangodb.String():
|
|
arangodb, err := initArangodb()
|
|
if err != nil {
|
|
log.Fatal("error initing arangodb:", err)
|
|
}
|
|
Mgr = &manager{
|
|
sqlDB: nil,
|
|
arangodb: arangodb,
|
|
}
|
|
|
|
// check if collections exists
|
|
|
|
break
|
|
}
|
|
|
|
// common for all sql dbs that are configured via gorm
|
|
if isSQL() {
|
|
if err != nil {
|
|
log.Fatal("Failed to init sqlDB:", err)
|
|
} else {
|
|
sqlDB.AutoMigrate(&User{}, &VerificationRequest{}, &Role{}, &Session{})
|
|
}
|
|
Mgr = &manager{
|
|
sqlDB: sqlDB,
|
|
arangodb: nil,
|
|
}
|
|
}
|
|
}
|