117 lines
3.0 KiB
Go
117 lines
3.0 KiB
Go
|
|
//go:build ignore
|
||
|
|
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"log"
|
||
|
|
"os"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"github.com/glebarez/sqlite"
|
||
|
|
"github.com/user-management-system/internal/auth"
|
||
|
|
"github.com/user-management-system/internal/config"
|
||
|
|
"github.com/user-management-system/internal/domain"
|
||
|
|
"gorm.io/gorm"
|
||
|
|
)
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
username := strings.TrimSpace(os.Getenv("UMS_ADMIN_USERNAME"))
|
||
|
|
password := os.Getenv("UMS_ADMIN_PASSWORD")
|
||
|
|
email := strings.TrimSpace(os.Getenv("UMS_ADMIN_EMAIL"))
|
||
|
|
resetPassword := strings.EqualFold(strings.TrimSpace(os.Getenv("UMS_ADMIN_RESET_PASSWORD")), "true")
|
||
|
|
|
||
|
|
if username == "" || password == "" {
|
||
|
|
log.Fatal("UMS_ADMIN_USERNAME and UMS_ADMIN_PASSWORD are required")
|
||
|
|
}
|
||
|
|
|
||
|
|
db, err := gorm.Open(sqlite.Open(resolveDBPath()), &gorm.Config{})
|
||
|
|
if err != nil {
|
||
|
|
log.Fatal("open db:", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
var adminRole domain.Role
|
||
|
|
if err := db.Where("code = ?", "admin").First(&adminRole).Error; err != nil {
|
||
|
|
log.Fatal("admin role not found:", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
var user domain.User
|
||
|
|
err = db.Where("username = ?", username).First(&user).Error
|
||
|
|
switch {
|
||
|
|
case err == nil:
|
||
|
|
if email != "" {
|
||
|
|
user.Email = &email
|
||
|
|
}
|
||
|
|
user.Status = domain.UserStatusActive
|
||
|
|
if resetPassword {
|
||
|
|
passwordHash, hashErr := auth.HashPassword(password)
|
||
|
|
if hashErr != nil {
|
||
|
|
log.Fatal("hash password:", hashErr)
|
||
|
|
}
|
||
|
|
user.Password = passwordHash
|
||
|
|
}
|
||
|
|
if saveErr := db.Save(&user).Error; saveErr != nil {
|
||
|
|
log.Fatal("update admin:", saveErr)
|
||
|
|
}
|
||
|
|
case err == gorm.ErrRecordNotFound:
|
||
|
|
passwordHash, hashErr := auth.HashPassword(password)
|
||
|
|
if hashErr != nil {
|
||
|
|
log.Fatal("hash password:", hashErr)
|
||
|
|
}
|
||
|
|
|
||
|
|
user = domain.User{
|
||
|
|
Username: username,
|
||
|
|
Email: stringPtr(email),
|
||
|
|
Password: passwordHash,
|
||
|
|
Status: domain.UserStatusActive,
|
||
|
|
Nickname: username,
|
||
|
|
}
|
||
|
|
if createErr := db.Create(&user).Error; createErr != nil {
|
||
|
|
log.Fatal("create admin:", createErr)
|
||
|
|
}
|
||
|
|
default:
|
||
|
|
log.Fatal("query admin:", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
var binding domain.UserRole
|
||
|
|
bindingErr := db.Where("user_id = ? AND role_id = ?", user.ID, adminRole.ID).First(&binding).Error
|
||
|
|
if bindingErr == gorm.ErrRecordNotFound {
|
||
|
|
if err := db.Create(&domain.UserRole{UserID: user.ID, RoleID: adminRole.ID}).Error; err != nil {
|
||
|
|
log.Fatal("assign admin role:", err)
|
||
|
|
}
|
||
|
|
} else if bindingErr != nil {
|
||
|
|
log.Fatal("query admin role binding:", bindingErr)
|
||
|
|
}
|
||
|
|
|
||
|
|
fmt.Printf("admin initialized: username=%s user_id=%d role_id=%d\n", user.Username, user.ID, adminRole.ID)
|
||
|
|
}
|
||
|
|
|
||
|
|
func stringPtr(value string) *string {
|
||
|
|
if strings.TrimSpace(value) == "" {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
return &value
|
||
|
|
}
|
||
|
|
|
||
|
|
func resolveDBPath() string {
|
||
|
|
if path := strings.TrimSpace(os.Getenv("UMS_DATABASE_SQLITE_PATH")); path != "" {
|
||
|
|
return path
|
||
|
|
}
|
||
|
|
|
||
|
|
cfg, err := config.Load(resolveConfigPath())
|
||
|
|
if err == nil && strings.EqualFold(strings.TrimSpace(cfg.Database.Type), "sqlite") {
|
||
|
|
if path := strings.TrimSpace(cfg.Database.SQLite.Path); path != "" {
|
||
|
|
return path
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return "./data/user_management.db"
|
||
|
|
}
|
||
|
|
|
||
|
|
func resolveConfigPath() string {
|
||
|
|
if path := strings.TrimSpace(os.Getenv("UMS_CONFIG_PATH")); path != "" {
|
||
|
|
return path
|
||
|
|
}
|
||
|
|
return "./configs/config.yaml"
|
||
|
|
}
|