Fixes issues with the merged contenttype mapper

Mediatype, membertype and contenttype all use the same core mapper, with
small variations between each type - it is however important in what
order the mappers are added.
This commit is contained in:
Per Ploug
2015-08-26 12:07:43 +02:00
parent ca88d9cbc2
commit 94b09a4568
2 changed files with 96 additions and 32 deletions

View File

@@ -10,7 +10,7 @@ using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
internal class AvailableCompositeContentTypesResolver : ValueResolver<IContentType, IEnumerable<EntityBasic>>
internal class AvailableCompositeContentTypesResolver : ValueResolver<IContentTypeComposition, IEnumerable<EntityBasic>>
{
private ApplicationContext _context;
private bool _mediaType;
@@ -20,14 +20,29 @@ namespace Umbraco.Web.Models.Mapping
_mediaType = mediaType;
}
protected override IEnumerable<EntityBasic> ResolveCore(IContentType source)
protected override IEnumerable<EntityBasic> ResolveCore(IContentTypeComposition source)
{
//below is all ported from the old doc type editor and comes with the same weaknesses /insanity / magic
//get all types
var allContentTypes = _mediaType
? _context.Services.ContentTypeService.GetAllMediaTypes().Cast<IContentTypeComposition>().ToArray()
: _context.Services.ContentTypeService.GetAllContentTypes().Cast<IContentTypeComposition>().ToArray();
var s = source;
var type = _context.Services.EntityService.GetObjectType(source.Id);
IContentTypeComposition[] allContentTypes = new IContentTypeComposition[0];
switch (type)
{
case UmbracoObjectTypes.DocumentType:
allContentTypes = _context.Services.ContentTypeService.GetAllContentTypes().Cast<IContentTypeComposition>().ToArray();
break;
case UmbracoObjectTypes.MediaType:
allContentTypes = _context.Services.ContentTypeService.GetAllMediaTypes().Cast<IContentTypeComposition>().ToArray();
break;
case UmbracoObjectTypes.MemberType:
allContentTypes = _context.Services.MemberTypeService.GetAll().Cast<IContentTypeComposition>().ToArray();
break;
}
// note: there are many sanity checks missing here and there ;-((
// make sure once and for all

View File

@@ -9,6 +9,7 @@ using Umbraco.Core.Models.Mapping;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
using System.Collections.Generic;
using AutoMapper.Internal;
using Property = umbraco.NodeFactory.Property;
namespace Umbraco.Web.Models.Mapping
@@ -34,24 +35,11 @@ namespace Umbraco.Web.Models.Mapping
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
config.CreateMap<ContentTypeDisplay, IContentType>()
.ConstructUsing((ContentTypeDisplay source) => new ContentType(source.ParentId))
.ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore())
.ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore())
.AfterMap((source, dest) =>
{
//sync templates
dest.AllowedTemplates = source.AllowedTemplates.Select(x => Mapper.Map<ITemplate>(x));
if (source.DefaultTemplate != null)
dest.SetDefaultTemplate(Mapper.Map<ITemplate>(source.DefaultTemplate));
});
config.CreateMap<ContentTypeCompositionDisplay, IContentTypeComposition>()
.Include<ContentTypeDisplay, IContentType>()
.Include<ContentTypeCompositionDisplay, IMemberType>()
.Include<ContentTypeCompositionDisplay, IMediaType>()
//only map id if set to something higher then zero
.ForMember(dto => dto.Id, expression => expression.Condition(display => (Convert.ToInt32(display.Id) > 0)))
.ForMember(dto => dto.Id, expression => expression.MapFrom(display => Convert.ToInt32(display.Id)))
@@ -60,9 +48,10 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dto => dto.Level, expression => expression.Ignore())
.ForMember(dto => dto.SortOrder, expression => expression.Ignore())
//mapped in aftermap
.ForMember(dto => dto.AllowedContentTypes, expression => expression.Ignore())
.ForMember(
dto => dto.AllowedContentTypes,
expression => expression.MapFrom(dto => dto.AllowedContentTypes.Select( (t, i) => new ContentTypeSort(t, i) )))
//ignore, we'll do this in after map
.ForMember(dto => dto.PropertyGroups, expression => expression.Ignore())
@@ -123,11 +112,24 @@ namespace Umbraco.Web.Models.Mapping
{
dest.RemovePropertyType(removedType.Alias);
}
});
config.CreateMap<ContentTypeDisplay, IContentType>()
.ConstructUsing((source) => new ContentType(source.ParentId))
.ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore())
.ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore())
.AfterMap((source, dest) =>
{
//sync templates
dest.AllowedTemplates = source.AllowedTemplates.Select(x => Mapper.Map<ITemplate>(x));
if (source.DefaultTemplate != null)
dest.SetDefaultTemplate(Mapper.Map<ITemplate>(source.DefaultTemplate));
//Sync allowed child types
var allowedTypes = source.AllowedContentTypes.Select((t, i) => new ContentTypeSort(t, i));
dest.AllowedContentTypes = allowedTypes.ToArray();
//sync compositions
var current = dest.CompositionAliases().ToArray();
@@ -143,23 +145,66 @@ namespace Umbraco.Web.Models.Mapping
foreach (var a in add)
{
//TODO: Remove N+1 lookup
var addCt = applicationContext.Services.ContentTypeService.GetContentType(a);
if (addCt != null)
dest.AddContentType(addCt);
}
});
config.CreateMap<ContentTypeCompositionDisplay, IMemberType>()
.AfterMap((source, dest) =>
{
//sync compositions
var current = dest.CompositionAliases().ToArray();
var proposed = source.CompositeContentTypes;
var remove = current.Where(x => proposed.Contains(x) == false);
var add = proposed.Where(x => current.Contains(x) == false);
foreach (var rem in remove)
dest.RemoveContentType(rem);
foreach (var a in add)
{
//TODO: Remove N+1 lookup
var addCt = applicationContext.Services.MemberTypeService.Get(a);
if (addCt != null)
dest.AddContentType(addCt);
}
});
config.CreateMap<ContentTypeCompositionDisplay, IMediaType>()
.AfterMap((source, dest) =>
{
//sync compositions
var current = dest.CompositionAliases().ToArray();
var proposed = source.CompositeContentTypes;
config.CreateMap<ContentTypeSort, int>().ConvertUsing(x => x.Id.Value);
var remove = current.Where(x => proposed.Contains(x) == false);
var add = proposed.Where(x => current.Contains(x) == false);
foreach (var rem in remove)
dest.RemoveContentType(rem);
foreach (var a in add)
{
//TODO: Remove N+1 lookup
var addCt = applicationContext.Services.ContentTypeService.GetMediaType(a);
if (addCt != null)
dest.AddContentType(addCt);
}
});
config.CreateMap<IContentTypeComposition, string>().ConvertUsing(x => x.Alias);
config.CreateMap<IContentTypeComposition, ContentTypeCompositionDisplay>()
.Include<IContentType, ContentTypeDisplay>()
.Include<IMemberType, ContentTypeCompositionDisplay>()
.Include<IMediaType, ContentTypeCompositionDisplay>()
@@ -197,9 +242,9 @@ namespace Umbraco.Web.Models.Mapping
}));
config.CreateMap<IMemberType, ContentTypeCompositionDisplay>();
config.CreateMap<IMediaType, ContentTypeCompositionDisplay>();
config.CreateMap<IContentType, ContentTypeDisplay>()
.ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore())
.ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore())
@@ -213,6 +258,10 @@ namespace Umbraco.Web.Models.Mapping
dest.DefaultTemplate = Mapper.Map<EntityBasic>(source.DefaultTemplate);
});
config.CreateMap<IMemberType, ContentTypeBasic>();
config.CreateMap<IMediaType, ContentTypeBasic>();
config.CreateMap<IContentType, ContentTypeBasic>();
config.CreateMap<PropertyGroupDisplay, PropertyGroup>()
.ForMember(dest => dest.Id, expression => expression.Condition(source => source.Id > 0))