diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 96233592ac..33932eb0b9 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -34,6 +34,7 @@ using Umbraco.Web.WebApi.Filters; using umbraco; using Constants = Umbraco.Core.Constants; using Examine; +using Newtonsoft.Json; namespace Umbraco.Web.Editors { @@ -237,7 +238,7 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } - var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); emptyContent = new Member(contentType); emptyContent.AdditionalData["NewPassword"] = Membership.GeneratePassword(provider.MinRequiredPasswordLength, provider.MinRequiredNonAlphanumericCharacters); @@ -397,7 +398,7 @@ namespace Umbraco.Web.Editors UpdateName(contentItem); //map the custom properties - this will already be set for new entities in our member binder - contentItem.PersistedContent.Email = contentItem.Email; + contentItem.PersistedContent.Email = contentItem.Email; contentItem.PersistedContent.Username = contentItem.Username; //use the base method to map the rest of the properties @@ -800,26 +801,29 @@ namespace Umbraco.Web.Editors //since we want to write the property types last, we'll re-order this list var propertyTypesProperties = memberProperties.Where(x => x.PropertyType == typeof(PropertyCollection)).ToList(); foreach (var propertyType in propertyTypesProperties) - { memberProperties.Remove(propertyType); - } + //now re-add them to the end (there will only be one, but we'll do this just to be complete) foreach (var propertyTypesProperty in propertyTypesProperties) - { memberProperties.Add(propertyTypesProperty); - } var fileName = $"{member.Name}_{member.Email}.txt"; + var exportProperties = new List(); + foreach (var memberProperty in memberProperties) + { + var exportItems = ReportWriter.GetPropertyExportItems(member, memberProperty); + if (exportItems != null) + exportProperties.AddRange(exportItems); + } + using (var memoryStream = new MemoryStream()) { using (var textWriter = new StreamWriter(memoryStream)) - { - foreach (var memberProperty in memberProperties) - { - ReportWriter.WritePropertyValue(member, memberProperty, textWriter); - } - + { + var output = JsonConvert.SerializeObject(exportProperties, Formatting.Indented); + textWriter.WriteLine("Member export"); + textWriter.Write(output); textWriter.Flush(); } @@ -832,7 +836,6 @@ namespace Umbraco.Web.Editors return httpResponseMessage; } - } private static class ReportWriter @@ -855,63 +858,60 @@ namespace Umbraco.Web.Editors "ContentType", "DeletedDate" }; - private static readonly List PropertiesFilter = new List - { - "PropertyType", - "Version", - "Id", - "HasIdentity", - "Key", - "DeletedDate" - }; - public static void WritePropertyValue(object owner, PropertyInfo prop, StreamWriter textWriter) + public static List GetPropertyExportItems(IMember owner, PropertyInfo prop) { if (owner == null) throw new ArgumentNullException(nameof(owner)); if (prop == null) throw new ArgumentNullException(nameof(prop)); - if (textWriter == null) throw new ArgumentNullException(nameof(textWriter)); if (MemberPropertyFilter.Contains(prop.Name)) - return; + return null; + var exportProperties = new List(); var propertyValue = prop.GetValue(owner, null) ?? string.Empty; var type = prop.PropertyType; - if (propertyValue is DateTime time) + if (type == typeof(PropertyCollection)) { - textWriter.WriteLine(prop.Name + " : " + time.ToIsoString()); - } - else if (type == typeof(PropertyCollection)) - { - textWriter.WriteLine(""); - textWriter.WriteLine("PROPERTIES"); - textWriter.WriteLine("**********"); - if (propertyValue is PropertyCollection propertyCollection) { foreach (var property in propertyCollection) { - var propProperties = property.GetType().GetProperties(); - - textWriter.WriteLine("Name : " + property.PropertyType.Name); - - foreach (var p in propProperties) + var propertyExportModel = new PropertyExportModel { - if (PropertiesFilter.Contains(p.Name)) continue; - - WritePropertyValue(property, p, textWriter); //recurse - } - - textWriter.WriteLine("------------------------"); + Id = property.Id, + Alias = property.Alias, + Value = property.Value, + CreateDate = property.CreateDate, + UpdateDate = property.UpdateDate + }; + exportProperties.Add(propertyExportModel); } } } else { - textWriter.WriteLine(prop.Name + " : " + propertyValue); + var propertyExportModel = new PropertyExportModel + { + Name = prop.Name, + Value = propertyValue, + CreateDate = null, + UpdateDate = null + }; + exportProperties.Add(propertyExportModel); } + + return exportProperties; } } + } - + internal class PropertyExportModel + { + public int Id { get; set; } + public string Alias { get; set; } + public string Name { get; set; } + public object Value { get; set; } + public DateTime? CreateDate { get; set; } + public DateTime? UpdateDate { get; set; } } }