feat: initialize default root user

This commit is contained in:
2026-07-23 13:54:39 +08:00
parent c3a7c3a2d4
commit 50274184dc
3 changed files with 92 additions and 0 deletions

View File

@@ -5,6 +5,7 @@ import (
"senlinai-agent/backend/internal/config"
"senlinai-agent/backend/internal/httpx"
"senlinai-agent/backend/internal/initdb"
"senlinai-agent/backend/internal/logic/ai"
"senlinai-agent/backend/internal/logic/auth"
"senlinai-agent/backend/internal/logic/files"
@@ -22,6 +23,9 @@ func main() {
if err != nil {
log.Fatal(err)
}
if err := initdb.InitUser(models.DBService); err != nil {
log.Fatal(err)
}
authService := auth.NewService(cfg.AuthSecret)
projectService := projects.NewService()

View File

@@ -0,0 +1,36 @@
package initdb
import (
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
"senlinai-agent/backend/internal/models"
)
const (
rootUsername = "root"
rootPassword = "123456"
rootRole = "root"
)
// InitUser creates the default root account when the user table is empty.
func InitUser(database *gorm.DB) error {
var count int64
if err := database.Model(&models.SenlinAgentUser{}).Count(&count).Error; err != nil {
return err
}
if count > 0 {
return nil
}
passwordHash, err := bcrypt.GenerateFromPassword([]byte(rootPassword), bcrypt.DefaultCost)
if err != nil {
return err
}
return database.Create(&models.SenlinAgentUser{
Email: rootUsername,
DisplayName: rootUsername,
PasswordHash: string(passwordHash),
Role: rootRole,
}).Error
}

View File

@@ -0,0 +1,52 @@
package initdb
import (
"testing"
"github.com/glebarez/sqlite"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
"senlinai-agent/backend/internal/models"
)
func TestInitUserCreatesRootUserWhenTableIsEmpty(t *testing.T) {
database := newUserTestDatabase(t)
require.NoError(t, InitUser(database))
var users []models.SenlinAgentUser
require.NoError(t, database.Find(&users).Error)
require.Len(t, users, 1)
require.Equal(t, rootUsername, users[0].Email)
require.Equal(t, rootUsername, users[0].DisplayName)
require.Equal(t, rootRole, users[0].Role)
require.NoError(t, bcrypt.CompareHashAndPassword([]byte(users[0].PasswordHash), []byte(rootPassword)))
}
func TestInitUserDoesNothingWhenTableIsNotEmpty(t *testing.T) {
database := newUserTestDatabase(t)
existing := models.SenlinAgentUser{
Email: "existing@example.com",
DisplayName: "Existing User",
PasswordHash: "existing-hash",
Role: "user",
}
require.NoError(t, database.Create(&existing).Error)
require.NoError(t, InitUser(database))
var users []models.SenlinAgentUser
require.NoError(t, database.Find(&users).Error)
require.Len(t, users, 1)
require.Equal(t, existing.Email, users[0].Email)
}
func newUserTestDatabase(t *testing.T) *gorm.DB {
t.Helper()
database, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
require.NoError(t, err)
require.NoError(t, database.AutoMigrate(&models.SenlinAgentUser{}))
return database
}