diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs
index 361912b2bd..d2e6ef309d 100644
--- a/src/Umbraco.Web/Editors/ContentController.cs
+++ b/src/Umbraco.Web/Editors/ContentController.cs
@@ -303,7 +303,7 @@ namespace Umbraco.Web.Editors
}
///
- /// Gets the content json for the content id
+ /// Gets the content json for the content guid
///
///
///
@@ -323,7 +323,7 @@ namespace Umbraco.Web.Editors
}
///
- /// Gets the content json for the content id
+ /// Gets the content json for the content udi
///
///
///
@@ -341,7 +341,7 @@ namespace Umbraco.Web.Editors
}
///
- /// Gets an empty content item for the
+ /// Gets an empty content item for the document type.
///
///
///
diff --git a/src/Umbraco.Web/Editors/DataTypeController.cs b/src/Umbraco.Web/Editors/DataTypeController.cs
index 31e0d70a42..5f5f5104cb 100644
--- a/src/Umbraco.Web/Editors/DataTypeController.cs
+++ b/src/Umbraco.Web/Editors/DataTypeController.cs
@@ -20,6 +20,7 @@ using Umbraco.Web.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
+using System.Web.Http.Controllers;
namespace Umbraco.Web.Editors
{
@@ -34,6 +35,7 @@ namespace Umbraco.Web.Editors
[PluginController("UmbracoApi")]
[UmbracoTreeAuthorize(Constants.Trees.DataTypes, Constants.Trees.DocumentTypes, Constants.Trees.MediaTypes, Constants.Trees.MemberTypes)]
[EnableOverrideAuthorization]
+ [DataTypeControllerConfiguration]
public class DataTypeController : BackOfficeNotificationsController
{
private readonly PropertyEditorCollection _propertyEditors;
@@ -44,6 +46,19 @@ namespace Umbraco.Web.Editors
_propertyEditors = propertyEditors;
}
+ ///
+ /// Configures this controller with a custom action selector
+ ///
+ private class DataTypeControllerConfigurationAttribute : Attribute, IControllerConfiguration
+ {
+ public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
+ {
+ controllerSettings.Services.Replace(typeof(IHttpActionSelector), new ParameterSwapControllerActionSelector(
+ new ParameterSwapControllerActionSelector.ParameterSwapInfo("GetById", "id", typeof(int), typeof(Guid), typeof(Udi))
+ ));
+ }
+ }
+
///
/// Gets data type by name
///
@@ -70,6 +85,40 @@ namespace Umbraco.Web.Editors
return Mapper.Map(dataType);
}
+ ///
+ /// Gets the datatype json for the datatype guid
+ ///
+ ///
+ ///
+ public DataTypeDisplay GetById(Guid id)
+ {
+ var dataType = Services.DataTypeService.GetDataType(id);
+ if (dataType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+ return Mapper.Map(dataType);
+ }
+
+ ///
+ /// Gets the datatype json for the datatype udi
+ ///
+ ///
+ ///
+ public DataTypeDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var dataType = Services.DataTypeService.GetDataType(guidUdi.Guid);
+ if (dataType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+ return Mapper.Map(dataType);
+ }
+
///
/// Deletes a data type with a given ID
///
diff --git a/src/Umbraco.Web/Editors/MacrosController.cs b/src/Umbraco.Web/Editors/MacrosController.cs
index 2e68925ce4..38103400d9 100644
--- a/src/Umbraco.Web/Editors/MacrosController.cs
+++ b/src/Umbraco.Web/Editors/MacrosController.cs
@@ -19,6 +19,7 @@ using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
+using System.Web.Http.Controllers;
namespace Umbraco.Web.Editors
{
@@ -28,6 +29,7 @@ namespace Umbraco.Web.Editors
///
[PluginController("UmbracoApi")]
[UmbracoTreeAuthorize(Constants.Trees.Macros)]
+ [MacrosControllerConfiguration]
public class MacrosController : BackOfficeNotificationsController
{
private readonly IMacroService _macroService;
@@ -38,6 +40,19 @@ namespace Umbraco.Web.Editors
_macroService = Services.MacroService;
}
+ ///
+ /// Configures this controller with a custom action selector
+ ///
+ private class MacrosControllerConfigurationAttribute : Attribute, IControllerConfiguration
+ {
+ public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
+ {
+ controllerSettings.Services.Replace(typeof(IHttpActionSelector), new ParameterSwapControllerActionSelector(
+ new ParameterSwapControllerActionSelector.ParameterSwapInfo("GetById", "id", typeof(int), typeof(Guid), typeof(Udi))
+ ));
+ }
+ }
+
///
/// Creates a new macro
///
@@ -97,39 +112,43 @@ namespace Umbraco.Web.Editors
return this.ReturnErrorResponse($"Macro with id {id} does not exist");
}
- var macroDisplay = new MacroDisplay
- {
- Alias = macro.Alias,
- Id = macro.Id,
- Key = macro.Key,
- Name = macro.Name,
- CacheByPage = macro.CacheByPage,
- CacheByUser = macro.CacheByMember,
- CachePeriod = macro.CacheDuration,
- View = macro.MacroSource,
- RenderInEditor = !macro.DontRender,
- UseInEditor = macro.UseInEditor,
- Path = $"-1,{macro.Id}"
- };
-
- var parameters = new List();
-
- foreach (var param in macro.Properties.Values.OrderBy(x => x.SortOrder))
- {
- parameters.Add(new MacroParameterDisplay
- {
- Editor = param.EditorAlias,
- Key = param.Alias,
- Label = param.Name,
- Id = param.Id
- });
- }
-
- macroDisplay.Parameters = parameters;
+ var macroDisplay = MapToDisplay(macro);
return this.Request.CreateResponse(HttpStatusCode.OK, macroDisplay);
}
+ [HttpGet]
+ public HttpResponseMessage GetById(Guid id)
+ {
+ var macro = _macroService.GetById(id);
+
+ if (macro == null)
+ {
+ return this.ReturnErrorResponse($"Macro with id {id} does not exist");
+ }
+
+ var macroDisplay = MapToDisplay(macro);
+
+ return this.Request.CreateResponse(HttpStatusCode.OK, macroDisplay);
+ }
+
+ [HttpGet]
+ public HttpResponseMessage GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ this.ReturnErrorResponse($"Macro with id {id} does not exist");
+
+ var macro = _macroService.GetById(guidUdi.Guid);
+ if (macro == null)
+ {
+ return this.ReturnErrorResponse($"Macro with id {id} does not exist");
+ }
+
+ var macroDisplay = MapToDisplay(macro);
+
+ return this.Request.CreateResponse(HttpStatusCode.OK, macroDisplay);
+ }
[HttpPost]
public HttpResponseMessage DeleteById(int id)
@@ -384,5 +403,29 @@ namespace Umbraco.Web.Editors
return files;
}
+
+ ///
+ /// Used to map an instance to a
+ ///
+ ///
+ ///
+ private MacroDisplay MapToDisplay(IMacro macro)
+ {
+ var display = Mapper.Map(macro);
+
+ var parameters = macro.Properties.Values
+ .OrderBy(x => x.SortOrder)
+ .Select(x => new MacroParameterDisplay()
+ {
+ Editor = x.EditorAlias,
+ Key = x.Alias,
+ Label = x.Name,
+ Id = x.Id
+ });
+
+ display.Parameters = parameters;
+
+ return display;
+ }
}
}
diff --git a/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs
index e5bca22287..e654fc16a1 100644
--- a/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs
+++ b/src/Umbraco.Web/Models/Mapping/MacroMapDefinition.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Logging;
@@ -23,6 +24,7 @@ namespace Umbraco.Web.Models.Mapping
public void DefineMaps(UmbracoMapper mapper)
{
mapper.Define((source, context) => new EntityBasic(), Map);
+ mapper.Define((source, context) => new MacroDisplay(), Map);
mapper.Define>((source, context) => context.MapEnumerable(source.Properties.Values));
mapper.Define((source, context) => new MacroParameter(), Map);
}
@@ -40,6 +42,23 @@ namespace Umbraco.Web.Models.Mapping
target.Udi = Udi.Create(Constants.UdiEntityType.Macro, source.Key);
}
+ private void Map(IMacro source, MacroDisplay target, MapperContext context)
+ {
+ target.Alias = source.Alias;
+ target.Icon = Constants.Icons.Macro;
+ target.Id = source.Id;
+ target.Key = source.Key;
+ target.Name = source.Name;
+ target.ParentId = -1;
+ target.Path = "-1," + source.Id;
+ target.Udi = Udi.Create(Constants.UdiEntityType.Macro, source.Key);
+ target.CacheByPage = source.CacheByPage;
+ target.CacheByUser = source.CacheByMember;
+ target.CachePeriod = source.CacheDuration;
+ target.UseInEditor = source.UseInEditor;
+ target.RenderInEditor = !source.DontRender;
+ target.View = source.MacroSource;
+ }
// Umbraco.Code.MapAll -Value
private void Map(IMacroProperty source, MacroParameter target, MapperContext context)
{