86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
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"
|
|
|
|
"kanhole/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
|
|
}
|