package sub import ( "github.com/urfave/cli/v2" "github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/libs/auth" "github.com/veypi/OneAuth/models" "github.com/veypi/OneAuth/oalib" "github.com/veypi/utils" ) var Init = &cli.Command{ Name: "init", Action: runInit, } func runInit(c *cli.Context) error { return InitSystem() } func InitSystem() error { err := db() if err != nil { return err } self, err := selfApp() if err != nil { return err } err = role(self.InitRoleID == 0) return err } func db() error { db := cfg.DB() err := utils.MultiErr( db.SetupJoinTable(&models.User{}, "Roles", &models.UserRole{}), db.SetupJoinTable(&models.Role{}, "Users", &models.UserRole{}), db.SetupJoinTable(&models.User{}, "Apps", &models.AppUser{}), db.SetupJoinTable(&models.App{}, "Users", &models.AppUser{}), db.AutoMigrate(&models.User{}, &models.App{}, &models.Auth{}, &models.Role{}), db.AutoMigrate(&models.Wechat{}, &models.Resource{}), ) return err } func selfApp() (*models.App, error) { self := &models.App{ Name: "OA", Icon: "", UUID: cfg.CFG.APPUUID, Des: "", Creator: 0, UserCount: 0, Hide: false, Host: "", UserRefreshUrl: "/", Key: cfg.CFG.APPKey, EnableRegister: true, EnableUserKey: true, EnableUser: true, EnableWx: false, EnablePhone: false, EnableEmail: false, } return self, cfg.DB().Where("uuid = ?", self.UUID).FirstOrCreate(self).Error } func role(reset_init_role bool) error { authMap := make(map[string]*models.Resource) n := []string{ auth.APP, auth.User, auth.Res, auth.Auth, auth.Role, } var err error adminRole := &models.Role{ AppUUID: cfg.CFG.APPUUID, Name: "admin", } err = cfg.DB().Where(adminRole).FirstOrCreate(adminRole).Error if err != nil { return err } for _, na := range n { a := &models.Resource{ AppUUID: cfg.CFG.APPUUID, Name: na, Tag: "", Des: "", } err = cfg.DB().Where(a).FirstOrCreate(a).Error if err != nil { return err } authMap[na] = a err = auth.BindRoleAuth(cfg.DB(), adminRole.ID, a.ID, oalib.AuthAll, "") if err != nil { return err } } userRole := &models.Role{ AppUUID: cfg.CFG.APPUUID, Name: "user", } err = cfg.DB().Where(userRole).FirstOrCreate(userRole).Error if err != nil { return err } e1 := auth.BindRoleAuth(cfg.DB(), userRole.ID, authMap[auth.APP].ID, oalib.AuthRead, "") if err := utils.MultiErr(e1); err != nil { return err } if reset_init_role { return cfg.DB().Model(&models.App{}).Where("uuid = ?", cfg.CFG.APPUUID).Update("init_role_id", adminRole.ID).Error } return nil }