using System.Collections.Generic; using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Mapping; using Umbraco.Web.Models.ContentEditing; using umbraco; using System.Linq; namespace Umbraco.Web.Models.Mapping { /// /// Declares model mappings for members. /// internal class MemberModelMapper : MapperConfiguration { public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) { //FROM IMember TO MediaItemDisplay config.CreateMap() .ForMember( dto => dto.Owner, expression => expression.ResolveUsing>()) .ForMember( dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon)) .ForMember( dto => dto.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias)) .ForMember( dto => dto.ContentTypeName, expression => expression.MapFrom(content => content.ContentType.Name)) .ForMember(display => display.Properties, expression => expression.Ignore()) .ForMember(display => display.Tabs, expression => expression.ResolveUsing( new TabsAndPropertiesResolver( //do no map this properties (currently anyways, they were never there in 6.x) Constants.Conventions.Member.StandardPropertyTypeStubs.Select(x => x.Value.Alias)))) .AfterMap(MapGenericCustomProperties); //FROM IMember TO ContentItemBasic config.CreateMap>() .ForMember( dto => dto.Owner, expression => expression.ResolveUsing>()) .ForMember( dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon)) .ForMember( dto => dto.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias)); //FROM IMember TO ContentItemDto config.CreateMap>() .ForMember( dto => dto.Owner, expression => expression.ResolveUsing>()) //do no map the custom member properties (currently anyways, they were never there in 6.x) .ForMember(dto => dto.Properties, expression => expression.ResolveUsing()); } /// /// Maps the generic tab with custom properties for content /// /// /// private static void MapGenericCustomProperties(IMember member, MemberDisplay display) { TabsAndPropertiesResolver.MapGenericProperties( member, display, new ContentPropertyDisplay { Alias = string.Format("{0}login", Constants.PropertyEditors.InternalGenericPropertiesPrefix), Label = ui.Text("login"), Value = display.Username, View = "textbox", Config = new Dictionary { { "IsRequired", true } } }, new ContentPropertyDisplay { Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix), Label = ui.Text("password"), Value = "", View = "changepassword" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor }, new ContentPropertyDisplay { Alias = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix), Label = ui.Text("general", "email"), Value = display.Email, View = "email", Config = new Dictionary {{"IsRequired", true}} }); } /// /// This ensures that the custom membership provider properties are not mapped (currently since they weren't there in v6) /// /// /// Because these properties don't exist on the form, if we don't remove them for this map we'll get validation errors when posting data /// internal class MemberDtoPropertiesValueResolver : ValueResolver> { protected override IEnumerable ResolveCore(IMember source) { var exclude = Constants.Conventions.Member.StandardPropertyTypeStubs.Select(x => x.Value.Alias).ToArray(); return source.Properties .Where(x => exclude.Contains(x.Alias) == false) .Select(Mapper.Map); } } } }