diff --git a/src/Umbraco.Web/Models/Mapping/CommonMapper.cs b/src/Umbraco.Infrastructure/Models/Mapping/CommonMapper.cs similarity index 72% rename from src/Umbraco.Web/Models/Mapping/CommonMapper.cs rename to src/Umbraco.Infrastructure/Models/Mapping/CommonMapper.cs index b1e511670f..2d7ee84675 100644 --- a/src/Umbraco.Web/Models/Mapping/CommonMapper.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/CommonMapper.cs @@ -1,18 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Web; -using System.Web.Mvc; using Umbraco.Core; using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Core.Models.ContentEditing; -using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.ContentApps; using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.Trees; + using UserProfile = Umbraco.Web.Models.ContentEditing.UserProfile; namespace Umbraco.Web.Models.Mapping @@ -23,17 +20,15 @@ namespace Umbraco.Web.Models.Mapping private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; private readonly ContentAppFactoryCollection _contentAppDefinitions; private readonly ILocalizedTextService _localizedTextService; - private readonly IHttpContextAccessor _httpContextAccessor; private readonly IUmbracoContextAccessor _umbracoContextAccessor; public CommonMapper(IUserService userService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, - ContentAppFactoryCollection contentAppDefinitions, ILocalizedTextService localizedTextService, IHttpContextAccessor httpContextAccessor) + ContentAppFactoryCollection contentAppDefinitions, ILocalizedTextService localizedTextService) { _userService = userService; _contentTypeBaseServiceProvider = contentTypeBaseServiceProvider; _contentAppDefinitions = contentAppDefinitions; _localizedTextService = localizedTextService; - _httpContextAccessor = httpContextAccessor; _umbracoContextAccessor = umbracoContextAccessor; } @@ -64,25 +59,6 @@ namespace Umbraco.Web.Models.Mapping return null; } - public string GetTreeNodeUrl(IContentBase source) - where TController : ContentTreeControllerBase - { - var httpContext = _httpContextAccessor.HttpContext; - if (httpContext == null) return null; - - var urlHelper = new UrlHelper(httpContext.Request.RequestContext); - return urlHelper.GetUmbracoApiService(controller => controller.GetTreeNode(source.Key.ToString("N"), null)); - } - - public string GetMemberTreeNodeUrl(IContentBase source) - { - var httpContext = _httpContextAccessor.HttpContext; - if (httpContext == null) return null; - - var urlHelper = new UrlHelper(httpContext.Request.RequestContext); - return urlHelper.GetUmbracoApiService(controller => controller.GetTreeNode(source.Key.ToString("N"), null)); - } - public IEnumerable GetContentApps(IContentBase source) { var apps = _contentAppDefinitions.GetContentAppsFor(source).ToArray(); diff --git a/src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs similarity index 98% rename from src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs rename to src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs index c454f19ce7..f2faaf275d 100644 --- a/src/Umbraco.Web/Models/Mapping/EntityMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs @@ -11,7 +11,7 @@ using Umbraco.Examine; namespace Umbraco.Web.Models.Mapping { - internal class EntityMapDefinition : IMapDefinition + public class EntityMapDefinition : IMapDefinition { public void DefineMaps(UmbracoMapper mapper) { @@ -236,7 +236,7 @@ namespace Umbraco.Web.Models.Mapping return memberEntity.ContentTypeIcon.IfNullOrWhiteSpace(Constants.Icons.Member); case IContentEntitySlim contentEntity: // NOTE: this case covers both content and media entities - return contentEntity.ContentTypeIcon; + return contentEntity.ContentTypeIcon; } return null; diff --git a/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs b/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs index 219111fc56..d5f3ba244b 100644 --- a/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs +++ b/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs @@ -32,6 +32,7 @@ namespace Umbraco.Web.Composing.CompositionExtensions .Add();; composition.Register(); + composition.Register(); composition.Register(); return composition; diff --git a/src/Umbraco.Web/Models/Mapping/CommonTreeNodeMapper.cs b/src/Umbraco.Web/Models/Mapping/CommonTreeNodeMapper.cs new file mode 100644 index 0000000000..d1d0857abb --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/CommonTreeNodeMapper.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; +using Umbraco.Core; +using Umbraco.Core.Mapping; +using Umbraco.Core.Models; +using Umbraco.Core.Models.ContentEditing; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Services; +using Umbraco.Web.ContentApps; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Trees; +using Umbraco.Web.WebApi; +using UserProfile = Umbraco.Web.Models.ContentEditing.UserProfile; + +namespace Umbraco.Web.Models.Mapping +{ + public class CommonTreeNodeMapper + { + private readonly IHttpContextAccessor _httpContextAccessor; + + + public CommonTreeNodeMapper(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + + public string GetTreeNodeUrl(IContentBase source) + where TController : UmbracoApiController, ITreeNodeController + { + var httpContext = _httpContextAccessor.HttpContext; + if (httpContext == null) return null; + + var urlHelper = new UrlHelper(httpContext.Request.RequestContext); + return urlHelper.GetUmbracoApiService(controller => controller.GetTreeNode(source.Key.ToString("N"), null)); + } + + } +} diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs index 36c117197b..c1118d0eb0 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs @@ -21,6 +21,7 @@ namespace Umbraco.Web.Models.Mapping internal class ContentMapDefinition : IMapDefinition { private readonly CommonMapper _commonMapper; + private readonly CommonTreeNodeMapper _commonTreeNodeMapper; private readonly ICultureDictionary _cultureDictionary; private readonly ILocalizedTextService _localizedTextService; private readonly IContentService _contentService; @@ -41,11 +42,12 @@ namespace Umbraco.Web.Models.Mapping private readonly ContentVariantMapper _contentVariantMapper; - public ContentMapDefinition(CommonMapper commonMapper, ICultureDictionary cultureDictionary, ILocalizedTextService localizedTextService, IContentService contentService, IContentTypeService contentTypeService, + public ContentMapDefinition(CommonMapper commonMapper, CommonTreeNodeMapper commonTreeNodeMapper, ICultureDictionary cultureDictionary, ILocalizedTextService localizedTextService, IContentService contentService, IContentTypeService contentTypeService, IFileService fileService, IUmbracoContextAccessor umbracoContextAccessor, IPublishedRouter publishedRouter, ILocalizationService localizationService, ILogger logger, IUserService userService, IVariationContextAccessor variationContextAccessor, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, UriUtility uriUtility, IPublishedUrlProvider publishedUrlProvider, IEntityService entityService) { _commonMapper = commonMapper; + _commonTreeNodeMapper = commonTreeNodeMapper; _cultureDictionary = cultureDictionary; _localizedTextService = localizedTextService; _contentService = contentService; @@ -105,7 +107,7 @@ namespace Umbraco.Web.Models.Mapping target.TemplateAlias = GetDefaultTemplate(source); target.TemplateId = source.TemplateId ?? default; target.Trashed = source.Trashed; - target.TreeNodeUrl = _commonMapper.GetTreeNodeUrl(source); + target.TreeNodeUrl = _commonTreeNodeMapper.GetTreeNodeUrl(source); target.Udi = Udi.Create(source.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, source.Key); target.UpdateDate = source.UpdateDate; target.Updater = _commonMapper.GetCreator(source, context); diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs index f42e8d5d37..e6a41451f6 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapDefinition.cs @@ -18,16 +18,18 @@ namespace Umbraco.Web.Models.Mapping public class MediaMapDefinition : IMapDefinition { private readonly CommonMapper _commonMapper; + private readonly CommonTreeNodeMapper _commonTreeNodeMapper; private readonly IMediaService _mediaService; private readonly IMediaTypeService _mediaTypeService; private readonly MediaUrlGeneratorCollection _mediaUrlGenerators; private readonly TabsAndPropertiesMapper _tabsAndPropertiesMapper; private readonly IUmbracoSettingsSection _umbracoSettingsSection; - public MediaMapDefinition(ICultureDictionary cultureDictionary, CommonMapper commonMapper, IMediaService mediaService, IMediaTypeService mediaTypeService, + public MediaMapDefinition(ICultureDictionary cultureDictionary, CommonMapper commonMapper, CommonTreeNodeMapper commonTreeNodeMapper, IMediaService mediaService, IMediaTypeService mediaTypeService, ILocalizedTextService localizedTextService, MediaUrlGeneratorCollection mediaUrlGenerators, IUmbracoSettingsSection umbracoSettingsSection, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) { _commonMapper = commonMapper; + _commonTreeNodeMapper = commonTreeNodeMapper; _mediaService = mediaService; _mediaTypeService = mediaTypeService; _mediaUrlGenerators = mediaUrlGenerators; @@ -71,7 +73,7 @@ namespace Umbraco.Web.Models.Mapping target.State = null; target.Tabs = _tabsAndPropertiesMapper.Map(source, context); target.Trashed = source.Trashed; - target.TreeNodeUrl = _commonMapper.GetTreeNodeUrl(source); + target.TreeNodeUrl = _commonTreeNodeMapper.GetTreeNodeUrl(source); target.Udi = Udi.Create(Constants.UdiEntityType.Media, source.Key); target.UpdateDate = source.UpdateDate; target.VariesByCulture = source.ContentType.VariesByCulture(); diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs index d47f9df7c7..6e16dd2d71 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs @@ -1,7 +1,9 @@ -using Umbraco.Core; +using System.Web.Mvc; +using Umbraco.Core; using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Trees; namespace Umbraco.Web.Models.Mapping { @@ -11,13 +13,17 @@ namespace Umbraco.Web.Models.Mapping public class MemberMapDefinition : IMapDefinition { private readonly CommonMapper _commonMapper; + private readonly CommonTreeNodeMapper _commonTreeNodeMapper; private readonly MemberTabsAndPropertiesMapper _tabsAndPropertiesMapper; + private readonly IHttpContextAccessor _httpContextAccessor; - public MemberMapDefinition(CommonMapper commonMapper, MemberTabsAndPropertiesMapper tabsAndPropertiesMapper) + public MemberMapDefinition(CommonMapper commonMapper, CommonTreeNodeMapper commonTreeNodeMapper, MemberTabsAndPropertiesMapper tabsAndPropertiesMapper, IHttpContextAccessor httpContextAccessor) { _commonMapper = commonMapper; + _commonTreeNodeMapper = commonTreeNodeMapper; _tabsAndPropertiesMapper = tabsAndPropertiesMapper; + _httpContextAccessor = httpContextAccessor; } public void DefineMaps(UmbracoMapper mapper) @@ -48,7 +54,7 @@ namespace Umbraco.Web.Models.Mapping target.SortOrder = source.SortOrder; target.State = null; target.Tabs = _tabsAndPropertiesMapper.Map(source, context); - target.TreeNodeUrl = _commonMapper.GetMemberTreeNodeUrl(source); + target.TreeNodeUrl = _commonTreeNodeMapper.GetTreeNodeUrl(source); target.Udi = Udi.Create(Constants.UdiEntityType.Member, source.Key); target.UpdateDate = source.UpdateDate; target.Username = source.Username; @@ -92,5 +98,7 @@ namespace Umbraco.Web.Models.Mapping target.Properties = context.MapEnumerable(source.Properties); } + + } } diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index 4549f47a2f..083c4b82e8 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -12,7 +12,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi.Filters; -using System.Globalization; using Umbraco.Core.Models.Entities; using System.Web.Http.ModelBinding; using Umbraco.Web.Actions; @@ -26,7 +25,7 @@ using Umbraco.Web.Routing; namespace Umbraco.Web.Trees { - public abstract class ContentTreeControllerBase : TreeController + public abstract class ContentTreeControllerBase : TreeController, ITreeNodeController { public IMenuItemCollectionFactory MenuItemCollectionFactory { get; } diff --git a/src/Umbraco.Web/Trees/ITreeNodeController.cs b/src/Umbraco.Web/Trees/ITreeNodeController.cs new file mode 100644 index 0000000000..a8c22f38bd --- /dev/null +++ b/src/Umbraco.Web/Trees/ITreeNodeController.cs @@ -0,0 +1,22 @@ +using System.Net.Http.Formatting; +using Umbraco.Web.Models.Trees; +using Umbraco.Web.WebApi.Filters; +using System.Web.Http.ModelBinding; + +namespace Umbraco.Web.Trees +{ + /// + /// Represents an TreeNodeController + /// + public interface ITreeNodeController + { + /// + /// Gets an individual tree node + /// + /// + /// + /// + TreeNode GetTreeNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))] + FormDataCollection queryStrings); + } +} diff --git a/src/Umbraco.Web/Trees/MediaTreeController.cs b/src/Umbraco.Web/Trees/MediaTreeController.cs index 05b7e0e2ad..0ac33734ff 100644 --- a/src/Umbraco.Web/Trees/MediaTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTreeController.cs @@ -37,7 +37,7 @@ namespace Umbraco.Web.Trees [PluginController("UmbracoTrees")] [CoreTree] [SearchableTree("searchResultFormatter", "configureMediaResult", 20)] - public class MediaTreeController : ContentTreeControllerBase, ISearchableTree + public class MediaTreeController : ContentTreeControllerBase, ISearchableTree, ITreeNodeController { private readonly UmbracoTreeSearcher _treeSearcher; diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index 490fe3d646..ad77c837f6 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -37,7 +37,7 @@ namespace Umbraco.Web.Trees [PluginController("UmbracoTrees")] [CoreTree] [SearchableTree("searchResultFormatter", "configureMemberResult")] - public class MemberTreeController : TreeController, ISearchableTree + public class MemberTreeController : TreeController, ISearchableTree, ITreeNodeController { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 8174555486..27f372753a 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -55,6 +55,9 @@ + + C:\Users\Bjarke\.nuget\packages\microsoft.aspnet.mvc\5.2.7\lib\net45\System.Web.Mvc.dll + @@ -167,9 +170,8 @@ - + - @@ -203,6 +205,7 @@ +