From 54cc80f4e8bbcbe79c541b0cd5c0e1aa66104f72 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 25 Jan 2018 14:41:28 -0700 Subject: [PATCH] Updates all required mappings to use AutoMapperExtensions.MapWithUmbracoContext where appropriate --- src/Umbraco.Web/Editors/ContentController.cs | 18 +++++++------- src/Umbraco.Web/Editors/MediaController.cs | 14 +++++------ src/Umbraco.Web/Editors/MemberController.cs | 12 +++++----- .../Models/Mapping/AutoMapperExtensions.cs | 6 ++--- .../Mapping/ContentTreeNodeUrlResolver.cs | 2 +- .../Models/Mapping/MemberModelMapper.cs | 24 +++++++++++++------ .../Mapping/MemberTreeNodeUrlResolver.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 3 +++ 8 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index a61ca7e249..45107d3f21 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -80,7 +80,7 @@ namespace Umbraco.Web.Editors public IEnumerable GetByIds([FromUri]int[] ids) { var foundContent = Services.ContentService.GetByIds(ids); - return foundContent.Select(Mapper.Map); + return foundContent.Select(content => AutoMapperExtensions.MapWithUmbracoContext(content, UmbracoContext)); } /// @@ -232,7 +232,7 @@ namespace Umbraco.Web.Editors HandleContentNotFound(id); } - var content = Mapper.Map(foundContent); + var content = AutoMapperExtensions.MapWithUmbracoContext(foundContent, UmbracoContext); SetupBlueprint(content, foundContent); @@ -270,7 +270,7 @@ namespace Umbraco.Web.Editors HandleContentNotFound(id); } - var content = Mapper.Map(foundContent); + var content = AutoMapperExtensions.MapWithUmbracoContext(foundContent, UmbracoContext); return content; } @@ -283,7 +283,7 @@ namespace Umbraco.Web.Editors HandleContentNotFound(id); } - var content = Mapper.Map(foundContent); + var content = AutoMapperExtensions.MapWithUmbracoContext(foundContent, UmbracoContext); return content; } @@ -306,7 +306,7 @@ namespace Umbraco.Web.Editors } var emptyContent = Services.ContentService.CreateContent("", parentId, contentType.Alias, UmbracoUser.Id); - var mapped = Mapper.Map(emptyContent); + var mapped = AutoMapperExtensions.MapWithUmbracoContext(emptyContent, UmbracoContext); //remove this tab if it exists: umbContainerView var containerTab = mapped.Tabs.FirstOrDefault(x => x.Alias == Constants.Conventions.PropertyGroups.ListViewGroupName); @@ -563,7 +563,7 @@ namespace Umbraco.Web.Editors { //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! // add the modelstate to the outgoing object and throw a validation message - var forDisplay = Mapper.Map(contentItem.PersistedContent); + var forDisplay = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); @@ -605,7 +605,7 @@ namespace Umbraco.Web.Editors } //return the updated model - var display = Mapper.Map(contentItem.PersistedContent); + var display = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); @@ -858,7 +858,7 @@ namespace Umbraco.Web.Editors var unpublishResult = Services.ContentService.WithResult().UnPublish(foundContent, Security.CurrentUser.Id); - var content = Mapper.Map(foundContent); + var content = AutoMapperExtensions.MapWithUmbracoContext(foundContent, UmbracoContext); if (unpublishResult == false) { @@ -1092,4 +1092,4 @@ namespace Umbraco.Web.Editors } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 72af1c4c70..0b2044dbe5 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -89,7 +89,7 @@ namespace Umbraco.Web.Editors } var emptyContent = Services.MediaService.CreateMedia("", parentId, contentType.Alias, UmbracoUser.Id); - var mapped = Mapper.Map(emptyContent); + var mapped = AutoMapperExtensions.MapWithUmbracoContext(emptyContent, UmbracoContext); //remove this tab if it exists: umbContainerView var containerTab = mapped.Tabs.FirstOrDefault(x => x.Alias == Constants.Conventions.PropertyGroups.ListViewGroupName); @@ -137,7 +137,7 @@ namespace Umbraco.Web.Editors //HandleContentNotFound will throw an exception return null; } - return Mapper.Map(foundContent); + return AutoMapperExtensions.MapWithUmbracoContext(foundContent, UmbracoContext); } /// @@ -157,7 +157,7 @@ namespace Umbraco.Web.Editors //HandleContentNotFound will throw an exception return null; } - return Mapper.Map(foundContent); + return AutoMapperExtensions.MapWithUmbracoContext(foundContent, UmbracoContext); } /// @@ -186,7 +186,7 @@ namespace Umbraco.Web.Editors public IEnumerable GetByIds([FromUri]int[] ids) { var foundMedia = Services.MediaService.GetByIds(ids); - return foundMedia.Select(Mapper.Map); + return foundMedia.Select(media => AutoMapperExtensions.MapWithUmbracoContext(media, UmbracoContext)); } /// @@ -488,7 +488,7 @@ namespace Umbraco.Web.Editors { //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! // add the modelstate to the outgoing object and throw validation response - var forDisplay = Mapper.Map(contentItem.PersistedContent); + var forDisplay = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); } @@ -498,7 +498,7 @@ namespace Umbraco.Web.Editors var saveStatus = Services.MediaService.WithResult().Save(contentItem.PersistedContent, (int)Security.CurrentUser.Id); //return the updated model - var display = Mapper.Map(contentItem.PersistedContent); + var display = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); @@ -607,7 +607,7 @@ namespace Umbraco.Web.Editors var f = mediaService.CreateMedia(folder.Name, intParentId, Constants.Conventions.MediaTypes.Folder); mediaService.Save(f, Security.CurrentUser.Id); - return Mapper.Map(f); + return AutoMapperExtensions.MapWithUmbracoContext(f, UmbracoContext); } /// diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 5aad40aa70..841b2df3d5 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -178,7 +178,7 @@ namespace Umbraco.Web.Editors { HandleContentNotFound(key); } - return Mapper.Map(foundMember); + return AutoMapperExtensions.MapWithUmbracoContext(foundMember, UmbracoContext); case MembershipScenario.CustomProviderWithUmbracoLink: //TODO: Support editing custom properties for members with a custom membership provider here. @@ -238,7 +238,7 @@ namespace Umbraco.Web.Editors emptyContent = new Member(contentType); emptyContent.AdditionalData["NewPassword"] = Membership.GeneratePassword(provider.MinRequiredPasswordLength, provider.MinRequiredNonAlphanumericCharacters); - return Mapper.Map(emptyContent); + return AutoMapperExtensions.MapWithUmbracoContext(emptyContent, UmbracoContext); case MembershipScenario.CustomProviderWithUmbracoLink: //TODO: Support editing custom properties for members with a custom membership provider here. @@ -247,7 +247,7 @@ namespace Umbraco.Web.Editors //we need to return a scaffold of a 'simple' member - basically just what a membership provider can edit emptyContent = MemberService.CreateGenericMembershipProviderMember("", "", "", ""); emptyContent.AdditionalData["NewPassword"] = Membership.GeneratePassword(Membership.MinRequiredPasswordLength, Membership.MinRequiredNonAlphanumericCharacters); - return Mapper.Map(emptyContent); + return AutoMapperExtensions.MapWithUmbracoContext(emptyContent, UmbracoContext); } } @@ -287,7 +287,7 @@ namespace Umbraco.Web.Editors //Unlike content/media - if there are errors for a member, we do NOT proceed to save them, we cannot so return the errors if (ModelState.IsValid == false) { - var forDisplay = Mapper.Map(contentItem.PersistedContent); + var forDisplay = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); } @@ -329,7 +329,7 @@ namespace Umbraco.Web.Editors //If we've had problems creating/updating the user with the provider then return the error if (ModelState.IsValid == false) { - var forDisplay = Mapper.Map(contentItem.PersistedContent); + var forDisplay = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); } @@ -367,7 +367,7 @@ namespace Umbraco.Web.Editors contentItem.PersistedContent.AdditionalData["GeneratedPassword"] = generatedPassword; //return the updated model - var display = Mapper.Map(contentItem.PersistedContent); + var display = AutoMapperExtensions.MapWithUmbracoContext(contentItem.PersistedContent, UmbracoContext); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); diff --git a/src/Umbraco.Web/Models/Mapping/AutoMapperExtensions.cs b/src/Umbraco.Web/Models/Mapping/AutoMapperExtensions.cs index 78fc71dbc0..e5850b2689 100644 --- a/src/Umbraco.Web/Models/Mapping/AutoMapperExtensions.cs +++ b/src/Umbraco.Web/Models/Mapping/AutoMapperExtensions.cs @@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Mapping { return Mapper.Map(obj, opt => opt.Items["UmbracoContext"] = umbCtx); } - + /// /// Returns an from the mapping options /// @@ -32,11 +32,11 @@ namespace Umbraco.Web.Models.Mapping /// /// If an UmbracoContext is not found in the mapping options, it will try to retrieve it from the singleton /// - public static UmbracoContext GetUmbracoContext(this ResolutionResult res) + public static UmbracoContext GetUmbracoContext(this ResolutionContext res) { //get the context from the mapping options set during a mapping operation object umbCtx; - if (res.Context.Options.Items.TryGetValue("UmbracoContext", out umbCtx)) + if (res.Options.Items.TryGetValue("UmbracoContext", out umbCtx)) { var umbracoContext = umbCtx as UmbracoContext; if (umbracoContext != null) return umbracoContext; diff --git a/src/Umbraco.Web/Models/Mapping/ContentTreeNodeUrlResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentTreeNodeUrlResolver.cs index dfea70a968..63d5b9b7e3 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTreeNodeUrlResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTreeNodeUrlResolver.cs @@ -20,7 +20,7 @@ namespace Umbraco.Web.Models.Mapping private string ResolveCore(ResolutionResult res, TSource source) { - var umbCtx = res.GetUmbracoContext(); + var umbCtx = res.Context.GetUmbracoContext(); //map the tree node url if (umbCtx != null) { diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs index 5f5c42f9dc..7f5bc731b1 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs @@ -25,12 +25,7 @@ namespace Umbraco.Web.Models.Mapping public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { //FROM MembershipUser TO MediaItemDisplay - used when using a non-umbraco membership provider - config.CreateMap() - .ConvertUsing(user => - { - var member = Mapper.Map(user); - return Mapper.Map(member); - }); + config.CreateMap().ConvertUsing(); //FROM MembershipUser TO IMember - used when using a non-umbraco membership provider config.CreateMap() @@ -262,7 +257,7 @@ namespace Umbraco.Web.Models.Mapping var tabs = (List>) result.Value; //now we can customize the result with the current context, we can get the UmbracoContext from the options - CustomizeProperties(source.GetUmbracoContext(), member, tabs); + CustomizeProperties(source.Context.GetUmbracoContext(), member, tabs); return result; } @@ -500,6 +495,21 @@ namespace Umbraco.Web.Models.Mapping } } } + + /// + /// A converter to go from a to a + /// + internal class MembershipUserTypeConverter : ITypeConverter + { + public MemberDisplay Convert(ResolutionContext context) + { + var source = (MembershipUser)context.SourceValue; + //first convert to IMember + var member = Mapper.Map(source); + //then convert to MemberDisplay + return AutoMapperExtensions.MapWithUmbracoContext(member, context.GetUmbracoContext()); + } + } } } diff --git a/src/Umbraco.Web/Models/Mapping/MemberTreeNodeUrlResolver.cs b/src/Umbraco.Web/Models/Mapping/MemberTreeNodeUrlResolver.cs index a0b99252d2..a6e6472e16 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberTreeNodeUrlResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberTreeNodeUrlResolver.cs @@ -18,7 +18,7 @@ namespace Umbraco.Web.Models.Mapping private string ResolveCore(ResolutionResult res, IMember source) { - var umbCtx = res.GetUmbracoContext(); + var umbCtx = res.Context.GetUmbracoContext(); //map the tree node url if (umbCtx != null) { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 2a164b6ea1..e71441a06a 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -330,6 +330,9 @@ + + +