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  }