github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/system/initial/local_migrations/m_role.go (about) 1 // This file is part of the Smart Home 2 // Program complex distribution https://github.com/e154/smart-home 3 // Copyright (C) 2023, Filippov Alex 4 // 5 // This library is free software: you can redistribute it and/or 6 // modify it under the terms of the GNU Lesser General Public 7 // License as published by the Free Software Foundation; either 8 // version 3 of the License, or (at your option) any later version. 9 // 10 // This library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 // Library General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public 16 // License along with this library. If not, see 17 // <https://www.gnu.org/licenses/>. 18 19 package local_migrations 20 21 import ( 22 "context" 23 24 "github.com/e154/smart-home/adaptors" 25 m "github.com/e154/smart-home/models" 26 "github.com/e154/smart-home/system/access_list" 27 . "github.com/e154/smart-home/system/initial/assertions" 28 "github.com/e154/smart-home/system/validation" 29 ) 30 31 type MigrationRoles struct { 32 adaptors *adaptors.Adaptors 33 accessList access_list.AccessListService 34 validation *validation.Validate 35 } 36 37 func NewMigrationRoles(adaptors *adaptors.Adaptors, 38 accessList access_list.AccessListService, 39 validation *validation.Validate) *MigrationRoles { 40 return &MigrationRoles{ 41 adaptors: adaptors, 42 accessList: accessList, 43 validation: validation, 44 } 45 } 46 47 func (r *MigrationRoles) Up(ctx context.Context, adaptors *adaptors.Adaptors) (err error) { 48 if adaptors != nil { 49 r.adaptors = adaptors 50 } 51 52 if _, err = r.addAdmin(ctx); err != nil { 53 return 54 } 55 var demo *m.Role 56 if demo, err = r.addDemo(ctx); err != nil { 57 return 58 } 59 _, err = r.addUser(ctx, demo) 60 61 return 62 } 63 64 func (r *MigrationRoles) addAdmin(ctx context.Context) (adminRole *m.Role, err error) { 65 66 if adminRole, err = r.adaptors.Role.GetByName(ctx, "admin"); err != nil { 67 adminRole = &m.Role{ 68 Name: "admin", 69 } 70 err = r.adaptors.Role.Add(ctx, adminRole) 71 So(err, ShouldBeNil) 72 } 73 if _, err = r.adaptors.User.GetByNickname(ctx, "admin"); err == nil { 74 return 75 } 76 77 // add admin 78 adminUser := &m.User{ 79 Nickname: "admin", 80 RoleName: adminRole.Name, 81 Email: "admin@e154.ru", 82 Lang: "en", 83 Status: "active", 84 } 85 err = adminUser.SetPass("admin") 86 So(err, ShouldBeNil) 87 88 ok, _ := r.validation.Valid(adminUser) 89 So(ok, ShouldEqual, true) 90 91 adminUser.Id, err = r.adaptors.User.Add(ctx, adminUser) 92 So(err, ShouldBeNil) 93 94 return 95 } 96 97 func (r *MigrationRoles) addUser(ctx context.Context, demoRole *m.Role) (userRole *m.Role, err error) { 98 99 if userRole, err = r.adaptors.Role.GetByName(ctx, "user"); err != nil { 100 userRole = &m.Role{ 101 Name: "user", 102 Parent: demoRole, 103 } 104 err = r.adaptors.Role.Add(ctx, userRole) 105 So(err, ShouldBeNil) 106 107 for pack, item := range *r.accessList.List(ctx) { 108 for levelName, right := range item { 109 if right.Method == "put" || right.Method == "post" || right.Method == "delete" { 110 permission := &m.Permission{ 111 RoleName: userRole.Name, 112 PackageName: pack, 113 LevelName: levelName, 114 } 115 116 _, err = r.adaptors.Permission.Add(ctx, permission) 117 So(err, ShouldBeNil) 118 } 119 } 120 } 121 } 122 123 if _, err = r.adaptors.User.GetByNickname(ctx, "user"); err == nil { 124 return 125 } 126 127 // add base user 128 baseUser := &m.User{ 129 Nickname: "user", 130 RoleName: userRole.Name, 131 Email: "user@e154.ru", 132 Lang: "en", 133 Status: "active", 134 } 135 err = baseUser.SetPass("user") 136 So(err, ShouldBeNil) 137 138 ok, _ := r.validation.Valid(baseUser) 139 So(ok, ShouldEqual, true) 140 141 baseUser.Id, err = r.adaptors.User.Add(ctx, baseUser) 142 So(err, ShouldBeNil) 143 144 return 145 } 146 147 func (r *MigrationRoles) addDemo(ctx context.Context) (demoRole *m.Role, err error) { 148 149 if demoRole, err = r.adaptors.Role.GetByName(ctx, "demo"); err != nil { 150 151 demoRole = &m.Role{ 152 Name: "demo", 153 } 154 err = r.adaptors.Role.Add(ctx, demoRole) 155 So(err, ShouldBeNil) 156 157 for pack, item := range *r.accessList.List(ctx) { 158 for levelName, right := range item { 159 if right.Method == "get" { 160 permission := &m.Permission{ 161 RoleName: demoRole.Name, 162 PackageName: pack, 163 LevelName: levelName, 164 } 165 166 _, err = r.adaptors.Permission.Add(ctx, permission) 167 So(err, ShouldBeNil) 168 169 } 170 } 171 } 172 } 173 174 if _, err = r.adaptors.User.GetByNickname(ctx, "demo"); err == nil { 175 return 176 } 177 178 // add demo user 179 demoUser := &m.User{ 180 Nickname: "demo", 181 RoleName: demoRole.Name, 182 Email: "demo@e154.ru", 183 Lang: "en", 184 Status: "active", 185 } 186 err = demoUser.SetPass("demo") 187 So(err, ShouldBeNil) 188 189 ok, _ := r.validation.Valid(demoUser) 190 So(ok, ShouldEqual, true) 191 192 demoUser.Id, err = r.adaptors.User.Add(ctx, demoUser) 193 So(err, ShouldBeNil) 194 195 return 196 }