github.com/teloshs/mattermost-server@v5.11.1+incompatible/store/sqlstore/role_supplier.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"context"
     8  	"database/sql"
     9  	"fmt"
    10  	"net/http"
    11  	"strings"
    12  
    13  	"github.com/mattermost/gorp"
    14  	"github.com/mattermost/mattermost-server/model"
    15  	"github.com/mattermost/mattermost-server/store"
    16  )
    17  
    18  type Role struct {
    19  	Id            string
    20  	Name          string
    21  	DisplayName   string
    22  	Description   string
    23  	CreateAt      int64
    24  	UpdateAt      int64
    25  	DeleteAt      int64
    26  	Permissions   string
    27  	SchemeManaged bool
    28  	BuiltIn       bool
    29  }
    30  
    31  func NewRoleFromModel(role *model.Role) *Role {
    32  	permissionsMap := make(map[string]bool)
    33  	permissions := ""
    34  
    35  	for _, permission := range role.Permissions {
    36  		if !permissionsMap[permission] {
    37  			permissions += fmt.Sprintf(" %v", permission)
    38  			permissionsMap[permission] = true
    39  		}
    40  	}
    41  
    42  	return &Role{
    43  		Id:            role.Id,
    44  		Name:          role.Name,
    45  		DisplayName:   role.DisplayName,
    46  		Description:   role.Description,
    47  		CreateAt:      role.CreateAt,
    48  		UpdateAt:      role.UpdateAt,
    49  		DeleteAt:      role.DeleteAt,
    50  		Permissions:   permissions,
    51  		SchemeManaged: role.SchemeManaged,
    52  		BuiltIn:       role.BuiltIn,
    53  	}
    54  }
    55  
    56  func (role Role) ToModel() *model.Role {
    57  	return &model.Role{
    58  		Id:            role.Id,
    59  		Name:          role.Name,
    60  		DisplayName:   role.DisplayName,
    61  		Description:   role.Description,
    62  		CreateAt:      role.CreateAt,
    63  		UpdateAt:      role.UpdateAt,
    64  		DeleteAt:      role.DeleteAt,
    65  		Permissions:   strings.Fields(role.Permissions),
    66  		SchemeManaged: role.SchemeManaged,
    67  		BuiltIn:       role.BuiltIn,
    68  	}
    69  }
    70  
    71  func initSqlSupplierRoles(sqlStore SqlStore) {
    72  	for _, db := range sqlStore.GetAllConns() {
    73  		table := db.AddTableWithName(Role{}, "Roles").SetKeys(false, "Id")
    74  		table.ColMap("Id").SetMaxSize(26)
    75  		table.ColMap("Name").SetMaxSize(64).SetUnique(true)
    76  		table.ColMap("DisplayName").SetMaxSize(128)
    77  		table.ColMap("Description").SetMaxSize(1024)
    78  		table.ColMap("Permissions").SetMaxSize(4096)
    79  	}
    80  }
    81  
    82  func (s *SqlSupplier) RoleSave(ctx context.Context, role *model.Role, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
    83  	result := store.NewSupplierResult()
    84  
    85  	// Check the role is valid before proceeding.
    86  	if !role.IsValidWithoutId() {
    87  		result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.invalid_role.app_error", nil, "", http.StatusBadRequest)
    88  		return result
    89  	}
    90  
    91  	if len(role.Id) == 0 {
    92  		if transaction, err := s.GetMaster().Begin(); err != nil {
    93  			result.Err = model.NewAppError("SqlRoleStore.RoleSave", "store.sql_role.save.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
    94  			return result
    95  		} else {
    96  			defer finalizeTransaction(transaction)
    97  			result = s.createRole(ctx, role, transaction, hints...)
    98  
    99  			if result.Err != nil {
   100  				transaction.Rollback()
   101  			} else if err := transaction.Commit(); err != nil {
   102  				result.Err = model.NewAppError("SqlRoleStore.RoleSave", "store.sql_role.save_role.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
   103  			}
   104  		}
   105  	} else {
   106  		dbRole := NewRoleFromModel(role)
   107  
   108  		dbRole.UpdateAt = model.GetMillis()
   109  		if rowsChanged, err := s.GetMaster().Update(dbRole); err != nil {
   110  			result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.update.app_error", nil, err.Error(), http.StatusInternalServerError)
   111  		} else if rowsChanged != 1 {
   112  			result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.update.app_error", nil, "no record to update", http.StatusInternalServerError)
   113  		}
   114  
   115  		result.Data = dbRole.ToModel()
   116  	}
   117  
   118  	return result
   119  }
   120  
   121  func (s *SqlSupplier) createRole(ctx context.Context, role *model.Role, transaction *gorp.Transaction, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   122  	result := store.NewSupplierResult()
   123  
   124  	// Check the role is valid before proceeding.
   125  	if !role.IsValidWithoutId() {
   126  		result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.invalid_role.app_error", nil, "", http.StatusBadRequest)
   127  		return result
   128  	}
   129  
   130  	dbRole := NewRoleFromModel(role)
   131  
   132  	dbRole.Id = model.NewId()
   133  	dbRole.CreateAt = model.GetMillis()
   134  	dbRole.UpdateAt = dbRole.CreateAt
   135  
   136  	if err := transaction.Insert(dbRole); err != nil {
   137  		result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.insert.app_error", nil, err.Error(), http.StatusInternalServerError)
   138  	}
   139  
   140  	result.Data = dbRole.ToModel()
   141  
   142  	return result
   143  }
   144  
   145  func (s *SqlSupplier) RoleGet(ctx context.Context, roleId string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   146  	result := store.NewSupplierResult()
   147  
   148  	var dbRole Role
   149  
   150  	if err := s.GetReplica().SelectOne(&dbRole, "SELECT * from Roles WHERE Id = :Id", map[string]interface{}{"Id": roleId}); err != nil {
   151  		if err == sql.ErrNoRows {
   152  			result.Err = model.NewAppError("SqlRoleStore.Get", "store.sql_role.get.app_error", nil, "Id="+roleId+", "+err.Error(), http.StatusNotFound)
   153  		} else {
   154  			result.Err = model.NewAppError("SqlRoleStore.Get", "store.sql_role.get.app_error", nil, err.Error(), http.StatusInternalServerError)
   155  		}
   156  	}
   157  
   158  	result.Data = dbRole.ToModel()
   159  
   160  	return result
   161  }
   162  
   163  func (s *SqlSupplier) RoleGetAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   164  	result := store.NewSupplierResult()
   165  
   166  	var dbRoles []Role
   167  
   168  	if _, err := s.GetReplica().Select(&dbRoles, "SELECT * from Roles", map[string]interface{}{}); err != nil {
   169  		if err == sql.ErrNoRows {
   170  			result.Err = model.NewAppError("SqlRoleStore.GetAll", "store.sql_role.get_all.app_error", nil, err.Error(), http.StatusNotFound)
   171  		} else {
   172  			result.Err = model.NewAppError("SqlRoleStore.GetAll", "store.sql_role.get_all.app_error", nil, err.Error(), http.StatusInternalServerError)
   173  		}
   174  	}
   175  
   176  	var roles []*model.Role
   177  	for _, dbRole := range dbRoles {
   178  		roles = append(roles, dbRole.ToModel())
   179  	}
   180  	result.Data = roles
   181  
   182  	return result
   183  }
   184  
   185  func (s *SqlSupplier) RoleGetByName(ctx context.Context, name string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   186  	result := store.NewSupplierResult()
   187  
   188  	var dbRole Role
   189  
   190  	if err := s.GetReplica().SelectOne(&dbRole, "SELECT * from Roles WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
   191  		if err == sql.ErrNoRows {
   192  			result.Err = model.NewAppError("SqlRoleStore.GetByName", "store.sql_role.get_by_name.app_error", nil, "name="+name+",err="+err.Error(), http.StatusNotFound)
   193  		} else {
   194  			result.Err = model.NewAppError("SqlRoleStore.GetByName", "store.sql_role.get_by_name.app_error", nil, "name="+name+",err="+err.Error(), http.StatusInternalServerError)
   195  		}
   196  	}
   197  
   198  	result.Data = dbRole.ToModel()
   199  
   200  	return result
   201  }
   202  
   203  func (s *SqlSupplier) RoleGetByNames(ctx context.Context, names []string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   204  	result := store.NewSupplierResult()
   205  
   206  	var dbRoles []*Role
   207  
   208  	if len(names) == 0 {
   209  		result.Data = []*model.Role{}
   210  		return result
   211  	}
   212  
   213  	var searchPlaceholders []string
   214  	var parameters = map[string]interface{}{}
   215  	for i, value := range names {
   216  		searchPlaceholders = append(searchPlaceholders, fmt.Sprintf(":Name%d", i))
   217  		parameters[fmt.Sprintf("Name%d", i)] = value
   218  	}
   219  
   220  	searchTerm := "Name IN (" + strings.Join(searchPlaceholders, ", ") + ")"
   221  
   222  	if _, err := s.GetReplica().Select(&dbRoles, "SELECT * from Roles WHERE "+searchTerm, parameters); err != nil {
   223  		result.Err = model.NewAppError("SqlRoleStore.GetByNames", "store.sql_role.get_by_names.app_error", nil, err.Error(), http.StatusInternalServerError)
   224  	}
   225  
   226  	var roles []*model.Role
   227  	for _, dbRole := range dbRoles {
   228  		roles = append(roles, dbRole.ToModel())
   229  	}
   230  
   231  	result.Data = roles
   232  
   233  	return result
   234  }
   235  
   236  func (s *SqlSupplier) RoleDelete(ctx context.Context, roleId string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   237  	result := store.NewSupplierResult()
   238  
   239  	// Get the role.
   240  	var role *Role
   241  	if err := s.GetReplica().SelectOne(&role, "SELECT * from Roles WHERE Id = :Id", map[string]interface{}{"Id": roleId}); err != nil {
   242  		if err == sql.ErrNoRows {
   243  			result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.get.app_error", nil, "Id="+roleId+", "+err.Error(), http.StatusNotFound)
   244  		} else {
   245  			result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.get.app_error", nil, err.Error(), http.StatusInternalServerError)
   246  		}
   247  
   248  		return result
   249  	}
   250  
   251  	time := model.GetMillis()
   252  	role.DeleteAt = time
   253  	role.UpdateAt = time
   254  
   255  	if rowsChanged, err := s.GetMaster().Update(role); err != nil {
   256  		result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.delete.update.app_error", nil, err.Error(), http.StatusInternalServerError)
   257  	} else if rowsChanged != 1 {
   258  		result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.delete.update.app_error", nil, "no record to update", http.StatusInternalServerError)
   259  	} else {
   260  		result.Data = role.ToModel()
   261  	}
   262  
   263  	return result
   264  }
   265  
   266  func (s *SqlSupplier) RolePermanentDeleteAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
   267  	result := store.NewSupplierResult()
   268  
   269  	if _, err := s.GetMaster().Exec("DELETE FROM Roles"); err != nil {
   270  		result.Err = model.NewAppError("SqlRoleStore.PermanentDeleteAll", "store.sql_role.permanent_delete_all.app_error", nil, err.Error(), http.StatusInternalServerError)
   271  	}
   272  
   273  	return result
   274  }