Updates all required mappings to use AutoMapperExtensions.MapWithUmbracoContext where appropriate

This commit is contained in:
Shannon
2018-01-25 14:41:28 -07:00
parent 64628c0a9d
commit 54cc80f4e8
8 changed files with 47 additions and 34 deletions

View File

@@ -80,7 +80,7 @@ namespace Umbraco.Web.Editors
public IEnumerable<ContentItemDisplay> GetByIds([FromUri]int[] ids)
{
var foundContent = Services.ContentService.GetByIds(ids);
return foundContent.Select(Mapper.Map<IContent, ContentItemDisplay>);
return foundContent.Select(content => AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(content, UmbracoContext));
}
/// <summary>
@@ -232,7 +232,7 @@ namespace Umbraco.Web.Editors
HandleContentNotFound(id);
}
var content = Mapper.Map<IContent, ContentItemDisplay>(foundContent);
var content = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(foundContent, UmbracoContext);
SetupBlueprint(content, foundContent);
@@ -270,7 +270,7 @@ namespace Umbraco.Web.Editors
HandleContentNotFound(id);
}
var content = Mapper.Map<IContent, ContentItemDisplay>(foundContent);
var content = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(foundContent, UmbracoContext);
return content;
}
@@ -283,7 +283,7 @@ namespace Umbraco.Web.Editors
HandleContentNotFound(id);
}
var content = Mapper.Map<IContent, ContentItemDisplay>(foundContent);
var content = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(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<IContent, ContentItemDisplay>(emptyContent);
var mapped = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(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<IContent, ContentItemDisplay>(contentItem.PersistedContent);
var forDisplay = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(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<IContent, ContentItemDisplay>(contentItem.PersistedContent);
var display = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(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<IContent, ContentItemDisplay>(foundContent);
var content = AutoMapperExtensions.MapWithUmbracoContext<IContent, ContentItemDisplay>(foundContent, UmbracoContext);
if (unpublishResult == false)
{
@@ -1092,4 +1092,4 @@ namespace Umbraco.Web.Editors
}
}
}
}

View File

@@ -89,7 +89,7 @@ namespace Umbraco.Web.Editors
}
var emptyContent = Services.MediaService.CreateMedia("", parentId, contentType.Alias, UmbracoUser.Id);
var mapped = Mapper.Map<IMedia, MediaItemDisplay>(emptyContent);
var mapped = AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(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<IMedia, MediaItemDisplay>(foundContent);
return AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(foundContent, UmbracoContext);
}
/// <summary>
@@ -157,7 +157,7 @@ namespace Umbraco.Web.Editors
//HandleContentNotFound will throw an exception
return null;
}
return Mapper.Map<IMedia, MediaItemDisplay>(foundContent);
return AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(foundContent, UmbracoContext);
}
/// <summary>
@@ -186,7 +186,7 @@ namespace Umbraco.Web.Editors
public IEnumerable<MediaItemDisplay> GetByIds([FromUri]int[] ids)
{
var foundMedia = Services.MediaService.GetByIds(ids);
return foundMedia.Select(Mapper.Map<IMedia, MediaItemDisplay>);
return foundMedia.Select(media => AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(media, UmbracoContext));
}
/// <summary>
@@ -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<IMedia, MediaItemDisplay>(contentItem.PersistedContent);
var forDisplay = AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(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<IMedia, MediaItemDisplay>(contentItem.PersistedContent);
var display = AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(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<IMedia, MediaItemDisplay>(f);
return AutoMapperExtensions.MapWithUmbracoContext<IMedia, MediaItemDisplay>(f, UmbracoContext);
}
/// <summary>

View File

@@ -178,7 +178,7 @@ namespace Umbraco.Web.Editors
{
HandleContentNotFound(key);
}
return Mapper.Map<IMember, MemberDisplay>(foundMember);
return AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(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<IMember, MemberDisplay>(emptyContent);
return AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(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<IMember, MemberDisplay>(emptyContent);
return AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(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<IMember, MemberDisplay>(contentItem.PersistedContent);
var forDisplay = AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(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<IMember, MemberDisplay>(contentItem.PersistedContent);
var forDisplay = AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(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<IMember, MemberDisplay>(contentItem.PersistedContent);
var display = AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(contentItem.PersistedContent, UmbracoContext);
//lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403
HandleInvalidModelState(display);

View File

@@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Mapping
{
return Mapper.Map<TIn, TOut>(obj, opt => opt.Items["UmbracoContext"] = umbCtx);
}
/// <summary>
/// Returns an <see cref="UmbracoContext"/> from the mapping options
/// </summary>
@@ -32,11 +32,11 @@ namespace Umbraco.Web.Models.Mapping
/// <remarks>
/// If an UmbracoContext is not found in the mapping options, it will try to retrieve it from the singleton
/// </remarks>
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;

View File

@@ -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)
{

View File

@@ -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<MembershipUser, MemberDisplay>()
.ConvertUsing(user =>
{
var member = Mapper.Map<MembershipUser, IMember>(user);
return Mapper.Map<IMember, MemberDisplay>(member);
});
config.CreateMap<MembershipUser, MemberDisplay>().ConvertUsing<MembershipUserTypeConverter>();
//FROM MembershipUser TO IMember - used when using a non-umbraco membership provider
config.CreateMap<MembershipUser, IMember>()
@@ -262,7 +257,7 @@ namespace Umbraco.Web.Models.Mapping
var tabs = (List<Tab<ContentPropertyDisplay>>) 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
}
}
}
/// <summary>
/// A converter to go from a <see cref="MembershipUser"/> to a <see cref="MemberDisplay"/>
/// </summary>
internal class MembershipUserTypeConverter : ITypeConverter<MembershipUser, MemberDisplay>
{
public MemberDisplay Convert(ResolutionContext context)
{
var source = (MembershipUser)context.SourceValue;
//first convert to IMember
var member = Mapper.Map<MembershipUser, IMember>(source);
//then convert to MemberDisplay
return AutoMapperExtensions.MapWithUmbracoContext<IMember, MemberDisplay>(member, context.GetUmbracoContext());
}
}
}
}

View File

@@ -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)
{

View File

@@ -330,6 +330,9 @@
<Compile Include="Editors\CodeFileController.cs" />
<Compile Include="Editors\TourController.cs" />
<Compile Include="Models\BackOfficeTourFilter.cs" />
<Compile Include="Models\Mapping\AutoMapperExtensions.cs" />
<Compile Include="Models\Mapping\ContentTreeNodeUrlResolver.cs" />
<Compile Include="Models\Mapping\MemberTreeNodeUrlResolver.cs" />
<Compile Include="TourFilterResolver.cs" />
<Compile Include="Editors\UserEditorAuthorizationHelper.cs" />
<Compile Include="Editors\UserGroupAuthorizationAttribute.cs" />