summaryrefslogtreecommitdiffstats
path: root/store/sqlstore/role_supplier.go
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2018-04-20 19:49:13 +0100
committerMartin Kraft <mkraft@users.noreply.github.com>2018-04-20 14:49:13 -0400
commitcd55c44c8fd8f61cdb7cbfb57a588be82c7aa0ab (patch)
tree2979276d03b5bca72b549d7576eab104ceefd495 /store/sqlstore/role_supplier.go
parent853445dc2ea68f765faa04ad14618b04f1081c43 (diff)
downloadchat-cd55c44c8fd8f61cdb7cbfb57a588be82c7aa0ab.tar.gz
chat-cd55c44c8fd8f61cdb7cbfb57a588be82c7aa0ab.tar.bz2
chat-cd55c44c8fd8f61cdb7cbfb57a588be82c7aa0ab.zip
MM-8796: Full implementation of "Schemes" in Store/Model/App layers. (#8357)
* Add Scheme model and stub store. * Port ChannelStore to be Scheme aware. * Make almost all the API/APP layer work with ChannelSchemes. Only thing still hacky is UpdateChannelMemberRoles(). * Add basic SchemeStore implementation. * Migrate UpdateChannelMemberRoles properly and fix tests. * Update store tests and mocks so they work. * Include creating default roles in Scheme create store function. * Implement role deletion and start scheme deletion. * Only use non-deleted roles for authorization. * Add GetByScheme method to Team store. * Add GetChannelsByScheme. * Update store mocks. * Implement scheme deletion in the store. * Rename is valid function. * Add offset and limit to queries to fetch teams and channels by scheme. * Fix queries. * Implement scheme awareness in Team store and add a migration. * Tidy up ChannelStore mapping functions and add exhaustive unit tests. * Add all missing i18n. * Proper tests for TeamStore internal functions and fix them. * Make additional TeamMember fields nullable. * Make new ChannelMember fields nullable. * Create new nullable columns without defaults. * Make new fields in large tables nullalble. * Fix empty list of TeamMembers. * Deduplicate SQL queries. * Fix spelling. * Fix review comment. * More review fixes. * More review fixes.
Diffstat (limited to 'store/sqlstore/role_supplier.go')
-rw-r--r--store/sqlstore/role_supplier.go80
1 files changed, 73 insertions, 7 deletions
diff --git a/store/sqlstore/role_supplier.go b/store/sqlstore/role_supplier.go
index ddbdaca52..19ef602eb 100644
--- a/store/sqlstore/role_supplier.go
+++ b/store/sqlstore/role_supplier.go
@@ -10,6 +10,8 @@ import (
"net/http"
"strings"
+ "github.com/mattermost/gorp"
+
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store"
)
@@ -24,6 +26,7 @@ type Role struct {
DeleteAt int64
Permissions string
SchemeManaged bool
+ BuiltIn bool
}
func NewRoleFromModel(role *model.Role) *Role {
@@ -47,6 +50,7 @@ func NewRoleFromModel(role *model.Role) *Role {
DeleteAt: role.DeleteAt,
Permissions: permissions,
SchemeManaged: role.SchemeManaged,
+ BuiltIn: role.BuiltIn,
}
}
@@ -61,6 +65,7 @@ func (role Role) ToModel() *model.Role {
DeleteAt: role.DeleteAt,
Permissions: strings.Fields(role.Permissions),
SchemeManaged: role.SchemeManaged,
+ BuiltIn: role.BuiltIn,
}
}
@@ -84,21 +89,52 @@ func (s *SqlSupplier) RoleSave(ctx context.Context, role *model.Role, hints ...s
return result
}
- dbRole := NewRoleFromModel(role)
- if len(dbRole.Id) == 0 {
- dbRole.Id = model.NewId()
- dbRole.CreateAt = model.GetMillis()
- dbRole.UpdateAt = dbRole.CreateAt
- if err := s.GetMaster().Insert(dbRole); err != nil {
- result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.insert.app_error", nil, err.Error(), http.StatusInternalServerError)
+ if len(role.Id) == 0 {
+ if transaction, err := s.GetMaster().Begin(); err != nil {
+ result.Err = model.NewAppError("SqlRoleStore.RoleSave", "store.sql_role.save.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
+ return result
+ } else {
+ result = s.createRole(ctx, role, transaction, hints...)
+
+ if result.Err != nil {
+ transaction.Rollback()
+ } else if err := transaction.Commit(); err != nil {
+ result.Err = model.NewAppError("SqlRoleStore.RoleSave", "store.sql_role.save_role.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
+ }
}
} else {
+ dbRole := NewRoleFromModel(role)
+
dbRole.UpdateAt = model.GetMillis()
if rowsChanged, err := s.GetMaster().Update(dbRole); err != nil {
result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.update.app_error", nil, err.Error(), http.StatusInternalServerError)
} else if rowsChanged != 1 {
result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.update.app_error", nil, "no record to update", http.StatusInternalServerError)
}
+
+ result.Data = dbRole.ToModel()
+ }
+
+ return result
+}
+
+func (s *SqlSupplier) createRole(ctx context.Context, role *model.Role, transaction *gorp.Transaction, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
+ result := store.NewSupplierResult()
+
+ // Check the role is valid before proceeding.
+ if !role.IsValidWithoutId() {
+ result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.invalid_role.app_error", nil, "", http.StatusBadRequest)
+ return result
+ }
+
+ dbRole := NewRoleFromModel(role)
+
+ dbRole.Id = model.NewId()
+ dbRole.CreateAt = model.GetMillis()
+ dbRole.UpdateAt = dbRole.CreateAt
+
+ if err := transaction.Insert(dbRole); err != nil {
+ result.Err = model.NewAppError("SqlRoleStore.Save", "store.sql_role.save.insert.app_error", nil, err.Error(), http.StatusInternalServerError)
}
result.Data = dbRole.ToModel()
@@ -175,6 +211,36 @@ func (s *SqlSupplier) RoleGetByNames(ctx context.Context, names []string, hints
return result
}
+func (s *SqlSupplier) RoleDelete(ctx context.Context, roleId string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
+ result := store.NewSupplierResult()
+
+ // Get the role.
+ var role *Role
+ if err := s.GetReplica().SelectOne(&role, "SELECT * from Roles WHERE Id = :Id", map[string]interface{}{"Id": roleId}); err != nil {
+ if err == sql.ErrNoRows {
+ result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.get.app_error", nil, "Id="+roleId+", "+err.Error(), http.StatusNotFound)
+ } else {
+ result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.get.app_error", nil, err.Error(), http.StatusInternalServerError)
+ }
+
+ return result
+ }
+
+ time := model.GetMillis()
+ role.DeleteAt = time
+ role.UpdateAt = time
+
+ if rowsChanged, err := s.GetMaster().Update(role); err != nil {
+ result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.delete.update.app_error", nil, err.Error(), http.StatusInternalServerError)
+ } else if rowsChanged != 1 {
+ result.Err = model.NewAppError("SqlRoleStore.Delete", "store.sql_role.delete.update.app_error", nil, "no record to update", http.StatusInternalServerError)
+ } else {
+ result.Data = role.ToModel()
+ }
+
+ return result
+}
+
func (s *SqlSupplier) RolePermanentDeleteAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
result := store.NewSupplierResult()