diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index 9758c05dd6..88281cb84b 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -15,31 +15,35 @@ en-US umbraco - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/NuSpecs/UmbracoCms.Web.nuspec b/build/NuSpecs/UmbracoCms.Web.nuspec index fabd1e25a8..c52c8831e0 100644 --- a/build/NuSpecs/UmbracoCms.Web.nuspec +++ b/build/NuSpecs/UmbracoCms.Web.nuspec @@ -15,30 +15,35 @@ en-US umbraco - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index b0f30b9779..5e6dccfcd8 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -15,18 +15,25 @@ en-US umbraco - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs index e30bf85fd0..02b26aec86 100644 --- a/src/Umbraco.Core/Configuration/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs @@ -31,7 +31,7 @@ namespace Umbraco.Core.Configuration private static string _reservedPaths; private static string _reservedUrls; //ensure the built on (non-changeable) reserved paths are there at all times - internal const string StaticReservedPaths = "~/app_plugins/,~/install/,"; //must end with a comma! + internal const string StaticReservedPaths = "~/app_plugins/,~/install/,~/mini-profiler-resources/,"; //must end with a comma! internal const string StaticReservedUrls = "~/config/splashes/noNodes.aspx,~/.well-known,"; //must end with a comma! #endregion diff --git a/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs b/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs index 20586cb6f4..835f76f9f9 100644 --- a/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs +++ b/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs @@ -76,7 +76,7 @@ namespace Umbraco.Core.Persistence do { c = unwrapped; - if (unwrapped is ProfiledDbConnection profiled) unwrapped = profiled.InnerConnection; + if (unwrapped is ProfiledDbConnection profiled) unwrapped = profiled.WrappedConnection; if (unwrapped is RetryDbConnection retrying) unwrapped = retrying.Inner; } while (c != unwrapped); diff --git a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs index 248f91284f..bb4c60a0df 100644 --- a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs +++ b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs @@ -148,7 +148,7 @@ namespace Umbraco.Core.Persistence where TConnection : class, IDbConnection { var profiled = connection as ProfiledDbConnection; - return profiled == null ? connection as TConnection : profiled.InnerConnection as TConnection; + return profiled == null ? connection as TConnection : profiled.WrappedConnection as TConnection; } /// diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index f773d5d152..b80d607d4f 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -55,25 +55,25 @@ - - + + 2.2.2 - 5.2.6 + 5.2.7 - 4.0.0 + 4.0.1 - - + + - 2.7.1 + 2.8.0 2.0.1 @@ -88,7 +88,7 @@ 1.0.0 - 1.0.2 + 1.0.3 2.2.2 diff --git a/src/Umbraco.Examine/Umbraco.Examine.csproj b/src/Umbraco.Examine/Umbraco.Examine.csproj index 1320f3b0d2..989afd8d1c 100644 --- a/src/Umbraco.Examine/Umbraco.Examine.csproj +++ b/src/Umbraco.Examine/Umbraco.Examine.csproj @@ -49,7 +49,7 @@ - + diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config index 5e366eef33..49de625450 100644 --- a/src/Umbraco.Tests/App.config +++ b/src/Umbraco.Tests/App.config @@ -64,23 +64,23 @@ - + - + - + - + - - + + @@ -88,7 +88,7 @@ - + @@ -100,11 +100,11 @@ - + - + diff --git a/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs b/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs index 59c514f654..18bceaae49 100644 --- a/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs +++ b/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs @@ -121,16 +121,16 @@ namespace Umbraco.Tests.Models.Mapping break; case 1: map - .ForMember(dest => dest.ValueString, opt => opt.ResolveUsing(src => src.ValueString)); + .ForMember(dest => dest.ValueString, opt => opt.MapFrom(src => src.ValueString)); break; case 2: map - .ForMember(dest => dest.ValueString, opt => opt.ResolveUsing()); + .ForMember(dest => dest.ValueString, opt => opt.MapFrom()); break; case 3: // in most cases that should be perfectly enough? map - .ForMember(dest => dest.ValueString, opt => opt.ResolveUsing(source => "!!" + source.ValueString + "!!")); + .ForMember(dest => dest.ValueString, opt => opt.MapFrom(source => "!!" + source.ValueString + "!!")); break; default: throw new ArgumentOutOfRangeException(nameof(ver)); diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs index 0ffcfb7a3f..39cac6e24f 100644 --- a/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs @@ -33,15 +33,20 @@ namespace Umbraco.Tests.TestHelpers.Stubs { if (_enabled == false) return; - MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter(); - MiniProfiler.Settings.StackMaxLength = 5000; - MiniProfiler.Start(); + //see https://miniprofiler.com/dotnet/AspDotNet + MiniProfiler.Configure(new MiniProfilerOptions + { + SqlFormatter = new SqlServerFormatter(), + StackMaxLength = 5000, + }); + + MiniProfiler.StartNew(); } public void Stop(bool discardResults = false) { if (_enabled) - MiniProfiler.Stop(discardResults); + MiniProfiler.Current.Stop(discardResults); } } } diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 3bfc3387fe..e88aa5ae61 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -78,40 +78,39 @@ - - + + - 1.8.9 + 1.8.14 - + - - - - - - - - - - + + + + + + + + + + - - + + - - - + + + - + - - + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index f12ccfcf99..3658ef7066 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -83,7 +83,7 @@ - + @@ -91,19 +91,19 @@ - - + + all - - - - - + + + + + 8.0.0-alpha.37 diff --git a/src/Umbraco.Web.UI/web.Template.Debug.config b/src/Umbraco.Web.UI/web.Template.Debug.config index 8c4b3bb299..ff42f098f7 100644 --- a/src/Umbraco.Web.UI/web.Template.Debug.config +++ b/src/Umbraco.Web.UI/web.Template.Debug.config @@ -25,4 +25,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config index d93089fe21..f0abbfde52 100644 --- a/src/Umbraco.Web.UI/web.Template.config +++ b/src/Umbraco.Web.UI/web.Template.config @@ -215,23 +215,23 @@ - + - + - + - + - + @@ -239,16 +239,20 @@ - + - + + + + + diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index 55604e0eb9..d89909d793 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -14,6 +14,7 @@ using System.Reflection; using Umbraco.Core.Models; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; @@ -605,8 +606,7 @@ namespace Umbraco.Web.Editors } } - [HttpQueryStringFilter("queryStrings")] - public IEnumerable GetAncestors(int id, UmbracoEntityTypes type, FormDataCollection queryStrings) + public IEnumerable GetAncestors(int id, UmbracoEntityTypes type, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings) { return GetResultForAncestors(id, type, queryStrings); } diff --git a/src/Umbraco.Web/Logging/WebProfiler.cs b/src/Umbraco.Web/Logging/WebProfiler.cs index e31ef75209..14c1bb065f 100755 --- a/src/Umbraco.Web/Logging/WebProfiler.cs +++ b/src/Umbraco.Web/Logging/WebProfiler.cs @@ -11,6 +11,9 @@ namespace Umbraco.Web.Logging /// /// Implements by using the MiniProfiler framework. /// + /// + /// Profiling only runs when the app is in debug mode, see WebRuntime for how this gets created + /// internal class WebProfiler : IProfiler { private const string BootRequestItemKey = "Umbraco.Core.Logging.WebProfiler__isBootRequest"; @@ -22,10 +25,13 @@ namespace Umbraco.Web.Logging // create our own provider, which can provide a profiler even during boot _provider = new WebProfilerProvider(); - // settings - MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter(); - MiniProfiler.Settings.StackMaxLength = 5000; - MiniProfiler.Settings.ProfilerProvider = _provider; + //see https://miniprofiler.com/dotnet/AspDotNet + MiniProfiler.Configure(new MiniProfilerOptions + { + SqlFormatter = new SqlServerFormatter(), + StackMaxLength = 5000, + ProfilerProvider = _provider + }); } public void UmbracoApplicationBeginRequest(object sender, EventArgs e) @@ -68,29 +74,32 @@ namespace Umbraco.Web.Logging /// public string Render() { - return MiniProfiler.RenderIncludes(RenderPosition.Right).ToString(); + return MiniProfiler.Current.RenderIncludes(RenderPosition.Right).ToString(); } /// public IDisposable Step(string name) { - return MiniProfiler.Current.Step(name); + return MiniProfiler.Current?.Step(name); } /// public void Start() { - MiniProfiler.Start(); + MiniProfiler.StartNew(); } /// public void Stop(bool discardResults = false) { - MiniProfiler.Stop(discardResults); + MiniProfiler.Current?.Stop(discardResults); } private static Attempt TryGetRequest(object sender) { + if (sender is HttpRequest httpRequest) + return Attempt.Succeed(new HttpRequestWrapper(httpRequest)); + var app = sender as HttpApplication; if (app == null) return Attempt.Fail(); diff --git a/src/Umbraco.Web/Logging/WebProfilerProvider.cs b/src/Umbraco.Web/Logging/WebProfilerProvider.cs index 7b12c2f5bd..dbb81cf232 100755 --- a/src/Umbraco.Web/Logging/WebProfilerProvider.cs +++ b/src/Umbraco.Web/Logging/WebProfilerProvider.cs @@ -2,6 +2,7 @@ using System.Threading; using System.Web; using StackExchange.Profiling; +using StackExchange.Profiling.Internal; namespace Umbraco.Web.Logging { @@ -13,7 +14,7 @@ namespace Umbraco.Web.Logging /// Once the boot phase is changed to BootPhase.BootRequest then the base class (default) provider will handle all /// profiling data and this sub class no longer performs any logic. /// - internal class WebProfilerProvider : WebRequestProfilerProvider + internal class WebProfilerProvider : AspNetRequestProvider { private readonly ReaderWriterLockSlim _locker = new ReaderWriterLockSlim(); private MiniProfiler _startupProfiler; @@ -81,23 +82,16 @@ namespace Umbraco.Web.Logging /// - assuming profiling is enabled, on every BeginRequest that should be profiled, /// - except for the very first one which is the boot request. /// - public override MiniProfiler Start(string sessionName = null) + public override MiniProfiler Start(string profilerName, MiniProfilerBaseOptions options) { var first = Interlocked.Exchange(ref _first, 1) == 0; - if (first == false) return base.Start(sessionName); + if (first == false) return base.Start(profilerName, options); - _startupProfiler = new MiniProfiler("http://localhost/umbraco-startup") { Name = "StartupProfiler" }; - SetProfilerActive(_startupProfiler); + _startupProfiler = new MiniProfiler("StartupProfiler", options); + CurrentProfiler = _startupProfiler; return _startupProfiler; } - // obsolete but that's the one that's called ;-( - [Obsolete] - public override MiniProfiler Start(ProfileLevel level, string sessionName = null) - { - return Start(sessionName); - } - /// /// Gets the current profiler. /// @@ -105,23 +99,27 @@ namespace Umbraco.Web.Logging /// If the boot phase is not Booted, then this will return the startup profiler (this), otherwise /// returns the base class /// - public override MiniProfiler GetCurrentProfiler() + public override MiniProfiler CurrentProfiler { - // if not booting then just use base (fast) - // no lock, _bootPhase is volatile - if (_bootPhase == BootPhase.Booted) - return base.GetCurrentProfiler(); + get + { + // if not booting then just use base (fast) + // no lock, _bootPhase is volatile + if (_bootPhase == BootPhase.Booted) + return base.CurrentProfiler; - // else - try - { - var current = base.GetCurrentProfiler(); - return current ?? _startupProfiler; - } - catch - { - return _startupProfiler; + // else + try + { + var current = base.CurrentProfiler; + return current ?? _startupProfiler; + } + catch + { + return _startupProfiler; + } } + } } } diff --git a/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs index b3f5f0374c..563935676f 100644 --- a/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Alias, opt => opt.MapFrom(sheet => sheet.Alias)) .ForMember(dest => dest.Key, opt => opt.MapFrom(sheet => sheet.Key)) .ForMember(dest => dest.Name, opt => opt.MapFrom(sheet => sheet.Name)) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(sheet => sheet.Path)) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index 55b1672b2b..652ac12014 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -41,53 +41,53 @@ namespace Umbraco.Web.Models.Mapping //FROM IContent TO ContentItemDisplay CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) - .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src))) - .ForMember(dest => dest.Variants, opt => opt.ResolveUsing(variantResolver)) - .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(contentAppResolver)) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => contentOwnerResolver.Resolve(src))) + .ForMember(dest => dest.Updater, opt => opt.MapFrom(src => creatorResolver.Resolve(src))) + .ForMember(dest => dest.Variants, opt => opt.MapFrom(variantResolver)) + .ForMember(dest => dest.ContentApps, opt => opt.MapFrom(contentAppResolver)) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => src.ContentType.Name)) .ForMember(dest => dest.IsContainer, opt => opt.MapFrom(src => src.ContentType.IsContainer)) .ForMember(dest => dest.IsElement, opt => opt.MapFrom(src => src.ContentType.IsElement)) .ForMember(dest => dest.IsBlueprint, opt => opt.MapFrom(src => src.Blueprint)) - .ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver)) + .ForMember(dest => dest.IsChildOfListView, opt => opt.MapFrom(childOfListViewResolver)) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed)) - .ForMember(dest => dest.TemplateAlias, opt => opt.ResolveUsing(defaultTemplateResolver)) - .ForMember(dest => dest.Urls, opt => opt.ResolveUsing(contentUrlResolver)) + .ForMember(dest => dest.TemplateAlias, opt => opt.MapFrom(defaultTemplateResolver)) + .ForMember(dest => dest.Urls, opt => opt.MapFrom(contentUrlResolver)) .ForMember(dest => dest.AllowPreview, opt => opt.Ignore()) - .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver)) + .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(contentTreeNodeUrlResolver)) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) - .ForMember(dest => dest.DocumentType, opt => opt.ResolveUsing(contentTypeBasicResolver)) - .ForMember(dest => dest.AllowedTemplates, opt => opt.ResolveUsing(allowedTemplatesResolver)) - .ForMember(dest => dest.AllowedActions, opt => opt.ResolveUsing(src => actionButtonsResolver.Resolve(src))) + .ForMember(dest => dest.DocumentType, opt => opt.MapFrom(contentTypeBasicResolver)) + .ForMember(dest => dest.AllowedTemplates, opt => opt.MapFrom(allowedTemplatesResolver)) + .ForMember(dest => dest.AllowedActions, opt => opt.MapFrom(src => actionButtonsResolver.Resolve(src))) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); CreateMap() .ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) - .ForMember(dest => dest.ReleaseDate, opt => opt.ResolveUsing(schedPublishReleaseDateResolver)) - .ForMember(dest => dest.ExpireDate, opt => opt.ResolveUsing(schedPublishExpireDateResolver)) + .ForMember(dest => dest.ReleaseDate, opt => opt.MapFrom(schedPublishReleaseDateResolver)) + .ForMember(dest => dest.ExpireDate, opt => opt.MapFrom(schedPublishExpireDateResolver)) .ForMember(dest => dest.Segment, opt => opt.Ignore()) .ForMember(dest => dest.Language, opt => opt.Ignore()) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) - .ForMember(dest => dest.State, opt => opt.ResolveUsing>()) - .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)); + .ForMember(dest => dest.State, opt => opt.MapFrom>()) + .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver)); //FROM IContent TO ContentItemBasic CreateMap>() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) - .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src))) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => contentOwnerResolver.Resolve(src))) + .ForMember(dest => dest.Updater, opt => opt.MapFrom(src => creatorResolver.Resolve(src))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) .ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) - .ForMember(dest => dest.UpdateDate, opt => opt.ResolveUsing()) - .ForMember(dest => dest.Name, opt => opt.ResolveUsing()) - .ForMember(dest => dest.State, opt => opt.ResolveUsing>()) + .ForMember(dest => dest.UpdateDate, opt => opt.MapFrom()) + .ForMember(dest => dest.Name, opt => opt.MapFrom()) + .ForMember(dest => dest.State, opt => opt.MapFrom>()) .ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture())); //FROM IContent TO ContentPropertyCollectionDto diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs index 0b086afb2d..f9ed72fc11 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs @@ -22,7 +22,7 @@ namespace Umbraco.Web.Models.Mapping //FROM Property TO ContentPropertyBasic CreateMap>() .ForMember(tab => tab.Label, expression => expression.MapFrom(@group => @group.Name)) - .ForMember(tab => tab.IsActive, expression => expression.UseValue(true)) + .ForMember(tab => tab.IsActive, expression => expression.MapFrom(_ => true)) .ForMember(tab => tab.Properties, expression => expression.Ignore()) .ForMember(tab => tab.Alias, expression => expression.Ignore()) .ForMember(tab => tab.Expanded, expression => expression.Ignore()); diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs index 88bf409737..ee78c692ff 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs @@ -153,7 +153,7 @@ namespace Umbraco.Web.Models.Mapping CreateMap() - .ConstructUsing(propertyTypeBasic => + .ConstructUsing((propertyTypeBasic, context) => { var dataType = dataTypeService.GetDataType(propertyTypeBasic.DataTypeId); if (dataType == null) throw new NullReferenceException("No data type found with id " + propertyTypeBasic.DataTypeId); @@ -168,7 +168,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.PropertyEditorAlias, opt => opt.Ignore()) .ForMember(dest => dest.DeleteDate, opt => opt.Ignore()) - .ForMember(dto => dto.Variations, opt => opt.ResolveUsing()) + .ForMember(dto => dto.Variations, opt => opt.MapFrom()) //only map if it is actually set .ForMember(dest => dest.Id, opt => opt.Condition(source => source.Id > 0)) diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs index 0e324c94b9..d05295a546 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs @@ -114,7 +114,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) .ForMember(dest => dest.LockedCompositeContentTypes, opt => opt.Ignore()) - .ForMember(dest => dest.Groups, opt => opt.ResolveUsing(src => propertyGroupDisplayResolver.Resolve(src))); + .ForMember(dest => dest.Groups, opt => opt.MapFrom(src => propertyGroupDisplayResolver.Resolve(src))); } public static IMappingExpression MapBaseContentTypeEntityToDisplay( @@ -129,7 +129,7 @@ namespace Umbraco.Web.Models.Mapping var propertyTypeGroupResolver = new PropertyTypeGroupResolver(propertyEditors, dataTypeService); return mapping - .ForMember(dest => dest.Udi, opt => opt.ResolveUsing(src => contentTypeUdiResolver.Resolve(src))) + .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => contentTypeUdiResolver.Resolve(src))) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Blueprints, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) @@ -140,8 +140,8 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.AllowedContentTypes, opt => opt.MapFrom(src => src.AllowedContentTypes.Select(x => x.Id.Value))) .ForMember(dest => dest.CompositeContentTypes, opt => opt.MapFrom(src => src.ContentTypeComposition)) - .ForMember(dest => dest.LockedCompositeContentTypes, opt => opt.ResolveUsing(src => lockedCompositionsResolver.Resolve(src))) - .ForMember(dest => dest.Groups, opt => opt.ResolveUsing(src => propertyTypeGroupResolver.Resolve(src))) + .ForMember(dest => dest.LockedCompositeContentTypes, opt => opt.MapFrom(src => lockedCompositionsResolver.Resolve(src))) + .ForMember(dest => dest.Groups, opt => opt.MapFrom(src => propertyTypeGroupResolver.Resolve(src))) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); } @@ -184,7 +184,7 @@ namespace Umbraco.Web.Models.Mapping // ignore for members mapping = typeof(TDestination) == typeof(IMemberType) ? mapping.ForMember(dto => dto.Variations, opt => opt.Ignore()) - : mapping.ForMember(dto => dto.Variations, opt => opt.ResolveUsing>()); + : mapping.ForMember(dto => dto.Variations, opt => opt.MapFrom>()); mapping = mapping .ForMember( diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs index 425e447c9c..f707003ffe 100644 --- a/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs @@ -68,8 +68,8 @@ namespace Umbraco.Web.Models.Mapping CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.DataType, src.Key))) - .ForMember(dest => dest.AvailableEditors, opt => opt.ResolveUsing(src => availablePropertyEditorsResolver.Resolve(src))) - .ForMember(dest => dest.PreValues, opt => opt.ResolveUsing(src => configurationDisplayResolver.Resolve(src))) + .ForMember(dest => dest.AvailableEditors, opt => opt.MapFrom(src => availablePropertyEditorsResolver.Resolve(src))) + .ForMember(dest => dest.PreValues, opt => opt.MapFrom(src => configurationDisplayResolver.Resolve(src))) .ForMember(dest => dest.SelectedEditor, opt => opt.MapFrom(src => src.EditorAlias.IsNullOrWhiteSpace() ? null : src.EditorAlias)) .ForMember(dest => dest.HasPrevalues, opt => opt.Ignore()) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) @@ -92,13 +92,13 @@ namespace Umbraco.Web.Models.Mapping .ConvertUsing(src => configurationDisplayResolver.Resolve(src)); CreateMap() - .ConstructUsing(src => new DataType(propertyEditors[src.EditorAlias]) {CreateDate = DateTime.Now}) + .ConstructUsing(src => new DataType(propertyEditors[src.EditorAlias], -1) {CreateDate = DateTime.Now}) .IgnoreEntityCommonProperties() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => Convert.ToInt32(src.Id))) .ForMember(dest => dest.Key, opt => opt.Ignore()) // ignore key, else resets UniqueId - U4-3911 .ForMember(dest => dest.Path, opt => opt.Ignore()) .ForMember(dest => dest.EditorAlias, opt => opt.MapFrom(src => src.EditorAlias)) - .ForMember(dest => dest.DatabaseType, opt => opt.ResolveUsing(src => databaseTypeResolver.Resolve(src))) + .ForMember(dest => dest.DatabaseType, opt => opt.MapFrom(src => databaseTypeResolver.Resolve(src))) .ForMember(dest => dest.CreatorId, opt => opt.Ignore()) .ForMember(dest => dest.Level, opt => opt.Ignore()) .ForMember(dest => dest.SortOrder, opt => opt.Ignore()) @@ -107,14 +107,14 @@ namespace Umbraco.Web.Models.Mapping //Converts a property editor to a new list of pre-value fields - used when creating a new data type or changing a data type with new pre-vals CreateMap>() - .ConvertUsing(src => + .ConvertUsing((dataEditor, configurationFieldDisplays) => { // this is a new data type, initialize default configuration // get the configuration editor, // get the configuration fields and map to UI, // get the configuration default values and map to UI - var configurationEditor = src.GetConfigurationEditor(); + var configurationEditor = dataEditor.GetConfigurationEditor(); var fields = configurationEditor.Fields.Select(Mapper.Map).ToArray(); diff --git a/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs index 90e98822b1..ab3929166f 100644 --- a/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs @@ -25,7 +25,7 @@ namespace Umbraco.Web.Models.Mapping var contentTypeUdiResolver = new ContentTypeUdiResolver(); CreateMap() - .ForMember(dest => dest.Name, opt => opt.ResolveUsing()) + .ForMember(dest => dest.Name, opt => opt.MapFrom()) .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(ObjectTypes.GetUdiType(src.NodeObjectType), src.Key))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => GetContentTypeIcon(src))) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed)) @@ -42,17 +42,17 @@ namespace Umbraco.Web.Models.Mapping CreateMap() .ForMember(dest => dest.Udi, opt => opt.Ignore()) - .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-box")) - .ForMember(dest => dest.Path, opt => opt.UseValue("")) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-box")) + .ForMember(dest => dest.Path, opt => opt.MapFrom(_ => "")) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); CreateMap() .ForMember(dest => dest.Udi, opt => opt.Ignore()) - .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-tab")) - .ForMember(dest => dest.Path, opt => opt.UseValue("")) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-tab")) + .ForMember(dest => dest.Path, opt => opt.MapFrom(_ => "")) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) //in v6 the 'alias' is it's lower cased name so we'll stick to that. .ForMember(dest => dest.Alias, opt => opt.MapFrom(src => src.Name.ToLowerInvariant())) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) @@ -60,18 +60,18 @@ namespace Umbraco.Web.Models.Mapping CreateMap() .ForMember(dest => dest.Udi, opt => opt.Ignore()) - .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-user")) - .ForMember(dest => dest.Path, opt => opt.UseValue("")) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-user")) + .ForMember(dest => dest.Path, opt => opt.MapFrom(_ => "")) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Alias, opt => opt.MapFrom(src => src.Username)) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Template, src.Key))) - .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-layout")) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-layout")) .ForMember(dest => dest.Path, opt => opt.MapFrom(src => src.Path)) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); @@ -80,7 +80,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.SortOrder, opt => opt.Ignore()); CreateMap() - .ForMember(dest => dest.Udi, opt => opt.ResolveUsing(src => contentTypeUdiResolver.Resolve(src))) + .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => contentTypeUdiResolver.Resolve(src))) .ForMember(dest => dest.Path, opt => opt.MapFrom(src => src.Path)) .ForMember(dest => dest.ParentId, opt => opt.MapFrom(src => src.ParentId)) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs index 13c6af2fda..a838180622 100644 --- a/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs @@ -17,7 +17,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Name, opt => opt.MapFrom(x => x.CultureName)) .ForMember(dest => dest.Key, opt => opt.MapFrom(x => x.Key)) .ForMember(dest => dest.Alias, opt => opt.MapFrom(x => x.IsoCode)) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.Ignore()) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs index be1bcdefdc..3e0f6c7337 100644 --- a/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs @@ -19,9 +19,9 @@ namespace Umbraco.Web.Models.Mapping //FROM IMacro TO EntityBasic CreateMap() .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Macro, content.Key))) - .ForMember(entityBasic => entityBasic.Icon, expression => expression.UseValue("icon-settings-alt")) - .ForMember(dto => dto.ParentId, expression => expression.UseValue(-1)) - .ForMember(dto => dto.Path, expression => expression.ResolveUsing(macro => "-1," + macro.Id)) + .ForMember(entityBasic => entityBasic.Icon, expression => expression.MapFrom(_ => "icon-settings-alt")) + .ForMember(dto => dto.ParentId, expression => expression.MapFrom(_ => -1)) + .ForMember(dto => dto.Path, expression => expression.MapFrom(macro => "-1," + macro.Id)) .ForMember(dto => dto.Trashed, expression => expression.Ignore()) .ForMember(dto => dto.AdditionalData, expression => expression.Ignore()); diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index 7a8706edf2..f5182f0b3b 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -35,37 +35,37 @@ namespace Umbraco.Web.Models.Mapping //FROM IMedia TO MediaItemDisplay CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(content => content.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(content => content.ContentType.Alias)) - .ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver)) + .ForMember(dest => dest.IsChildOfListView, opt => opt.MapFrom(childOfListViewResolver)) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(content => content.Trashed)) .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(content => content.ContentType.Name)) .ForMember(dest => dest.Properties, opt => opt.Ignore()) - .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver)) + .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(contentTreeNodeUrlResolver)) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) - .ForMember(dest => dest.State, opt => opt.UseValue(null)) + .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null)) .ForMember(dest => dest.Edited, opt => opt.Ignore()) .ForMember(dest => dest.Updater, opt => opt.Ignore()) .ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.IsContainer, opt => opt.Ignore()) - .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) + .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver)) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) - .ForMember(dest => dest.ContentType, opt => opt.ResolveUsing(mediaTypeBasicResolver)) - .ForMember(dest => dest.MediaLink, opt => opt.ResolveUsing(content => string.Join(",", content.GetUrls(Current.Configs.Settings().Content, logger)))) - .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(mediaAppResolver)) + .ForMember(dest => dest.ContentType, opt => opt.MapFrom(mediaTypeBasicResolver)) + .ForMember(dest => dest.MediaLink, opt => opt.MapFrom(content => string.Join(",", content.GetUrls(Current.Configs.Settings().Content, logger)))) + .ForMember(dest => dest.ContentApps, opt => opt.MapFrom(mediaAppResolver)) .ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture())); //FROM IMedia TO ContentItemBasic CreateMap>() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) - .ForMember(dest => dest.State, opt => opt.UseValue(null)) + .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null)) .ForMember(dest => dest.Edited, opt => opt.Ignore()) .ForMember(dest => dest.Updater, opt => opt.Ignore()) .ForMember(dest => dest.Alias, opt => opt.Ignore()) @@ -76,7 +76,7 @@ namespace Umbraco.Web.Models.Mapping //FROM IMedia TO ContentItemDto CreateMap(); //.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key))) - //.ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) + //.ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src))) //.ForMember(dest => dest.Published, opt => opt.Ignore()) //.ForMember(dest => dest.Edited, opt => opt.Ignore()) //.ForMember(dest => dest.Updater, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs index af894bee5e..a721714a14 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs @@ -64,24 +64,24 @@ namespace Umbraco.Web.Models.Mapping //FROM IMember TO MemberDisplay CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src))) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => memberOwnerResolver.Resolve(src))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => src.ContentType.Name)) .ForMember(dest => dest.Properties, opt => opt.Ignore()) - .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) - .ForMember(dest => dest.MemberProviderFieldMapping, opt => opt.ResolveUsing(src => memberProfiderFieldMappingResolver.Resolve(src))) - .ForMember(dest => dest.MembershipScenario, opt => opt.ResolveUsing(src => membershipScenarioMappingResolver.Resolve(src))) + .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver)) + .ForMember(dest => dest.MemberProviderFieldMapping, opt => opt.MapFrom(src => memberProfiderFieldMappingResolver.Resolve(src))) + .ForMember(dest => dest.MembershipScenario, opt => opt.MapFrom(src => membershipScenarioMappingResolver.Resolve(src))) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) - .ForMember(dest => dest.State, opt => opt.UseValue(null)) + .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null)) .ForMember(dest => dest.Edited, opt => opt.Ignore()) .ForMember(dest => dest.Updater, opt => opt.Ignore()) .ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.IsChildOfListView, opt => opt.Ignore()) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.IsContainer, opt => opt.Ignore()) - .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(memberTreeNodeUrlResolver)) + .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(memberTreeNodeUrlResolver)) .ForMember(dest => dest.VariesByCulture, opt => opt.Ignore()); //FROM IMember TO MemberBasic @@ -89,17 +89,17 @@ namespace Umbraco.Web.Models.Mapping //we're giving this entity an ID of int.MaxValue - this is kind of a hack to force angular to use the Key instead of the Id in list views .ForMember(dest => dest.Id, opt => opt.MapFrom(src => int.MaxValue)) .ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src))) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => memberOwnerResolver.Resolve(src))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)) .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.Username)) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) - .ForMember(dest => dest.State, opt => opt.UseValue(null)) + .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null)) .ForMember(dest => dest.Edited, opt => opt.Ignore()) .ForMember(dest => dest.Updater, opt => opt.Ignore()) .ForMember(dest => dest.Alias, opt => opt.Ignore()) - .ForMember(dto => dto.Properties, expression => expression.ResolveUsing(memberBasicPropertiesResolver)) + .ForMember(dto => dto.Properties, expression => expression.MapFrom(memberBasicPropertiesResolver)) .ForMember(dest => dest.VariesByCulture, opt => opt.Ignore()); //FROM MembershipUser TO MemberBasic @@ -110,8 +110,8 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.CreateDate, opt => opt.MapFrom(src => src.CreationDate)) .ForMember(dest => dest.UpdateDate, opt => opt.MapFrom(src => src.LastActivityDate)) .ForMember(dest => dest.Key, opt => opt.MapFrom(src => src.ProviderUserKey.TryConvertTo().Result.ToString("N"))) - .ForMember(dest => dest.Owner, opt => opt.UseValue(new UserProfile {Name = "Admin", UserId = -1 })) - .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-user")) + .ForMember(dest => dest.Owner, opt => opt.MapFrom(_ => new UserProfile {Name = "Admin", UserId = -1 })) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-user")) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.UserName)) .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)) .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.UserName)) @@ -120,7 +120,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Path, opt => opt.Ignore()) .ForMember(dest => dest.SortOrder, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) - .ForMember(dest => dest.State, opt => opt.UseValue(ContentSavedState.Draft)) + .ForMember(dest => dest.State, opt => opt.MapFrom(_ => ContentSavedState.Draft)) .ForMember(dest => dest.Edited, opt => opt.Ignore()) .ForMember(dest => dest.Updater, opt => opt.Ignore()) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) @@ -131,14 +131,14 @@ namespace Umbraco.Web.Models.Mapping //FROM IMember TO ContentItemDto CreateMap() //.ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key))) - //.ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src))) + //.ForMember(dest => dest.Owner, opt => opt.MapFrom(src => memberOwnerResolver.Resolve(src))) //.ForMember(dest => dest.Published, opt => opt.Ignore()) //.ForMember(dest => dest.Edited, opt => opt.Ignore()) //.ForMember(dest => dest.Updater, opt => opt.Ignore()) //.ForMember(dest => dest.Icon, opt => opt.Ignore()) //.ForMember(dest => dest.Alias, opt => opt.Ignore()) //do no map the custom member properties (currently anyways, they were never there in 6.x) - .ForMember(dest => dest.Properties, opt => opt.ResolveUsing(src => memberDtoPropertiesResolver.Resolve(src))); + .ForMember(dest => dest.Properties, opt => opt.MapFrom(src => memberDtoPropertiesResolver.Resolve(src))); //FROM IMemberGroup TO MemberGroupDisplay CreateMap() diff --git a/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs index 6f3af3b812..84660d2602 100644 --- a/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs @@ -99,7 +99,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.LastLockoutDate, opt => opt.Ignore()) .ForMember(dest => dest.FailedPasswordAttempts, opt => opt.Ignore()) //all invited users will not be approved, completing the invite will approve the user - .ForMember(user => user.IsApproved, opt => opt.UseValue(false)) + .ForMember(user => user.IsApproved, opt => opt.MapFrom(_ => false)) .AfterMap((invite, user) => { user.ClearGroups(); @@ -119,7 +119,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Udi, opt => opt.Ignore()) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id)) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) .AfterMap((group, display) => @@ -134,7 +134,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Udi, opt => opt.Ignore()) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id)) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) .AfterMap((group, display) => @@ -148,9 +148,9 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) .ForMember(dest => dest.Id, opt => opt.MapFrom(group => group.Id)) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id)) - .ForMember(dest => dest.DefaultPermissions, opt => opt.ResolveUsing(src => userGroupDefaultPermissionsResolver.Resolve(src))) + .ForMember(dest => dest.DefaultPermissions, opt => opt.MapFrom(src => userGroupDefaultPermissionsResolver.Resolve(src))) //these will be manually mapped and by default they are null .ForMember(dest => dest.AssignedPermissions, opt => opt.Ignore()) .AfterMap((group, display) => @@ -182,11 +182,11 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Udi, opt => opt.Ignore()) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id)) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) .ForMember(dest => dest.Users, opt => opt.Ignore()) - .ForMember(dest => dest.DefaultPermissions, opt => opt.ResolveUsing(src => userGroupDefaultPermissionsResolver.Resolve(src))) + .ForMember(dest => dest.DefaultPermissions, opt => opt.MapFrom(src => userGroupDefaultPermissionsResolver.Resolve(src))) .ForMember(dest => dest.AssignedPermissions, opt => opt.Ignore()) .AfterMap((group, display) => { @@ -276,7 +276,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember( dest => dest.EmailHash, opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().GenerateHash())) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(user => "-1," + user.Id)) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Udi, opt => opt.Ignore()) @@ -302,7 +302,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember( dest => dest.EmailHash, opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().ToMd5())) - .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1)) .ForMember(dest => dest.Path, opt => opt.MapFrom(user => "-1," + user.Id)) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.IsCurrentUser, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Trees/ApplicationTreeController.cs b/src/Umbraco.Web/Trees/ApplicationTreeController.cs index 68d7fbb3fd..162d001e96 100644 --- a/src/Umbraco.Web/Trees/ApplicationTreeController.cs +++ b/src/Umbraco.Web/Trees/ApplicationTreeController.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; @@ -50,8 +49,7 @@ namespace Umbraco.Web.Trees /// /// Tree use. /// - [HttpQueryStringFilter("queryStrings")] - public async Task GetApplicationTrees(string application, string tree, FormDataCollection queryStrings, TreeUse use = TreeUse.Main) + public async Task GetApplicationTrees(string application, string tree, [System.Web.Http.ModelBinding.ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings, TreeUse use = TreeUse.Main) { application = application.CleanForXss(); diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index ca2f2031bb..e521deca40 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -14,6 +14,7 @@ using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi.Filters; using System.Globalization; using Umbraco.Core.Models.Entities; +using System.Web.Http.ModelBinding; using Umbraco.Web.Actions; using Umbraco.Web.Composing; @@ -30,8 +31,7 @@ namespace Umbraco.Web.Trees /// /// /// - [HttpQueryStringFilter("queryStrings")] - public TreeNode GetTreeNode(string id, FormDataCollection queryStrings) + public TreeNode GetTreeNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings) { int asInt; Guid asGuid = Guid.Empty; diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index 430c5d2111..6107540c0c 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Formatting; using System.Web.Http; +using System.Web.Http.ModelBinding; using System.Web.Security; using Umbraco.Core; using Umbraco.Core.Models; @@ -49,8 +50,7 @@ namespace Umbraco.Web.Trees /// /// /// - [HttpQueryStringFilter("queryStrings")] - public TreeNode GetTreeNode(string id, FormDataCollection queryStrings) + public TreeNode GetTreeNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings) { var node = GetSingleTreeNode(id, queryStrings); diff --git a/src/Umbraco.Web/Trees/TreeControllerBase.cs b/src/Umbraco.Web/Trees/TreeControllerBase.cs index e3946ce532..f7c2b2460e 100644 --- a/src/Umbraco.Web/Trees/TreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/TreeControllerBase.cs @@ -2,6 +2,7 @@ using System.Globalization; using System.Linq; using System.Net.Http.Formatting; +using System.Web.Http.ModelBinding; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; @@ -45,7 +46,7 @@ namespace Umbraco.Web.Trees /// We are allowing an arbitrary number of query strings to be passed in so that developers are able to persist custom data from the front-end /// to the back end to be used in the query for model data. /// - protected abstract TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings); + protected abstract TreeNodeCollection GetTreeNodes(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings); /// /// Returns the menu structure for the node @@ -53,7 +54,7 @@ namespace Umbraco.Web.Trees /// /// /// - protected abstract MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings); + protected abstract MenuItemCollection GetMenuForNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings); /// /// The name to display on the root node @@ -86,8 +87,7 @@ namespace Umbraco.Web.Trees /// /// /// - [HttpQueryStringFilter("queryStrings")] - public TreeNode GetRootNode(FormDataCollection queryStrings) + public TreeNode GetRootNode([ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings) { if (queryStrings == null) queryStrings = new FormDataCollection(""); var node = CreateRootNode(queryStrings); @@ -126,8 +126,7 @@ namespace Umbraco.Web.Trees /// We are allowing an arbitrary number of query strings to be passed in so that developers are able to persist custom data from the front-end /// to the back end to be used in the query for model data. /// - [HttpQueryStringFilter("queryStrings")] - public TreeNodeCollection GetNodes(string id, FormDataCollection queryStrings) + public TreeNodeCollection GetNodes(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings) { if (queryStrings == null) queryStrings = new FormDataCollection(""); var nodes = GetTreeNodes(id, queryStrings); @@ -158,8 +157,7 @@ namespace Umbraco.Web.Trees /// /// /// - [HttpQueryStringFilter("queryStrings")] - public MenuItemCollection GetMenu(string id, FormDataCollection queryStrings) + public MenuItemCollection GetMenu(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings) { if (queryStrings == null) queryStrings = new FormDataCollection(""); var menu = GetMenuForNode(id, queryStrings); diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 1cb2e9a53e..8699540e4b 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -60,32 +60,32 @@ - + - + 2.6.2.25 - + - - - - - - - - - + + + + + + + + + - + @@ -283,6 +283,7 @@ + @@ -1057,7 +1058,6 @@ - diff --git a/src/Umbraco.Web/WebApi/Filters/HttpQueryStringFilterAttribute.cs b/src/Umbraco.Web/WebApi/Filters/HttpQueryStringFilterAttribute.cs deleted file mode 100644 index eea4ef7e67..0000000000 --- a/src/Umbraco.Web/WebApi/Filters/HttpQueryStringFilterAttribute.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http.Formatting; -using System.Web.Http.Controllers; -using System.Web.Http.Filters; - -namespace Umbraco.Web.WebApi.Filters -{ - /// - /// Allows an Action to execute with an arbitrary number of QueryStrings - /// - /// - /// Just like you can POST an arbitrary number of parameters to an Action, you can't GET an arbitrary number - /// but this will allow you to do it - /// - public sealed class HttpQueryStringFilterAttribute : ActionFilterAttribute - { - public string ParameterName { get; private set; } - - public HttpQueryStringFilterAttribute(string parameterName) - { - if (string.IsNullOrEmpty(parameterName)) - throw new ArgumentException("ParameterName is required."); - ParameterName = parameterName; - } - - public override void OnActionExecuting(HttpActionContext actionContext) - { - //get the query strings from the request properties - if (actionContext.Request.Properties.ContainsKey("MS_QueryNameValuePairs")) - { - var queryStrings = actionContext.Request.Properties["MS_QueryNameValuePairs"] as IEnumerable>; - if (queryStrings == null) return; - - var formData = new FormDataCollection(queryStrings); - - actionContext.ActionArguments[ParameterName] = formData; - } - - base.OnActionExecuting(actionContext); - } - } -} diff --git a/src/Umbraco.Web/WebApi/Filters/HttpQueryStringModelBinder.cs b/src/Umbraco.Web/WebApi/Filters/HttpQueryStringModelBinder.cs new file mode 100644 index 0000000000..6ffbb239f8 --- /dev/null +++ b/src/Umbraco.Web/WebApi/Filters/HttpQueryStringModelBinder.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Net.Http.Formatting; +using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; + +namespace Umbraco.Web.WebApi.Filters +{ + /// + /// Allows an Action to execute with an arbitrary number of QueryStrings + /// + /// + /// Just like you can POST an arbitrary number of parameters to an Action, you can't GET an arbitrary number + /// but this will allow you to do it + /// + public sealed class HttpQueryStringModelBinder : IModelBinder + { + public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + { + //get the query strings from the request properties + if (actionContext.Request.Properties.ContainsKey("MS_QueryNameValuePairs")) + { + if (actionContext.Request.Properties["MS_QueryNameValuePairs"] is IEnumerable> queryStrings) + { + var formData = new FormDataCollection(queryStrings); + bindingContext.Model = formData; + return true; + } + } + return false; + } + } +} \ No newline at end of file