diff --git a/src/Umbraco.Core/Mapping/MapperContext.cs b/src/Umbraco.Core/Mapping/MapperContext.cs index b001300952..a7044a05b9 100644 --- a/src/Umbraco.Core/Mapping/MapperContext.cs +++ b/src/Umbraco.Core/Mapping/MapperContext.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace Umbraco.Core.Mapping { @@ -112,6 +113,18 @@ namespace Umbraco.Core.Mapping } */ + /// + /// Maps an enumerable of source objects to a new list of target objects. + /// + /// The type of the source objects. + /// The type of the target objects. + /// The source objects. + /// A list containing the target objects. + public List MapEnumerable(IEnumerable source) + { + return source.Select(Map).ToList(); + } + #endregion } } diff --git a/src/Umbraco.Core/Mapping/UmbracoMapper.cs b/src/Umbraco.Core/Mapping/UmbracoMapper.cs index 2d7d9f97c4..0831edab4e 100644 --- a/src/Umbraco.Core/Mapping/UmbracoMapper.cs +++ b/src/Umbraco.Core/Mapping/UmbracoMapper.cs @@ -229,7 +229,7 @@ namespace Umbraco.Core.Mapping if (ctor != null && map != null) { // register (for next time) and do it now (for this time) - object NCtor(object s, MapperContext c) => MapEnumerable((IEnumerable) s, targetGenericArg, ctor, map, c); + object NCtor(object s, MapperContext c) => MapEnumerableInternal((IEnumerable) s, targetGenericArg, ctor, map, c); DefineCtors(sourceType)[targetType] = NCtor; DefineMaps(sourceType)[targetType] = Identity; return (TTarget) NCtor(source, context); @@ -241,7 +241,7 @@ namespace Umbraco.Core.Mapping throw new InvalidOperationException($"Don't know how to map {sourceType.FullName} to {targetType.FullName}."); } - private TTarget MapEnumerable(IEnumerable source, Type targetGenericArg, Func ctor, Action map, MapperContext context) + private TTarget MapEnumerableInternal(IEnumerable source, Type targetGenericArg, Func ctor, Action map, MapperContext context) { var targetList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(targetGenericArg)); @@ -379,6 +379,46 @@ namespace Umbraco.Core.Mapping throw new Exception("panic"); } + /// + /// Maps an enumerable of source objects to a new list of target objects. + /// + /// The type of the source objects. + /// The type of the target objects. + /// The source objects. + /// A list containing the target objects. + public List MapEnumerable(IEnumerable source) + { + return source.Select(Map).ToList(); + } + + /// + /// Maps an enumerable of source objects to a new list of target objects. + /// + /// The type of the source objects. + /// The type of the target objects. + /// The source objects. + /// A mapper context preparation method. + /// A list containing the target objects. + public List MapEnumerable(IEnumerable source, Action f) + { + var context = new MapperContext(this); + f(context); + return source.Select(x => Map(x, context)).ToList(); + } + + /// + /// Maps an enumerable of source objects to a new list of target objects. + /// + /// The type of the source objects. + /// The type of the target objects. + /// The source objects. + /// A mapper context. + /// A list containing the target objects. + public List MapEnumerable(IEnumerable source, MapperContext context) + { + return source.Select(x => Map(x, context)).ToList(); + } + #endregion } } diff --git a/src/Umbraco.Tests/Mapping/MappingTests.cs b/src/Umbraco.Tests/Mapping/MappingTests.cs index 5cfb0056b5..3435050cc5 100644 --- a/src/Umbraco.Tests/Mapping/MappingTests.cs +++ b/src/Umbraco.Tests/Mapping/MappingTests.cs @@ -2,6 +2,8 @@ using System.Linq; using NUnit.Framework; using Umbraco.Core.Mapping; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Tests.Mapping { @@ -11,11 +13,11 @@ namespace Umbraco.Tests.Mapping [Test] public void SimpleMap() { - var profiles = new MapDefinitionCollection(new IMapDefinition[] + var definitions = new MapDefinitionCollection(new IMapDefinition[] { - new Profile1(), + new MapperDefinition1(), }); - var mapper = new UmbracoMapper(profiles); + var mapper = new UmbracoMapper(definitions); var thing1 = new Thing1 { Value = "value" }; var thing2 = mapper.Map(thing1); @@ -36,11 +38,11 @@ namespace Umbraco.Tests.Mapping [Test] public void EnumerableMap() { - var profiles = new MapDefinitionCollection(new IMapDefinition[] + var definitions = new MapDefinitionCollection(new IMapDefinition[] { - new Profile1(), + new MapperDefinition1(), }); - var mapper = new UmbracoMapper(profiles); + var mapper = new UmbracoMapper(definitions); var thing1A = new Thing1 { Value = "valueA" }; var thing1B = new Thing1 { Value = "valueB" }; @@ -58,16 +60,23 @@ namespace Umbraco.Tests.Mapping Assert.AreEqual(2, thing2.Count); Assert.AreEqual("valueA", thing2[0].Value); Assert.AreEqual("valueB", thing2[1].Value); + + thing2 = mapper.MapEnumerable(thing1).ToList(); + + Assert.IsNotNull(thing2); + Assert.AreEqual(2, thing2.Count); + Assert.AreEqual("valueA", thing2[0].Value); + Assert.AreEqual("valueB", thing2[1].Value); } [Test] public void InheritedMap() { - var profiles = new MapDefinitionCollection(new IMapDefinition[] + var definitions = new MapDefinitionCollection(new IMapDefinition[] { - new Profile1(), + new MapperDefinition1(), }); - var mapper = new UmbracoMapper(profiles); + var mapper = new UmbracoMapper(definitions); var thing3 = new Thing3 { Value = "value" }; var thing2 = mapper.Map(thing3); @@ -85,6 +94,20 @@ namespace Umbraco.Tests.Mapping Assert.AreEqual("value", thing2.Value); } + [Test] + public void CollectionsMap() + { + var definitions = new MapDefinitionCollection(new IMapDefinition[] + { + new MapperDefinition2(), + }); + var mapper = new UmbracoMapper(definitions); + + // can map a PropertyCollection + var source = new PropertyCollection(); + var target = mapper.Map>(source); + } + private class Thing1 { public string Value { get; set; } @@ -98,7 +121,7 @@ namespace Umbraco.Tests.Mapping public string Value { get; set; } } - private class Profile1 : IMapDefinition + private class MapperDefinition1 : IMapDefinition { public void DefineMaps(UmbracoMapper mapper) { @@ -110,5 +133,16 @@ namespace Umbraco.Tests.Mapping target.Value = source.Value; } } + + private class MapperDefinition2 : IMapDefinition + { + public void DefineMaps(UmbracoMapper mapper) + { + mapper.Define((source, context) => new ContentPropertyDto(), Map); + } + + private static void Map(Property source, ContentPropertyDto target, MapperContext context) + { } + } } } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 588f4f4c85..cafc7dba09 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -190,7 +190,7 @@ namespace Umbraco.Web.Editors //get all user groups and map their default permissions to the AssignedUserGroupPermissions model. //we do this because not all groups will have true assigned permissions for this node so if they don't have assigned permissions, we need to show the defaults. - var defaultPermissionsByGroup = Mapper.Map>(allUserGroups).ToArray(); + var defaultPermissionsByGroup = Mapper.MapEnumerable(allUserGroups); var defaultPermissionsAsDictionary = defaultPermissionsByGroup .ToDictionary(x => Convert.ToInt32(x.Id), x => x); diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index 3af5b0dd5d..e648a4d140 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -917,7 +917,7 @@ namespace Umbraco.Web.Editors .SelectMany(x => x.PropertyTypes) .DistinctBy(composition => composition.Alias); var filteredPropertyTypes = ExecutePostFilter(propertyTypes, postFilter); - return Mapper.Map, IEnumerable>(filteredPropertyTypes); + return Mapper.MapEnumerable(filteredPropertyTypes); case UmbracoEntityTypes.PropertyGroup: @@ -928,13 +928,13 @@ namespace Umbraco.Web.Editors .SelectMany(x => x.PropertyGroups) .DistinctBy(composition => composition.Name); var filteredpropertyGroups = ExecutePostFilter(propertyGroups, postFilter); - return Mapper.Map, IEnumerable>(filteredpropertyGroups); + return Mapper.MapEnumerable(filteredpropertyGroups); case UmbracoEntityTypes.User: var users = Services.UserService.GetAll(0, int.MaxValue, out _); var filteredUsers = ExecutePostFilter(users, postFilter); - return Mapper.Map, IEnumerable>(filteredUsers); + return Mapper.MapEnumerable(filteredUsers); case UmbracoEntityTypes.Stylesheet: diff --git a/src/Umbraco.Web/Editors/LanguageController.cs b/src/Umbraco.Web/Editors/LanguageController.cs index 650dcea6e9..2ee77ca418 100644 --- a/src/Umbraco.Web/Editors/LanguageController.cs +++ b/src/Umbraco.Web/Editors/LanguageController.cs @@ -46,7 +46,7 @@ namespace Umbraco.Web.Editors { var allLanguages = Services.LocalizationService.GetAllLanguages(); - return Mapper.Map, IEnumerable>(allLanguages); + return Mapper.MapEnumerable(allLanguages); } [HttpGet] diff --git a/src/Umbraco.Web/Editors/LogController.cs b/src/Umbraco.Web/Editors/LogController.cs index 7639fd624c..4f750920d3 100644 --- a/src/Umbraco.Web/Editors/LogController.cs +++ b/src/Umbraco.Web/Editors/LogController.cs @@ -45,7 +45,7 @@ namespace Umbraco.Web.Editors var dateQuery = sinceDate.HasValue ? SqlContext.Query().Where(x => x.CreateDate >= sinceDate) : null; var userId = Security.GetUserId().ResultOr(0); var result = Services.AuditService.GetPagedItemsByUser(userId, pageNumber - 1, pageSize, out totalRecords, orderDirection, customFilter:dateQuery); - var mapped = Mapper.Map>(result); + var mapped = Mapper.MapEnumerable(result); return new PagedResult(totalRecords, pageNumber, pageSize) { Items = MapAvatarsAndNames(mapped) diff --git a/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs b/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs index ec55a50c0a..4a3f6b43c3 100644 --- a/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs +++ b/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs @@ -49,7 +49,7 @@ namespace Umbraco.Web.Editors ? redirectUrlService.GetAllRedirectUrls(page, pageSize, out resultCount) : redirectUrlService.SearchRedirectUrls(searchTerm, page, pageSize, out resultCount); - searchResult.SearchResults = Mapper.Map>(redirects).ToArray(); + searchResult.SearchResults = Mapper.MapEnumerable(redirects); searchResult.TotalCount = resultCount; searchResult.CurrentPage = page; searchResult.PageCount = ((int)resultCount + pageSize - 1) / pageSize; @@ -71,9 +71,10 @@ namespace Umbraco.Web.Editors { var redirectUrlService = Services.RedirectUrlService; var redirects = redirectUrlService.GetContentRedirectUrls(guidIdi.Guid); - redirectsResult.SearchResults = Mapper.Map>(redirects).ToArray(); + var mapped = Mapper.MapEnumerable(redirects); + redirectsResult.SearchResults = mapped; //not doing paging 'yet' - redirectsResult.TotalCount = redirects.Count(); + redirectsResult.TotalCount = mapped.Count(); redirectsResult.CurrentPage = 1; redirectsResult.PageCount = 1; } diff --git a/src/Umbraco.Web/Editors/RelationController.cs b/src/Umbraco.Web/Editors/RelationController.cs index bbb6b3f26f..b7f9baba55 100644 --- a/src/Umbraco.Web/Editors/RelationController.cs +++ b/src/Umbraco.Web/Editors/RelationController.cs @@ -34,11 +34,11 @@ namespace Umbraco.Web.Editors if (string.IsNullOrWhiteSpace(relationTypeAlias) == false) { return - Mapper.Map, IEnumerable>( + Mapper.MapEnumerable( relations.Where(x => x.RelationType.Alias.InvariantEquals(relationTypeAlias))); } - return Mapper.Map, IEnumerable>(relations); + return Mapper.MapEnumerable(relations); } [HttpDelete] diff --git a/src/Umbraco.Web/Editors/RelationTypeController.cs b/src/Umbraco.Web/Editors/RelationTypeController.cs index 0d6b128f2c..faafbb79f1 100644 --- a/src/Umbraco.Web/Editors/RelationTypeController.cs +++ b/src/Umbraco.Web/Editors/RelationTypeController.cs @@ -48,7 +48,7 @@ namespace Umbraco.Web.Editors var relations = Services.RelationService.GetByRelationTypeId(relationType.Id); var display = Mapper.Map(relationType); - display.Relations = Mapper.Map, IEnumerable>(relations); + display.Relations = Mapper.MapEnumerable(relations); return display; } diff --git a/src/Umbraco.Web/Editors/UserGroupsController.cs b/src/Umbraco.Web/Editors/UserGroupsController.cs index 54253d936e..e79cfd625c 100644 --- a/src/Umbraco.Web/Editors/UserGroupsController.cs +++ b/src/Umbraco.Web/Editors/UserGroupsController.cs @@ -102,7 +102,7 @@ namespace Umbraco.Web.Editors /// public IEnumerable GetUserGroups(bool onlyCurrentUserGroups = true) { - var allGroups = Mapper.Map, IEnumerable>(Services.UserService.GetAllUserGroups()) + var allGroups = Mapper.MapEnumerable(Services.UserService.GetAllUserGroups()) .ToList(); var isAdmin = Security.CurrentUser.IsAdmin(); diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 13c7b6d2ff..e133d2e6b0 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -238,7 +238,7 @@ namespace Umbraco.Web.Editors var paged = new PagedUserResult(total, pageNumber, pageSize) { - Items = Mapper.Map>(result), + Items = Mapper.MapEnumerable(result), UserStates = Services.UserService.GetUserStates() }; diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs index f2ff4328fb..2b30b0ac5a 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs @@ -64,7 +64,7 @@ namespace Umbraco.Web.Models.Mapping // Umbraco.Code.MapAll private static void Map(IContent source, ContentPropertyCollectionDto target, MapperContext context) { - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); } // Umbraco.Code.MapAll -AllowPreview -Errors -PersistedContent @@ -98,7 +98,7 @@ namespace Umbraco.Web.Models.Mapping target.Variants = _contentVariantMapper.Map(source, context); target.ContentDto = new ContentPropertyCollectionDto(); - target.ContentDto.Properties = source.Properties.Select(context.Map); + target.ContentDto.Properties = context.MapEnumerable(source.Properties); } // Umbraco.Code.MapAll -Segment -Language @@ -127,7 +127,7 @@ namespace Umbraco.Web.Models.Mapping target.Owner = _commonMapper.GetOwner(source, context); target.ParentId = source.ParentId; target.Path = source.Path; - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); target.SortOrder = source.SortOrder; target.State = _basicStateMapper.Map(source, context); target.Trashed = source.Trashed; diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs index 394c5fb0cf..a438f04781 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs @@ -122,7 +122,7 @@ namespace Umbraco.Web.Models.Mapping target.AllowCultureVariant = source.VariesByCulture(); //sync templates - target.AllowedTemplates = source.AllowedTemplates.Select(context.Map).ToArray(); + target.AllowedTemplates = context.MapEnumerable(source.AllowedTemplates); if (source.DefaultTemplate != null) target.DefaultTemplate = context.Map(source.DefaultTemplate); @@ -312,7 +312,7 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.SortOrder = source.SortOrder; - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); } // Umbraco.Code.MapAll -ContentTypeId -ParentTabContentTypes -ParentTabContentTypeNames @@ -325,7 +325,7 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.SortOrder = source.SortOrder; - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); } // Umbraco.Code.MapAll -Editor -View -Config -ContentTypeId -ContentTypeName -Locked @@ -531,7 +531,7 @@ namespace Umbraco.Web.Models.Mapping { MapTypeToDisplayBase(source, target); - target.Groups = source.Groups.Select(context.Map>); + target.Groups = context.MapEnumerable, PropertyGroupDisplay>(source.Groups); } private IEnumerable MapLockedCompositions(IContentTypeComposition source) diff --git a/src/Umbraco.Web/Models/Mapping/ContentVariantMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentVariantMapper.cs index aa71b9817a..560d398a2c 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentVariantMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentVariantMapper.cs @@ -32,7 +32,7 @@ namespace Umbraco.Web.Models.Mapping var allLanguages = _localizationService.GetAllLanguages().OrderBy(x => x.Id).ToList(); if (allLanguages.Count == 0) return Enumerable.Empty(); //this should never happen - var langs = context.Map>(allLanguages).ToList(); + var langs = context.MapEnumerable(allLanguages).ToList(); //create a variant for each language, then we'll populate the values var variants = langs.Select(x => diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs index 7240bdec50..4c4a03939d 100644 --- a/src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs @@ -127,10 +127,10 @@ namespace Umbraco.Web.Models.Mapping private IEnumerable MapAvailableEditors(IDataType source, MapperContext context) { var contentSection = Current.Configs.Settings().Content; - return _propertyEditors + var properties = _propertyEditors .Where(x => !x.IsDeprecated || contentSection.ShowDeprecatedPropertyEditors || source.EditorAlias == x.Alias) - .OrderBy(x => x.Name) - .Select(context.Map); + .OrderBy(x => x.Name); + return context.MapEnumerable(properties); } private IEnumerable MapPreValues(IDataType dataType, MapperContext context) @@ -143,7 +143,7 @@ namespace Umbraco.Web.Models.Mapping throw new InvalidOperationException($"Could not find a property editor with alias \"{dataType.EditorAlias}\"."); var configurationEditor = editor.GetConfigurationEditor(); - var fields = configurationEditor.Fields.Select(context.Map).ToArray(); + var fields = context.MapEnumerable(configurationEditor.Fields); var configurationDictionary = configurationEditor.ToConfigurationEditor(dataType.Configuration); MapConfigurationFields(fields, configurationDictionary); @@ -151,7 +151,7 @@ namespace Umbraco.Web.Models.Mapping return fields; } - private void MapConfigurationFields(DataTypeConfigurationFieldDisplay[] fields, IDictionary configuration) + private void MapConfigurationFields(List fields, IDictionary configuration) { if (fields == null) throw new ArgumentNullException(nameof(fields)); if (configuration == null) throw new ArgumentNullException(nameof(configuration)); @@ -190,7 +190,7 @@ namespace Umbraco.Web.Models.Mapping var configurationEditor = source.GetConfigurationEditor(); - var fields = configurationEditor.Fields.Select(context.Map).ToArray(); + var fields = context.MapEnumerable(configurationEditor.Fields); var defaultConfiguration = configurationEditor.DefaultConfiguration; if (defaultConfiguration != null) diff --git a/src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs index 6ff03b4f7d..78c25ced33 100644 --- a/src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs @@ -26,8 +26,8 @@ namespace Umbraco.Web.Models.Mapping mapper.Define((source, context) => new EntityBasic(), Map); mapper.Define((source, context) => new SearchResultEntity(), Map); mapper.Define((source, context) => new SearchResultEntity(), Map); - mapper.Define>((source, context) => source.Select(context.Map).ToList()); - mapper.Define, IEnumerable>((source, context) => source.Select(context.Map).ToList()); + mapper.Define>((source, context) => context.MapEnumerable(source)); + mapper.Define, IEnumerable>((source, context) => context.MapEnumerable(source)); } // Umbraco.Code.MapAll -Alias diff --git a/src/Umbraco.Web/Models/Mapping/LanguageMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/LanguageMapDefinition.cs index 21d42f0bc2..28074d4817 100644 --- a/src/Umbraco.Web/Models/Mapping/LanguageMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/LanguageMapDefinition.cs @@ -45,7 +45,7 @@ namespace Umbraco.Web.Models.Mapping if (!(target is List list)) throw new NotSupportedException($"{nameof(target)} must be a List."); - var temp = source.Select(context.Map).ToList(); + var temp = context.MapEnumerable(source); //Put the default language first in the list & then sort rest by a-z var defaultLang = temp.SingleOrDefault(x => x.IsDefault); diff --git a/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs index 0d6f779b82..089f5d5d71 100644 --- a/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs @@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Mapping public void DefineMaps(UmbracoMapper mapper) { mapper.Define((source, context) => new EntityBasic(), Map); - mapper.Define>((source, context) => source.Properties.Values.Select(context.Map).ToList()); + mapper.Define>((source, context) => context.MapEnumerable(source.Properties.Values)); mapper.Define((source, context) => new MacroParameter(), Map); } diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs index b147687ed3..3da61bc9c0 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs @@ -42,7 +42,7 @@ namespace Umbraco.Web.Models.Mapping // Umbraco.Code.MapAll private static void Map(IMedia source, ContentPropertyCollectionDto target, MapperContext context) { - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); } // Umbraco.Code.MapAll -Properties -Errors -Edited -Updater -Alias -IsContainer @@ -84,7 +84,7 @@ namespace Umbraco.Web.Models.Mapping target.Owner = _commonMapper.GetOwner(source, context); target.ParentId = source.ParentId; target.Path = source.Path; - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); target.SortOrder = source.SortOrder; target.State = null; target.Trashed = source.Trashed; diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs index 84f9340713..b230dcfe15 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs @@ -111,7 +111,7 @@ namespace Umbraco.Web.Models.Mapping target.Owner = _commonMapper.GetOwner(source, context); target.ParentId = source.ParentId; target.Path = source.Path; - target.Properties = context.Map>(source.Properties); + target.Properties = context.MapEnumerable(source.Properties); target.SortOrder = source.SortOrder; target.State = null; target.Udi = Udi.Create(Constants.UdiEntityType.Member, source.Key); @@ -149,7 +149,7 @@ namespace Umbraco.Web.Models.Mapping // Umbraco.Code.MapAll private static void Map(IMember source, ContentPropertyCollectionDto target, MapperContext context) { - target.Properties = source.Properties.Select(context.Map); + target.Properties = context.MapEnumerable(source.Properties); } private MembershipScenario GetMembershipScenario() diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs index d0382eb557..b8d76572fb 100644 --- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs @@ -105,7 +105,7 @@ namespace Umbraco.Web.Models.Mapping /// protected virtual List MapProperties(IContentBase content, List properties, MapperContext context) { - return properties.OrderBy(x => x.PropertyType.SortOrder).Select(context.Map).ToList(); + return context.MapEnumerable(properties.OrderBy(x => x.PropertyType.SortOrder)); } } diff --git a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs index e2c7fb611e..1b245cdce2 100644 --- a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Models.Membership; using Umbraco.Web.Models.ContentEditing; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; +using Umbraco.Core.Models.Sections; using Umbraco.Core.Services; using Umbraco.Web.Actions; using Umbraco.Web.Services; @@ -215,7 +216,7 @@ namespace Umbraco.Web.Models.Mapping //Important! Currently we are never mapping to multiple UserGroupDisplay objects but if we start doing that // this will cause an N+1 and we'll need to change how this works. var users = _userService.GetAllInGroup(source.Id); - target.Users = context.Map>(users); + target.Users = context.MapEnumerable(users); //Deal with assigned permissions: @@ -286,7 +287,7 @@ namespace Umbraco.Web.Models.Mapping target.StartContentIds = GetStartNodes(source.StartContentIds.ToArray(), UmbracoObjectTypes.Document, "content/contentRoot", context); target.StartMediaIds = GetStartNodes(source.StartMediaIds.ToArray(), UmbracoObjectTypes.Media, "media/mediaRoot", context); target.UpdateDate = source.UpdateDate; - target.UserGroups = source.Groups.Select(context.Map); + target.UserGroups = context.MapEnumerable(source.Groups); target.Username = source.Username; target.UserState = source.UserState; } @@ -307,7 +308,7 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.ParentId = -1; target.Path = "-1," + source.Id; - target.UserGroups = source.Groups.Select(context.Map); + target.UserGroups = context.MapEnumerable(source.Groups); target.Username = source.Username; target.UserState = source.UserState; } @@ -336,7 +337,7 @@ namespace Umbraco.Web.Models.Mapping private void MapUserGroupBasic(UserGroupBasic target, IEnumerable sourceAllowedSections, int? sourceStartContentId, int? sourceStartMediaId, MapperContext context) { var allSections = _sectionService.GetSections(); - target.Sections = allSections.Where(x => sourceAllowedSections.Contains(x.Alias)).Select(context.Map
); + target.Sections = context.MapEnumerable(allSections.Where(x => sourceAllowedSections.Contains(x.Alias))); if (sourceStartMediaId > 0) target.MediaStartNode = context.Map(_entityService.Get(sourceStartMediaId.Value, UmbracoObjectTypes.Media)); @@ -387,7 +388,7 @@ namespace Umbraco.Web.Models.Mapping startNodes.Add(CreateRootNode(_textService.Localize(localizedKey))); var mediaItems = _entityService.GetAll(objectType, startNodeIds); - startNodes.AddRange(context.Map>(mediaItems)); + startNodes.AddRange(context.MapEnumerable(mediaItems)); return startNodes; } diff --git a/src/Umbraco.Web/TagQuery.cs b/src/Umbraco.Web/TagQuery.cs index b7373a6d2c..4a7ee8e7eb 100644 --- a/src/Umbraco.Web/TagQuery.cs +++ b/src/Umbraco.Web/TagQuery.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Mapping; +using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; using Umbraco.Web.Models; @@ -66,37 +67,37 @@ namespace Umbraco.Web /// public IEnumerable GetAllTags(string group = null, string culture = null) { - return _mapper.Map>(_tagService.GetAllTags(group, culture)); + return _mapper.MapEnumerable(_tagService.GetAllTags(group, culture)); } /// public IEnumerable GetAllContentTags(string group = null, string culture = null) { - return _mapper.Map>(_tagService.GetAllContentTags(group, culture)); + return _mapper.MapEnumerable(_tagService.GetAllContentTags(group, culture)); } /// public IEnumerable GetAllMediaTags(string group = null, string culture = null) { - return _mapper.Map>(_tagService.GetAllMediaTags(group, culture)); + return _mapper.MapEnumerable(_tagService.GetAllMediaTags(group, culture)); } /// public IEnumerable GetAllMemberTags(string group = null, string culture = null) { - return _mapper.Map>(_tagService.GetAllMemberTags(group, culture)); + return _mapper.MapEnumerable(_tagService.GetAllMemberTags(group, culture)); } /// public IEnumerable GetTagsForProperty(int contentId, string propertyTypeAlias, string group = null, string culture = null) { - return _mapper.Map>(_tagService.GetTagsForProperty(contentId, propertyTypeAlias, group, culture)); + return _mapper.MapEnumerable(_tagService.GetTagsForProperty(contentId, propertyTypeAlias, group, culture)); } /// public IEnumerable GetTagsForEntity(int contentId, string group = null, string culture = null) { - return _mapper.Map>(_tagService.GetTagsForEntity(contentId, group, culture)); + return _mapper.MapEnumerable(_tagService.GetTagsForEntity(contentId, group, culture)); } } } diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 00329040ff..4a8cfba9a5 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -138,7 +138,7 @@ namespace Umbraco.Web.Trees { var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.DocumentType, pageIndex, pageSize, out totalFound, filter: SqlContext.Query().Where(x => x.Name.Contains(query))); - return Mapper.Map>(results); + return Mapper.MapEnumerable(results); } } } diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index 5e11d03a6a..75260b586d 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -143,7 +143,7 @@ namespace Umbraco.Web.Trees { var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.DataType, pageIndex, pageSize, out totalFound, filter: SqlContext.Query().Where(x => x.Name.Contains(query))); - return Mapper.Map>(results); + return Mapper.MapEnumerable(results); } } } diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index 54ecdb6a83..5798c546fc 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -120,7 +120,7 @@ namespace Umbraco.Web.Trees { var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.MediaType, pageIndex, pageSize, out totalFound, filter: SqlContext.Query().Where(x => x.Name.Contains(query))); - return Mapper.Map>(results); + return Mapper.MapEnumerable(results); } } } diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index 3558b94425..8c37718c9b 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -122,7 +122,7 @@ namespace Umbraco.Web.Trees { var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.Template, pageIndex, pageSize, out totalFound, filter: SqlContext.Query().Where(x => x.Name.Contains(query))); - return Mapper.Map>(results); + return Mapper.MapEnumerable(results); } } }