Move features

- Introduced IUmbracoFeature
Move Install
Move Tree Items
 - Introduced IMenuItemCollectionFactory - to insure injection of ActionCollection
This commit is contained in:
Bjarke Berg
2020-02-17 14:58:34 +01:00
parent 7a6ded2f6e
commit 43b33f9e6b
74 changed files with 492 additions and 198 deletions
@@ -6,5 +6,7 @@ namespace Umbraco.Core.Configuration
{
get;
}
void RemoveConnectionString(string umbracoConnectionName);
}
}
@@ -1,5 +1,4 @@
using Umbraco.Core.Collections;
using Umbraco.Web.WebApi;
namespace Umbraco.Web.Features
{
@@ -13,19 +12,19 @@ namespace Umbraco.Web.Features
/// </summary>
public DisabledFeatures()
{
Controllers = new TypeList<UmbracoApiControllerBase>();
Controllers = new TypeList<IUmbracoFeature>();
}
/// <summary>
/// Gets the disabled controllers.
/// </summary>
public TypeList<UmbracoApiControllerBase> Controllers { get; }
public TypeList<IUmbracoFeature> Controllers { get; }
/// <summary>
/// Disables the device preview feature of previewing.
/// </summary>
public bool DisableDevicePreview { get; set; }
/// <summary>
/// If true, all references to templates will be removed in the back office and routing
/// </summary>
@@ -0,0 +1,7 @@
namespace Umbraco.Web.Features
{
public interface IUmbracoFeature
{
}
}
@@ -1,5 +1,4 @@
using System;
using Umbraco.Web.WebApi;
namespace Umbraco.Web.Features
{
@@ -16,7 +15,7 @@ namespace Umbraco.Web.Features
Disabled = new DisabledFeatures();
Enabled = new EnabledFeatures();
}
/// <summary>
/// Gets the disabled features.
/// </summary>
@@ -32,7 +31,7 @@ namespace Umbraco.Web.Features
/// </summary>
internal bool IsControllerEnabled(Type feature)
{
if (typeof(UmbracoApiControllerBase).IsAssignableFrom(feature))
if (typeof(IUmbracoFeature).IsAssignableFrom(feature))
return Disabled.Controllers.Contains(feature) == false;
throw new NotSupportedException("Not a supported feature type.");
@@ -2,10 +2,10 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Collections;
using Umbraco.Web.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.Serialization;
using Umbraco.Web.Install.Models;
namespace Umbraco.Web.Install
@@ -13,29 +13,37 @@ namespace Umbraco.Web.Install
/// <summary>
/// An internal in-memory status tracker for the current installation
/// </summary>
internal static class InstallStatusTracker
public class InstallStatusTracker
{
private readonly IIOHelper _ioHelper;
private readonly IJsonSerializer _jsonSerializer;
public InstallStatusTracker(IIOHelper ioHelper, IJsonSerializer jsonSerializer)
{
_ioHelper = ioHelper;
_jsonSerializer = jsonSerializer;
}
private static ConcurrentHashSet<InstallTrackingItem> _steps = new ConcurrentHashSet<InstallTrackingItem>();
private static string GetFile(Guid installId)
private string GetFile(Guid installId)
{
var file = Current.IOHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/"
+ "install_"
+ installId.ToString("N")
+ ".txt");
var file = _ioHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/"
+ "install_"
+ installId.ToString("N")
+ ".txt");
return file;
}
public static void Reset()
public void Reset()
{
_steps = new ConcurrentHashSet<InstallTrackingItem>();
ClearFiles();
}
public static void ClearFiles()
public void ClearFiles()
{
var dir = Current.IOHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/");
var dir = _ioHelper.MapPath(Constants.SystemDirectories.TempData.EnsureEndsWith('/') + "Install/");
if (Directory.Exists(dir))
{
var files = Directory.GetFiles(dir);
@@ -50,13 +58,13 @@ namespace Umbraco.Web.Install
}
}
public static IEnumerable<InstallTrackingItem> InitializeFromFile(Guid installId)
public IEnumerable<InstallTrackingItem> InitializeFromFile(Guid installId)
{
//check if we have our persisted file and read it
var file = GetFile(installId);
if (File.Exists(file))
{
var deserialized = JsonConvert.DeserializeObject<IEnumerable<InstallTrackingItem>>(
var deserialized = _jsonSerializer.Deserialize<IEnumerable<InstallTrackingItem>>(
File.ReadAllText(file));
foreach (var item in deserialized)
{
@@ -70,7 +78,7 @@ namespace Umbraco.Web.Install
return new List<InstallTrackingItem>(_steps);
}
public static IEnumerable<InstallTrackingItem> Initialize(Guid installId, IEnumerable<InstallSetupStep> steps)
public IEnumerable<InstallTrackingItem> Initialize(Guid installId, IEnumerable<InstallSetupStep> steps)
{
//if there are no steps in memory
if (_steps.Count == 0)
@@ -79,7 +87,7 @@ namespace Umbraco.Web.Install
var file = GetFile(installId);
if (File.Exists(file))
{
var deserialized = JsonConvert.DeserializeObject<IEnumerable<InstallTrackingItem>>(
var deserialized = _jsonSerializer.Deserialize<IEnumerable<InstallTrackingItem>>(
File.ReadAllText(file));
foreach (var item in deserialized)
{
@@ -96,7 +104,7 @@ namespace Umbraco.Web.Install
_steps.Add(new InstallTrackingItem(step.Name, step.ServerOrder));
}
//save the file
var serialized = JsonConvert.SerializeObject(new List<InstallTrackingItem>(_steps));
var serialized = _jsonSerializer.Serialize(new List<InstallTrackingItem>(_steps));
Directory.CreateDirectory(Path.GetDirectoryName(file));
File.WriteAllText(file, serialized);
}
@@ -110,7 +118,7 @@ namespace Umbraco.Web.Install
ClearFiles();
//save the correct file
var serialized = JsonConvert.SerializeObject(new List<InstallTrackingItem>(_steps));
var serialized = _jsonSerializer.Serialize(new List<InstallTrackingItem>(_steps));
Directory.CreateDirectory(Path.GetDirectoryName(file));
File.WriteAllText(file, serialized);
}
@@ -119,7 +127,7 @@ namespace Umbraco.Web.Install
return new List<InstallTrackingItem>(_steps);
}
public static void SetComplete(Guid installId, string name, IDictionary<string, object> additionalData = null)
public void SetComplete(Guid installId, string name, IDictionary<string, object> additionalData = null)
{
var trackingItem = _steps.Single(x => x.Name == name);
if (additionalData != null)
@@ -130,7 +138,7 @@ namespace Umbraco.Web.Install
//save the file
var file = GetFile(installId);
var serialized = JsonConvert.SerializeObject(new List<InstallTrackingItem>(_steps));
var serialized = _jsonSerializer.Serialize(new List<InstallTrackingItem>(_steps));
File.WriteAllText(file, serialized);
}
@@ -4,7 +4,6 @@ using System.IO;
using System.Threading.Tasks;
using Umbraco.Core;
using Umbraco.Core.Install;
using Umbraco.Core.IO;
using Umbraco.Web.Install.Models;
namespace Umbraco.Web.Install.InstallSteps
@@ -1,6 +1,6 @@
using System;
using System.Threading.Tasks;
using Umbraco.Web.Composing;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Web.Install.Models;
@@ -14,10 +14,12 @@ namespace Umbraco.Web.Install.InstallSteps
{
public override bool RequiresExecution(object model) => true;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IRuntimeState _runtimeState;
public UpgradeStep(IUmbracoVersion umbracoVersion)
public UpgradeStep(IUmbracoVersion umbracoVersion, IRuntimeState runtimeState)
{
_umbracoVersion = umbracoVersion;
_runtimeState = runtimeState;
}
public override Task<InstallSetupResult> ExecuteAsync(object model) => Task.FromResult<InstallSetupResult>(null);
@@ -43,9 +45,9 @@ namespace Umbraco.Web.Install.InstallSteps
return value;
}
var state = Current.RuntimeState; // TODO: inject
var currentState = FormatGuidState(state.CurrentMigrationState);
var newState = FormatGuidState(state.FinalMigrationState);
var currentState = FormatGuidState(_runtimeState.CurrentMigrationState);
var newState = FormatGuidState(_runtimeState.FinalMigrationState);
var reportUrl = $"https://our.umbraco.com/contribute/releases/compare?from={currentVersion}&to={newVersion}&notes=1";
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json.Linq;
namespace Umbraco.Web.Install.Models
{
@@ -9,7 +8,7 @@ namespace Umbraco.Web.Install.Models
public class InstallInstructions
{
[DataMember(Name = "instructions")]
public IDictionary<string, JToken> Instructions { get; set; }
public IDictionary<string, object> Instructions { get; set; }
[DataMember(Name = "installId")]
public Guid InstallId { get; set; }
@@ -3,7 +3,7 @@ using System.Runtime.Serialization;
namespace Umbraco.Web.Install.Models
{
internal class InstallTrackingItem
public class InstallTrackingItem
{
public InstallTrackingItem(string name, int serverOrder)
{
@@ -0,0 +1,9 @@
using Umbraco.Web.Models.Trees;
namespace Umbraco.Web.Trees
{
public interface IMenuItemCollectionFactory
{
MenuItemCollection Create();
}
}
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
using Umbraco.Web.Actions;
namespace Umbraco.Web.Models.Trees
{
@@ -9,17 +10,16 @@ namespace Umbraco.Web.Models.Trees
[DataContract(Name = "menuItems", Namespace = "")]
public class MenuItemCollection
{
public static MenuItemCollection Empty => new MenuItemCollection();
private readonly MenuItemList _menuItems;
private readonly MenuItemList _menuItems = new MenuItemList();
public MenuItemCollection()
public MenuItemCollection(ActionCollection actionCollection)
{
_menuItems = new MenuItemList(actionCollection);
}
public MenuItemCollection(IEnumerable<MenuItem> items)
public MenuItemCollection(ActionCollection actionCollection, IEnumerable<MenuItem> items)
{
_menuItems = new MenuItemList(items);
_menuItems = new MenuItemList(actionCollection, items);
}
/// <summary>
@@ -0,0 +1,21 @@
using Umbraco.Web.Actions;
using Umbraco.Web.Models.Trees;
namespace Umbraco.Web.Trees
{
public class MenuItemCollectionFactory: IMenuItemCollectionFactory
{
private readonly ActionCollection _actionCollection;
public MenuItemCollectionFactory(ActionCollection actionCollection)
{
_actionCollection = actionCollection;
}
public MenuItemCollection Create()
{
return new MenuItemCollection(_actionCollection);
}
}
}
@@ -1,7 +1,6 @@
using System.Collections.Generic;
using Umbraco.Core.Services;
using Umbraco.Web.Actions;
using Umbraco.Web.Composing;
namespace Umbraco.Web.Models.Trees
{
@@ -13,13 +12,17 @@ namespace Umbraco.Web.Models.Trees
/// </remarks>
public class MenuItemList : List<MenuItem>
{
public MenuItemList()
private readonly ActionCollection _actionCollection;
public MenuItemList(ActionCollection actionCollection)
{
_actionCollection = actionCollection;
}
public MenuItemList( IEnumerable<MenuItem> items)
public MenuItemList(ActionCollection actionCollection, IEnumerable<MenuItem> items)
: base(items)
{
_actionCollection = actionCollection;
}
/// <summary>
@@ -44,7 +47,7 @@ namespace Umbraco.Web.Models.Trees
private MenuItem CreateMenuItem<T>(ILocalizedTextService textService, bool hasSeparator = false, bool opensDialog = false)
where T : IAction
{
var item = Current.Actions.GetAction<T>();
var item = _actionCollection.GetAction<T>();
if (item == null) return null;
var menuItem = new MenuItem(item, textService.Localize($"actions/{item.Alias}"))
+1 -6
View File
@@ -7,11 +7,6 @@ namespace Umbraco.Core.Configuration
{
public class ConfigsFactory : IConfigsFactory
{
public ConfigsFactory()
{
}
public IHostingSettings HostingSettings { get; } = new HostingSettings();
public ICoreDebug CoreDebug { get; } = new CoreDebug();
@@ -32,7 +27,7 @@ namespace Umbraco.Core.Configuration
configs.AddPasswordConfigurations();
configs.Add(() => CoreDebug);
configs.Add<IConnectionStrings>(() => new ConnectionStrings());
configs.Add<IConnectionStrings>(() => new ConnectionStrings(ioHelper));
configs.AddCoreConfigs(ioHelper);
return configs;
}
@@ -8,6 +8,13 @@ namespace Umbraco.Core.Configuration
{
public class ConnectionStrings : IConnectionStrings
{
private readonly IIOHelper _ioHelper;
public ConnectionStrings(IIOHelper ioHelper)
{
_ioHelper = ioHelper;
}
public ConfigConnectionString this[string key]
{
get
@@ -17,5 +24,22 @@ namespace Umbraco.Core.Configuration
return new ConfigConnectionString(settings.ConnectionString, settings.ProviderName, settings.Name);
}
}
public void RemoveConnectionString(string key)
{
var fileName = _ioHelper.MapPath(string.Format("{0}/web.config", _ioHelper.Root));
var xml = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);
var appSettings = xml.Root.DescendantsAndSelf("appSettings").Single();
var setting = appSettings.Descendants("add").FirstOrDefault(s => s.Attribute("key").Value == key);
if (setting != null)
{
setting.Remove();
xml.Save(fileName, SaveOptions.DisableFormatting);
ConfigurationManager.RefreshSection("appSettings");
}
var settings = ConfigurationManager.ConnectionStrings[key];
}
}
}
+1 -21
View File
@@ -254,27 +254,7 @@ namespace Umbraco.Core.Configuration
ConfigurationManager.RefreshSection("appSettings");
}
/// <summary>
/// Removes a setting from the configuration file.
/// </summary>
/// <param name="key">Key of the setting to be removed.</param>
public static void RemoveSetting(string key, IIOHelper ioHelper)
{
var fileName = ioHelper.MapPath(string.Format("{0}/web.config", ioHelper.Root));
var xml = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);
var appSettings = xml.Root.DescendantsAndSelf("appSettings").Single();
var setting = appSettings.Descendants("add").FirstOrDefault(s => s.Attribute("key").Value == key);
if (setting != null)
{
setting.Remove();
xml.Save(fileName, SaveOptions.DisableFormatting);
ConfigurationManager.RefreshSection("appSettings");
}
}
/// <summary>
/// Gets the time out in minutes.
/// </summary>
@@ -4,10 +4,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Events;
using Umbraco.Core.Logging;
using Umbraco.Core.Serialization;
namespace Umbraco.Web.Cache
{
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Cache;
using Umbraco.Core.Events;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
@@ -9,7 +8,6 @@ using Umbraco.Core.Models.Membership;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Changes;
using Umbraco.Core.Services.Implement;
using Umbraco.Web.Services;
namespace Umbraco.Web.Cache
{
@@ -11,7 +11,7 @@ namespace Umbraco.Web.Install.InstallSteps
[InstallSetupStep(InstallationType.NewInstall,
"DatabaseConfigure", "database", 10, "Setting up a database, so Umbraco has a place to store your website",
PerformsAppRestart = true)]
internal class DatabaseConfigureStep : InstallSetupStep<DatabaseModel>
public class DatabaseConfigureStep : InstallSetupStep<DatabaseModel>
{
private readonly DatabaseBuilder _databaseBuilder;
private readonly ILogger _logger;
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Threading.Tasks;
using Umbraco.Core;
using Umbraco.Core.Configuration;
@@ -13,19 +12,21 @@ namespace Umbraco.Web.Install.InstallSteps
{
[InstallSetupStep(InstallationType.NewInstall | InstallationType.Upgrade,
"DatabaseInstall", 11, "")]
internal class DatabaseInstallStep : InstallSetupStep<object>
public class DatabaseInstallStep : InstallSetupStep<object>
{
private readonly DatabaseBuilder _databaseBuilder;
private readonly IRuntimeState _runtime;
private readonly ILogger _logger;
private readonly IIOHelper _ioHelper;
private readonly IConnectionStrings _connectionStrings;
public DatabaseInstallStep(DatabaseBuilder databaseBuilder, IRuntimeState runtime, ILogger logger, IIOHelper ioHelper)
public DatabaseInstallStep(DatabaseBuilder databaseBuilder, IRuntimeState runtime, ILogger logger, IIOHelper ioHelper, IConnectionStrings connectionStrings)
{
_databaseBuilder = databaseBuilder;
_runtime = runtime;
_logger = logger;
_ioHelper = ioHelper;
_connectionStrings = connectionStrings;
}
public override Task<InstallSetupResult> ExecuteAsync(object model)
@@ -42,7 +43,7 @@ namespace Umbraco.Web.Install.InstallSteps
if (result.RequiresUpgrade == false)
{
HandleConnectionStrings(_logger, _ioHelper);
HandleConnectionStrings(_logger, _ioHelper, _connectionStrings);
return Task.FromResult<InstallSetupResult>(null);
}
@@ -53,12 +54,18 @@ namespace Umbraco.Web.Install.InstallSteps
}));
}
internal static void HandleConnectionStrings(ILogger logger, IIOHelper ioHelper)
internal static void HandleConnectionStrings(ILogger logger, IIOHelper ioHelper, IConnectionStrings connectionStrings)
{
var databaseSettings = connectionStrings[Constants.System.UmbracoConnectionName];
// Remove legacy umbracoDbDsn configuration setting if it exists and connectionstring also exists
if (ConfigurationManager.ConnectionStrings[Constants.System.UmbracoConnectionName] != null)
if (databaseSettings != null)
{
GlobalSettings.RemoveSetting(Constants.System.UmbracoConnectionName, ioHelper);
connectionStrings.RemoveConnectionString(Constants.System.UmbracoConnectionName);
}
else
{
@@ -7,7 +7,6 @@ using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Migrations.Install;
using Umbraco.Core.Migrations.Upgrade;
using Umbraco.Web.Composing;
using Umbraco.Web.Install.Models;
using Umbraco.Web.Migrations.PostMigrations;
@@ -15,7 +14,7 @@ namespace Umbraco.Web.Install.InstallSteps
{
[InstallSetupStep(InstallationType.Upgrade | InstallationType.NewInstall,
"DatabaseUpgrade", 12, "")]
internal class DatabaseUpgradeStep : InstallSetupStep<object>
public class DatabaseUpgradeStep : InstallSetupStep<object>
{
private readonly DatabaseBuilder _databaseBuilder;
private readonly IRuntimeState _runtime;
@@ -56,7 +55,7 @@ namespace Umbraco.Web.Install.InstallSteps
throw new InstallException("The database failed to upgrade. ERROR: " + result.Message);
}
DatabaseInstallStep.HandleConnectionStrings(_logger, _ioHelper);
DatabaseInstallStep.HandleConnectionStrings(_logger, _ioHelper, _connectionStrings);
}
return Task.FromResult<InstallSetupResult>(null);
@@ -23,6 +23,8 @@ using Umbraco.Core.Sync;
using Umbraco.Web.Models.PublishedContent;
using Umbraco.Web.PublishedCache;
using Umbraco.Web;
using Umbraco.Web.Install;
using Umbraco.Web.Trees;
using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidator;
namespace Umbraco.Core.Runtime
@@ -54,6 +56,8 @@ namespace Umbraco.Core.Runtime
composition.RegisterUnique<IScopeAccessor>(f => f.GetInstance<ScopeProvider>());
composition.RegisterUnique<IJsonSerializer, JsonNetSerializer>();
composition.RegisterUnique<IMenuItemCollectionFactory, MenuItemCollectionFactory>();
composition.RegisterUnique<InstallStatusTracker>();
// register database builder
// *not* a singleton, don't want to keep it around
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Umbraco.Composing;
using Umbraco.Core;
using Umbraco.Web.Composing;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Trees
@@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Trees
/// <param name="parentId">The parent id for the current node</param>
/// <param name="getChildNodesUrl"></param>
/// <param name="menuUrl"></param>
internal TreeNode(string nodeId, string parentId, string getChildNodesUrl, string menuUrl)
public TreeNode(string nodeId, string parentId, string getChildNodesUrl, string menuUrl)
{
if (nodeId == null) throw new ArgumentNullException(nameof(nodeId));
if (string.IsNullOrWhiteSpace(nodeId)) throw new ArgumentException("Value can't be empty or consist only of white-space characters.", nameof(nodeId));
@@ -55,7 +55,9 @@ using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
using Umbraco.Core.Services;
using Umbraco.Net;
using Umbraco.Web.Install;
using Umbraco.Web.Security;
using Umbraco.Web.Trees;
using Current = Umbraco.Web.Composing.Current;
namespace Umbraco.Tests.Testing
{
@@ -412,6 +414,8 @@ namespace Umbraco.Tests.Testing
Composition.RegisterUnique<IExamineManager, ExamineManager>();
Composition.RegisterUnique<IJsonSerializer, JsonNetSerializer>();
Composition.RegisterUnique<IMenuItemCollectionFactory, MenuItemCollectionFactory>();
Composition.RegisterUnique<InstallStatusTracker>();
// register filesystems
Composition.RegisterUnique(factory => TestObjects.GetFileSystemsMock());
+2
View File
@@ -27,6 +27,7 @@ using Umbraco.Web.Mvc;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
using Umbraco.Web.Services;
using Umbraco.Web.Trees;
using Umbraco.Web.WebApi;
namespace Umbraco.Web.Composing
@@ -260,6 +261,7 @@ namespace Umbraco.Web.Composing
public static IIpResolver IpResolver => Factory.GetInstance<IIpResolver>();
public static IUmbracoVersion UmbracoVersion => Factory.GetInstance<IUmbracoVersion>();
public static IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance<IPublishedUrlProvider>();
public static IMenuItemCollectionFactory MenuItemCollectionFactory => Factory.GetInstance<IMenuItemCollectionFactory>();
#endregion
}
@@ -20,13 +20,15 @@ namespace Umbraco.Web.Install.Controllers
private readonly DatabaseBuilder _databaseBuilder;
private readonly IProfilingLogger _proflog;
private readonly InstallStepCollection _installSteps;
private readonly InstallStatusTracker _installStatusTracker;
private readonly ILogger _logger;
public InstallApiController(DatabaseBuilder databaseBuilder, IProfilingLogger proflog, InstallHelper installHelper, InstallStepCollection installSteps)
public InstallApiController(DatabaseBuilder databaseBuilder, IProfilingLogger proflog, InstallHelper installHelper, InstallStepCollection installSteps, InstallStatusTracker installStatusTracker)
{
_databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder));
_proflog = proflog ?? throw new ArgumentNullException(nameof(proflog));
_installSteps = installSteps;
_installStatusTracker = installStatusTracker;
InstallHelper = installHelper;
_logger = _proflog;
}
@@ -56,7 +58,7 @@ namespace Umbraco.Web.Install.Controllers
steps.AddRange(installSteps);
setup.Steps = steps;
InstallStatusTracker.Initialize(setup.InstallId, installSteps);
_installStatusTracker.Initialize(setup.InstallId, installSteps);
return setup;
}
@@ -78,7 +80,7 @@ namespace Umbraco.Web.Install.Controllers
//there won't be any statuses returned if the app pool has restarted so we need to re-read from file.
if (status.Any() == false)
{
status = InstallStatusTracker.InitializeFromFile(installModel.InstallId).ToArray();
status = _installStatusTracker.InitializeFromFile(installModel.InstallId).ToArray();
}
//create a new queue of the non-finished ones
@@ -95,7 +97,7 @@ namespace Umbraco.Web.Install.Controllers
if (StepRequiresExecution(step, instruction) == false)
{
// set this as complete and continue
InstallStatusTracker.SetComplete(installModel.InstallId, item.Name);
_installStatusTracker.SetComplete(installModel.InstallId, item.Name);
continue;
}
@@ -104,7 +106,7 @@ namespace Umbraco.Web.Install.Controllers
var setupData = await ExecuteStepAsync(step, instruction);
// update the status
InstallStatusTracker.SetComplete(installModel.InstallId, step.Name, setupData?.SavedStepData);
_installStatusTracker.SetComplete(installModel.InstallId, step.Name, setupData?.SavedStepData);
// determine's the next step in the queue and dequeue's any items that don't need to execute
var nextStep = IterateSteps(step, queue, installModel.InstallId, installModel);
@@ -147,7 +149,7 @@ namespace Umbraco.Web.Install.Controllers
}
}
InstallStatusTracker.Reset();
_installStatusTracker.Reset();
return new InstallProgressResultModel(true, "", "");
}
@@ -175,7 +177,7 @@ namespace Umbraco.Web.Install.Controllers
var step = _installSteps.GetAllSteps().Single(x => x.Name == item.Name);
// if this step has any instructions then extract them
JToken instruction;
object instruction;
installModel.Instructions.TryGetValue(item.Name, out instruction); // else null
// if the step requires execution then return its name
@@ -187,7 +189,7 @@ namespace Umbraco.Web.Install.Controllers
queue.Dequeue();
// complete
InstallStatusTracker.SetComplete(installId, step.Name);
_installStatusTracker.SetComplete(installId, step.Name);
// and continue
current = step;
@@ -197,9 +199,9 @@ namespace Umbraco.Web.Install.Controllers
}
// determines whether the step requires execution
internal bool StepRequiresExecution(InstallSetupStep step, JToken instruction)
internal bool StepRequiresExecution(InstallSetupStep step, object instruction)
{
var model = instruction?.ToObject(step.StepType);
var model = Convert.ChangeType(instruction, step.StepType);
var genericStepType = typeof(InstallSetupStep<>);
Type[] typeArgs = { step.StepType };
var typedStepType = genericStepType.MakeGenericType(typeArgs);
@@ -216,11 +218,11 @@ namespace Umbraco.Web.Install.Controllers
}
// executes the step
internal async Task<InstallSetupResult> ExecuteStepAsync(InstallSetupStep step, JToken instruction)
internal async Task<InstallSetupResult> ExecuteStepAsync(InstallSetupStep step, object instruction)
{
using (_proflog.TraceDuration<InstallApiController>($"Executing installation step: '{step.Name}'.", "Step completed"))
{
var model = instruction?.ToObject(step.StepType);
var model = Convert.ChangeType(instruction, step.StepType);
var genericStepType = typeof(InstallSetupStep<>);
Type[] typeArgs = { step.StepType };
var typedStepType = genericStepType.MakeGenericType(typeArgs);
@@ -7,7 +7,7 @@ using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Install;
using Umbraco.Core.IO;
using Umbraco.Web.Composing;
using Umbraco.Web.PublishedCache;
namespace Umbraco.Web.Install
{
@@ -21,11 +21,13 @@ namespace Umbraco.Web.Install
private readonly string[] _permissionFiles = { };
private readonly IGlobalSettings _globalSettings;
private readonly IIOHelper _ioHelper;
private readonly IPublishedSnapshotService _publishedSnapshotService;
public FilePermissionHelper(IGlobalSettings globalSettings, IIOHelper ioHelper)
public FilePermissionHelper(IGlobalSettings globalSettings, IIOHelper ioHelper, IPublishedSnapshotService publishedSnapshotService)
{
_globalSettings = globalSettings;
_ioHelper = ioHelper;
_publishedSnapshotService = publishedSnapshotService;
_permissionDirs = new[] { _globalSettings.UmbracoCssPath, Constants.SystemDirectories.Config, Constants.SystemDirectories.Data, _globalSettings.UmbracoMediaPath, Constants.SystemDirectories.Preview };
_packagesPermissionsDirs = new[] { Constants.SystemDirectories.Bin, _globalSettings.UmbracoPath, Constants.SystemDirectories.Packages };
}
@@ -48,7 +50,7 @@ namespace Umbraco.Web.Install
if (TestPublishedSnapshotService(out errors) == false)
report["Published snapshot environment check failed"] = errors.ToList();
if (EnsureCanCreateSubDirectory(Current.Configs.Global().UmbracoMediaPath, out errors) == false)
if (EnsureCanCreateSubDirectory(_globalSettings.UmbracoMediaPath, out errors) == false)
report["Media folder creation failed"] = errors.ToList();
}
@@ -129,8 +131,7 @@ namespace Umbraco.Web.Install
public bool TestPublishedSnapshotService(out IEnumerable<string> errors)
{
var publishedSnapshotService = Current.PublishedSnapshotService;
return publishedSnapshotService.EnsureEnvironment(out errors);
return _publishedSnapshotService.EnsureEnvironment(out errors);
}
// tries to create a sub-directory
+9 -7
View File
@@ -18,7 +18,7 @@ namespace Umbraco.Web.Install
{
private static HttpClient _httpClient;
private readonly DatabaseBuilder _databaseBuilder;
private readonly HttpContextBase _httpContext;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ILogger _logger;
private readonly IGlobalSettings _globalSettings;
private readonly IUmbracoVersion _umbracoVersion;
@@ -29,7 +29,7 @@ namespace Umbraco.Web.Install
DatabaseBuilder databaseBuilder,
ILogger logger, IGlobalSettings globalSettings, IUmbracoVersion umbracoVersion, IConnectionStrings connectionStrings)
{
_httpContext = httpContextAccessor.HttpContext;
_httpContextAccessor = httpContextAccessor;
_logger = logger;
_globalSettings = globalSettings;
_umbracoVersion = umbracoVersion;
@@ -42,16 +42,18 @@ namespace Umbraco.Web.Install
return _installationType ?? (_installationType = IsBrandNewInstall ? InstallationType.NewInstall : InstallationType.Upgrade).Value;
}
internal void InstallStatus(bool isCompleted, string errorMsg)
public void InstallStatus(bool isCompleted, string errorMsg)
{
var httpContext = _httpContextAccessor.HttpContext;
try
{
var userAgent = _httpContext.Request.UserAgent;
var userAgent = httpContext.Request.UserAgent;
// Check for current install Id
var installId = Guid.NewGuid();
var installCookie = _httpContext.Request.GetCookieValue(Constants.Web.InstallerCookieName);
var installCookie = httpContext.Request.GetCookieValue(Constants.Web.InstallerCookieName);
if (string.IsNullOrEmpty(installCookie) == false)
{
if (Guid.TryParse(installCookie, out installId))
@@ -61,7 +63,7 @@ namespace Umbraco.Web.Install
installId = Guid.NewGuid();
}
}
_httpContext.Response.Cookies.Set(new HttpCookie(Constants.Web.InstallerCookieName, "1"));
httpContext.Response.Cookies.Set(new HttpCookie(Constants.Web.InstallerCookieName, "1"));
var dbProvider = string.Empty;
if (IsBrandNewInstall == false)
@@ -134,7 +136,7 @@ namespace Umbraco.Web.Install
}
}
internal IEnumerable<Package> GetStarterKits()
public IEnumerable<Package> GetStarterKits()
{
if (_httpClient == null)
_httpClient = new HttpClient();
@@ -1,6 +1,6 @@
using System;
using System.Threading;
using Umbraco.Core.Security;
namespace Umbraco.Web.Security
{
@@ -1,11 +1,18 @@
using System.Linq;
using System.Net.Http.Formatting;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Actions;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Mvc;
using Umbraco.Web.Routing;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
@@ -23,6 +30,24 @@ namespace Umbraco.Web.Trees
[CoreTree]
public class ContentBlueprintTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public ContentBlueprintTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
{
@@ -89,7 +114,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -42,6 +42,7 @@ namespace Umbraco.Web.Trees
private readonly UmbracoTreeSearcher _treeSearcher;
private readonly ActionCollection _actions;
private readonly IGlobalSettings _globalSettings;
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
protected override int RecycleBinId => Constants.System.RecycleBinContent;
@@ -64,12 +65,14 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider, menuItemCollectionFactory)
{
_treeSearcher = treeSearcher;
_actions = actions;
_globalSettings = globalSettings;
_menuItemCollectionFactory = menuItemCollectionFactory;
}
/// <inheritdoc />
@@ -133,7 +136,7 @@ namespace Umbraco.Web.Trees
{
if (id == Constants.System.RootString)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
// if the user's start node is not the root then the only menu item to display is refresh
if (UserStartNodes.Contains(Constants.System.Root) == false)
@@ -184,7 +187,7 @@ namespace Umbraco.Web.Trees
//if the user has no path access for this node, all they can do is refresh
if (!Security.CurrentUser.HasContentPathAccess(item, Services.EntityService))
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
menu.Items.Add(new RefreshNode(Services.TextService, true));
return menu;
}
@@ -246,7 +249,7 @@ namespace Umbraco.Web.Trees
/// <returns></returns>
protected MenuItemCollection GetAllNodeMenuItems(IUmbracoEntity item)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
AddActionNode<ActionNew>(item, menu, opensDialog: true);
AddActionNode<ActionDelete>(item, menu, opensDialog: true);
AddActionNode<ActionCreateBlueprintFromContent>(item, menu, opensDialog: true);
@@ -282,7 +285,7 @@ namespace Umbraco.Web.Trees
/// <returns></returns>
protected MenuItemCollection GetNodeMenuItemsForDeletedContent(IUmbracoEntity item)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
menu.Items.Add<ActionRestore>(Services.TextService, opensDialog: true);
menu.Items.Add<ActionMove>(Services.TextService, opensDialog: true);
menu.Items.Add<ActionDelete>(Services.TextService, opensDialog: true);
@@ -28,6 +28,8 @@ namespace Umbraco.Web.Trees
{
public abstract class ContentTreeControllerBase : TreeController
{
public IMenuItemCollectionFactory MenuItemCollectionFactory { get; }
protected ContentTreeControllerBase(
IGlobalSettings globalSettings,
@@ -39,9 +41,11 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
MenuItemCollectionFactory = menuItemCollectionFactory;
}
protected ContentTreeControllerBase()
@@ -430,7 +434,7 @@ namespace Umbraco.Web.Trees
deleteAllowed = perms.FirstOrDefault(x => x.Contains(deleteAction.Letter)) != null;
}
var menu = new MenuItemCollection();
var menu = MenuItemCollectionFactory.Create();
// only add empty recycle bin if the current user is allowed to delete by default
if (deleteAllowed)
{
@@ -27,6 +27,7 @@ namespace Umbraco.Web.Trees
public class ContentTypeTreeController : TreeController, ISearchableTree
{
private readonly UmbracoTreeSearcher _treeSearcher;
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public ContentTypeTreeController(
UmbracoTreeSearcher treeSearcher,
@@ -39,10 +40,12 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_treeSearcher = treeSearcher;
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
@@ -103,7 +106,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -29,6 +29,7 @@ namespace Umbraco.Web.Trees
public class DataTypeTreeController : TreeController, ISearchableTree
{
private readonly UmbracoTreeSearcher _treeSearcher;
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public DataTypeTreeController(
UmbracoTreeSearcher treeSearcher,
@@ -41,10 +42,12 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_treeSearcher = treeSearcher;
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
@@ -128,7 +131,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -2,9 +2,16 @@
using System.Linq;
using System.Net.Http.Formatting;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Actions;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Routing;
using Umbraco.Web.WebApi.Filters;
namespace Umbraco.Web.Trees
@@ -21,6 +28,25 @@ namespace Umbraco.Web.Trees
[Tree(Constants.Applications.Translation, Constants.Trees.Dictionary, TreeGroup = Constants.Trees.Groups.Settings)]
public class DictionaryTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public DictionaryTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
{
var root = base.CreateRootNode(queryStrings);
@@ -100,7 +126,7 @@ namespace Umbraco.Web.Trees
/// <returns></returns>
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
menu.Items.Add<ActionNew>(Services.TextService, opensDialog: true);
@@ -4,14 +4,46 @@ using System.Linq;
using System.Net.Http.Formatting;
using System.Web;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Actions;
using Umbraco.Web.Composing;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Routing;
namespace Umbraco.Web.Trees
{
public abstract class FileSystemTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
protected FileSystemTreeController()
{
_menuItemCollectionFactory = Current.MenuItemCollectionFactory;
}
protected FileSystemTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected abstract IFileSystem FileSystem { get; }
protected abstract string[] Extensions { get; }
protected abstract string FileIcon { get; }
@@ -88,7 +120,7 @@ namespace Umbraco.Web.Trees
protected virtual MenuItemCollection GetMenuForRootNode(FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
//set the default to create
menu.DefaultMenuAlias = ActionNew.ActionAlias;
@@ -102,7 +134,7 @@ namespace Umbraco.Web.Trees
protected virtual MenuItemCollection GetMenuForFolder(string path, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
//set the default to create
menu.DefaultMenuAlias = ActionNew.ActionAlias;
@@ -126,7 +158,7 @@ namespace Umbraco.Web.Trees
protected virtual MenuItemCollection GetMenuForFile(string path, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
//if it's not a directory then we only allow to delete the item
menu.Items.Add<ActionDelete>(Services.TextService, opensDialog: true);
@@ -142,7 +174,7 @@ namespace Umbraco.Web.Trees
return GetMenuForRootNode(queryStrings);
}
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
var path = string.IsNullOrEmpty(id) == false && id != Constants.System.RootString
? HttpUtility.UrlDecode(id).TrimStart("/")
+28 -2
View File
@@ -1,10 +1,17 @@
using System.Linq;
using System.Net.Http.Formatting;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi.Filters;
using Umbraco.Web.Actions;
using Umbraco.Web.Routing;
using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Trees
@@ -15,6 +22,25 @@ namespace Umbraco.Web.Trees
[CoreTree]
public class MacrosTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public MacrosTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
{
var root = base.CreateRootNode(queryStrings);
@@ -46,7 +72,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -60,7 +86,7 @@ namespace Umbraco.Web.Trees
}
var macro = Services.MacroService.GetById(int.Parse(id));
if (macro == null) return new MenuItemCollection();
if (macro == null) return menu;
//add delete option for all macros
menu.Items.Add<ActionDelete>(Services.TextService, opensDialog: true);
+4 -3
View File
@@ -52,8 +52,9 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider, menuItemCollectionFactory)
{
_treeSearcher = treeSearcher;
}
@@ -99,7 +100,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection PerformGetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = MenuItemCollectionFactory.Create();
//set the default
menu.DefaultMenuAlias = ActionNew.ActionAlias;
@@ -27,6 +27,7 @@ namespace Umbraco.Web.Trees
public class MediaTypeTreeController : TreeController, ISearchableTree
{
private readonly UmbracoTreeSearcher _treeSearcher;
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public MediaTypeTreeController(
UmbracoTreeSearcher treeSearcher,
@@ -39,10 +40,12 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_treeSearcher = treeSearcher;
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
@@ -87,7 +90,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
+28 -5
View File
@@ -7,7 +7,12 @@ using System.Net.Http.Formatting;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Core.Security;
using Umbraco.Web.Actions;
@@ -15,6 +20,7 @@ using Umbraco.Web.Models.Trees;
using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi.Filters;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.Routing;
using Umbraco.Web.Search;
using Constants = Umbraco.Core.Constants;
using Umbraco.Web.Security;
@@ -33,12 +39,29 @@ namespace Umbraco.Web.Trees
[SearchableTree("searchResultFormatter", "configureMemberResult")]
public class MemberTreeController : TreeController, ISearchableTree
{
public MemberTreeController(UmbracoTreeSearcher treeSearcher)
{
_treeSearcher = treeSearcher;
}
private readonly UmbracoTreeSearcher _treeSearcher;
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public MemberTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
UmbracoTreeSearcher treeSearcher,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_treeSearcher = treeSearcher;
_menuItemCollectionFactory = menuItemCollectionFactory;
}
/// <summary>
/// Gets an individual tree node
@@ -111,7 +134,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -1,8 +1,16 @@
using System.Collections.Generic;
using System.Net.Http.Formatting;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Actions;
using Umbraco.Web.Composing;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Routing;
namespace Umbraco.Web.Trees
{
@@ -10,6 +18,30 @@ namespace Umbraco.Web.Trees
[CoreTree]
public abstract class MemberTypeAndGroupTreeControllerBase : TreeController
{
public IMenuItemCollectionFactory MenuItemCollectionFactory { get; }
protected MemberTypeAndGroupTreeControllerBase()
{
MenuItemCollectionFactory = Current.MenuItemCollectionFactory;
}
protected MemberTypeAndGroupTreeControllerBase(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
MenuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
{
var nodes = new TreeNodeCollection();
@@ -19,7 +51,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = MenuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -1,7 +1,14 @@
using System.Net.Http.Formatting;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Mvc;
using Umbraco.Web.Routing;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
@@ -13,6 +20,25 @@ namespace Umbraco.Web.Trees
[CoreTree]
public class PackagesTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public PackagesTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
/// <summary>
/// Helper method to create a root model for a tree
/// </summary>
@@ -39,7 +65,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
//doesn't have a menu, this is a full screen app without tree nodes
return MenuItemCollection.Empty;
return _menuItemCollectionFactory.Create();
}
}
}
@@ -1,6 +1,5 @@
using Umbraco.Core.IO;
using Umbraco.Web.Composing;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
@@ -3,8 +3,14 @@ using System.Net.Http.Formatting;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.WebApi.Filters;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Actions;
using Umbraco.Web.Routing;
namespace Umbraco.Web.Trees
{
@@ -14,11 +20,30 @@ namespace Umbraco.Web.Trees
[CoreTree]
public class RelationTypeTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public RelationTypeTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
//TODO: Do not allow deleting built in types
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
if (id == Constants.System.RootString)
{
@@ -32,7 +57,7 @@ namespace Umbraco.Web.Trees
}
var relationType = Services.RelationService.GetRelationTypeById(int.Parse(id));
if (relationType == null) return new MenuItemCollection();
if (relationType == null) return menu;
menu.Items.Add<ActionDelete>(Services.TextService);
@@ -29,6 +29,7 @@ namespace Umbraco.Web.Trees
public class TemplatesTreeController : TreeController, ISearchableTree
{
private readonly UmbracoTreeSearcher _treeSearcher;
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public TemplatesTreeController(
UmbracoTreeSearcher treeSearcher,
@@ -41,10 +42,12 @@ namespace Umbraco.Web.Trees
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider)
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_treeSearcher = treeSearcher;
_menuItemCollectionFactory = menuItemCollectionFactory;
}
protected override TreeNode CreateRootNode(FormDataCollection queryStrings)
@@ -97,7 +100,7 @@ namespace Umbraco.Web.Trees
/// <returns></returns>
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
var menu = new MenuItemCollection();
var menu = _menuItemCollectionFactory.Create();
//Create the normal create action
var item = menu.Items.Add<ActionNew>(Services.TextService, opensDialog: true);
@@ -112,7 +115,7 @@ namespace Umbraco.Web.Trees
}
var template = Services.FileService.GetTemplate(int.Parse(id));
if (template == null) return new MenuItemCollection();
if (template == null) return menu;
var entity = FromTemplate(template);
//don't allow delete if it has child layouts
+27 -1
View File
@@ -1,7 +1,14 @@
using System.Net.Http.Formatting;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.Mvc;
using Umbraco.Web.Routing;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
@@ -13,6 +20,25 @@ namespace Umbraco.Web.Trees
[CoreTree]
public class UserTreeController : TreeController
{
private readonly IMenuItemCollectionFactory _menuItemCollectionFactory;
public UserTreeController(
IGlobalSettings globalSettings,
IUmbracoContextAccessor umbracoContextAccessor,
ISqlContext sqlContext,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger logger,
IRuntimeState runtimeState,
UmbracoHelper umbracoHelper,
UmbracoMapper umbracoMapper,
IPublishedUrlProvider publishedUrlProvider,
IMenuItemCollectionFactory menuItemCollectionFactory)
: base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper, publishedUrlProvider)
{
_menuItemCollectionFactory = menuItemCollectionFactory;
}
/// <summary>
/// Helper method to create a root model for a tree
/// </summary>
@@ -38,7 +64,7 @@ namespace Umbraco.Web.Trees
protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
{
//doesn't have a menu, this is a full screen app without tree nodes
return MenuItemCollection.Empty;
return _menuItemCollectionFactory.Create();
}
}
}
+11 -44
View File
@@ -134,17 +134,16 @@
</Compile>
<Compile Include="AppBuilderExtensions.cs" />
<Compile Include="AreaRegistrationContextExtensions.cs" />
<Compile Include="Cache\DistributedCacheBinder.cs" />
<Compile Include="Cache\DistributedCacheBinderComposer.cs" />
<Compile Include="Cache\DistributedCacheBinder_Handlers.cs" />
<Compile Include="AspNet\AspNetHostingEnvironment.cs" />
<Compile Include="AspNet\FrameworkMarchal.cs" />
<Compile Include="Cache\WebCachingAppCache.cs" />
<Compile Include="Compose\AuditEventsComponent.cs" />
<Compile Include="Compose\AuditEventsComposer.cs" />
<Compile Include="Compose\BackOfficeUserAuditEventsComponent.cs" />
<Compile Include="Compose\BackOfficeUserAuditEventsComposer.cs" />
<Compile Include="Composing\BuildManagerTypeFinder.cs" />
<Compile Include="Composing\CompositionExtensions\Installer.cs" />
<Compile Include="Composing\LightInject\LightInjectContainer.cs" />
<Compile Include="Compose\BackOfficeUserAuditEventsComponent.cs" />
<Compile Include="Editors\BackOfficePreviewModel.cs" />
<Compile Include="Editors\Filters\ContentSaveModelValidator.cs" />
<Compile Include="Editors\Filters\MediaSaveModelValidator.cs" />
@@ -154,12 +153,11 @@
<Compile Include="Editors\MacrosController.cs" />
<Compile Include="Editors\RelationTypeController.cs" />
<Compile Include="Editors\TinyMceController.cs" />
<Compile Include="FrameworkMarchal.cs" />
<Compile Include="Hosting\AspNetHostingEnvironment.cs" />
<Compile Include="HttpContextExtensions.cs" />
<Compile Include="ImageCropperTemplateCoreExtensions.cs" />
<Compile Include="IUmbracoContextFactory.cs" />
<Compile Include="Install\ChangesMonitor.cs" />
<Compile Include="Install\InstallSteps\StarterKitDownloadStep.cs" />
<Compile Include="Install\InstallSteps\StarterKitInstallStep.cs" />
<Compile Include="Logging\OwinLogger.cs" />
<Compile Include="Logging\OwinLoggerFactory.cs" />
<Compile Include="Logging\WebProfiler.cs" />
@@ -178,22 +176,17 @@
<Compile Include="Models\Mapping\MediaMapDefinition.cs" />
<Compile Include="Models\Mapping\MemberMapDefinition.cs" />
<Compile Include="Models\Membership\UmbracoMembershipMember.cs" />
<Compile Include="Models\Trees\MenuItemCollection.cs" />
<Compile Include="Models\Trees\MenuItemList.cs" />
<Compile Include="Models\Trees\TreeNodeCollection.cs" />
<Compile Include="Models\Trees\TreeNodeExtensions.cs" />
<Compile Include="Models\Trees\TreeRootNode.cs" />
<Compile Include="Mvc\HttpUmbracoFormRouteStringException.cs" />
<Compile Include="Mvc\ModelBindingExceptionFilter.cs" />
<Compile Include="Mvc\StatusCodeFilterAttribute.cs" />
<Compile Include="Mvc\SurfaceControllerTypeCollectionBuilder.cs" />
<Compile Include="Mvc\ValidateUmbracoFormRouteStringAttribute.cs" />
<Compile Include="Net\AspNetBackOfficeInfo.cs" />
<Compile Include="Net\AspNetCookieManager.cs" />
<Compile Include="Net\AspNetHttpContextAccessor.cs" />
<Compile Include="Net\AspNetIpResolver.cs" />
<Compile Include="Net\AspNetPasswordHasher.cs" />
<Compile Include="Net\AspNetSessionIdResolver.cs" />
<Compile Include="AspNet\AspNetBackOfficeInfo.cs" />
<Compile Include="AspNet\AspNetCookieManager.cs" />
<Compile Include="AspNet\AspNetHttpContextAccessor.cs" />
<Compile Include="AspNet\AspNetIpResolver.cs" />
<Compile Include="AspNet\AspNetPasswordHasher.cs" />
<Compile Include="AspNet\AspNetSessionIdResolver.cs" />
<Compile Include="Profiling\WebProfilingController.cs" />
<Compile Include="PropertyEditors\GridPropertyEditor.cs" />
<Compile Include="PropertyEditors\RichTextEditorPastedImages.cs" />
@@ -222,7 +215,6 @@
<Compile Include="Search\UmbracoTreeSearcherFields.cs" />
<Compile Include="StringExtensions.cs" />
<Compile Include="Trees\TreeCollectionBuilder.cs" />
<Compile Include="Trees\TreeNode.cs" />
<Compile Include="UmbracoContext.cs" />
<Compile Include="UmbracoContextFactory.cs" />
<Compile Include="Mvc\UmbracoVirtualNodeByUdiRouteHandler.cs" />
@@ -290,9 +282,6 @@
<Compile Include="Editors\UserGroupsController.cs" />
<Compile Include="Editors\Filters\UserGroupValidateAttribute.cs" />
<Compile Include="Editors\UsersController.cs" />
<Compile Include="Features\DisabledFeatures.cs" />
<Compile Include="Features\EnabledFeatures.cs" />
<Compile Include="Features\UmbracoFeatures.cs" />
<Compile Include="HybridUmbracoContextAccessor.cs" />
<Compile Include="HttpContextUmbracoContextAccessor.cs" />
<Compile Include="IHttpContextAccessor.cs" />
@@ -399,30 +388,8 @@
<Compile Include="Editors\RelationController.cs" />
<Compile Include="GridTemplateExtensions.cs" />
<Compile Include="Editors\TemplateQueryController.cs" />
<Compile Include="Install\InstallException.cs" />
<Compile Include="Install\InstallStatusTracker.cs" />
<Compile Include="Install\InstallSteps\DatabaseConfigureStep.cs" />
<Compile Include="Install\InstallSteps\DatabaseInstallStep.cs" />
<Compile Include="Install\InstallSteps\DatabaseUpgradeStep.cs" />
<Compile Include="Install\InstallSteps\FilePermissionsStep.cs" />
<Compile Include="Install\InstallSteps\SetUmbracoVersionStep.cs" />
<Compile Include="Install\InstallSteps\StarterKitCleanupStep.cs" />
<Compile Include="Install\InstallSteps\StarterKitDownloadStep.cs" />
<Compile Include="Install\InstallSteps\StarterKitInstallStep.cs" />
<Compile Include="Install\InstallSteps\UpgradeStep.cs" />
<Compile Include="Install\InstallSteps\NewInstallStep.cs" />
<Compile Include="Install\Models\DatabaseModel.cs" />
<Compile Include="Install\Models\DatabaseType.cs" />
<Compile Include="Install\Models\InstallationType.cs" />
<Compile Include="Install\Models\InstallInstructions.cs" />
<Compile Include="Install\Models\InstallProgressResultModel.cs" />
<Compile Include="Install\Models\InstallSetup.cs" />
<Compile Include="Install\Models\InstallSetupResult.cs" />
<Compile Include="Install\Models\InstallSetupStep.cs" />
<Compile Include="Install\Models\InstallSetupStepAttribute.cs" />
<Compile Include="Install\Models\InstallTrackingItem.cs" />
<Compile Include="Install\Models\Package.cs" />
<Compile Include="Install\Models\UserModel.cs" />
<Compile Include="Install\UmbracoInstallArea.cs" />
<Compile Include="Install\Controllers\InstallApiController.cs" />
<Compile Include="Install\Controllers\InstallController.cs" />
@@ -10,18 +10,21 @@ using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Features;
using Umbraco.Web.Routing;
using Umbraco.Web.Security;
using Umbraco.Web.WebApi.Filters;
namespace Umbraco.Web.WebApi
{
/// <summary>
/// Provides a base class for Umbraco API controllers.
/// </summary>
/// <remarks>These controllers are NOT auto-routed.</remarks>
[FeatureAuthorize]
public abstract class UmbracoApiControllerBase : ApiController
public abstract class UmbracoApiControllerBase : ApiController, IUmbracoFeature
{
// note: all Umbraco controllers have two constructors: one with all dependencies, which should be used,