You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OneAuth/models/init.go

93 lines
2.2 KiB
Go

//
// Copyright (C) 2024 veypi <i@veypi.com>
// 2024-09-20 16:10:16
// Distributed under terms of the MIT license.
//
package models
import (
"strings"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/oauth"
"github.com/google/uuid"
"github.com/vyes-ai/vigo"
"github.com/vyes-ai/vigo/logv"
)
var AllModels = &vigo.ModelList{}
func init() {
AllModels.Append(User{}, AppUser{}, Resource{}, Access{}, Role{}, UserRole{}, Token{}, App{}, SMSCode{}, SMSLog{})
AllModels.Append(
oauth.User{},
oauth.UserLoginLog{},
oauth.OAuthClient{},
oauth.OAuthAuthorizationCode{},
oauth.OAuthAccessToken{},
oauth.OAuthRefreshToken{},
oauth.OAuthScope{},
oauth.OAuthClientScope{},
oauth.OAuthProvider{},
oauth.OAuthAccount{},
oauth.UserToken{},
oauth.UserSession{},
oauth.OAuthUserConsent{},
)
}
func Migrate() error {
return AllModels.AutoMigrate(cfg.DB())
}
func Drop() error {
return AllModels.AutoDrop(cfg.DB())
}
func InitDB() error {
app := &App{}
app.ID = cfg.Config.ID
app.Name = "OA"
app.Icon = "/favicon.ico"
app.Key = cfg.Config.Key
logv.AssertError(cfg.DB().Where("id = ?", app.ID).Attrs(app).FirstOrCreate(app).Error)
initRole := map[string]map[string]uint{
"user": {"admin": 5, "normal": 1},
"app": {"admin": 5, "normal": 1},
}
adminID := ""
for r, roles := range initRole {
resource := &Resource{
AppID: app.ID,
Name: r,
}
logv.AssertError(cfg.DB().Where("app_id = ? AND name = ?", app.ID, r).FirstOrCreate(resource).Error)
for rName, l := range roles {
role := &Role{}
logv.AssertError(cfg.DB().Where("app_id = ? AND name = ?", app.ID, rName).Attrs(&Role{
Model: vigo.Model{
ID: strings.ReplaceAll(uuid.New().String(), "-", ""),
},
AppID: app.ID,
Name: rName,
}).FirstOrCreate(role).Error)
logv.AssertError(cfg.DB().Where("app_id = ? AND role_id = ? AND name = ?", app.ID, role.ID, r).FirstOrCreate(&Access{
AppID: app.ID,
RoleID: &role.ID,
ResourceID: &resource.ID,
Name: r,
Level: l,
}).Error)
if rName == "admin" {
adminID = role.ID
}
}
}
if app.InitRoleID == nil {
logv.AssertError(cfg.DB().Model(app).Update("init_role_id", adminID).Error)
}
return oauth.InitializeOAuthData(cfg.DB())
}