27 lines
799 B
Go
27 lines
799 B
Go
package db
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
|
||
"git.pcux.cn/xuans/Smail/models"
|
||
"xorm.io/xorm"
|
||
)
|
||
|
||
var ErrSuperAdminInvariant = errors.New("必须有且仅有一个启用的超级管理员,请在部署端核查账号数据")
|
||
|
||
// ValidateSuperAdmin 在初始化完成和业务启动前检查唯一管理员,不自动提权或降级任何账号。
|
||
func ValidateSuperAdmin(engine *xorm.Engine) error {
|
||
if engine == nil {
|
||
return fmt.Errorf("%w:数据库尚未初始化", ErrSuperAdminInvariant)
|
||
}
|
||
var users []models.User
|
||
if err := engine.Cols("id", "disabled").Where(models.SuperAdminPredicate).Limit(2).Find(&users); err != nil {
|
||
return fmt.Errorf("读取超级管理员状态失败:%w", err)
|
||
}
|
||
if len(users) != 1 || users[0].Disabled != 0 {
|
||
return ErrSuperAdminInvariant
|
||
}
|
||
return nil
|
||
}
|