diff --git a/src/Umbraco.Core/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs index acdd8db907..2bf305da26 100644 --- a/src/Umbraco.Core/Models/Membership/IUser.cs +++ b/src/Umbraco.Core/Models/Membership/IUser.cs @@ -12,6 +12,11 @@ namespace Umbraco.Core.Models.Membership int SessionTimeout { get; set; } int StartContentId { get; set; } int StartMediaId { get; set; } + string Lanuguage { get; set; } + bool DefaultToLiveEditing { get; set; } IEnumerable Applications { get; set; } + bool NoConsole { get; set; } + IUserType UserType { get; } + string Permissions { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Membership/IUserType.cs b/src/Umbraco.Core/Models/Membership/IUserType.cs new file mode 100644 index 0000000000..229cbfee53 --- /dev/null +++ b/src/Umbraco.Core/Models/Membership/IUserType.cs @@ -0,0 +1,11 @@ +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models.Membership +{ + internal interface IUserType : IAggregateRoot + { + string Alias { get; set; } + string Name { get; set; } + string Permissions { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs index 796b4966dd..3018a8b409 100644 --- a/src/Umbraco.Core/Models/Membership/User.cs +++ b/src/Umbraco.Core/Models/Membership/User.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models.Membership @@ -16,6 +17,11 @@ namespace Umbraco.Core.Models.Membership private bool _hasIdentity; private int _id; + public User(IUserType userType) + { + Groups = new List {userType}; + } + #region Implementation of IEntity public bool HasIdentity { get { return Id != null || _hasIdentity; } } @@ -24,11 +30,11 @@ namespace Umbraco.Core.Models.Membership { get { - return _id; + return int.Parse(base.Id.ToString()); } set { - _id = value; + base.Id = value; _hasIdentity = true; } } @@ -58,5 +64,23 @@ namespace Umbraco.Core.Models.Membership public IEnumerable Groups { get; set; } #endregion + + #region Implementation of IUser + + public string Lanuguage { get; set; } + public string Permissions { get; set; } + public bool DefaultToLiveEditing { get; set; } + public bool NoConsole { get; set; } + + public IUserType UserType + { + get + { + var type = Groups.FirstOrDefault(); + return type as IUserType; + } + } + + #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Membership/UserType.cs b/src/Umbraco.Core/Models/Membership/UserType.cs new file mode 100644 index 0000000000..a466e51d0d --- /dev/null +++ b/src/Umbraco.Core/Models/Membership/UserType.cs @@ -0,0 +1,18 @@ +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models.Membership +{ + /// + /// Represents the Type for a Backoffice User + /// + /// + /// Should be internal until a proper user/membership implementation + /// is part of the roadmap. + /// + internal class UserType : Entity, IUserType + { + public string Alias { get; set; } + public string Name { get; set; } + public string Permissions { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/UserFactory.cs b/src/Umbraco.Core/Persistence/Factories/UserFactory.cs new file mode 100644 index 0000000000..207c08bdd2 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Factories/UserFactory.cs @@ -0,0 +1,65 @@ +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Factories +{ + internal class UserFactory : IEntityFactory + { + private readonly IUserType _userType; + + public UserFactory(IUserType userType) + { + _userType = userType; + } + + #region Implementation of IEntityFactory + + public IUser BuildEntity(UserDto dto) + { + //TODO Add list of applications for user + return new User(_userType) + { + Id = dto.Id, + ProfileId = dto.Id, + StartContentId = dto.ContentStartId, + StartMediaId = dto.MediaStartId.HasValue ? dto.MediaStartId.Value : -1, + Password = dto.Password, + Username = dto.Login, + Name = dto.UserName, + IsLockedOut = dto.Disabled, + IsApproved = dto.Disabled == false, + Email = dto.Email, + Lanuguage = dto.UserLanguage, + DefaultToLiveEditing = dto.DefaultToLiveEditing, + NoConsole = dto.NoConsole, + Permissions = dto.DefaultPermissions + }; + } + + public UserDto BuildDto(IUser entity) + { + var dto = new UserDto + { + ContentStartId = entity.StartContentId, + MediaStartId = entity.StartMediaId, + DefaultToLiveEditing = entity.DefaultToLiveEditing, + Disabled = entity.IsApproved == false, + Email = entity.Email, + Login = entity.Username, + NoConsole = entity.NoConsole, + Password = entity.Password, + UserLanguage = entity.Lanuguage, + UserName = entity.Name, + Type = short.Parse(entity.UserType.Id.ToString()), + DefaultPermissions = entity.Permissions + }; + + if (entity.HasIdentity) + dto.Id = entity.Id.SafeCast(); + + return dto; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Factories/UserTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/UserTypeFactory.cs new file mode 100644 index 0000000000..8542adac8d --- /dev/null +++ b/src/Umbraco.Core/Persistence/Factories/UserTypeFactory.cs @@ -0,0 +1,38 @@ +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Factories +{ + internal class UserTypeFactory : IEntityFactory + { + #region Implementation of IEntityFactory + + public IUserType BuildEntity(UserTypeDto dto) + { + return new UserType + { + Alias = dto.Alias, + Id = dto.Id, + Name = dto.Name, + Permissions = dto.DefaultPermissions + }; + } + + public UserTypeDto BuildDto(IUserType entity) + { + var userType = new UserTypeDto + { + Alias = entity.Alias, + DefaultPermissions = entity.Permissions, + Name = entity.Name + }; + + if(entity.HasIdentity) + userType.Id = short.Parse(entity.Id.ToString()); + + return userType; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs index cc5b8dc5de..c44512a6fb 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ModelDtoMapper.cs @@ -1,6 +1,7 @@ using System; using System.Reflection; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; namespace Umbraco.Core.Persistence.Mappers { @@ -104,6 +105,26 @@ namespace Umbraco.Core.Persistence.Mappers return true; } + if (t == typeof(User) || t == typeof(IUser)) + { + var mappedName = UserMapper.Instance.Map(pi.Name); + if (!string.IsNullOrEmpty(mappedName)) + { + columnName = mappedName; + } + return true; + } + + if (t == typeof(UserType) || t == typeof(IUserType)) + { + var mappedName = UserTypeMapper.Instance.Map(pi.Name); + if (!string.IsNullOrEmpty(mappedName)) + { + columnName = mappedName; + } + return true; + } + if (t == typeof(PropertyType)) { var mappedName = PropertyTypeMapper.Instance.Map(pi.Name); diff --git a/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs b/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs new file mode 100644 index 0000000000..ad7690b769 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Concurrent; +using System.Linq.Expressions; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Mappers +{ + internal sealed class UserMapper : BaseMapper + { + private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); + + internal static UserMapper Instance = new UserMapper(); + + private UserMapper() + { + BuildMap(); + } + + #region Overrides of BaseMapper + + internal override void BuildMap() + { + CacheMap(src => src.Id, dto => dto.Id); + CacheMap(src => src.Email, dto => dto.Email); + CacheMap(src => src.Username, dto => dto.Login); + CacheMap(src => src.Password, dto => dto.Password); + CacheMap(src => src.Name, dto => dto.UserName); + CacheMap(src => src.Permissions, dto => dto.DefaultPermissions); + CacheMap(src => src.StartMediaId, dto => dto.MediaStartId); + CacheMap(src => src.StartContentId, dto => dto.ContentStartId); + CacheMap(src => src.DefaultToLiveEditing, dto => dto.DefaultToLiveEditing); + CacheMap(src => src.IsApproved, dto => dto.Disabled); + CacheMap(src => src.NoConsole, dto => dto.NoConsole); + CacheMap(src => src.UserType, dto => dto.Type); + CacheMap(src => src.Lanuguage, dto => dto.UserLanguage); + } + + internal override string Map(string propertyName) + { + if (!PropertyInfoCache.ContainsKey(propertyName)) + return string.Empty; + + var dtoTypeProperty = PropertyInfoCache[propertyName]; + + return base.GetColumnName(dtoTypeProperty.Type, dtoTypeProperty.PropertyInfo); + } + + internal override void CacheMap(Expression> sourceMember, Expression> destinationMember) + { + var property = base.ResolveMapping(sourceMember, destinationMember); + PropertyInfoCache.AddOrUpdate(property.SourcePropertyName, property, (x, y) => property); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs new file mode 100644 index 0000000000..ab9f8ddbc6 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Concurrent; +using System.Linq.Expressions; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Mappers +{ + /// + /// Represents a to DTO mapper used to translate the properties of the public api + /// implementation to that of the database's DTO as sql: [tableName].[columnName]. + /// + internal sealed class UserTypeMapper : BaseMapper + { + private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); + + internal static UserTypeMapper Instance = new UserTypeMapper(); + + private UserTypeMapper() + { + BuildMap(); + } + + #region Overrides of BaseMapper + + internal override void BuildMap() + { + CacheMap(src => src.Id, dto => dto.Id); + CacheMap(src => src.Alias, dto => dto.Alias); + CacheMap(src => src.Name, dto => dto.Name); + CacheMap(src => src.Permissions, dto => dto.DefaultPermissions); + } + + internal override string Map(string propertyName) + { + if (!PropertyInfoCache.ContainsKey(propertyName)) + return string.Empty; + + var dtoTypeProperty = PropertyInfoCache[propertyName]; + + return base.GetColumnName(dtoTypeProperty.Type, dtoTypeProperty.PropertyInfo); + } + + internal override void CacheMap(Expression> sourceMember, Expression> destinationMember) + { + var property = base.ResolveMapping(sourceMember, destinationMember); + PropertyInfoCache.AddOrUpdate(property.SourcePropertyName, property, (x, y) => property); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 09b020ff46..043559e196 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -19,17 +19,20 @@ namespace Umbraco.Core.Persistence.Repositories internal class ContentRepository : PetaPocoRepositoryBase, IContentRepository { private readonly IContentTypeRepository _contentTypeRepository; + private readonly IUserRepository _userRepository; - public ContentRepository(IUnitOfWork work, IContentTypeRepository contentTypeRepository) + public ContentRepository(IUnitOfWork work, IContentTypeRepository contentTypeRepository, IUserRepository userRepository) : base(work) { _contentTypeRepository = contentTypeRepository; + _userRepository = userRepository; } - public ContentRepository(IUnitOfWork work, IRepositoryCacheProvider cache, IContentTypeRepository contentTypeRepository) + public ContentRepository(IUnitOfWork work, IRepositoryCacheProvider cache, IContentTypeRepository contentTypeRepository, IUserRepository userRepository) : base(work, cache) { _contentTypeRepository = contentTypeRepository; + _userRepository = userRepository; } #region Overrides of RepositoryBase @@ -48,10 +51,12 @@ namespace Umbraco.Core.Persistence.Repositories var contentType = _contentTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentTypeId); //NOTE: Should eventually be moved to a UserRepository like is the case with ContentType - var userDto = Database.FirstOrDefault("WHERE id = @Id", new { Id = dto.ContentVersionDto.ContentDto.NodeDto.UserId }); + /*var userDto = Database.FirstOrDefault("WHERE id = @Id", new { Id = dto.ContentVersionDto.ContentDto.NodeDto.UserId }); var user = new Profile(userDto.Id, userDto.UserName); var writerDto = Database.FirstOrDefault("WHERE id = @Id", new { Id = dto.WriterUserId }); - var writer = new Profile(writerDto.Id, writerDto.UserName); + var writer = new Profile(writerDto.Id, writerDto.UserName);*/ + var user = _userRepository.GetProfileById(dto.ContentVersionDto.ContentDto.NodeDto.UserId.Value); + var writer = _userRepository.GetProfileById(dto.WriterUserId); var factory = new ContentFactory(contentType, NodeObjectTypeId, id, user, writer); var content = factory.BuildEntity(dto); diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs index d7d251d45f..077456da1b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserRepository.cs @@ -4,6 +4,6 @@ namespace Umbraco.Core.Persistence.Repositories { internal interface IUserRepository : IRepositoryQueryable { - + IProfile GetProfileById(int id); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserTypeRepository.cs new file mode 100644 index 0000000000..efa50f6641 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserTypeRepository.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.Models.Membership; + +namespace Umbraco.Core.Persistence.Repositories +{ + internal interface IUserTypeRepository : IRepositoryQueryable + { + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index 5c320164ac..ad3d7aefb9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -1,36 +1,84 @@ using System; using System.Collections.Generic; +using System.Linq; using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { /// - /// Represents the UserRepository for doing CRUD operations for users + /// Represents the UserRepository for doing CRUD operations for /// internal class UserRepository : PetaPocoRepositoryBase, IUserRepository { - public UserRepository(IUnitOfWork work) + private readonly IUserTypeRepository _userTypeRepository; + + public UserRepository(IUnitOfWork work, IUserTypeRepository userTypeRepository) : base(work) { + _userTypeRepository = userTypeRepository; + } + + public UserRepository(IUnitOfWork work, IRepositoryCacheProvider cache, IUserTypeRepository userTypeRepository) + : base(work, cache) + { + _userTypeRepository = userTypeRepository; } #region Overrides of RepositoryBase protected override IUser PerformGet(int id) { - throw new NotImplementedException(); + var sql = GetBaseQuery(false); + sql.Where(GetBaseWhereClause(), new { Id = id }); + + var dto = Database.Query(sql).FirstOrDefault(); + + if (dto == null) + return null; + + var userType = _userTypeRepository.Get(dto.Type); + var userFactory = new UserFactory(userType); + var user = userFactory.BuildEntity(dto); + + return user; } protected override IEnumerable PerformGetAll(params int[] ids) { - throw new NotImplementedException(); + if (ids.Any()) + { + foreach (var id in ids) + { + yield return Get(id); + } + } + else + { + var userDtos = Database.Fetch("WHERE id >= 0"); + foreach (var userDto in userDtos) + { + yield return Get(userDto.Id); + } + } } protected override IEnumerable PerformGetByQuery(IQuery query) { - throw new NotImplementedException(); + var sqlClause = GetBaseQuery(false); + var translator = new SqlTranslator(sqlClause, query); + var sql = translator.Translate(); + + var dtos = Database.Fetch(sql); + + foreach (var dto in dtos.DistinctBy(x => x.Id)) + { + yield return Get(dto.Id); + } } #endregion @@ -39,17 +87,24 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { - throw new NotImplementedException(); + var sql = new Sql(); + sql.Select(isCount ? "COUNT(*)" : "*"); + sql.From("umbracoUser"); + return sql; } protected override string GetBaseWhereClause() { - throw new NotImplementedException(); + return "[umbracoUser].[id] = @Id"; } protected override IEnumerable GetDeleteClauses() { - throw new NotImplementedException(); + var list = new List + { + string.Format("DELETE FROM umbracoUser WHERE id = @Id") + }; + return list; } protected override Guid NodeObjectTypeId @@ -59,12 +114,37 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistNewItem(IUser entity) { - throw new NotImplementedException(); + var userFactory = new UserFactory(entity.UserType); + var userDto = userFactory.BuildDto(entity); + + var id = Convert.ToInt32(Database.Insert(userDto)); + entity.Id = id; + } protected override void PersistUpdatedItem(IUser entity) { - throw new NotImplementedException(); + var userFactory = new UserFactory(entity.UserType); + var userDto = userFactory.BuildDto(entity); + + Database.Update(userDto); + } + + #endregion + + #region Implementation of IUserRepository + + public IProfile GetProfileById(int id) + { + var sql = GetBaseQuery(false); + sql.Where(GetBaseWhereClause(), new { Id = id }); + + var dto = Database.Query(sql).FirstOrDefault(); + + if (dto == null) + return null; + + return new Profile(dto.Id, dto.UserName); } #endregion diff --git a/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs new file mode 100644 index 0000000000..2e8cf45137 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.Persistence.Factories; +using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + /// + /// Represents the UserTypeRepository for doing CRUD operations for + /// + internal class UserTypeRepository : PetaPocoRepositoryBase, IUserTypeRepository + { + public UserTypeRepository(IUnitOfWork work) : base(work) + { + } + + public UserTypeRepository(IUnitOfWork work, IRepositoryCacheProvider cache) : base(work, cache) + { + } + + #region Overrides of RepositoryBase + + protected override IUserType PerformGet(int id) + { + var sql = GetBaseQuery(false); + sql.Where(GetBaseWhereClause(), new { Id = id }); + + var dto = Database.Query(sql).FirstOrDefault(); + + if (dto == null) + return null; + + var userTypeFactory = new UserTypeFactory(); + var userType = userTypeFactory.BuildEntity(dto); + + return userType; + } + + protected override IEnumerable PerformGetAll(params int[] ids) + { + if (ids.Any()) + { + foreach (var id in ids) + { + yield return Get(id); + } + } + else + { + var userDtos = Database.Fetch("WHERE id >= 0"); + foreach (var userDto in userDtos) + { + yield return Get(userDto.Id); + } + } + } + + protected override IEnumerable PerformGetByQuery(IQuery query) + { + var sqlClause = GetBaseQuery(false); + var translator = new SqlTranslator(sqlClause, query); + var sql = translator.Translate(); + + var dtos = Database.Fetch(sql); + + foreach (var dto in dtos.DistinctBy(x => x.Id)) + { + yield return Get(dto.Id); + } + } + + #endregion + + #region Overrides of PetaPocoRepositoryBase + + protected override Sql GetBaseQuery(bool isCount) + { + var sql = new Sql(); + sql.Select(isCount ? "COUNT(*)" : "*"); + sql.From("umbracoUserType"); + return sql; + } + + protected override string GetBaseWhereClause() + { + return "[umbracoUserType].[id] = @Id"; + } + + protected override IEnumerable GetDeleteClauses() + { + var list = new List + { + string.Format("DELETE FROM umbracoUser WHERE userType = @Id"), + string.Format("DELETE FROM umbracoUserType WHERE id = @Id") + }; + return list; + } + + protected override Guid NodeObjectTypeId + { + get { throw new NotImplementedException(); } + } + + protected override void PersistNewItem(IUserType entity) + { + var userTypeFactory = new UserTypeFactory(); + var userTypeDto = userTypeFactory.BuildDto(entity); + + var id = Convert.ToInt32(Database.Insert(userTypeDto)); + entity.Id = id; + } + + protected override void PersistUpdatedItem(IUserType entity) + { + var userTypeFactory = new UserTypeFactory(); + var userTypeDto = userTypeFactory.BuildDto(entity); + + Database.Update(userTypeDto); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 3d288e2274..afc4c15a06 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -106,9 +106,11 @@ + + @@ -150,6 +152,8 @@ + + @@ -164,6 +168,8 @@ + + @@ -195,6 +201,7 @@ + @@ -207,6 +214,7 @@ + diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config index 8d07784e2d..9b9b360796 100644 --- a/src/Umbraco.Tests/App.config +++ b/src/Umbraco.Tests/App.config @@ -92,6 +92,8 @@ + + diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 43a93d5c8e..1bcf454e3a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -38,8 +38,7 @@ namespace Umbraco.Tests.Persistence.Repositories var unitOfWork = provider.GetUnitOfWork(); // Act - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Assert Assert.That(repository, Is.Not.Null); @@ -52,7 +51,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); Content textpage = MockedContent.CreateSimpleContent(contentType); @@ -74,7 +73,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); Content textpage = MockedContent.CreateSimpleContent(contentType); @@ -130,8 +129,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var content = repository.Get(1048); @@ -147,8 +145,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var content = repository.Get(1047); @@ -169,7 +166,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); var contentType = contentTypeRepository.Get(1045); var content = new Content(1048, contentType); @@ -182,8 +179,7 @@ namespace Umbraco.Tests.Persistence.Repositories unitOfWork.Commit(); var id = content.Id; - var contentTypeRepository2 = new ContentTypeRepository(unitOfWork); - var repository2 = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository2); + var repository2 = RepositoryResolver.ResolveByType(unitOfWork); repository2.Delete(content); unitOfWork.Commit(); @@ -199,8 +195,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var content = repository.Get(1048); @@ -224,8 +219,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var query = Query.Builder.Where(x => x.Level == 2); @@ -241,8 +235,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var contents = repository.GetAll(1047, 1048); @@ -259,8 +252,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var contents = repository.GetAll(); @@ -277,8 +269,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var exists = repository.Exists(1046); @@ -293,8 +284,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Arrange var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act int level = 2; diff --git a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs index 917f8769c8..95020e86c6 100644 --- a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs +++ b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -19,7 +20,7 @@ namespace Umbraco.Tests.Persistence RepositoryResolver.RegisterRepositories(); // Assert - Assert.That(RepositoryResolver.RegisteredRepositories(), Is.EqualTo(13)); + Assert.That(RepositoryResolver.RegisteredRepositories(), Is.EqualTo(15)); } [Test] @@ -191,6 +192,32 @@ namespace Umbraco.Tests.Persistence Assert.That(repository, Is.Not.Null); } + [Test] + public void Can_Resolve_UserRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + + [Test] + public void Can_Resolve_UserTypeRepository() + { + // Arrange + var uow = new PetaPocoUnitOfWork(); + + // Act + var repository = RepositoryResolver.ResolveByType(uow); + + // Assert + Assert.That(repository, Is.Not.Null); + } + [Test] public void Can_Verify_UOW_In_Repository() { diff --git a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs index be58a8754d..8843e6705c 100644 --- a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs +++ b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; +using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Caching; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -69,8 +70,7 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, NullCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act Stopwatch watch = Stopwatch.StartNew(); @@ -85,7 +85,7 @@ namespace Umbraco.Tests.Services Assert.That(contents.Any(x => x == null), Is.False); } - [Test, Ignore] + [Test, NUnit.Framework.Ignore] public void Getting_1000_Uncached_Items() { // Arrange @@ -95,8 +95,7 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, NullCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act Stopwatch watch = Stopwatch.StartNew(); @@ -121,8 +120,7 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var contents = repository.GetAll(); @@ -140,7 +138,7 @@ namespace Umbraco.Tests.Services Assert.That(contentsCached.Count(), Is.EqualTo(contents.Count())); } - [Test, Ignore] + [Test, NUnit.Framework.Ignore] public void Getting_1000_Cached_Items() { // Arrange @@ -150,8 +148,7 @@ namespace Umbraco.Tests.Services var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); - var contentTypeRepository = new ContentTypeRepository(unitOfWork); - var repository = new ContentRepository(unitOfWork, InMemoryCacheProvider.Current, contentTypeRepository); + var repository = RepositoryResolver.ResolveByType(unitOfWork); // Act var contents = repository.GetAll();