feat: ent ORM, admin UI, client auth, Fyne GUI, Windows/MSI packaging
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
|
||||
"entgo.io/ent/dialect"
|
||||
entsql "entgo.io/ent/dialect/sql"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
||||
"github.com/fatedier/frp/pkg/db/ent"
|
||||
)
|
||||
|
||||
var (
|
||||
client *ent.Client
|
||||
)
|
||||
|
||||
func Init(driverName, dataSourceName string) error {
|
||||
if driverName == "" {
|
||||
driverName = "sqlite"
|
||||
}
|
||||
if dataSourceName == "" {
|
||||
dataSourceName = "admin.db"
|
||||
}
|
||||
|
||||
dsn := dataSourceName + "?:_pragma=journal_mode=WAL&_pragma=foreign_keys=1"
|
||||
sqldb, err := sql.Open(driverName, dsn)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed opening sql database: %w", err)
|
||||
}
|
||||
|
||||
drv := entsql.OpenDB(dialect.SQLite, sqldb)
|
||||
entClient := ent.NewClient(ent.Driver(drv))
|
||||
|
||||
ctx := context.Background()
|
||||
if err := entClient.Schema.Create(ctx); err != nil {
|
||||
return fmt.Errorf("failed creating schema resources: %w", err)
|
||||
}
|
||||
|
||||
client = entClient
|
||||
return nil
|
||||
}
|
||||
|
||||
func Close() error {
|
||||
if client != nil {
|
||||
return client.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Client() *ent.Client {
|
||||
return client
|
||||
}
|
||||
|
||||
func HasAdmin() bool {
|
||||
ctx := context.Background()
|
||||
exists, err := client.User.Query().Exist(ctx)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return exists
|
||||
}
|
||||
|
||||
func CreateAdmin(username, password, name string) error {
|
||||
ctx := context.Background()
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to hash password: %w", err)
|
||||
}
|
||||
_, err = client.User.Create().
|
||||
SetUsername(username).
|
||||
SetPassword(string(hashedPassword)).
|
||||
SetName(name).
|
||||
SetRole("admin").
|
||||
Save(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create admin user: %w", err)
|
||||
}
|
||||
log.Printf("admin user created: %s", username)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user