diff --git a/src/Umbraco.Core/Models/MemberGroup.cs b/src/Umbraco.Core/Models/MemberGroup.cs index caaeb1d860..5d77c92385 100644 --- a/src/Umbraco.Core/Models/MemberGroup.cs +++ b/src/Umbraco.Core/Models/MemberGroup.cs @@ -44,5 +44,17 @@ namespace Umbraco.Core.Models }, _creatorId, CreatorIdSelector); } } + + /// + /// Method to call when Entity is being saved + /// + /// Created date is set and a Unique key is assigned + internal override void AddingEntity() + { + base.AddingEntity(); + + if (Key == Guid.Empty) + Key = Guid.NewGuid(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs index 1057da3958..2b9ec950f5 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs @@ -164,7 +164,7 @@ namespace Umbraco.Core.Persistence.Repositories .InnerJoin() .On(dto => dto.NodeId, dto => dto.NodeId) .Where(x => x.NodeObjectType == memberObjectType) - .Where(x => x.LoginName.Equals(username)); + .Where(x => x.LoginName == username); var memberIdUsername = Database.Fetch(memberSql).FirstOrDefault(); if (memberIdUsername.HasValue == false) { @@ -233,6 +233,8 @@ namespace Umbraco.Core.Persistence.Repositories { PersistNewItem(new MemberGroup { Name = m }); } + //now go get all the dto's for roles with these role names + var rolesForNames = Database.Fetch(existingSql).ToArray(); //get the groups that are currently assigned to any of these members @@ -262,7 +264,7 @@ namespace Umbraco.Core.Persistence.Repositories var nonAssignedRoles = roleNames.Except(assignedRoles); foreach (var toAssign in nonAssignedRoles) { - var groupId = found.First(x => x.RoleName == toAssign).MemberGroupId; + var groupId = rolesForNames.First(x => x.Text == toAssign).NodeId; Database.Insert(new Member2MemberGroupDto { Member = mId, MemberGroup = groupId }); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index c60cf97cb5..348b342ad4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -23,19 +23,22 @@ namespace Umbraco.Core.Persistence.Repositories internal class MemberRepository : VersionableRepositoryBase, IMemberRepository { private readonly IMemberTypeRepository _memberTypeRepository; + private readonly IMemberGroupRepository _memberGroupRepository; - public MemberRepository(IDatabaseUnitOfWork work, IMemberTypeRepository memberTypeRepository) + public MemberRepository(IDatabaseUnitOfWork work, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository) : base(work) { if (memberTypeRepository == null) throw new ArgumentNullException("memberTypeRepository"); _memberTypeRepository = memberTypeRepository; + _memberGroupRepository = memberGroupRepository; } - public MemberRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache, IMemberTypeRepository memberTypeRepository) + public MemberRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository) : base(work, cache) { if (memberTypeRepository == null) throw new ArgumentNullException("memberTypeRepository"); _memberTypeRepository = memberTypeRepository; + _memberGroupRepository = memberGroupRepository; } #region Overrides of RepositoryBase @@ -434,9 +437,13 @@ namespace Umbraco.Core.Persistence.Repositories /// public IEnumerable GetByMemberGroup(string groupName) { - var subquery = GetSubquery().Where(x => x.Text.Equals(groupName)); + var grpQry = new Query().Where(group => group.Name.Equals(groupName)); + var memberGroup = _memberGroupRepository.GetByQuery(grpQry).FirstOrDefault(); + if (memberGroup == null) return Enumerable.Empty(); + var subQuery = new Sql().Select("Member").From().Where(dto => dto.MemberGroup == memberGroup.Id); + var sql = GetBaseQuery(false) - .Append(new Sql("WHERE umbracoNode.id IN (" + subquery.SQL + ")", subquery.Arguments)) + .Append(new Sql("WHERE umbracoNode.id IN (" + subQuery.SQL + ")", subQuery.Arguments)) .OrderByDescending(x => x.VersionDate) .OrderBy(x => x.SortOrder); diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 0460f8e6fd..935c199749 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -152,7 +152,11 @@ namespace Umbraco.Core.Persistence internal virtual IMemberRepository CreateMemberRepository(IDatabaseUnitOfWork uow) { - return new MemberRepository(uow, _disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current, CreateMemberTypeRepository(uow)); + return new MemberRepository( + uow, + _disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current, + CreateMemberTypeRepository(uow), + CreateMemberGroupRepository(uow)); } internal virtual IMemberTypeRepository CreateMemberTypeRepository(IDatabaseUnitOfWork uow) diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index b2253c8dd0..584091f1eb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -29,10 +29,11 @@ namespace Umbraco.Tests.Persistence.Repositories base.TearDown(); } - private MemberRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out MemberTypeRepository memberTypeRepository) + private MemberRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out MemberTypeRepository memberTypeRepository, out MemberGroupRepository memberGroupRepository) { memberTypeRepository = new MemberTypeRepository(unitOfWork, NullCacheProvider.Current); - var repository = new MemberRepository(unitOfWork, NullCacheProvider.Current, memberTypeRepository); + memberGroupRepository = new MemberGroupRepository(unitOfWork, NullCacheProvider.Current); + var repository = new MemberRepository(unitOfWork, NullCacheProvider.Current, memberTypeRepository, memberGroupRepository); return repository; } @@ -56,7 +57,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var member = CreateTestMember(); @@ -73,7 +75,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var type = CreateTestMemberType(); var m1 = CreateTestMember(type, "Test 1", "test1@test.com", "pass1", "test1"); @@ -94,7 +97,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var type = CreateTestMemberType(); for (var i = 0; i < 5; i++) @@ -118,7 +122,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var key = Guid.NewGuid(); var member = CreateTestMember(key: key); @@ -140,7 +145,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { // Act @@ -161,7 +167,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { // Act @@ -180,7 +187,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var member = CreateTestMember(); @@ -202,7 +210,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); @@ -228,7 +237,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); @@ -256,7 +266,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); @@ -302,7 +313,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { if (memberType == null) { @@ -324,7 +336,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; - using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + MemberGroupRepository memberGroupRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index 31548bc286..7bda2ea76c 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -39,37 +39,108 @@ namespace Umbraco.Tests.Services [Test] public void Can_Create_Duplicate_Role() { + ServiceContext.MemberService.AddRole("MyTestRole"); + ServiceContext.MemberService.AddRole("MyTestRole"); + var found = ServiceContext.MemberService.GetAllRoles(); + + Assert.AreEqual(1, found.Count()); + Assert.AreEqual("MyTestRole", found.Single()); } [Test] public void Can_Get_All_Roles() { + ServiceContext.MemberService.AddRole("MyTestRole1"); + ServiceContext.MemberService.AddRole("MyTestRole2"); + ServiceContext.MemberService.AddRole("MyTestRole3"); + var found = ServiceContext.MemberService.GetAllRoles(); + + Assert.AreEqual(3, found.Count()); } [Test] public void Can_Get_All_Roles_By_Member_Id() { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + IMember member = MockedMember.CreateSimpleMember(memberType, "test", "test@test.com", "pass", "test"); + ServiceContext.MemberService.Save(member); + + ServiceContext.MemberService.AddRole("MyTestRole1"); + ServiceContext.MemberService.AddRole("MyTestRole2"); + ServiceContext.MemberService.AddRole("MyTestRole3"); + ServiceContext.MemberService.AssignRoles(new[] { member.Id }, new[] { "MyTestRole1", "MyTestRole2" }); + + var memberRoles = ServiceContext.MemberService.GetAllRoles(member.Id); + + Assert.AreEqual(2, memberRoles.Count()); } [Test] public void Can_Get_All_Roles_By_Member_Username() { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + IMember member = MockedMember.CreateSimpleMember(memberType, "test", "test@test.com", "pass", "test"); + ServiceContext.MemberService.Save(member); + ServiceContext.MemberService.AddRole("MyTestRole1"); + ServiceContext.MemberService.AddRole("MyTestRole2"); + ServiceContext.MemberService.AddRole("MyTestRole3"); + ServiceContext.MemberService.AssignRoles(new[] { member.Id }, new[] { "MyTestRole1", "MyTestRole2" }); + + var memberRoles = ServiceContext.MemberService.GetAllRoles("test"); + + Assert.AreEqual(2, memberRoles.Count()); } [Test] public void Can_Delete_Role() { + ServiceContext.MemberService.AddRole("MyTestRole1"); + ServiceContext.MemberService.DeleteRole("MyTestRole1", false); + + var memberRoles = ServiceContext.MemberService.GetAllRoles(); + + Assert.AreEqual(0, memberRoles.Count()); } [Test] public void Throws_When_Deleting_Assigned_Role() { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + IMember member = MockedMember.CreateSimpleMember(memberType, "test", "test@test.com", "pass", "test"); + ServiceContext.MemberService.Save(member); + ServiceContext.MemberService.AddRole("MyTestRole1"); + ServiceContext.MemberService.AssignRoles(new[] { member.Id }, new[] { "MyTestRole1", "MyTestRole2" }); + + Assert.Throws(() => ServiceContext.MemberService.DeleteRole("MyTestRole1", true)); + } + + [Test] + public void Can_Get_Members_In_Role() + { + ServiceContext.MemberService.AddRole("MyTestRole1"); + var roleId = DatabaseContext.Database.ExecuteScalar("SELECT id from umbracoNode where [text] = 'MyTestRole1'"); + + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + var member1 = MockedMember.CreateSimpleMember(memberType, "test1", "test1@test.com", "pass", "test1"); + ServiceContext.MemberService.Save(member1); + var member2 = MockedMember.CreateSimpleMember(memberType, "test2", "test2@test.com", "pass", "test2"); + ServiceContext.MemberService.Save(member2); + + DatabaseContext.Database.Insert(new Member2MemberGroupDto {MemberGroup = roleId, Member = member1.Id}); + DatabaseContext.Database.Insert(new Member2MemberGroupDto { MemberGroup = roleId, Member = member2.Id }); + + var membersInRole = ServiceContext.MemberService.GetMembersInRole("MyTestRole1"); + Assert.AreEqual(2, membersInRole.Count()); } [Test] @@ -81,13 +152,57 @@ namespace Umbraco.Tests.Services [Test] public void Associate_Members_To_Roles_With_Member_Id() { + ServiceContext.MemberService.AddRole("MyTestRole1"); + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + var member1 = MockedMember.CreateSimpleMember(memberType, "test1", "test1@test.com", "pass", "test1"); + ServiceContext.MemberService.Save(member1); + var member2 = MockedMember.CreateSimpleMember(memberType, "test2", "test2@test.com", "pass", "test2"); + ServiceContext.MemberService.Save(member2); + + ServiceContext.MemberService.AssignRoles(new[] { member1.Id, member2.Id }, new[] { "MyTestRole1" }); + + var membersInRole = ServiceContext.MemberService.GetMembersInRole("MyTestRole1"); + + Assert.AreEqual(2, membersInRole.Count()); } [Test] public void Associate_Members_To_Roles_With_Member_Username() { + ServiceContext.MemberService.AddRole("MyTestRole1"); + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + var member1 = MockedMember.CreateSimpleMember(memberType, "test1", "test1@test.com", "pass", "test1"); + ServiceContext.MemberService.Save(member1); + var member2 = MockedMember.CreateSimpleMember(memberType, "test2", "test2@test.com", "pass", "test2"); + ServiceContext.MemberService.Save(member2); + + ServiceContext.MemberService.AssignRoles(new[] { member1.Username, member2.Username }, new[] { "MyTestRole1" }); + + var membersInRole = ServiceContext.MemberService.GetMembersInRole("MyTestRole1"); + + Assert.AreEqual(2, membersInRole.Count()); + } + + [Test] + public void Associate_Members_To_Roles_With_New_Role() + { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + var member1 = MockedMember.CreateSimpleMember(memberType, "test1", "test1@test.com", "pass", "test1"); + ServiceContext.MemberService.Save(member1); + var member2 = MockedMember.CreateSimpleMember(memberType, "test2", "test2@test.com", "pass", "test2"); + ServiceContext.MemberService.Save(member2); + + //implicitly create the role + ServiceContext.MemberService.AssignRoles(new[] { member1.Username, member2.Username }, new[] { "MyTestRole1" }); + + var membersInRole = ServiceContext.MemberService.GetMembersInRole("MyTestRole1"); + + Assert.AreEqual(2, membersInRole.Count()); } [Test]