Files
Umbraco-CMS/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs

325 lines
13 KiB
C#
Raw Normal View History

2017-12-07 16:45:25 +01:00
using System;
using System.Collections.Generic;
using System.Linq;
using NPoco;
using Umbraco.Core.Cache;
using Umbraco.Core.Events;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
2017-12-28 09:06:33 +01:00
using Umbraco.Core.Persistence.Dtos;
2017-12-07 16:45:25 +01:00
using Umbraco.Core.Persistence.Factories;
using Umbraco.Core.Persistence.Querying;
2017-12-12 15:04:13 +01:00
using Umbraco.Core.Scoping;
2017-12-07 16:45:25 +01:00
namespace Umbraco.Core.Persistence.Repositories.Implement
{
internal class MemberGroupRepository : NPocoRepositoryBase<int, IMemberGroup>, IMemberGroupRepository
{
2019-01-17 08:34:29 +01:00
public MemberGroupRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger)
2017-12-14 17:04:44 +01:00
: base(scopeAccessor, cache, logger)
2017-12-07 16:45:25 +01:00
{ }
protected override IMemberGroup PerformGet(int id)
{
var sql = GetBaseQuery(false);
sql.Where(GetBaseWhereClause(), new { id = id });
2017-12-07 16:45:25 +01:00
var dto = Database.Fetch<NodeDto>(SqlSyntax.SelectTop(sql, 1)).FirstOrDefault();
2018-06-29 11:52:12 +01:00
return dto == null ? null : MemberGroupFactory.BuildEntity(dto);
2017-12-07 16:45:25 +01:00
}
protected override IEnumerable<IMemberGroup> PerformGetAll(params int[] ids)
{
var sql = Sql()
.SelectAll()
.From<NodeDto>()
.Where<NodeDto>(dto => dto.NodeObjectType == NodeObjectTypeId);
if (ids.Any())
sql.Where("umbracoNode.id in (@ids)", new { /*ids =*/ ids });
2018-06-29 11:52:12 +01:00
return Database.Fetch<NodeDto>(sql).Select(x => MemberGroupFactory.BuildEntity(x));
2017-12-07 16:45:25 +01:00
}
protected override IEnumerable<IMemberGroup> PerformGetByQuery(IQuery<IMemberGroup> query)
{
var sqlClause = GetBaseQuery(false);
var translator = new SqlTranslator<IMemberGroup>(sqlClause, query);
var sql = translator.Translate();
2018-06-29 11:52:12 +01:00
return Database.Fetch<NodeDto>(sql).Select(x => MemberGroupFactory.BuildEntity(x));
2017-12-07 16:45:25 +01:00
}
protected override Sql<ISqlContext> GetBaseQuery(bool isCount)
{
var sql = Sql();
sql = isCount
? sql.SelectCount()
: sql.Select<NodeDto>();
sql
.From<NodeDto>()
.Where<NodeDto>(x => x.NodeObjectType == NodeObjectTypeId);
return sql;
}
protected override string GetBaseWhereClause()
{
2020-07-30 17:12:18 +02:00
return $"{Constants.DatabaseSchema.Tables.Node}.id = @id";
2017-12-07 16:45:25 +01:00
}
protected override IEnumerable<string> GetDeleteClauses()
{
var list = new[]
{
"DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @id",
"DELETE FROM umbracoUserGroup2NodePermission WHERE nodeId = @id",
"DELETE FROM umbracoRelation WHERE parentId = @id",
"DELETE FROM umbracoRelation WHERE childId = @id",
"DELETE FROM cmsTagRelationship WHERE nodeId = @id",
"DELETE FROM cmsMember2MemberGroup WHERE MemberGroup = @id",
"DELETE FROM umbracoNode WHERE id = @id"
};
return list;
}
protected override Guid NodeObjectTypeId => Constants.ObjectTypes.MemberGroup;
protected override void PersistNewItem(IMemberGroup entity)
{
//Save to db
entity.AddingEntity();
2017-12-07 16:45:25 +01:00
var group = (MemberGroup)entity;
2018-06-29 11:52:12 +01:00
var dto = MemberGroupFactory.BuildDto(group);
2017-12-07 16:45:25 +01:00
var o = Database.IsNew(dto) ? Convert.ToInt32(Database.Insert(dto)) : Database.Update(dto);
group.Id = dto.NodeId; //Set Id on entity to ensure an Id is set
//Update with new correct path and id
dto.Path = string.Concat("-1,", dto.NodeId);
Database.Update(dto);
//assign to entity
group.Id = o;
group.ResetDirtyProperties();
}
protected override void PersistUpdatedItem(IMemberGroup entity)
{
2018-06-29 11:52:12 +01:00
var dto = MemberGroupFactory.BuildDto(entity);
2017-12-07 16:45:25 +01:00
Database.Update(dto);
entity.ResetDirtyProperties();
}
2020-07-30 17:12:18 +02:00
public IMemberGroup Get(Guid uniqueId)
{
var sql = GetBaseQuery(false);
sql.Where("umbracoNode.uniqueId = @uniqueId", new { uniqueId });
var dto = Database.Fetch<NodeDto>(SqlSyntax.SelectTop(sql, 1)).FirstOrDefault();
return dto == null ? null : MemberGroupFactory.BuildEntity(dto);
}
2017-12-07 16:45:25 +01:00
public IMemberGroup GetByName(string name)
{
return IsolatedCache.GetCacheItem<IMemberGroup>(
typeof (IMemberGroup).FullName + "." + name,
() =>
{
var qry = Query<IMemberGroup>().Where(group => group.Name.Equals(name));
var result = Get(qry);
return result.FirstOrDefault();
},
2019-01-18 08:14:08 +01:00
//cache for 5 mins since that is the default in the Runtime app cache
2017-12-07 16:45:25 +01:00
TimeSpan.FromMinutes(5),
//sliding is true
true);
}
public IMemberGroup CreateIfNotExists(string roleName)
{
var qry = Query<IMemberGroup>().Where(group => group.Name.Equals(roleName));
var result = Get(qry);
if (result.Any()) return null;
var grp = new MemberGroup
{
Name = roleName
};
PersistNewItem(grp);
2017-12-12 15:04:13 +01:00
if (AmbientScope.Events.DispatchCancelable(SavingMemberGroup, this, new SaveEventArgs<IMemberGroup>(grp)))
2017-12-07 16:45:25 +01:00
return null;
2017-12-12 15:04:13 +01:00
AmbientScope.Events.Dispatch(SavedMemberGroup, this, new SaveEventArgs<IMemberGroup>(grp));
2017-12-07 16:45:25 +01:00
return grp;
}
public IEnumerable<IMemberGroup> GetMemberGroupsForMember(int memberId)
{
var sql = Sql()
.Select("umbracoNode.*")
.From<NodeDto>()
.InnerJoin<Member2MemberGroupDto>()
.On<NodeDto, Member2MemberGroupDto>( dto => dto.NodeId, dto => dto.MemberGroup)
.Where<NodeDto>(x => x.NodeObjectType == NodeObjectTypeId)
.Where<Member2MemberGroupDto>(x => x.Member == memberId);
return Database.Fetch<NodeDto>(sql)
.DistinctBy(dto => dto.NodeId)
2018-06-29 11:52:12 +01:00
.Select(x => MemberGroupFactory.BuildEntity(x));
2017-12-07 16:45:25 +01:00
}
public IEnumerable<IMemberGroup> GetMemberGroupsForMember(string username)
{
var sql = Sql()
.Select("un.*")
.From("umbracoNode AS un")
.InnerJoin("cmsMember2MemberGroup")
2018-03-22 11:24:12 +01:00
.On("cmsMember2MemberGroup.MemberGroup = un.id")
.InnerJoin("cmsMember")
.On("cmsMember.nodeId = cmsMember2MemberGroup.Member")
.Where("un.nodeObjectType=@objectType", new { objectType = NodeObjectTypeId })
.Where("cmsMember.LoginName=@loginName", new { loginName = username });
2017-12-07 16:45:25 +01:00
return Database.Fetch<NodeDto>(sql)
.DistinctBy(dto => dto.NodeId)
2018-06-29 11:52:12 +01:00
.Select(x => MemberGroupFactory.BuildEntity(x));
2017-12-07 16:45:25 +01:00
}
2018-03-22 11:24:12 +01:00
public int[] GetMemberIds(string[] usernames)
2017-12-07 16:45:25 +01:00
{
var memberObjectType = Constants.ObjectTypes.Member;
var memberSql = Sql()
.Select("umbracoNode.id")
.From<NodeDto>()
.InnerJoin<MemberDto>()
.On<NodeDto, MemberDto>(dto => dto.NodeId, dto => dto.NodeId)
.Where<NodeDto>(x => x.NodeObjectType == memberObjectType)
.Where("cmsMember.LoginName in (@usernames)", new { /*usernames =*/ usernames });
2018-03-22 11:24:12 +01:00
return Database.Fetch<int>(memberSql).ToArray();
}
2017-12-07 16:45:25 +01:00
2018-03-22 11:24:12 +01:00
public void AssignRoles(string[] usernames, string[] roleNames)
{
AssignRolesInternal(GetMemberIds(usernames), roleNames);
2017-12-07 16:45:25 +01:00
}
public void DissociateRoles(string[] usernames, string[] roleNames)
{
2018-03-22 11:24:12 +01:00
DissociateRolesInternal(GetMemberIds(usernames), roleNames);
2017-12-07 16:45:25 +01:00
}
public void AssignRoles(int[] memberIds, string[] roleNames)
{
AssignRolesInternal(memberIds, roleNames);
}
public void AssignRolesInternal(int[] memberIds, string[] roleNames)
{
//ensure they're unique
memberIds = memberIds.Distinct().ToArray();
//create the missing roles first
var existingSql = Sql()
.SelectAll()
.From<NodeDto>()
.Where<NodeDto>(dto => dto.NodeObjectType == NodeObjectTypeId)
.Where("umbracoNode." + SqlSyntax.GetQuotedColumnName("text") + " in (@names)", new { names = roleNames });
var existingRoles = Database.Fetch<NodeDto>(existingSql).Select(x => x.Text);
Merge remote-tracking branch 'origin/dev-v7' into temp8 # Conflicts: # build/NuSpecs/tools/Web.config.install.xdt # src/Umbraco.Core/Constants-Conventions.cs # src/Umbraco.Core/DatabaseContext.cs # src/Umbraco.Core/Models/Rdbms/LanguageDto.cs # src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs # src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs # src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs # src/Umbraco.Core/PropertyEditors/PreValueField.cs # src/Umbraco.Core/PropertyEditors/SupportTagsAttribute.cs # src/Umbraco.Core/Services/FileService.cs # src/Umbraco.Core/Services/IFileService.cs # src/Umbraco.Core/Strategies/RelateOnTrashHandler.cs # src/Umbraco.Tests/App.config # src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs # src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs # src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js # src/Umbraco.Web.UI.Client/src/common/directives/components/umbgridselector.directive.js # src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js # src/Umbraco.Web.UI.Client/src/less/belle.less # src/Umbraco.Web.UI.Client/src/less/components/application/umb-drawer.less # src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less # src/Umbraco.Web.UI.Client/src/less/hacks.less # src/Umbraco.Web.UI.Client/src/less/property-editors.less # src/Umbraco.Web.UI.Client/src/less/variables.less # src/Umbraco.Web.UI.Client/src/views/common/dialogs/insertmacro.controller.js # src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html # src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html # src/Umbraco.Web.UI.Client/src/views/components/umb-grid-selector.html # src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js # src/Umbraco.Web.UI.Client/src/views/documenttypes/views/templates/templates.html # src/Umbraco.Web.UI.Client/src/views/media/move.html # src/Umbraco.Web.UI.Client/src/views/prevalueeditors/multivalues.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.html # src/Umbraco.Web.UI/Views/Web.config # src/Umbraco.Web.UI/umbraco/Install/Views/Web.config # src/Umbraco.Web.UI/umbraco/config/lang/da.xml # src/Umbraco.Web.UI/umbraco/config/lang/en.xml # src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml # src/Umbraco.Web.UI/umbraco/config/lang/nl.xml # src/Umbraco.Web.UI/umbraco/config/lang/ru.xml # src/Umbraco.Web.UI/web.Template.Debug.config # src/Umbraco.Web.UI/web.Template.config # src/Umbraco.Web/Editors/TemplateController.cs # src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs # src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs # src/Umbraco.Web/PropertyEditors/ColorListPreValueEditor.cs # src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs # src/Umbraco.Web/PropertyEditors/TagsPropertyEditor.cs # src/Umbraco.Web/PropertyEditors/TrueFalsePropertyEditor.cs # src/Umbraco.Web/PropertyEditors/ValueListPreValueEditor.cs # src/Umbraco.Web/PublishedContentExtensions.cs # src/Umbraco.Web/Trees/ApplicationTreeExtensions.cs # src/Umbraco.Web/Trees/MediaTreeController.cs # src/umbraco.MacroEngines/Resources/Web.config # src/umbraco.cms/Actions/ActionRestore.cs # src/umbraco.editorControls/yesno/YesNoDataType.cs
2018-07-30 21:31:35 +10:00
var missingRoles = roleNames.Except(existingRoles, StringComparer.CurrentCultureIgnoreCase);
2017-12-07 16:45:25 +01:00
var missingGroups = missingRoles.Select(x => new MemberGroup {Name = x}).ToArray();
2017-12-12 15:04:13 +01:00
if (AmbientScope.Events.DispatchCancelable(SavingMemberGroup, this, new SaveEventArgs<IMemberGroup>(missingGroups)))
2017-12-07 16:45:25 +01:00
return;
foreach (var m in missingGroups)
PersistNewItem(m);
2017-12-12 15:04:13 +01:00
AmbientScope.Events.Dispatch(SavedMemberGroup, this, new SaveEventArgs<IMemberGroup>(missingGroups));
2017-12-07 16:45:25 +01:00
//now go get all the dto's for roles with these role names
var rolesForNames = Database.Fetch<NodeDto>(existingSql).ToArray();
//get the groups that are currently assigned to any of these members
var assignedSql = Sql()
.Select($"{SqlSyntax.GetQuotedColumnName("text")},{SqlSyntax.GetQuotedColumnName("Member")},{SqlSyntax.GetQuotedColumnName("MemberGroup")}")
.From<NodeDto>()
.InnerJoin<Member2MemberGroupDto>()
.On<NodeDto, Member2MemberGroupDto>(dto => dto.NodeId, dto => dto.MemberGroup)
.Where<NodeDto>(x => x.NodeObjectType == NodeObjectTypeId)
.Where("cmsMember2MemberGroup.Member in (@ids)", new { ids = memberIds });
var currentlyAssigned = Database.Fetch<AssignedRolesDto>(assignedSql).ToArray();
//assign the roles for each member id
foreach (var memberId in memberIds)
{
//find any roles for the current member that are currently assigned that
//exist in the roleNames list, then determine which ones are not currently assigned.
var mId = memberId;
var found = currentlyAssigned.Where(x => x.MemberId == mId).ToArray();
Merge remote-tracking branch 'origin/dev-v7' into temp8 # Conflicts: # build/NuSpecs/tools/Web.config.install.xdt # src/Umbraco.Core/Constants-Conventions.cs # src/Umbraco.Core/DatabaseContext.cs # src/Umbraco.Core/Models/Rdbms/LanguageDto.cs # src/Umbraco.Core/Models/Rdbms/RelationTypeDto.cs # src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs # src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs # src/Umbraco.Core/PropertyEditors/PreValueField.cs # src/Umbraco.Core/PropertyEditors/SupportTagsAttribute.cs # src/Umbraco.Core/Services/FileService.cs # src/Umbraco.Core/Services/IFileService.cs # src/Umbraco.Core/Strategies/RelateOnTrashHandler.cs # src/Umbraco.Tests/App.config # src/Umbraco.Tests/Persistence/Repositories/RelationTypeRepositoryTest.cs # src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs # src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js # src/Umbraco.Web.UI.Client/src/common/directives/components/umbgridselector.directive.js # src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js # src/Umbraco.Web.UI.Client/src/less/belle.less # src/Umbraco.Web.UI.Client/src/less/components/application/umb-drawer.less # src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less # src/Umbraco.Web.UI.Client/src/less/hacks.less # src/Umbraco.Web.UI.Client/src/less/property-editors.less # src/Umbraco.Web.UI.Client/src/less/variables.less # src/Umbraco.Web.UI.Client/src/views/common/dialogs/insertmacro.controller.js # src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html # src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html # src/Umbraco.Web.UI.Client/src/views/components/umb-grid-selector.html # src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js # src/Umbraco.Web.UI.Client/src/views/documenttypes/views/templates/templates.html # src/Umbraco.Web.UI.Client/src/views/media/move.html # src/Umbraco.Web.UI.Client/src/views/prevalueeditors/multivalues.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.html # src/Umbraco.Web.UI/Views/Web.config # src/Umbraco.Web.UI/umbraco/Install/Views/Web.config # src/Umbraco.Web.UI/umbraco/config/lang/da.xml # src/Umbraco.Web.UI/umbraco/config/lang/en.xml # src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml # src/Umbraco.Web.UI/umbraco/config/lang/nl.xml # src/Umbraco.Web.UI/umbraco/config/lang/ru.xml # src/Umbraco.Web.UI/web.Template.Debug.config # src/Umbraco.Web.UI/web.Template.config # src/Umbraco.Web/Editors/TemplateController.cs # src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs # src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs # src/Umbraco.Web/PropertyEditors/ColorListPreValueEditor.cs # src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs # src/Umbraco.Web/PropertyEditors/TagsPropertyEditor.cs # src/Umbraco.Web/PropertyEditors/TrueFalsePropertyEditor.cs # src/Umbraco.Web/PropertyEditors/ValueListPreValueEditor.cs # src/Umbraco.Web/PublishedContentExtensions.cs # src/Umbraco.Web/Trees/ApplicationTreeExtensions.cs # src/Umbraco.Web/Trees/MediaTreeController.cs # src/umbraco.MacroEngines/Resources/Web.config # src/umbraco.cms/Actions/ActionRestore.cs # src/umbraco.editorControls/yesno/YesNoDataType.cs
2018-07-30 21:31:35 +10:00
var assignedRoles = found.Where(x => roleNames.Contains(x.RoleName, StringComparer.CurrentCultureIgnoreCase)).Select(x => x.RoleName);
var nonAssignedRoles = roleNames.Except(assignedRoles, StringComparer.CurrentCultureIgnoreCase);
2017-12-07 16:45:25 +01:00
foreach (var toAssign in nonAssignedRoles)
{
Merge remote-tracking branch 'origin/dev-v7' into temp8 # Conflicts: # src/SolutionInfo.cs # src/Umbraco.Core/Configuration/GlobalSettings.cs # src/Umbraco.Core/Configuration/UmbracoConfig.cs # src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs # src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs # src/Umbraco.Core/Models/IContentTypeBase.cs # src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs # src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs # src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs # src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs # src/Umbraco.Core/Services/ContentService.cs # src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs # src/Umbraco.Tests/packages.config # src/Umbraco.Web.UI.Client/bower.json # src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js # src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js # src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js # src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js # src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js # src/Umbraco.Web.UI.Client/src/less/belle.less # src/Umbraco.Web.UI.Client/src/less/buttons.less # src/Umbraco.Web.UI.Client/src/less/components/umb-tabs.less # src/Umbraco.Web.UI.Client/src/less/forms.less # src/Umbraco.Web.UI.Client/src/less/hacks.less # src/Umbraco.Web.UI.Client/src/less/modals.less # src/Umbraco.Web.UI.Client/src/less/panel.less # src/Umbraco.Web.UI.Client/src/views/common/dialogs/approvedcolorpicker.controller.js # src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.controller.js # src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js # src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.html # src/Umbraco.Web.UI.Client/src/views/components/imaging/umb-image-gravity.html # src/Umbraco.Web.UI.Client/src/views/dashboard/media/mediadashboardvideos.html # src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html # src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardvideos.html # src/Umbraco.Web.UI.Client/src/views/documenttypes/edit.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.html # src/Umbraco.Web.UI.Client/src/views/users/user.html # src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html # src/Umbraco.Web.UI/Umbraco/Views/Preview/Index.cshtml # src/Umbraco.Web.UI/Umbraco/config/lang/da.xml # src/Umbraco.Web.UI/Umbraco/dialogs/protectPage.aspx # src/Umbraco.Web.UI/Umbraco/dialogs/rollBack.aspx # src/Umbraco.Web.UI/config/EmbeddedMedia.Release.config # src/Umbraco.Web.UI/config/EmbeddedMedia.config # src/Umbraco.Web.UI/umbraco/config/lang/en.xml # src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml # src/Umbraco.Web.UI/umbraco/dialogs/sort.aspx # src/Umbraco.Web.UI/umbraco_client/Dialogs/PublishDialog.js # src/Umbraco.Web.UI/web.Template.config # src/Umbraco.Web/Editors/ContentController.cs # src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/DatabaseSchemaValidationHealthCheck.cs # src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs # src/Umbraco.Web/Models/Trees/TreeNodeExtensions.cs # src/Umbraco.Web/PropertyEditors/ColorListPreValueEditor.cs # src/Umbraco.Web/PropertyEditors/EmailAddressPropertyEditor.cs # src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs # src/Umbraco.Web/PropertyEditors/TrueFalsePropertyEditor.cs # src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlPublishedContent.cs # src/Umbraco.Web/Routing/ContentFinderByUrlAlias.cs # src/Umbraco.Web/Templates/TemplateUtilities.cs # src/Umbraco.Web/UmbracoHelper.cs # src/Umbraco.Web/WebServices/SaveFileController.cs # src/Umbraco.Web/umbraco.presentation/umbraco/Trees/FileSystemTree.cs # src/Umbraco.Web/umbraco.presentation/umbraco/controls/dualSelectBox.cs # src/Umbraco.Web/umbraco.presentation/umbraco/dashboard/FeedProxy.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/rollBack.aspx # src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/rollBack.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/editstylesheet.aspx.cs
2018-10-22 16:03:01 +11:00
var groupId = rolesForNames.First(x => x.Text.InvariantEquals(toAssign)).NodeId;
2017-12-07 16:45:25 +01:00
Database.Insert(new Member2MemberGroupDto { Member = mId, MemberGroup = groupId });
}
}
}
public void DissociateRoles(int[] memberIds, string[] roleNames)
{
DissociateRolesInternal(memberIds, roleNames);
}
private void DissociateRolesInternal(int[] memberIds, string[] roleNames)
{
var existingSql = Sql()
.SelectAll()
.From<NodeDto>()
.Where<NodeDto>(dto => dto.NodeObjectType == NodeObjectTypeId)
.Where("umbracoNode." + SqlSyntax.GetQuotedColumnName("text") + " in (@names)", new { names = roleNames });
var existingRolesIds = Database.Fetch<NodeDto>(existingSql).Select(x => x.NodeId).ToArray();
Database.Execute("DELETE FROM cmsMember2MemberGroup WHERE Member IN (@memberIds) AND MemberGroup IN (@memberGroups)",
new { /*memberIds =*/ memberIds, memberGroups = existingRolesIds });
}
private class AssignedRolesDto
{
[Column("text")]
public string RoleName { get; set; }
[Column("Member")]
public int MemberId { get; set; }
[Column("MemberGroup")]
public int MemberGroupId { get; set; }
}
// TODO: understand why we need these two repository-level events, move them back to service
2017-12-07 16:45:25 +01:00
/// <summary>
/// Occurs before Save
/// </summary>
internal static event TypedEventHandler<IMemberGroupRepository, SaveEventArgs<IMemberGroup>> SavingMemberGroup;
/// <summary>
/// Occurs after Save
/// </summary>
internal static event TypedEventHandler<IMemberGroupRepository, SaveEventArgs<IMemberGroup>> SavedMemberGroup;
}
}