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 }