Files
kannn 2cd3052da1
golangci-lint / lint (push) Failing after 1m5s
rebrand: frp -> kanhole (kanhole server, kanholec client)
2026-05-29 09:05:34 +00:00

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
}