feat: persist encrypted env
This commit is contained in:
@@ -17,7 +17,7 @@ import (
|
||||
func initArangodb() (arangoDriver.Database, error) {
|
||||
ctx := context.Background()
|
||||
conn, err := http.NewConnection(http.ConnectionConfig{
|
||||
Endpoints: []string{constants.DATABASE_URL},
|
||||
Endpoints: []string{constants.EnvData.DATABASE_URL},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -32,16 +32,16 @@ func initArangodb() (arangoDriver.Database, error) {
|
||||
|
||||
var arangodb driver.Database
|
||||
|
||||
arangodb_exists, err := arangoClient.DatabaseExists(nil, constants.DATABASE_NAME)
|
||||
arangodb_exists, err := arangoClient.DatabaseExists(nil, constants.EnvData.DATABASE_NAME)
|
||||
|
||||
if arangodb_exists {
|
||||
log.Println(constants.DATABASE_NAME + " db exists already")
|
||||
arangodb, err = arangoClient.Database(nil, constants.DATABASE_NAME)
|
||||
log.Println(constants.EnvData.DATABASE_NAME + " db exists already")
|
||||
arangodb, err = arangoClient.Database(nil, constants.EnvData.DATABASE_NAME)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
arangodb, err = arangoClient.CreateDatabase(nil, constants.DATABASE_NAME, nil)
|
||||
arangodb, err = arangoClient.CreateDatabase(nil, constants.EnvData.DATABASE_NAME, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -100,5 +100,15 @@ func initArangodb() (arangoDriver.Database, error) {
|
||||
Sparse: true,
|
||||
})
|
||||
|
||||
configCollectionExists, err := arangodb.CollectionExists(ctx, Collections.Config)
|
||||
if configCollectionExists {
|
||||
log.Println(Collections.Config + " collection exists already")
|
||||
} else {
|
||||
_, err = arangodb.CreateCollection(ctx, Collections.Config, nil)
|
||||
if err != nil {
|
||||
log.Println("error creating collection("+Collections.Config+"):", err)
|
||||
}
|
||||
}
|
||||
|
||||
return arangodb, err
|
||||
}
|
||||
|
161
server/db/config.go
Normal file
161
server/db/config.go
Normal file
@@ -0,0 +1,161 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
arangoDriver "github.com/arangodb/go-driver"
|
||||
"github.com/google/uuid"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Key string `json:"_key,omitempty" bson:"_key"` // for arangodb
|
||||
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id"`
|
||||
Config []byte `gorm:"type:text" json:"config" bson:"config"`
|
||||
Hash string `gorm:"type:hash" json:"hash" bson:"hash"`
|
||||
UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at" bson:"updated_at"`
|
||||
CreatedAt int64 `gorm:"autoCreateTime" json:"created_at" bson:"created_at"`
|
||||
}
|
||||
|
||||
// AddConfig function to add config
|
||||
func (mgr *manager) AddConfig(config Config) (Config, error) {
|
||||
if config.ID == "" {
|
||||
config.ID = uuid.New().String()
|
||||
}
|
||||
|
||||
if IsORMSupported {
|
||||
// copy id as value for fields required for mongodb & arangodb
|
||||
config.Key = config.ID
|
||||
result := mgr.sqlDB.Create(&config)
|
||||
|
||||
if result.Error != nil {
|
||||
log.Println("error adding config:", result.Error)
|
||||
return config, result.Error
|
||||
}
|
||||
}
|
||||
|
||||
if IsArangoDB {
|
||||
config.CreatedAt = time.Now().Unix()
|
||||
config.UpdatedAt = time.Now().Unix()
|
||||
configCollection, _ := mgr.arangodb.Collection(nil, Collections.Config)
|
||||
meta, err := configCollection.CreateDocument(arangoDriver.WithOverwrite(nil), config)
|
||||
if err != nil {
|
||||
log.Println("error adding config:", err)
|
||||
return config, err
|
||||
}
|
||||
config.Key = meta.Key
|
||||
config.ID = meta.ID.String()
|
||||
}
|
||||
|
||||
if IsMongoDB {
|
||||
config.CreatedAt = time.Now().Unix()
|
||||
config.UpdatedAt = time.Now().Unix()
|
||||
config.Key = config.ID
|
||||
configCollection := mgr.mongodb.Collection(Collections.Config, options.Collection())
|
||||
_, err := configCollection.InsertOne(nil, config)
|
||||
if err != nil {
|
||||
log.Println("error adding config:", err)
|
||||
return config, err
|
||||
}
|
||||
}
|
||||
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// UpdateConfig function to update config
|
||||
func (mgr *manager) UpdateConfig(config Config) (Config, error) {
|
||||
config.UpdatedAt = time.Now().Unix()
|
||||
|
||||
if IsORMSupported {
|
||||
result := mgr.sqlDB.Save(&config)
|
||||
|
||||
if result.Error != nil {
|
||||
log.Println("error updating config:", result.Error)
|
||||
return config, result.Error
|
||||
}
|
||||
}
|
||||
|
||||
if IsArangoDB {
|
||||
collection, _ := mgr.arangodb.Collection(nil, Collections.Config)
|
||||
meta, err := collection.UpdateDocument(nil, config.Key, config)
|
||||
if err != nil {
|
||||
log.Println("error updating config:", err)
|
||||
return config, err
|
||||
}
|
||||
|
||||
config.Key = meta.Key
|
||||
config.ID = meta.ID.String()
|
||||
}
|
||||
|
||||
if IsMongoDB {
|
||||
configCollection := mgr.mongodb.Collection(Collections.Config, options.Collection())
|
||||
_, err := configCollection.UpdateOne(nil, bson.M{"_id": bson.M{"$eq": config.ID}}, bson.M{"$set": config}, options.MergeUpdateOptions())
|
||||
if err != nil {
|
||||
log.Println("error updating config:", err)
|
||||
return config, err
|
||||
}
|
||||
}
|
||||
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// GetConfig function to get config
|
||||
func (mgr *manager) GetConfig() (Config, error) {
|
||||
var config Config
|
||||
|
||||
if IsORMSupported {
|
||||
result := mgr.sqlDB.First(&config)
|
||||
|
||||
if result.Error != nil {
|
||||
return config, result.Error
|
||||
}
|
||||
}
|
||||
|
||||
if IsArangoDB {
|
||||
query := fmt.Sprintf("FOR d in %s RETURN d", Collections.Config)
|
||||
|
||||
cursor, err := mgr.arangodb.Query(nil, query, nil)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
defer cursor.Close()
|
||||
|
||||
for {
|
||||
if !cursor.HasMore() {
|
||||
if config.Key == "" {
|
||||
return config, fmt.Errorf("config not found")
|
||||
}
|
||||
break
|
||||
}
|
||||
_, err := cursor.ReadDocument(nil, &config)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if IsMongoDB {
|
||||
configCollection := mgr.mongodb.Collection(Collections.Config, options.Collection())
|
||||
cursor, err := configCollection.Find(nil, bson.M{}, options.Find())
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
defer cursor.Close(nil)
|
||||
|
||||
for cursor.Next(nil) {
|
||||
err := cursor.Decode(&config)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
}
|
||||
|
||||
if config.ID == "" {
|
||||
return config, fmt.Errorf("config not found")
|
||||
}
|
||||
}
|
||||
|
||||
return config, nil
|
||||
}
|
@@ -29,6 +29,9 @@ type Manager interface {
|
||||
GetVerificationByEmail(email string, identifier string) (VerificationRequest, error)
|
||||
AddSession(session Session) error
|
||||
DeleteUserSession(userId string) error
|
||||
AddConfig(config Config) (Config, error)
|
||||
UpdateConfig(config Config) (Config, error)
|
||||
GetConfig() (Config, error)
|
||||
}
|
||||
|
||||
type manager struct {
|
||||
@@ -42,6 +45,7 @@ type CollectionList struct {
|
||||
User string
|
||||
VerificationRequest string
|
||||
Session string
|
||||
Config string
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -54,6 +58,7 @@ var (
|
||||
User: Prefix + "users",
|
||||
VerificationRequest: Prefix + "verification_requests",
|
||||
Session: Prefix + "sessions",
|
||||
Config: Prefix + "config",
|
||||
}
|
||||
)
|
||||
|
||||
@@ -61,9 +66,9 @@ 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()
|
||||
IsORMSupported = constants.EnvData.DATABASE_TYPE != enum.Arangodb.String() && constants.EnvData.DATABASE_TYPE != enum.Mongodb.String()
|
||||
IsArangoDB = constants.EnvData.DATABASE_TYPE == enum.Arangodb.String()
|
||||
IsMongoDB = constants.EnvData.DATABASE_TYPE == enum.Mongodb.String()
|
||||
|
||||
// sql db orm config
|
||||
ormConfig := &gorm.Config{
|
||||
@@ -72,20 +77,20 @@ func InitDB() {
|
||||
},
|
||||
}
|
||||
|
||||
log.Println("db type:", constants.DATABASE_TYPE)
|
||||
log.Println("db type:", constants.EnvData.DATABASE_TYPE)
|
||||
|
||||
switch constants.DATABASE_TYPE {
|
||||
switch constants.EnvData.DATABASE_TYPE {
|
||||
case enum.Postgres.String():
|
||||
sqlDB, err = gorm.Open(postgres.Open(constants.DATABASE_URL), ormConfig)
|
||||
sqlDB, err = gorm.Open(postgres.Open(constants.EnvData.DATABASE_URL), ormConfig)
|
||||
break
|
||||
case enum.Sqlite.String():
|
||||
sqlDB, err = gorm.Open(sqlite.Open(constants.DATABASE_URL), ormConfig)
|
||||
sqlDB, err = gorm.Open(sqlite.Open(constants.EnvData.DATABASE_URL), ormConfig)
|
||||
break
|
||||
case enum.Mysql.String():
|
||||
sqlDB, err = gorm.Open(mysql.Open(constants.DATABASE_URL), ormConfig)
|
||||
sqlDB, err = gorm.Open(mysql.Open(constants.EnvData.DATABASE_URL), ormConfig)
|
||||
break
|
||||
case enum.SQLServer.String():
|
||||
sqlDB, err = gorm.Open(sqlserver.Open(constants.DATABASE_URL), ormConfig)
|
||||
sqlDB, err = gorm.Open(sqlserver.Open(constants.EnvData.DATABASE_URL), ormConfig)
|
||||
break
|
||||
case enum.Arangodb.String():
|
||||
arangodb, err := initArangodb()
|
||||
@@ -118,7 +123,7 @@ func InitDB() {
|
||||
if err != nil {
|
||||
log.Fatal("Failed to init sqlDB:", err)
|
||||
} else {
|
||||
sqlDB.AutoMigrate(&User{}, &VerificationRequest{}, &Session{})
|
||||
sqlDB.AutoMigrate(&User{}, &VerificationRequest{}, &Session{}, &Config{})
|
||||
}
|
||||
Mgr = &manager{
|
||||
sqlDB: sqlDB,
|
||||
|
@@ -12,7 +12,7 @@ import (
|
||||
)
|
||||
|
||||
func initMongodb() (*mongo.Database, error) {
|
||||
mongodbOptions := options.Client().ApplyURI(constants.DATABASE_URL)
|
||||
mongodbOptions := options.Client().ApplyURI(constants.EnvData.DATABASE_URL)
|
||||
maxWait := time.Duration(5 * time.Second)
|
||||
mongodbOptions.ConnectTimeout = &maxWait
|
||||
mongoClient, err := mongo.NewClient(mongodbOptions)
|
||||
@@ -30,7 +30,7 @@ func initMongodb() (*mongo.Database, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mongodb := mongoClient.Database(constants.DATABASE_NAME, options.Database())
|
||||
mongodb := mongoClient.Database(constants.EnvData.DATABASE_NAME, options.Database())
|
||||
|
||||
mongodb.CreateCollection(ctx, Collections.User, options.CreateCollection())
|
||||
userCollection := mongodb.Collection(Collections.User, options.Collection())
|
||||
@@ -73,5 +73,7 @@ func initMongodb() (*mongo.Database, error) {
|
||||
},
|
||||
}, options.CreateIndexes())
|
||||
|
||||
mongodb.CreateCollection(ctx, Collections.Config, options.CreateCollection())
|
||||
|
||||
return mongodb, nil
|
||||
}
|
||||
|
@@ -43,7 +43,7 @@ func (mgr *manager) AddUser(user User) (User, error) {
|
||||
}
|
||||
|
||||
if user.Roles == "" {
|
||||
user.Roles = constants.DEFAULT_ROLES[0]
|
||||
user.Roles = constants.EnvData.DEFAULT_ROLES[0]
|
||||
}
|
||||
|
||||
if IsORMSupported {
|
||||
|
Reference in New Issue
Block a user