mirror of
https://github.com/khairul169/vaulterm.git
synced 2026-09-15 17:03:30 +07:00
feat: init api, db, app
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var dbInstance *gorm.DB
|
||||
|
||||
func Get() *gorm.DB {
|
||||
if dbInstance == nil {
|
||||
log.Fatal("database not initialized")
|
||||
}
|
||||
return dbInstance
|
||||
}
|
||||
|
||||
func Init() {
|
||||
// log.Println("Initializing database...")
|
||||
|
||||
dsn := os.Getenv("DATABASE_URL")
|
||||
if dsn == "" {
|
||||
dsn = "file:data.db?cache=shared&mode=rwc&_journal_mode=WAL"
|
||||
}
|
||||
|
||||
// Open db connection
|
||||
var con gorm.Dialector
|
||||
if strings.HasPrefix(dsn, "postgres:") {
|
||||
con = postgres.Open(dsn)
|
||||
} else {
|
||||
con = sqlite.Open(dsn)
|
||||
}
|
||||
|
||||
db, err := gorm.Open(con, &gorm.Config{
|
||||
SkipDefaultTransaction: true,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
dbInstance = db
|
||||
|
||||
// Migrate the schema
|
||||
db.AutoMigrate(Models...)
|
||||
runSeeders(db)
|
||||
}
|
||||
|
||||
func Close() error {
|
||||
con, err := dbInstance.DB()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := con.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package db
|
||||
|
||||
import "rul.sh/vaulterm/models"
|
||||
|
||||
var Models = []interface{}{
|
||||
&models.User{},
|
||||
&models.UserSession{},
|
||||
&models.Keychain{},
|
||||
&models.Host{},
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
"rul.sh/vaulterm/lib"
|
||||
"rul.sh/vaulterm/models"
|
||||
)
|
||||
|
||||
type SeedFn func(*gorm.DB) error
|
||||
|
||||
var seeders = []SeedFn{
|
||||
seedUsers,
|
||||
}
|
||||
|
||||
func seedUsers(tx *gorm.DB) error {
|
||||
var userCount int64
|
||||
if res := tx.Model(&models.User{}).Count(&userCount); res.Error != nil {
|
||||
return res.Error
|
||||
}
|
||||
|
||||
// skip seeder if users already exist
|
||||
if userCount > 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
testPasswd, err := lib.HashPassword("123456")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
userList := []models.User{
|
||||
{
|
||||
Name: "Admin",
|
||||
Username: "admin",
|
||||
Password: testPasswd,
|
||||
Email: "[email protected]",
|
||||
Role: models.UserRoleAdmin,
|
||||
},
|
||||
{
|
||||
Name: "John Doe",
|
||||
Username: "user",
|
||||
Password: testPasswd,
|
||||
Email: "[email protected]",
|
||||
},
|
||||
}
|
||||
|
||||
if res := tx.Create(&userList); res.Error != nil {
|
||||
return res.Error
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func runSeeders(db *gorm.DB) {
|
||||
db.Transaction(func(tx *gorm.DB) error {
|
||||
for _, seed := range seeders {
|
||||
if err := seed(db); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user