Files
Umbraco-CMS/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs

120 lines
7.4 KiB
C#
Raw Normal View History

using System;
using System.Linq;
2017-07-19 13:42:47 +02:00
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Web.Models.ContentEditing;
2017-09-19 15:51:47 +02:00
using Umbraco.Web.Trees;
2017-07-19 13:42:47 +02:00
namespace Umbraco.Web.Models.Mapping
{
/// <summary>
/// Declares how model mappings for content
/// </summary>
2017-09-20 20:06:46 +02:00
internal class ContentMapperProfile : Profile
2017-07-19 13:42:47 +02:00
{
public ContentMapperProfile(
ContentUrlResolver contentUrlResolver,
ContentTreeNodeUrlResolver<IContent, ContentTreeController> contentTreeNodeUrlResolver,
TabsAndPropertiesResolver<IContent, ContentVariantDisplay> tabsAndPropertiesResolver,
ContentAppResolver contentAppResolver,
IUserService userService,
IContentService contentService,
IContentTypeService contentTypeService,
2018-09-07 11:34:55 +02:00
ILocalizationService localizationService)
2017-07-19 13:42:47 +02:00
{
// create, capture, cache
var contentOwnerResolver = new OwnerResolver<IContent>(userService);
var creatorResolver = new CreatorResolver(userService);
2018-03-27 10:04:07 +02:00
var actionButtonsResolver = new ActionButtonsResolver(userService, contentService);
var childOfListViewResolver = new ContentChildOfListViewResolver(contentService, contentTypeService);
var contentTypeBasicResolver = new ContentTypeBasicResolver<IContent, ContentItemDisplay>();
var defaultTemplateResolver = new DefaultTemplateResolver();
var variantResolver = new ContentVariantResolver(localizationService);
var contentSavedStateResolver = new ContentSavedStateResolver();
2017-07-19 13:42:47 +02:00
//FROM IContent TO ContentItemDisplay
CreateMap<IContent, ContentItemDisplay>()
2018-03-27 10:04:07 +02:00
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key)))
2017-07-19 13:42:47 +02:00
.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))
2017-07-19 13:42:47 +02:00
.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))
2017-11-15 08:53:20 +01:00
.ForMember(dest => dest.IsBlueprint, opt => opt.MapFrom(src => src.Blueprint))
2018-03-27 10:04:07 +02:00
.ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver))
2017-07-19 13:42:47 +02:00
.ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
2018-03-27 10:04:07 +02:00
.ForMember(dest => dest.TemplateAlias, opt => opt.ResolveUsing(defaultTemplateResolver))
.ForMember(dest => dest.Urls, opt => opt.ResolveUsing(contentUrlResolver))
2017-07-19 13:42:47 +02:00
.ForMember(dest => dest.AllowPreview, opt => opt.Ignore())
2018-03-27 10:04:07 +02:00
.ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver))
2017-07-19 13:42:47 +02:00
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Errors, opt => opt.Ignore())
2018-03-27 10:04:07 +02:00
.ForMember(dest => dest.DocumentType, opt => opt.ResolveUsing(contentTypeBasicResolver))
.ForMember(dest => dest.AllowedTemplates, opt =>
opt.MapFrom(content => content.ContentType.AllowedTemplates
.Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false)
.ToDictionary(t => t.Alias, t => t.Name)))
2017-07-19 13:42:47 +02:00
.ForMember(dest => dest.AllowedActions, opt => opt.ResolveUsing(src => actionButtonsResolver.Resolve(src)))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
CreateMap<IContent, ContentVariantDisplay>()
.ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate))
2018-07-16 20:24:49 +10:00
.ForMember(dest => dest.Segment, opt => opt.Ignore())
.ForMember(dest => dest.Language, opt => opt.Ignore())
2018-09-07 11:34:55 +02:00
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.State, opt => opt.ResolveUsing(contentSavedStateResolver))
.ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver));
2017-07-19 13:42:47 +02:00
//FROM IContent TO ContentItemBasic<ContentPropertyBasic, IContent>
CreateMap<IContent, ContentItemBasic<ContentPropertyBasic>>()
2017-09-19 15:51:47 +02:00
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src =>
2018-03-27 10:04:07 +02:00
Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key)))
2017-07-19 13:42:47 +02:00
.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.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<CultureUpdateDateResolver>())
.ForMember(dest => dest.Published, opt => opt.ResolveUsing<CulturePublishedResolver>())
.ForMember(dest => dest.Name, opt => opt.ResolveUsing<CultureNameResolver>());
2017-07-19 13:42:47 +02:00
//FROM IContent TO ContentPropertyCollectionDto
//NOTE: the property mapping for cultures relies on a culture being set in the mapping context
CreateMap<IContent, ContentPropertyCollectionDto>();
2017-07-19 13:42:47 +02:00
}
}
internal class CultureUpdateDateResolver : IValueResolver<IContent, ContentItemBasic<ContentPropertyBasic>, DateTime>
{
public DateTime Resolve(IContent source, ContentItemBasic<ContentPropertyBasic> destination, DateTime destMember, ResolutionContext context)
{
var culture = context.GetCulture();
return source.GetPublishDate(culture).HasValue ? source.GetPublishDate(culture).Value : source.UpdateDate;
}
}
internal class CulturePublishedResolver : IValueResolver<IContent, ContentItemBasic<ContentPropertyBasic>, bool>
{
public bool Resolve(IContent source, ContentItemBasic<ContentPropertyBasic> destination, bool destMember, ResolutionContext context)
{
var culture = context.GetCulture();
return source.IsCulturePublished(culture);
}
}
internal class CultureNameResolver : IValueResolver<IContent, ContentItemBasic<ContentPropertyBasic>, string>
{
public string Resolve(IContent source, ContentItemBasic<ContentPropertyBasic> destination, string destMember, ResolutionContext context)
{
return source.GetCultureName(context.GetCulture());
}
}
2017-07-20 11:21:28 +02:00
}