diff --git a/.editorconfig b/.editorconfig index 5a35b71ce6..29ad74b4d6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -25,16 +25,22 @@ dotnet_naming_rule.private_members_with_underscore.severity = suggestion dotnet_naming_symbols.private_fields.applicable_kinds = field dotnet_naming_symbols.private_fields.applicable_accessibilities = private +# dotnet_naming_symbols.private_fields.required_modifiers = abstract,async,readonly,static # all except const dotnet_naming_style.prefix_underscore.capitalization = camel_case dotnet_naming_style.prefix_underscore.required_prefix = _ + + + + + # https://github.com/MicrosoftDocs/visualstudio-docs/blob/master/docs/ide/editorconfig-code-style-settings-reference.md [*.cs] csharp_style_var_for_built_in_types = true:suggestion csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion -csharp_prefer_braces = false : none +csharp_prefer_braces = false : none -[*.{js,less}] -trim_trailing_whitespace = false +[*.{js,less}] +trim_trailing_whitespace = false diff --git a/.github/BUILD.md b/.github/BUILD.md index c6e870f396..ad33872423 100644 --- a/.github/BUILD.md +++ b/.github/BUILD.md @@ -43,6 +43,8 @@ If you only see a build.bat-file, you're probably on the wrong branch. If you sw You might run into [Powershell quirks](#powershell-quirks). +If it runs without errors; Hooray! Now you can continue with [the next step](CONTRIBUTING.md#how-do-i-begin) and open the solution and build it. + ### Build Infrastructure The Umbraco Build infrastructure relies on a PowerShell object. The object can be retrieved with: diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cea5859486..0101ac9d16 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -28,7 +28,7 @@ This project and everyone participating in it, is governed by the [our Code of C [Working with the code](#working-with-the-code) * [Building Umbraco from source code](#building-umbraco-from-source-code) * [Working with the source code](#working-with-the-source-code) - * [Making changes after the PR was opened](#making-changes-after-the-pr-was-opened) + * [Making changes after the PR is open](#making-changes-after-the-pr-is-open) * [Which branch should I target for my contributions?](#which-branch-should-i-target-for-my-contributions) * [Keeping your Umbraco fork in sync with the main repository](#keeping-your-umbraco-fork-in-sync-with-the-main-repository) @@ -65,7 +65,7 @@ Great question! The short version goes like this: * **Change** - make your changes, experiment, have fun, explore and learn, and don't be afraid. We welcome all contributions and will [happily give feedback](#questions) * **Commit** - done? Yay! 🎉 **Important:** create a new branch now and name it after the issue you're fixing, we usually follow the format: `temp-12345`. This means it's a temporary branch for the particular issue you're working on, in this case `12345`. When you have a branch, commit your changes. Don't commit to `v8/contrib`, create a new branch first. * **Push** - great, now you can push the changes up to your fork on GitHub - * **Create pull request** - exciting! You're ready to show us your changes (or not quite ready, you just need some feedback to progress - you can now make use of GitHub's draft pull request status, detailed [here] (https://github.blog/2019-02-14-introducing-draft-pull-requests/)). GitHub has picked up on the new branch you've pushed and will offer to create a Pull Request. Click that green button and away you go. + * **Create pull request** - exciting! You're ready to show us your changes (or not quite ready, you just need some feedback to progress - you can now make use of GitHub's draft pull request status, detailed [here](https://github.blog/2019-02-14-introducing-draft-pull-requests/)). GitHub has picked up on the new branch you've pushed and will offer to create a Pull Request. Click that green button and away you go. ![Create a pull request](img/createpullrequest.png) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index a9f5dcf352..4c2d72fb8c 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -2,7 +2,7 @@ using System.Resources; [assembly: AssemblyCompany("Umbraco")] -[assembly: AssemblyCopyright("Copyright © Umbraco 2019")] +[assembly: AssemblyCopyright("Copyright © Umbraco 2020")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/src/Umbraco.Abstractions/CompositionExtensions.cs b/src/Umbraco.Abstractions/CompositionExtensions.cs deleted file mode 100644 index c65cff50d6..0000000000 --- a/src/Umbraco.Abstractions/CompositionExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Umbraco.Core.Composing; - -namespace Umbraco.Core -{ - public static partial class CompositionExtensions - { - - #region Collection Builders - - /// - /// Gets the components collection builder. - /// - public static ComponentCollectionBuilder Components(this Composition composition) - => composition.WithCollectionBuilder(); - - #endregion - } -} diff --git a/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs b/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs deleted file mode 100644 index e8af1b0ac3..0000000000 --- a/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Umbraco.Core.PropertyEditors -{ - /// - /// Must be implemented by property editors that store media and return media paths - /// - /// - /// Currently there are only 2x core editors that do this: upload and image cropper. - /// It would be possible for developers to know implement their own media property editors whereas previously this was not possible. - /// - public interface IDataEditorWithMediaPath - { - /// - /// Returns the media path for the value stored for a property - /// - /// - /// - string GetMediaPath(object value); - } -} diff --git a/src/Umbraco.Abstractions/Models/Identity/ICurrentUserAccessor.cs b/src/Umbraco.Abstractions/Models/Identity/ICurrentUserAccessor.cs deleted file mode 100644 index 49b2c6d9f9..0000000000 --- a/src/Umbraco.Abstractions/Models/Identity/ICurrentUserAccessor.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Umbraco.Core.Models.Membership; - -namespace Umbraco.Core.Models.Identity -{ - public interface ICurrentUserAccessor - { - /// - /// Returns the current user or null if no user is currently authenticated. - /// - /// The current user or null - IUser TryGetCurrentUser(); - } -} diff --git a/src/Umbraco.Abstractions/Models/MacroTypes.cs b/src/Umbraco.Abstractions/Models/MacroTypes.cs deleted file mode 100644 index 5f8440845d..0000000000 --- a/src/Umbraco.Abstractions/Models/MacroTypes.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Runtime.Serialization; - -namespace Umbraco.Core.Models -{ - /// - /// Enum for the various types of Macros - /// - [Serializable] - [DataContract(IsReference = true)] - public enum MacroTypes - { - [EnumMember] - Unknown = 4, - [EnumMember] - PartialView = 7 - } -} diff --git a/src/Umbraco.Configuration/ActiveDirectorySettings.cs b/src/Umbraco.Configuration/ActiveDirectorySettings.cs new file mode 100644 index 0000000000..d85def7f33 --- /dev/null +++ b/src/Umbraco.Configuration/ActiveDirectorySettings.cs @@ -0,0 +1,15 @@ +using System.Configuration; +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration +{ + public class ActiveDirectorySettings : IActiveDirectorySettings + { + public ActiveDirectorySettings() + { + ActiveDirectoryDomain = ConfigurationManager.AppSettings["ActiveDirectoryDomain"]; + } + + public string ActiveDirectoryDomain { get; } + } +} diff --git a/src/Umbraco.Configuration/ConfigsFactory.cs b/src/Umbraco.Configuration/ConfigsFactory.cs index fea0c23f29..3742b7d7fa 100644 --- a/src/Umbraco.Configuration/ConfigsFactory.cs +++ b/src/Umbraco.Configuration/ConfigsFactory.cs @@ -1,4 +1,5 @@ using System.Configuration; +using Umbraco.Configuration; using Umbraco.Core.Configuration.HealthChecks; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; @@ -7,14 +8,16 @@ namespace Umbraco.Core.Configuration { public class ConfigsFactory : IConfigsFactory { - - public ConfigsFactory() - { - } - public IHostingSettings HostingSettings { get; } = new HostingSettings(); public ICoreDebug CoreDebug { get; } = new CoreDebug(); + public IMachineKeyConfig MachineKeyConfig { get; } = new MachineKeyConfig(); + public IIndexCreatorSettings IndexCreatorSettings { get; } = new IndexCreatorSettings(); + public INuCacheSettings NuCacheSettings { get; } = new NuCacheSettings(); + public ITypeFinderSettings TypeFinderSettings { get; } = new TypeFinderSettings(); + public IRuntimeSettings RuntimeSettings { get; } = new RuntimeSettings(); + public IActiveDirectorySettings ActiveDirectorySettings { get; } = new ActiveDirectorySettings(); + public IExceptionFilterSettings ExceptionFilterSettings { get; } = new ExceptionFilterSettings(); public IUmbracoSettingsSection UmbracoSettings { get; } @@ -32,7 +35,18 @@ namespace Umbraco.Core.Configuration configs.AddPasswordConfigurations(); configs.Add(() => CoreDebug); - configs.Add(() => new ConnectionStrings()); + configs.Add(() => MachineKeyConfig); + configs.Add(() => new ConnectionStrings(ioHelper)); + configs.Add(() => new ModelsBuilderConfig(ioHelper)); + + + configs.Add(() => IndexCreatorSettings); + configs.Add(() => NuCacheSettings); + configs.Add(() => TypeFinderSettings); + configs.Add(() => RuntimeSettings); + configs.Add(() => ActiveDirectorySettings); + configs.Add(() => ExceptionFilterSettings); + configs.AddCoreConfigs(ioHelper); return configs; } diff --git a/src/Umbraco.Configuration/ConnectionStrings.cs b/src/Umbraco.Configuration/ConnectionStrings.cs index 707f58c7b7..6a00974831 100644 --- a/src/Umbraco.Configuration/ConnectionStrings.cs +++ b/src/Umbraco.Configuration/ConnectionStrings.cs @@ -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]; + } } } diff --git a/src/Umbraco.Configuration/ExceptionFilterSettings.cs b/src/Umbraco.Configuration/ExceptionFilterSettings.cs new file mode 100644 index 0000000000..628b8755cc --- /dev/null +++ b/src/Umbraco.Configuration/ExceptionFilterSettings.cs @@ -0,0 +1,18 @@ +using System.Configuration; +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration +{ + public class ExceptionFilterSettings : IExceptionFilterSettings + { + public ExceptionFilterSettings() + { + if (bool.TryParse(ConfigurationManager.AppSettings["Umbraco.Web.DisableModelBindingExceptionFilter"], + out var disabled)) + { + Disabled = disabled; + } + } + public bool Disabled { get; } + } +} diff --git a/src/Umbraco.Configuration/GlobalSettings.cs b/src/Umbraco.Configuration/GlobalSettings.cs index 6cd1ea58a5..56e64fff31 100644 --- a/src/Umbraco.Configuration/GlobalSettings.cs +++ b/src/Umbraco.Configuration/GlobalSettings.cs @@ -254,27 +254,7 @@ namespace Umbraco.Core.Configuration ConfigurationManager.RefreshSection("appSettings"); } - /// - /// Removes a setting from the configuration file. - /// - /// Key of the setting to be removed. - 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"); - } - } - - + /// /// Gets the time out in minutes. /// @@ -402,6 +382,10 @@ namespace Umbraco.Core.Configuration private string _databaseFactoryServerVersion; public string DatabaseFactoryServerVersion => GetterWithDefaultValue(Constants.AppSettings.Debug.DatabaseFactoryServerVersion, string.Empty, ref _databaseFactoryServerVersion); + private string _mainDomLock; + + public string MainDomLock => GetterWithDefaultValue(Constants.AppSettings.MainDomLock, string.Empty, ref _mainDomLock); + private T GetterWithDefaultValue(string appSettingKey, T defaultValue, ref T backingField) { if (backingField != null) return backingField; diff --git a/src/Umbraco.Configuration/IndexCreatorSettings.cs b/src/Umbraco.Configuration/IndexCreatorSettings.cs new file mode 100644 index 0000000000..00d1a29dba --- /dev/null +++ b/src/Umbraco.Configuration/IndexCreatorSettings.cs @@ -0,0 +1,15 @@ +using System.Configuration; +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration +{ + public class IndexCreatorSettings : IIndexCreatorSettings + { + public IndexCreatorSettings() + { + LuceneDirectoryFactory = ConfigurationManager.AppSettings["Umbraco.Examine.LuceneDirectoryFactory"]; + } + + public string LuceneDirectoryFactory { get; } + } +} diff --git a/src/Umbraco.Configuration/MachineKeyConfig.cs b/src/Umbraco.Configuration/MachineKeyConfig.cs new file mode 100644 index 0000000000..4e3401e015 --- /dev/null +++ b/src/Umbraco.Configuration/MachineKeyConfig.cs @@ -0,0 +1,20 @@ +using System.Configuration; +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration +{ + public class MachineKeyConfig : IMachineKeyConfig + { + //TODO all the machineKey stuff should be replaced: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey?view=aspnetcore-3.1 + + public bool HasMachineKey + { + get + { + var machineKeySection = + ConfigurationManager.GetSection("system.web/machineKey") as ConfigurationSection; + return !(machineKeySection?.ElementInformation?.Source is null); + } + } + } +} diff --git a/src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsBuilderConfig.cs b/src/Umbraco.Configuration/ModelsBuilderConfig.cs similarity index 94% rename from src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsBuilderConfig.cs rename to src/Umbraco.Configuration/ModelsBuilderConfig.cs index d0137ed2b2..151e9908a1 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsBuilderConfig.cs +++ b/src/Umbraco.Configuration/ModelsBuilderConfig.cs @@ -2,11 +2,11 @@ using System.Configuration; using System.IO; using System.Threading; -using System.Web.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Core; using Umbraco.Core.IO; -namespace Umbraco.ModelsBuilder.Embedded.Configuration +namespace Umbraco.Configuration { /// /// Represents the models builder configuration. @@ -21,7 +21,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Configuration private object _flagOutOfDateModelsLock; private bool _flagOutOfDateModelsConfigured; private bool _flagOutOfDateModels; - public const string DefaultModelsNamespace = "Umbraco.Web.PublishedModels"; + public string DefaultModelsDirectory => _ioHelper.MapPath("~/App_Data/Models"); @@ -37,7 +37,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Configuration Enable = ConfigurationManager.AppSettings[Prefix + "Enable"] == "true"; // ensure defaults are initialized for tests - ModelsNamespace = DefaultModelsNamespace; + ModelsNamespace = Constants.ModelsBuilder.DefaultModelsNamespace; ModelsDirectory = DefaultModelsDirectory; DebugLevel = 0; @@ -95,7 +95,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Configuration Enable = enable; _modelsMode = modelsMode; - ModelsNamespace = string.IsNullOrWhiteSpace(modelsNamespace) ? DefaultModelsNamespace : modelsNamespace; + ModelsNamespace = string.IsNullOrWhiteSpace(modelsNamespace) ? Constants.ModelsBuilder.DefaultModelsNamespace : modelsNamespace; EnableFactory = enableFactory; _flagOutOfDateModels = flagOutOfDateModels; ModelsDirectory = string.IsNullOrWhiteSpace(modelsDirectory) ? DefaultModelsDirectory : modelsDirectory; @@ -174,8 +174,13 @@ namespace Umbraco.ModelsBuilder.Embedded.Configuration { get { - var section = (CompilationSection)ConfigurationManager.GetSection("system.web/compilation"); - return section != null && section.Debug; + if (ConfigurationManager.GetSection("system.web/compilation") is ConfigurationSection section && + bool.TryParse(section.ElementInformation.Properties["debug"].Value.ToString(), out var isDebug)) + { + return isDebug; + } + + return false; } } diff --git a/src/Umbraco.Configuration/NuCacheSettings.cs b/src/Umbraco.Configuration/NuCacheSettings.cs new file mode 100644 index 0000000000..c3a286d33d --- /dev/null +++ b/src/Umbraco.Configuration/NuCacheSettings.cs @@ -0,0 +1,14 @@ +using System.Configuration; +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration +{ + public class NuCacheSettings : INuCacheSettings + { + public NuCacheSettings() + { + BTreeBlockSize = ConfigurationManager.AppSettings["Umbraco.Web.PublishedCache.NuCache.BTree.BlockSize"]; + } + public string BTreeBlockSize { get; } + } +} diff --git a/src/Umbraco.Configuration/RuntimeSettings.cs b/src/Umbraco.Configuration/RuntimeSettings.cs new file mode 100644 index 0000000000..6dc8d6f832 --- /dev/null +++ b/src/Umbraco.Configuration/RuntimeSettings.cs @@ -0,0 +1,29 @@ +using System.Configuration; +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration +{ + public class RuntimeSettings : IRuntimeSettings + { + public RuntimeSettings() + { + if (ConfigurationManager.GetSection("system.web/httpRuntime") is ConfigurationSection section) + { + var maxRequestLengthProperty = section.ElementInformation.Properties["maxRequestLength"]; + if (maxRequestLengthProperty != null && maxRequestLengthProperty.Value is int requestLength) + { + MaxRequestLength = requestLength; + } + + var maxQueryStringProperty = section.ElementInformation.Properties["maxQueryStringLength"]; + if (maxQueryStringProperty != null && maxQueryStringProperty.Value is int maxQueryStringLength) + { + MaxQueryStringLength = maxQueryStringLength; + } + } + } + public int? MaxQueryStringLength { get; } + public int? MaxRequestLength { get; } + + } +} diff --git a/src/Umbraco.Configuration/TypeFinderSettings.cs b/src/Umbraco.Configuration/TypeFinderSettings.cs new file mode 100644 index 0000000000..bb3063d7bf --- /dev/null +++ b/src/Umbraco.Configuration/TypeFinderSettings.cs @@ -0,0 +1,17 @@ +using System.Configuration; +using Umbraco.Core.Configuration; +using Umbraco.Core; + +namespace Umbraco.Configuration +{ + public class TypeFinderSettings : ITypeFinderSettings + { + public TypeFinderSettings() + { + AssembliesAcceptingLoadExceptions = ConfigurationManager.AppSettings[ + Constants.AppSettings.AssembliesAcceptingLoadExceptions]; + } + + public string AssembliesAcceptingLoadExceptions { get; } + } +} diff --git a/src/Umbraco.Configuration/Umbraco.Configuration.csproj b/src/Umbraco.Configuration/Umbraco.Configuration.csproj index 15c6ac263f..57fca1dfd6 100644 --- a/src/Umbraco.Configuration/Umbraco.Configuration.csproj +++ b/src/Umbraco.Configuration/Umbraco.Configuration.csproj @@ -2,6 +2,7 @@ netstandard2.0 + 8 @@ -25,7 +26,7 @@ - + diff --git a/src/Umbraco.Abstractions/Actions/ActionAssignDomain.cs b/src/Umbraco.Core/Actions/ActionAssignDomain.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionAssignDomain.cs rename to src/Umbraco.Core/Actions/ActionAssignDomain.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionBrowse.cs b/src/Umbraco.Core/Actions/ActionBrowse.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionBrowse.cs rename to src/Umbraco.Core/Actions/ActionBrowse.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionChangeDocType.cs b/src/Umbraco.Core/Actions/ActionChangeDocType.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionChangeDocType.cs rename to src/Umbraco.Core/Actions/ActionChangeDocType.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionCollection.cs b/src/Umbraco.Core/Actions/ActionCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionCollection.cs rename to src/Umbraco.Core/Actions/ActionCollection.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionCollectionBuilder.cs b/src/Umbraco.Core/Actions/ActionCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionCollectionBuilder.cs rename to src/Umbraco.Core/Actions/ActionCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionCopy.cs b/src/Umbraco.Core/Actions/ActionCopy.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionCopy.cs rename to src/Umbraco.Core/Actions/ActionCopy.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionCreateBlueprintFromContent.cs b/src/Umbraco.Core/Actions/ActionCreateBlueprintFromContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionCreateBlueprintFromContent.cs rename to src/Umbraco.Core/Actions/ActionCreateBlueprintFromContent.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionDelete.cs b/src/Umbraco.Core/Actions/ActionDelete.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionDelete.cs rename to src/Umbraco.Core/Actions/ActionDelete.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionMove.cs b/src/Umbraco.Core/Actions/ActionMove.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionMove.cs rename to src/Umbraco.Core/Actions/ActionMove.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionNew.cs b/src/Umbraco.Core/Actions/ActionNew.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionNew.cs rename to src/Umbraco.Core/Actions/ActionNew.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionProtect.cs b/src/Umbraco.Core/Actions/ActionProtect.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionProtect.cs rename to src/Umbraco.Core/Actions/ActionProtect.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionPublish.cs b/src/Umbraco.Core/Actions/ActionPublish.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionPublish.cs rename to src/Umbraco.Core/Actions/ActionPublish.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionRestore.cs b/src/Umbraco.Core/Actions/ActionRestore.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionRestore.cs rename to src/Umbraco.Core/Actions/ActionRestore.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionRights.cs b/src/Umbraco.Core/Actions/ActionRights.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionRights.cs rename to src/Umbraco.Core/Actions/ActionRights.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionRollback.cs b/src/Umbraco.Core/Actions/ActionRollback.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionRollback.cs rename to src/Umbraco.Core/Actions/ActionRollback.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionSort.cs b/src/Umbraco.Core/Actions/ActionSort.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionSort.cs rename to src/Umbraco.Core/Actions/ActionSort.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionToPublish.cs b/src/Umbraco.Core/Actions/ActionToPublish.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionToPublish.cs rename to src/Umbraco.Core/Actions/ActionToPublish.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionUnpublish.cs b/src/Umbraco.Core/Actions/ActionUnpublish.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionUnpublish.cs rename to src/Umbraco.Core/Actions/ActionUnpublish.cs diff --git a/src/Umbraco.Abstractions/Actions/ActionUpdate.cs b/src/Umbraco.Core/Actions/ActionUpdate.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/ActionUpdate.cs rename to src/Umbraco.Core/Actions/ActionUpdate.cs diff --git a/src/Umbraco.Abstractions/Actions/IAction.cs b/src/Umbraco.Core/Actions/IAction.cs similarity index 100% rename from src/Umbraco.Abstractions/Actions/IAction.cs rename to src/Umbraco.Core/Actions/IAction.cs diff --git a/src/Umbraco.Abstractions/AssemblyExtensions.cs b/src/Umbraco.Core/AssemblyExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/AssemblyExtensions.cs rename to src/Umbraco.Core/AssemblyExtensions.cs diff --git a/src/Umbraco.Abstractions/Attempt.cs b/src/Umbraco.Core/Attempt.cs similarity index 100% rename from src/Umbraco.Abstractions/Attempt.cs rename to src/Umbraco.Core/Attempt.cs diff --git a/src/Umbraco.Abstractions/AttemptOfTResult.cs b/src/Umbraco.Core/AttemptOfTResult.cs similarity index 100% rename from src/Umbraco.Abstractions/AttemptOfTResult.cs rename to src/Umbraco.Core/AttemptOfTResult.cs diff --git a/src/Umbraco.Abstractions/AttemptOfTResultTStatus.cs b/src/Umbraco.Core/AttemptOfTResultTStatus.cs similarity index 100% rename from src/Umbraco.Abstractions/AttemptOfTResultTStatus.cs rename to src/Umbraco.Core/AttemptOfTResultTStatus.cs diff --git a/src/Umbraco.Abstractions/Cache/AppCacheExtensions.cs b/src/Umbraco.Core/Cache/AppCacheExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/AppCacheExtensions.cs rename to src/Umbraco.Core/Cache/AppCacheExtensions.cs diff --git a/src/Umbraco.Abstractions/Cache/AppCaches.cs b/src/Umbraco.Core/Cache/AppCaches.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/AppCaches.cs rename to src/Umbraco.Core/Cache/AppCaches.cs diff --git a/src/Umbraco.Abstractions/Cache/AppPolicedCacheDictionary.cs b/src/Umbraco.Core/Cache/AppPolicedCacheDictionary.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/AppPolicedCacheDictionary.cs rename to src/Umbraco.Core/Cache/AppPolicedCacheDictionary.cs diff --git a/src/Umbraco.Abstractions/Cache/ApplicationCacheRefresher.cs b/src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/ApplicationCacheRefresher.cs rename to src/Umbraco.Core/Cache/ApplicationCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/CacheKeys.cs b/src/Umbraco.Core/Cache/CacheKeys.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/CacheKeys.cs rename to src/Umbraco.Core/Cache/CacheKeys.cs diff --git a/src/Umbraco.Abstractions/Cache/CacheRefresherBase.cs b/src/Umbraco.Core/Cache/CacheRefresherBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/CacheRefresherBase.cs rename to src/Umbraco.Core/Cache/CacheRefresherBase.cs diff --git a/src/Umbraco.Abstractions/Cache/CacheRefresherCollection.cs b/src/Umbraco.Core/Cache/CacheRefresherCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/CacheRefresherCollection.cs rename to src/Umbraco.Core/Cache/CacheRefresherCollection.cs diff --git a/src/Umbraco.Abstractions/Cache/CacheRefresherCollectionBuilder.cs b/src/Umbraco.Core/Cache/CacheRefresherCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/CacheRefresherCollectionBuilder.cs rename to src/Umbraco.Core/Cache/CacheRefresherCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Cache/CacheRefresherEventArgs.cs b/src/Umbraco.Core/Cache/CacheRefresherEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/CacheRefresherEventArgs.cs rename to src/Umbraco.Core/Cache/CacheRefresherEventArgs.cs diff --git a/src/Umbraco.Abstractions/Cache/ContentCacheRefresher.cs b/src/Umbraco.Core/Cache/ContentCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/ContentCacheRefresher.cs rename to src/Umbraco.Core/Cache/ContentCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/ContentTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/ContentTypeCacheRefresher.cs rename to src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/DataTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/DataTypeCacheRefresher.cs rename to src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/DeepCloneAppCache.cs b/src/Umbraco.Core/Cache/DeepCloneAppCache.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/DeepCloneAppCache.cs rename to src/Umbraco.Core/Cache/DeepCloneAppCache.cs diff --git a/src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs b/src/Umbraco.Core/Cache/DictionaryAppCache.cs similarity index 94% rename from src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs rename to src/Umbraco.Core/Cache/DictionaryAppCache.cs index fd360b303d..d372916240 100644 --- a/src/Umbraco.Abstractions/Cache/DictionaryAppCache.cs +++ b/src/Umbraco.Core/Cache/DictionaryAppCache.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Text.RegularExpressions; @@ -101,5 +102,9 @@ namespace Umbraco.Core.Cache var compiled = new Regex(regex, RegexOptions.Compiled); _items.RemoveAll(kvp => compiled.IsMatch(kvp.Key)); } + + public IEnumerator> GetEnumerator() => _items.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } } diff --git a/src/Umbraco.Abstractions/Cache/DictionaryCacheRefresher.cs b/src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/DictionaryCacheRefresher.cs rename to src/Umbraco.Core/Cache/DictionaryCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/DistributedCache.cs b/src/Umbraco.Core/Cache/DistributedCache.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/DistributedCache.cs rename to src/Umbraco.Core/Cache/DistributedCache.cs diff --git a/src/Umbraco.Abstractions/Cache/DistributedCacheBinderComponent.cs b/src/Umbraco.Core/Cache/DistributedCacheBinderComponent.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/DistributedCacheBinderComponent.cs rename to src/Umbraco.Core/Cache/DistributedCacheBinderComponent.cs diff --git a/src/Umbraco.Abstractions/Cache/DomainCacheRefresher.cs b/src/Umbraco.Core/Cache/DomainCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/DomainCacheRefresher.cs rename to src/Umbraco.Core/Cache/DomainCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/FastDictionaryAppCache.cs b/src/Umbraco.Core/Cache/FastDictionaryAppCache.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/FastDictionaryAppCache.cs rename to src/Umbraco.Core/Cache/FastDictionaryAppCache.cs diff --git a/src/Umbraco.Abstractions/Cache/FastDictionaryAppCacheBase.cs b/src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/FastDictionaryAppCacheBase.cs rename to src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs diff --git a/src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs b/src/Umbraco.Core/Cache/HttpRequestAppCache.cs similarity index 92% rename from src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs rename to src/Umbraco.Core/Cache/HttpRequestAppCache.cs index 87d87ad1c9..e698d93ebe 100644 --- a/src/Umbraco.Abstractions/Cache/HttpRequestAppCache.cs +++ b/src/Umbraco.Core/Cache/HttpRequestAppCache.cs @@ -171,5 +171,20 @@ namespace Umbraco.Core.Cache } #endregion + + public IEnumerator> GetEnumerator() + { + if (!TryGetContextItems(out var items)) + { + yield break; + } + + foreach (DictionaryEntry item in items) + { + yield return new KeyValuePair(item.Key.ToString(), item.Value); + } + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } } diff --git a/src/Umbraco.Abstractions/Cache/IAppCache.cs b/src/Umbraco.Core/Cache/IAppCache.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IAppCache.cs rename to src/Umbraco.Core/Cache/IAppCache.cs diff --git a/src/Umbraco.Abstractions/Cache/IAppPolicyCache.cs b/src/Umbraco.Core/Cache/IAppPolicyCache.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IAppPolicyCache.cs rename to src/Umbraco.Core/Cache/IAppPolicyCache.cs diff --git a/src/Umbraco.Abstractions/Cache/ICacheRefresher.cs b/src/Umbraco.Core/Cache/ICacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/ICacheRefresher.cs rename to src/Umbraco.Core/Cache/ICacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/IDistributedCacheBinder.cs b/src/Umbraco.Core/Cache/IDistributedCacheBinder.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IDistributedCacheBinder.cs rename to src/Umbraco.Core/Cache/IDistributedCacheBinder.cs diff --git a/src/Umbraco.Abstractions/Cache/IJsonCacheRefresher.cs b/src/Umbraco.Core/Cache/IJsonCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IJsonCacheRefresher.cs rename to src/Umbraco.Core/Cache/IJsonCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/IPayloadCacheRefresher.cs b/src/Umbraco.Core/Cache/IPayloadCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IPayloadCacheRefresher.cs rename to src/Umbraco.Core/Cache/IPayloadCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/IRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/IRepositoryCachePolicy.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IRepositoryCachePolicy.cs rename to src/Umbraco.Core/Cache/IRepositoryCachePolicy.cs diff --git a/src/Umbraco.Abstractions/Cache/IRequestCache.cs b/src/Umbraco.Core/Cache/IRequestCache.cs similarity index 68% rename from src/Umbraco.Abstractions/Cache/IRequestCache.cs rename to src/Umbraco.Core/Cache/IRequestCache.cs index 5ed32b5ba0..7ed7f8251c 100644 --- a/src/Umbraco.Abstractions/Cache/IRequestCache.cs +++ b/src/Umbraco.Core/Cache/IRequestCache.cs @@ -1,6 +1,8 @@ +using System.Collections.Generic; + namespace Umbraco.Core.Cache { - public interface IRequestCache : IAppCache + public interface IRequestCache : IAppCache, IEnumerable> { bool Set(string key, object value); bool Remove(string key); diff --git a/src/Umbraco.Abstractions/Cache/IsolatedCaches.cs b/src/Umbraco.Core/Cache/IsolatedCaches.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/IsolatedCaches.cs rename to src/Umbraco.Core/Cache/IsolatedCaches.cs diff --git a/src/Umbraco.Abstractions/Cache/JsonCacheRefresherBase.cs b/src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/JsonCacheRefresherBase.cs rename to src/Umbraco.Core/Cache/JsonCacheRefresherBase.cs diff --git a/src/Umbraco.Abstractions/Cache/LanguageCacheRefresher.cs b/src/Umbraco.Core/Cache/LanguageCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/LanguageCacheRefresher.cs rename to src/Umbraco.Core/Cache/LanguageCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/MacroCacheRefresher.cs b/src/Umbraco.Core/Cache/MacroCacheRefresher.cs similarity index 94% rename from src/Umbraco.Abstractions/Cache/MacroCacheRefresher.cs rename to src/Umbraco.Core/Cache/MacroCacheRefresher.cs index 40c577444b..009e9f38d0 100644 --- a/src/Umbraco.Abstractions/Cache/MacroCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MacroCacheRefresher.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Serialization; namespace Umbraco.Web.Cache { - public sealed class MacroCacheRefresher : JsonCacheRefresherBase + public sealed class MacroCacheRefresher : PayloadCacheRefresherBase { public MacroCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer) : base(appCaches, jsonSerializer) @@ -53,7 +53,7 @@ namespace Umbraco.Web.Cache { macroRepoCache.Result.Clear(RepositoryCacheKeys.GetKey(payload.Id)); } - }; + } base.Refresh(json); } diff --git a/src/Umbraco.Abstractions/Cache/MediaCacheRefresher.cs b/src/Umbraco.Core/Cache/MediaCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/MediaCacheRefresher.cs rename to src/Umbraco.Core/Cache/MediaCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/MemberCacheRefresher.cs b/src/Umbraco.Core/Cache/MemberCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/MemberCacheRefresher.cs rename to src/Umbraco.Core/Cache/MemberCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/MemberGroupCacheRefresher.cs b/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs similarity index 92% rename from src/Umbraco.Abstractions/Cache/MemberGroupCacheRefresher.cs rename to src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs index 1149d499f5..213ca11302 100644 --- a/src/Umbraco.Abstractions/Cache/MemberGroupCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs @@ -6,7 +6,7 @@ using Umbraco.Core.Serialization; namespace Umbraco.Web.Cache { - public sealed class MemberGroupCacheRefresher : JsonCacheRefresherBase + public sealed class MemberGroupCacheRefresher : PayloadCacheRefresherBase { public MemberGroupCacheRefresher(AppCaches appCaches, IJsonSerializer jsonSerializer) : base(appCaches, jsonSerializer) diff --git a/src/Umbraco.Abstractions/Cache/NoAppCache.cs b/src/Umbraco.Core/Cache/NoAppCache.cs similarity index 91% rename from src/Umbraco.Abstractions/Cache/NoAppCache.cs rename to src/Umbraco.Core/Cache/NoAppCache.cs index 5ca8f47059..60bc6fb8b8 100644 --- a/src/Umbraco.Abstractions/Cache/NoAppCache.cs +++ b/src/Umbraco.Core/Cache/NoAppCache.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; @@ -84,5 +85,9 @@ namespace Umbraco.Core.Cache /// public virtual void ClearByRegex(string regex) { } + + public IEnumerator> GetEnumerator() => new Dictionary().GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } } diff --git a/src/Umbraco.Abstractions/Cache/NoCacheRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/NoCacheRepositoryCachePolicy.cs rename to src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs diff --git a/src/Umbraco.Abstractions/Cache/ObjectCacheAppCache.cs b/src/Umbraco.Core/Cache/ObjectCacheAppCache.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/ObjectCacheAppCache.cs rename to src/Umbraco.Core/Cache/ObjectCacheAppCache.cs diff --git a/src/Umbraco.Abstractions/Cache/PayloadCacheRefresherBase.cs b/src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/PayloadCacheRefresherBase.cs rename to src/Umbraco.Core/Cache/PayloadCacheRefresherBase.cs diff --git a/src/Umbraco.Abstractions/Cache/PublicAccessCacheRefresher.cs b/src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/PublicAccessCacheRefresher.cs rename to src/Umbraco.Core/Cache/PublicAccessCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/RelationTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/RelationTypeCacheRefresher.cs rename to src/Umbraco.Core/Cache/RelationTypeCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/RepositoryCachePolicyOptions.cs b/src/Umbraco.Core/Cache/RepositoryCachePolicyOptions.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/RepositoryCachePolicyOptions.cs rename to src/Umbraco.Core/Cache/RepositoryCachePolicyOptions.cs diff --git a/src/Umbraco.Abstractions/Cache/SafeLazy.cs b/src/Umbraco.Core/Cache/SafeLazy.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/SafeLazy.cs rename to src/Umbraco.Core/Cache/SafeLazy.cs diff --git a/src/Umbraco.Abstractions/Cache/TemplateCacheRefresher.cs b/src/Umbraco.Core/Cache/TemplateCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/TemplateCacheRefresher.cs rename to src/Umbraco.Core/Cache/TemplateCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/TypedCacheRefresherBase.cs b/src/Umbraco.Core/Cache/TypedCacheRefresherBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/TypedCacheRefresherBase.cs rename to src/Umbraco.Core/Cache/TypedCacheRefresherBase.cs diff --git a/src/Umbraco.Abstractions/Cache/UserCacheRefresher.cs b/src/Umbraco.Core/Cache/UserCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/UserCacheRefresher.cs rename to src/Umbraco.Core/Cache/UserCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/Cache/UserGroupCacheRefresher.cs b/src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs similarity index 100% rename from src/Umbraco.Abstractions/Cache/UserGroupCacheRefresher.cs rename to src/Umbraco.Core/Cache/UserGroupCacheRefresher.cs diff --git a/src/Umbraco.Abstractions/CacheHelperExtensions.cs b/src/Umbraco.Core/CacheHelperExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/CacheHelperExtensions.cs rename to src/Umbraco.Core/CacheHelperExtensions.cs diff --git a/src/Umbraco.Abstractions/CodeAnnotations/FriendlyNameAttribute.cs b/src/Umbraco.Core/CodeAnnotations/FriendlyNameAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/CodeAnnotations/FriendlyNameAttribute.cs rename to src/Umbraco.Core/CodeAnnotations/FriendlyNameAttribute.cs diff --git a/src/Umbraco.Abstractions/CodeAnnotations/UmbracoObjectTypeAttribute.cs b/src/Umbraco.Core/CodeAnnotations/UmbracoObjectTypeAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/CodeAnnotations/UmbracoObjectTypeAttribute.cs rename to src/Umbraco.Core/CodeAnnotations/UmbracoObjectTypeAttribute.cs diff --git a/src/Umbraco.Abstractions/CodeAnnotations/UmbracoUdiTypeAttribute.cs b/src/Umbraco.Core/CodeAnnotations/UmbracoUdiTypeAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/CodeAnnotations/UmbracoUdiTypeAttribute.cs rename to src/Umbraco.Core/CodeAnnotations/UmbracoUdiTypeAttribute.cs diff --git a/src/Umbraco.Abstractions/Collections/CompositeIntStringKey.cs b/src/Umbraco.Core/Collections/CompositeIntStringKey.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/CompositeIntStringKey.cs rename to src/Umbraco.Core/Collections/CompositeIntStringKey.cs diff --git a/src/Umbraco.Abstractions/Collections/CompositeNStringNStringKey.cs b/src/Umbraco.Core/Collections/CompositeNStringNStringKey.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/CompositeNStringNStringKey.cs rename to src/Umbraco.Core/Collections/CompositeNStringNStringKey.cs diff --git a/src/Umbraco.Abstractions/Collections/CompositeStringStringKey.cs b/src/Umbraco.Core/Collections/CompositeStringStringKey.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/CompositeStringStringKey.cs rename to src/Umbraco.Core/Collections/CompositeStringStringKey.cs diff --git a/src/Umbraco.Abstractions/Collections/CompositeTypeTypeKey.cs b/src/Umbraco.Core/Collections/CompositeTypeTypeKey.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/CompositeTypeTypeKey.cs rename to src/Umbraco.Core/Collections/CompositeTypeTypeKey.cs diff --git a/src/Umbraco.Abstractions/Collections/ConcurrentHashSet.cs b/src/Umbraco.Core/Collections/ConcurrentHashSet.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/ConcurrentHashSet.cs rename to src/Umbraco.Core/Collections/ConcurrentHashSet.cs diff --git a/src/Umbraco.Abstractions/Collections/DeepCloneableList.cs b/src/Umbraco.Core/Collections/DeepCloneableList.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/DeepCloneableList.cs rename to src/Umbraco.Core/Collections/DeepCloneableList.cs diff --git a/src/Umbraco.Abstractions/Collections/ListCloneBehavior.cs b/src/Umbraco.Core/Collections/ListCloneBehavior.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/ListCloneBehavior.cs rename to src/Umbraco.Core/Collections/ListCloneBehavior.cs diff --git a/src/Umbraco.Abstractions/Collections/ObservableDictionary.cs b/src/Umbraco.Core/Collections/ObservableDictionary.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/ObservableDictionary.cs rename to src/Umbraco.Core/Collections/ObservableDictionary.cs diff --git a/src/Umbraco.Abstractions/Collections/OrderedHashSet.cs b/src/Umbraco.Core/Collections/OrderedHashSet.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/OrderedHashSet.cs rename to src/Umbraco.Core/Collections/OrderedHashSet.cs diff --git a/src/Umbraco.Abstractions/Collections/TopoGraph.cs b/src/Umbraco.Core/Collections/TopoGraph.cs similarity index 97% rename from src/Umbraco.Abstractions/Collections/TopoGraph.cs rename to src/Umbraco.Core/Collections/TopoGraph.cs index b8ded4a458..955a210465 100644 --- a/src/Umbraco.Abstractions/Collections/TopoGraph.cs +++ b/src/Umbraco.Core/Collections/TopoGraph.cs @@ -126,7 +126,7 @@ namespace Umbraco.Core.Collections if (_items.TryGetValue(key, out value)) yield return value; else if (throwOnMissing) - throw new Exception(MissingDependencyError); + throw new Exception($"{MissingDependencyError} Error in type {typeof(TItem).Name}, with key {key}"); } } } diff --git a/src/Umbraco.Abstractions/Collections/TypeList.cs b/src/Umbraco.Core/Collections/TypeList.cs similarity index 100% rename from src/Umbraco.Abstractions/Collections/TypeList.cs rename to src/Umbraco.Core/Collections/TypeList.cs diff --git a/src/Umbraco.Abstractions/Composing/BuilderCollectionBase.cs b/src/Umbraco.Core/Composing/BuilderCollectionBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/BuilderCollectionBase.cs rename to src/Umbraco.Core/Composing/BuilderCollectionBase.cs diff --git a/src/Umbraco.Abstractions/Composing/CollectionBuilderBase.cs b/src/Umbraco.Core/Composing/CollectionBuilderBase.cs similarity index 91% rename from src/Umbraco.Abstractions/Composing/CollectionBuilderBase.cs rename to src/Umbraco.Core/Composing/CollectionBuilderBase.cs index 41038ea4e9..0d398be83b 100644 --- a/src/Umbraco.Abstractions/Composing/CollectionBuilderBase.cs +++ b/src/Umbraco.Core/Composing/CollectionBuilderBase.cs @@ -79,9 +79,12 @@ namespace Umbraco.Core.Composing foreach (var type in types) EnsureType(type, "register"); - // register them + // register them - ensuring that each item is registered with the same lifetime as the collection. + // NOTE: Previously each one was not registered with the same lifetime which would mean that if there + // was a dependency on an individual item, it would resolve a brand new transient instance which isn't what + // we would expect to happen. The same item should be resolved from the container as the collection. foreach (var type in types) - register.Register(type); + register.Register(type, CollectionLifetime); _registeredTypes = types; } diff --git a/src/Umbraco.Abstractions/Composing/ComponentCollection.cs b/src/Umbraco.Core/Composing/ComponentCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ComponentCollection.cs rename to src/Umbraco.Core/Composing/ComponentCollection.cs diff --git a/src/Umbraco.Abstractions/Composing/ComponentCollectionBuilder.cs b/src/Umbraco.Core/Composing/ComponentCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ComponentCollectionBuilder.cs rename to src/Umbraco.Core/Composing/ComponentCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Composing/ComponentComposer.cs b/src/Umbraco.Core/Composing/ComponentComposer.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ComponentComposer.cs rename to src/Umbraco.Core/Composing/ComponentComposer.cs diff --git a/src/Umbraco.Abstractions/Composing/ComposeAfterAttribute.cs b/src/Umbraco.Core/Composing/ComposeAfterAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ComposeAfterAttribute.cs rename to src/Umbraco.Core/Composing/ComposeAfterAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/ComposeBeforeAttribute.cs b/src/Umbraco.Core/Composing/ComposeBeforeAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ComposeBeforeAttribute.cs rename to src/Umbraco.Core/Composing/ComposeBeforeAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/Composers.cs b/src/Umbraco.Core/Composing/Composers.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/Composers.cs rename to src/Umbraco.Core/Composing/Composers.cs diff --git a/src/Umbraco.Abstractions/Composing/Composition.cs b/src/Umbraco.Core/Composing/Composition.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/Composition.cs rename to src/Umbraco.Core/Composing/Composition.cs diff --git a/src/Umbraco.Abstractions/Composing/CompositionExtensions.cs b/src/Umbraco.Core/Composing/CompositionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/CompositionExtensions.cs rename to src/Umbraco.Core/Composing/CompositionExtensions.cs diff --git a/src/Umbraco.Abstractions/Composing/Current.cs b/src/Umbraco.Core/Composing/Current.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/Current.cs rename to src/Umbraco.Core/Composing/Current.cs diff --git a/src/Umbraco.Abstractions/Composing/DisableAttribute.cs b/src/Umbraco.Core/Composing/DisableAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/DisableAttribute.cs rename to src/Umbraco.Core/Composing/DisableAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/DisableComposerAttribute.cs b/src/Umbraco.Core/Composing/DisableComposerAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/DisableComposerAttribute.cs rename to src/Umbraco.Core/Composing/DisableComposerAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/EnableAttribute.cs b/src/Umbraco.Core/Composing/EnableAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/EnableAttribute.cs rename to src/Umbraco.Core/Composing/EnableAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/EnableComposerAttribute.cs b/src/Umbraco.Core/Composing/EnableComposerAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/EnableComposerAttribute.cs rename to src/Umbraco.Core/Composing/EnableComposerAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/HideFromTypeFinderAttribute.cs b/src/Umbraco.Core/Composing/HideFromTypeFinderAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/HideFromTypeFinderAttribute.cs rename to src/Umbraco.Core/Composing/HideFromTypeFinderAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/IBuilderCollection.cs b/src/Umbraco.Core/Composing/IBuilderCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IBuilderCollection.cs rename to src/Umbraco.Core/Composing/IBuilderCollection.cs diff --git a/src/Umbraco.Abstractions/Composing/ICollectionBuilder.cs b/src/Umbraco.Core/Composing/ICollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ICollectionBuilder.cs rename to src/Umbraco.Core/Composing/ICollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Composing/IComponent.cs b/src/Umbraco.Core/Composing/IComponent.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IComponent.cs rename to src/Umbraco.Core/Composing/IComponent.cs diff --git a/src/Umbraco.Abstractions/Composing/IComposer.cs b/src/Umbraco.Core/Composing/IComposer.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IComposer.cs rename to src/Umbraco.Core/Composing/IComposer.cs diff --git a/src/Umbraco.Abstractions/Composing/ICoreComposer.cs b/src/Umbraco.Core/Composing/ICoreComposer.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ICoreComposer.cs rename to src/Umbraco.Core/Composing/ICoreComposer.cs diff --git a/src/Umbraco.Abstractions/Composing/IDiscoverable.cs b/src/Umbraco.Core/Composing/IDiscoverable.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IDiscoverable.cs rename to src/Umbraco.Core/Composing/IDiscoverable.cs diff --git a/src/Umbraco.Abstractions/Composing/IFactory.cs b/src/Umbraco.Core/Composing/IFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IFactory.cs rename to src/Umbraco.Core/Composing/IFactory.cs diff --git a/src/Umbraco.Abstractions/Composing/IPublishedCacheComposer .cs b/src/Umbraco.Core/Composing/IPublishedCacheComposer .cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IPublishedCacheComposer .cs rename to src/Umbraco.Core/Composing/IPublishedCacheComposer .cs diff --git a/src/Umbraco.Abstractions/Composing/IRegister.cs b/src/Umbraco.Core/Composing/IRegister.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IRegister.cs rename to src/Umbraco.Core/Composing/IRegister.cs diff --git a/src/Umbraco.Abstractions/Composing/ITypeFinder.cs b/src/Umbraco.Core/Composing/ITypeFinder.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/ITypeFinder.cs rename to src/Umbraco.Core/Composing/ITypeFinder.cs diff --git a/src/Umbraco.Abstractions/Composing/IUserComposer.cs b/src/Umbraco.Core/Composing/IUserComposer.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/IUserComposer.cs rename to src/Umbraco.Core/Composing/IUserComposer.cs diff --git a/src/Umbraco.Abstractions/Composing/LazyCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/LazyCollectionBuilderBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/LazyCollectionBuilderBase.cs rename to src/Umbraco.Core/Composing/LazyCollectionBuilderBase.cs diff --git a/src/Umbraco.Abstractions/Composing/Lifetime.cs b/src/Umbraco.Core/Composing/Lifetime.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/Lifetime.cs rename to src/Umbraco.Core/Composing/Lifetime.cs diff --git a/src/Umbraco.Abstractions/Composing/OrderedCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/OrderedCollectionBuilderBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/OrderedCollectionBuilderBase.cs rename to src/Umbraco.Core/Composing/OrderedCollectionBuilderBase.cs diff --git a/src/Umbraco.Abstractions/Composing/RuntimeLevelAttribute.cs b/src/Umbraco.Core/Composing/RuntimeLevelAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/RuntimeLevelAttribute.cs rename to src/Umbraco.Core/Composing/RuntimeLevelAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/SetCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/SetCollectionBuilderBase.cs rename to src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs diff --git a/src/Umbraco.Abstractions/Composing/TargetedServiceFactory.cs b/src/Umbraco.Core/Composing/TargetedServiceFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/TargetedServiceFactory.cs rename to src/Umbraco.Core/Composing/TargetedServiceFactory.cs diff --git a/src/Umbraco.Abstractions/Composing/TypeCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/TypeCollectionBuilderBase.cs rename to src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs diff --git a/src/Umbraco.Abstractions/Composing/TypeFinder.cs b/src/Umbraco.Core/Composing/TypeFinder.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/TypeFinder.cs rename to src/Umbraco.Core/Composing/TypeFinder.cs diff --git a/src/Umbraco.Abstractions/Composing/TypeFinderExtensions.cs b/src/Umbraco.Core/Composing/TypeFinderExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/TypeFinderExtensions.cs rename to src/Umbraco.Core/Composing/TypeFinderExtensions.cs diff --git a/src/Umbraco.Abstractions/Composing/TypeHelper.cs b/src/Umbraco.Core/Composing/TypeHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/TypeHelper.cs rename to src/Umbraco.Core/Composing/TypeHelper.cs diff --git a/src/Umbraco.Abstractions/Composing/TypeLoader.cs b/src/Umbraco.Core/Composing/TypeLoader.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/TypeLoader.cs rename to src/Umbraco.Core/Composing/TypeLoader.cs diff --git a/src/Umbraco.Abstractions/Composing/WeightAttribute.cs b/src/Umbraco.Core/Composing/WeightAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/WeightAttribute.cs rename to src/Umbraco.Core/Composing/WeightAttribute.cs diff --git a/src/Umbraco.Abstractions/Composing/WeightedCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/WeightedCollectionBuilderBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Composing/WeightedCollectionBuilderBase.cs rename to src/Umbraco.Core/Composing/WeightedCollectionBuilderBase.cs diff --git a/src/Umbraco.Core/CompositionExtensions.cs b/src/Umbraco.Core/CompositionExtensions.cs new file mode 100644 index 0000000000..bea78f82ed --- /dev/null +++ b/src/Umbraco.Core/CompositionExtensions.cs @@ -0,0 +1,37 @@ +using Umbraco.Core.Composing; +using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Dashboards; + +namespace Umbraco.Core +{ + public static partial class CompositionExtensions + { + + #region Collection Builders + + /// + /// Gets the components collection builder. + /// + public static ComponentCollectionBuilder Components(this Composition composition) + => composition.WithCollectionBuilder(); + + + /// + /// Gets the backoffice dashboards collection builder. + /// + /// The composition. + public static DashboardCollectionBuilder Dashboards(this Composition composition) + => composition.WithCollectionBuilder(); + + + /// + /// Gets the content finders collection builder. + /// + /// The composition. + /// + public static MediaUrlGeneratorCollectionBuilder MediaUrlGenerators(this Composition composition) + => composition.WithCollectionBuilder(); + + #endregion + } +} diff --git a/src/Umbraco.Abstractions/CompositionExtensions_Uniques.cs b/src/Umbraco.Core/CompositionExtensions_Uniques.cs similarity index 100% rename from src/Umbraco.Abstractions/CompositionExtensions_Uniques.cs rename to src/Umbraco.Core/CompositionExtensions_Uniques.cs diff --git a/src/Umbraco.Abstractions/ConfigConnectionStringExtensions.cs b/src/Umbraco.Core/ConfigConnectionStringExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ConfigConnectionStringExtensions.cs rename to src/Umbraco.Core/ConfigConnectionStringExtensions.cs diff --git a/src/Umbraco.Abstractions/Configuration/ConfigConnectionString.cs b/src/Umbraco.Core/Configuration/ConfigConnectionString.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/ConfigConnectionString.cs rename to src/Umbraco.Core/Configuration/ConfigConnectionString.cs diff --git a/src/Umbraco.Abstractions/Configuration/Configs.cs b/src/Umbraco.Core/Configuration/Configs.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/Configs.cs rename to src/Umbraco.Core/Configuration/Configs.cs diff --git a/src/Umbraco.Abstractions/Configuration/ConfigsExtensions.cs b/src/Umbraco.Core/Configuration/ConfigsExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/ConfigsExtensions.cs rename to src/Umbraco.Core/Configuration/ConfigsExtensions.cs diff --git a/src/Umbraco.Abstractions/Configuration/GlobalSettingsExtensions.cs b/src/Umbraco.Core/Configuration/GlobalSettingsExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/GlobalSettingsExtensions.cs rename to src/Umbraco.Core/Configuration/GlobalSettingsExtensions.cs diff --git a/src/Umbraco.Abstractions/Configuration/Grid/GridConfig.cs b/src/Umbraco.Core/Configuration/Grid/GridConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/Grid/GridConfig.cs rename to src/Umbraco.Core/Configuration/Grid/GridConfig.cs diff --git a/src/Umbraco.Abstractions/Configuration/Grid/GridEditorsConfig.cs b/src/Umbraco.Core/Configuration/Grid/GridEditorsConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/Grid/GridEditorsConfig.cs rename to src/Umbraco.Core/Configuration/Grid/GridEditorsConfig.cs diff --git a/src/Umbraco.Abstractions/Configuration/Grid/IGridConfig.cs b/src/Umbraco.Core/Configuration/Grid/IGridConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/Grid/IGridConfig.cs rename to src/Umbraco.Core/Configuration/Grid/IGridConfig.cs diff --git a/src/Umbraco.Abstractions/Configuration/Grid/IGridEditorConfig.cs b/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/Grid/IGridEditorConfig.cs rename to src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs diff --git a/src/Umbraco.Abstractions/Configuration/Grid/IGridEditorsConfig.cs b/src/Umbraco.Core/Configuration/Grid/IGridEditorsConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/Grid/IGridEditorsConfig.cs rename to src/Umbraco.Core/Configuration/Grid/IGridEditorsConfig.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/AbstractConfigCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/AbstractConfigCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/AbstractConfigCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/AbstractConfigCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/AcceptableConfiguration.cs b/src/Umbraco.Core/Configuration/HealthChecks/AcceptableConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/AcceptableConfiguration.cs rename to src/Umbraco.Core/Configuration/HealthChecks/AcceptableConfiguration.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/CompilationDebugCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/CompilationDebugCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/CompilationDebugCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/CompilationDebugCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/ConfigurationService.cs b/src/Umbraco.Core/Configuration/HealthChecks/ConfigurationService.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/ConfigurationService.cs rename to src/Umbraco.Core/Configuration/HealthChecks/ConfigurationService.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/ConfigurationServiceResult.cs b/src/Umbraco.Core/Configuration/HealthChecks/ConfigurationServiceResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/ConfigurationServiceResult.cs rename to src/Umbraco.Core/Configuration/HealthChecks/ConfigurationServiceResult.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/CustomErrorsCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/CustomErrorsCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/CustomErrorsCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/CustomErrorsCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/HealthCheckNotificationVerbosity.cs b/src/Umbraco.Core/Configuration/HealthChecks/HealthCheckNotificationVerbosity.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/HealthCheckNotificationVerbosity.cs rename to src/Umbraco.Core/Configuration/HealthChecks/HealthCheckNotificationVerbosity.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/IDisabledHealthCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/IDisabledHealthCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/IDisabledHealthCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/IDisabledHealthCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/IHealthCheckNotificationSettings.cs b/src/Umbraco.Core/Configuration/HealthChecks/IHealthCheckNotificationSettings.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/IHealthCheckNotificationSettings.cs rename to src/Umbraco.Core/Configuration/HealthChecks/IHealthCheckNotificationSettings.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/IHealthChecks.cs b/src/Umbraco.Core/Configuration/HealthChecks/IHealthChecks.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/IHealthChecks.cs rename to src/Umbraco.Core/Configuration/HealthChecks/IHealthChecks.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/INotificationMethod.cs b/src/Umbraco.Core/Configuration/HealthChecks/INotificationMethod.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/INotificationMethod.cs rename to src/Umbraco.Core/Configuration/HealthChecks/INotificationMethod.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/INotificationMethodSettings.cs b/src/Umbraco.Core/Configuration/HealthChecks/INotificationMethodSettings.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/INotificationMethodSettings.cs rename to src/Umbraco.Core/Configuration/HealthChecks/INotificationMethodSettings.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/MacroErrorsCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/MacroErrorsCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/MacroErrorsCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/MacroErrorsCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/NotificationEmailCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/NotificationEmailCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/NotificationEmailCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/NotificationEmailCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/TraceCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/TraceCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/TraceCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/TraceCheck.cs diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/TrySkipIisCustomErrorsCheck.cs b/src/Umbraco.Core/Configuration/HealthChecks/TrySkipIisCustomErrorsCheck.cs similarity index 86% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/TrySkipIisCustomErrorsCheck.cs rename to src/Umbraco.Core/Configuration/HealthChecks/TrySkipIisCustomErrorsCheck.cs index 58172ba063..e6ec49a1e7 100644 --- a/src/Umbraco.Abstractions/Configuration/HealthChecks/TrySkipIisCustomErrorsCheck.cs +++ b/src/Umbraco.Core/Configuration/HealthChecks/TrySkipIisCustomErrorsCheck.cs @@ -13,13 +13,13 @@ namespace Umbraco.Web.HealthCheck.Checks.Config Group = "Configuration")] public class TrySkipIisCustomErrorsCheck : AbstractConfigCheck { - private readonly IHostingEnvironment _hostingEnvironment; + private readonly Version _iisVersion; public TrySkipIisCustomErrorsCheck(ILocalizedTextService textService, IIOHelper ioHelper, ILogger logger, IHostingEnvironment hostingEnvironment) : base(textService, ioHelper, logger) { - _hostingEnvironment = hostingEnvironment; + _iisVersion = hostingEnvironment.IISVersion; } public override string FilePath => "~/Config/umbracoSettings.config"; @@ -33,7 +33,7 @@ namespace Umbraco.Web.HealthCheck.Checks.Config get { // beware! 7.5 and 7.5.0 are not the same thing! - var recommendedValue = _hostingEnvironment.IISVersion >= new Version("7.5") + var recommendedValue = _iisVersion >= new Version("7.5") ? bool.TrueString.ToLower() : bool.FalseString.ToLower(); return new List { new AcceptableConfiguration { IsRecommended = true, Value = recommendedValue } }; @@ -45,7 +45,7 @@ namespace Umbraco.Web.HealthCheck.Checks.Config get { return TextService.Localize("healthcheck/trySkipIisCustomErrorsCheckSuccessMessage", - new[] { Values.First(v => v.IsRecommended).Value, _hostingEnvironment.IISVersion.ToString() }); + new[] { Values.First(v => v.IsRecommended).Value, _iisVersion.ToString() }); } } @@ -54,7 +54,7 @@ namespace Umbraco.Web.HealthCheck.Checks.Config get { return TextService.Localize("healthcheck/trySkipIisCustomErrorsCheckErrorMessage", - new[] { CurrentValue, Values.First(v => v.IsRecommended).Value, _hostingEnvironment.IISVersion.ToString() }); + new[] { CurrentValue, Values.First(v => v.IsRecommended).Value, _iisVersion.ToString() }); } } @@ -63,7 +63,7 @@ namespace Umbraco.Web.HealthCheck.Checks.Config get { return TextService.Localize("healthcheck/trySkipIisCustomErrorsCheckRectifySuccessMessage", - new[] { Values.First(v => v.IsRecommended).Value, _hostingEnvironment.IISVersion.ToString() }); + new[] { Values.First(v => v.IsRecommended).Value, _iisVersion.ToString() }); } } } diff --git a/src/Umbraco.Abstractions/Configuration/HealthChecks/ValueComparisonType.cs b/src/Umbraco.Core/Configuration/HealthChecks/ValueComparisonType.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/HealthChecks/ValueComparisonType.cs rename to src/Umbraco.Core/Configuration/HealthChecks/ValueComparisonType.cs diff --git a/src/Umbraco.Core/Configuration/IActiveDirectorySettings.cs b/src/Umbraco.Core/Configuration/IActiveDirectorySettings.cs new file mode 100644 index 0000000000..e6b9202c06 --- /dev/null +++ b/src/Umbraco.Core/Configuration/IActiveDirectorySettings.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Configuration +{ + public interface IActiveDirectorySettings + { + string ActiveDirectoryDomain { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/IConfigsFactory.cs b/src/Umbraco.Core/Configuration/IConfigsFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IConfigsFactory.cs rename to src/Umbraco.Core/Configuration/IConfigsFactory.cs diff --git a/src/Umbraco.Abstractions/Configuration/IConnectionStrings.cs b/src/Umbraco.Core/Configuration/IConnectionStrings.cs similarity index 72% rename from src/Umbraco.Abstractions/Configuration/IConnectionStrings.cs rename to src/Umbraco.Core/Configuration/IConnectionStrings.cs index 0d33378669..acd2281a1e 100644 --- a/src/Umbraco.Abstractions/Configuration/IConnectionStrings.cs +++ b/src/Umbraco.Core/Configuration/IConnectionStrings.cs @@ -6,5 +6,7 @@ namespace Umbraco.Core.Configuration { get; } + + void RemoveConnectionString(string umbracoConnectionName); } } diff --git a/src/Umbraco.Abstractions/Configuration/ICoreDebug.cs b/src/Umbraco.Core/Configuration/ICoreDebug.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/ICoreDebug.cs rename to src/Umbraco.Core/Configuration/ICoreDebug.cs diff --git a/src/Umbraco.Core/Configuration/IExceptionFilterSettings.cs b/src/Umbraco.Core/Configuration/IExceptionFilterSettings.cs new file mode 100644 index 0000000000..169c04da5f --- /dev/null +++ b/src/Umbraco.Core/Configuration/IExceptionFilterSettings.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Configuration +{ + public interface IExceptionFilterSettings + { + bool Disabled { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/IGlobalSettings.cs b/src/Umbraco.Core/Configuration/IGlobalSettings.cs similarity index 99% rename from src/Umbraco.Abstractions/Configuration/IGlobalSettings.cs rename to src/Umbraco.Core/Configuration/IGlobalSettings.cs index 1b1f328142..ffc52130cc 100644 --- a/src/Umbraco.Abstractions/Configuration/IGlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/IGlobalSettings.cs @@ -95,5 +95,6 @@ bool DisableElectionForSingleServer { get; } string RegisterType { get; } string DatabaseFactoryServerVersion { get; } + string MainDomLock { get; } } } diff --git a/src/Umbraco.Abstractions/Configuration/IHostingSettings.cs b/src/Umbraco.Core/Configuration/IHostingSettings.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IHostingSettings.cs rename to src/Umbraco.Core/Configuration/IHostingSettings.cs diff --git a/src/Umbraco.Core/Configuration/IIndexCreatorSettings.cs b/src/Umbraco.Core/Configuration/IIndexCreatorSettings.cs new file mode 100644 index 0000000000..b3e2854a0d --- /dev/null +++ b/src/Umbraco.Core/Configuration/IIndexCreatorSettings.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Configuration +{ + public interface IIndexCreatorSettings + { + string LuceneDirectoryFactory { get; } + } +} diff --git a/src/Umbraco.Core/Configuration/IMachineKeyConfig.cs b/src/Umbraco.Core/Configuration/IMachineKeyConfig.cs new file mode 100644 index 0000000000..35969e668a --- /dev/null +++ b/src/Umbraco.Core/Configuration/IMachineKeyConfig.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Configuration +{ + public interface IMachineKeyConfig + { + bool HasMachineKey { get;} + } +} diff --git a/src/Umbraco.Abstractions/Configuration/IMemberPasswordConfiguration.cs b/src/Umbraco.Core/Configuration/IMemberPasswordConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IMemberPasswordConfiguration.cs rename to src/Umbraco.Core/Configuration/IMemberPasswordConfiguration.cs diff --git a/src/Umbraco.ModelsBuilder.Embedded/Configuration/IModelsBuilderConfig.cs b/src/Umbraco.Core/Configuration/IModelsBuilderConfig.cs similarity index 87% rename from src/Umbraco.ModelsBuilder.Embedded/Configuration/IModelsBuilderConfig.cs rename to src/Umbraco.Core/Configuration/IModelsBuilderConfig.cs index 7e96aec60e..6a071ac277 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Configuration/IModelsBuilderConfig.cs +++ b/src/Umbraco.Core/Configuration/IModelsBuilderConfig.cs @@ -1,4 +1,4 @@ -namespace Umbraco.ModelsBuilder.Embedded.Configuration +namespace Umbraco.Core.Configuration { public interface IModelsBuilderConfig { diff --git a/src/Umbraco.Core/Configuration/INuCacheSettings.cs b/src/Umbraco.Core/Configuration/INuCacheSettings.cs new file mode 100644 index 0000000000..c6524297a6 --- /dev/null +++ b/src/Umbraco.Core/Configuration/INuCacheSettings.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Configuration +{ + public interface INuCacheSettings + { + string BTreeBlockSize { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/IPasswordConfiguration.cs b/src/Umbraco.Core/Configuration/IPasswordConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IPasswordConfiguration.cs rename to src/Umbraco.Core/Configuration/IPasswordConfiguration.cs diff --git a/src/Umbraco.Core/Configuration/IRuntimeSettings.cs b/src/Umbraco.Core/Configuration/IRuntimeSettings.cs new file mode 100644 index 0000000000..915e774186 --- /dev/null +++ b/src/Umbraco.Core/Configuration/IRuntimeSettings.cs @@ -0,0 +1,8 @@ +namespace Umbraco.Core.Configuration +{ + public interface IRuntimeSettings + { + int? MaxQueryStringLength { get; } + int? MaxRequestLength { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/ISmtpSettings.cs b/src/Umbraco.Core/Configuration/ISmtpSettings.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/ISmtpSettings.cs rename to src/Umbraco.Core/Configuration/ISmtpSettings.cs diff --git a/src/Umbraco.Core/Configuration/ITypeFinderSettings.cs b/src/Umbraco.Core/Configuration/ITypeFinderSettings.cs new file mode 100644 index 0000000000..15e72a1f40 --- /dev/null +++ b/src/Umbraco.Core/Configuration/ITypeFinderSettings.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Configuration +{ + public interface ITypeFinderSettings + { + string AssembliesAcceptingLoadExceptions { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/IUmbracoConfigurationSection.cs b/src/Umbraco.Core/Configuration/IUmbracoConfigurationSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IUmbracoConfigurationSection.cs rename to src/Umbraco.Core/Configuration/IUmbracoConfigurationSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/IUmbracoVersion.cs b/src/Umbraco.Core/Configuration/IUmbracoVersion.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IUmbracoVersion.cs rename to src/Umbraco.Core/Configuration/IUmbracoVersion.cs diff --git a/src/Umbraco.Abstractions/Configuration/IUserPasswordConfiguration.cs b/src/Umbraco.Core/Configuration/IUserPasswordConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/IUserPasswordConfiguration.cs rename to src/Umbraco.Core/Configuration/IUserPasswordConfiguration.cs diff --git a/src/Umbraco.Abstractions/Configuration/LocalTempStorage.cs b/src/Umbraco.Core/Configuration/LocalTempStorage.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/LocalTempStorage.cs rename to src/Umbraco.Core/Configuration/LocalTempStorage.cs diff --git a/src/Umbraco.Abstractions/Configuration/MemberPasswordConfiguration.cs b/src/Umbraco.Core/Configuration/MemberPasswordConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/MemberPasswordConfiguration.cs rename to src/Umbraco.Core/Configuration/MemberPasswordConfiguration.cs diff --git a/src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsMode.cs b/src/Umbraco.Core/Configuration/ModelsMode.cs similarity index 92% rename from src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsMode.cs rename to src/Umbraco.Core/Configuration/ModelsMode.cs index e0286fdab1..2483367394 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsMode.cs +++ b/src/Umbraco.Core/Configuration/ModelsMode.cs @@ -1,4 +1,4 @@ -namespace Umbraco.ModelsBuilder.Embedded.Configuration +namespace Umbraco.Core.Configuration { /// /// Defines the models generation modes. @@ -8,7 +8,7 @@ /// /// Do not generate models. /// - Nothing = 0, // default value + Nothing = 0, // default value /// /// Generate models in memory. diff --git a/src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsModeExtensions.cs b/src/Umbraco.Core/Configuration/ModelsModeExtensions.cs similarity index 94% rename from src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsModeExtensions.cs rename to src/Umbraco.Core/Configuration/ModelsModeExtensions.cs index be638729ea..8d1b51cd28 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Configuration/ModelsModeExtensions.cs +++ b/src/Umbraco.Core/Configuration/ModelsModeExtensions.cs @@ -1,4 +1,6 @@ -namespace Umbraco.ModelsBuilder.Embedded.Configuration +using Umbraco.Core.Configuration; + +namespace Umbraco.Configuration { /// /// Provides extensions for the enumeration. diff --git a/src/Umbraco.Abstractions/Configuration/PasswordConfiguration.cs b/src/Umbraco.Core/Configuration/PasswordConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/PasswordConfiguration.cs rename to src/Umbraco.Core/Configuration/PasswordConfiguration.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ContentSectionExtensions.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ContentSectionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/ContentSectionExtensions.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/ContentSectionExtensions.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IBackOfficeSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IBackOfficeSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IBackOfficeSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IBackOfficeSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IChar.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IChar.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IChar.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IChar.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IContentErrorPage.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IContentErrorPage.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IContentErrorPage.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IContentErrorPage.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IContentSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IContentSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IImagingAutoFillUploadField.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IImagingAutoFillUploadField.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IImagingAutoFillUploadField.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IImagingAutoFillUploadField.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IKeepAliveSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IKeepAliveSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IKeepAliveSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IKeepAliveSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ILoggingSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ILoggingSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/ILoggingSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/ILoggingSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IRequestHandlerSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IRequestHandlerSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IRequestHandlerSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IRequestHandlerSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ISecuritySection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ISecuritySection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/ISecuritySection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/ISecuritySection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ITourSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ITourSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/ITourSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/ITourSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ITypeFinderConfig.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ITypeFinderConfig.cs similarity index 72% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/ITypeFinderConfig.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/ITypeFinderConfig.cs index fd5b18ed39..a290c26d15 100644 --- a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ITypeFinderConfig.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/ITypeFinderConfig.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; namespace Umbraco.Core.Configuration.UmbracoSettings { diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUmbracoSettingsSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IUmbracoSettingsSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUmbracoSettingsSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IUmbracoSettingsSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IWebRoutingSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IWebRoutingSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoSettings/IWebRoutingSection.cs rename to src/Umbraco.Core/Configuration/UmbracoSettings/IWebRoutingSection.cs diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UmbracoVersion.cs rename to src/Umbraco.Core/Configuration/UmbracoVersion.cs diff --git a/src/Umbraco.Abstractions/Configuration/UserPasswordConfiguration.cs b/src/Umbraco.Core/Configuration/UserPasswordConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/Configuration/UserPasswordConfiguration.cs rename to src/Umbraco.Core/Configuration/UserPasswordConfiguration.cs diff --git a/src/Umbraco.Abstractions/Constants-AppSettings.cs b/src/Umbraco.Core/Constants-AppSettings.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-AppSettings.cs rename to src/Umbraco.Core/Constants-AppSettings.cs diff --git a/src/Umbraco.Abstractions/Constants-Applications.cs b/src/Umbraco.Core/Constants-Applications.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-Applications.cs rename to src/Umbraco.Core/Constants-Applications.cs diff --git a/src/Umbraco.Abstractions/Constants-Composing.cs b/src/Umbraco.Core/Constants-Composing.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-Composing.cs rename to src/Umbraco.Core/Constants-Composing.cs diff --git a/src/Umbraco.Abstractions/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-Conventions.cs rename to src/Umbraco.Core/Constants-Conventions.cs diff --git a/src/Umbraco.Abstractions/Constants-DataTypes.cs b/src/Umbraco.Core/Constants-DataTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-DataTypes.cs rename to src/Umbraco.Core/Constants-DataTypes.cs diff --git a/src/Umbraco.Abstractions/Constants-DatabaseProviders.cs b/src/Umbraco.Core/Constants-DatabaseProviders.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-DatabaseProviders.cs rename to src/Umbraco.Core/Constants-DatabaseProviders.cs diff --git a/src/Umbraco.Abstractions/Constants-DeploySelector.cs b/src/Umbraco.Core/Constants-DeploySelector.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-DeploySelector.cs rename to src/Umbraco.Core/Constants-DeploySelector.cs diff --git a/src/Umbraco.Abstractions/Constants-Icons.cs b/src/Umbraco.Core/Constants-Icons.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-Icons.cs rename to src/Umbraco.Core/Constants-Icons.cs diff --git a/src/Umbraco.Abstractions/Constants-Indexes.cs b/src/Umbraco.Core/Constants-Indexes.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-Indexes.cs rename to src/Umbraco.Core/Constants-Indexes.cs diff --git a/src/Umbraco.Core/Constants-ModelsBuilder.cs b/src/Umbraco.Core/Constants-ModelsBuilder.cs new file mode 100644 index 0000000000..28e70ed383 --- /dev/null +++ b/src/Umbraco.Core/Constants-ModelsBuilder.cs @@ -0,0 +1,17 @@ +namespace Umbraco.Core +{ + /// + /// Defines constants. + /// + public static partial class Constants + { + /// + /// Defines constants for ModelsBuilder. + /// + public static class ModelsBuilder + { + + public const string DefaultModelsNamespace = "Umbraco.Web.PublishedModels"; + } + } +} diff --git a/src/Umbraco.Abstractions/Constants-ObjectTypes.cs b/src/Umbraco.Core/Constants-ObjectTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-ObjectTypes.cs rename to src/Umbraco.Core/Constants-ObjectTypes.cs diff --git a/src/Umbraco.Abstractions/Constants-PackageRepository.cs b/src/Umbraco.Core/Constants-PackageRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-PackageRepository.cs rename to src/Umbraco.Core/Constants-PackageRepository.cs diff --git a/src/Umbraco.Abstractions/Constants-PropertyEditors.cs b/src/Umbraco.Core/Constants-PropertyEditors.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-PropertyEditors.cs rename to src/Umbraco.Core/Constants-PropertyEditors.cs diff --git a/src/Umbraco.Abstractions/Constants-PropertyTypeGroups.cs b/src/Umbraco.Core/Constants-PropertyTypeGroups.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-PropertyTypeGroups.cs rename to src/Umbraco.Core/Constants-PropertyTypeGroups.cs diff --git a/src/Umbraco.Abstractions/Constants-Security.cs b/src/Umbraco.Core/Constants-Security.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-Security.cs rename to src/Umbraco.Core/Constants-Security.cs diff --git a/src/Umbraco.Abstractions/Constants-System.cs b/src/Umbraco.Core/Constants-System.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-System.cs rename to src/Umbraco.Core/Constants-System.cs diff --git a/src/Umbraco.Abstractions/Constants-SystemDirectories.cs b/src/Umbraco.Core/Constants-SystemDirectories.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-SystemDirectories.cs rename to src/Umbraco.Core/Constants-SystemDirectories.cs diff --git a/src/Umbraco.Abstractions/Constants-UdiEntityType.cs b/src/Umbraco.Core/Constants-UdiEntityType.cs similarity index 100% rename from src/Umbraco.Abstractions/Constants-UdiEntityType.cs rename to src/Umbraco.Core/Constants-UdiEntityType.cs diff --git a/src/Umbraco.Abstractions/Constants-Web.cs b/src/Umbraco.Core/Constants-Web.cs similarity index 56% rename from src/Umbraco.Abstractions/Constants-Web.cs rename to src/Umbraco.Core/Constants-Web.cs index 64216ba571..5b64319fb0 100644 --- a/src/Umbraco.Abstractions/Constants-Web.cs +++ b/src/Umbraco.Core/Constants-Web.cs @@ -19,6 +19,22 @@ public const string PreviewCookieName = "UMB_PREVIEW"; public const string InstallerCookieName = "umb_installId"; + + /// + /// The cookie name that is used to store the validation value + /// + public const string CsrfValidationCookieName = "UMB-XSRF-V"; + + /// + /// The cookie name that is set for angular to use to pass in to the header value for "X-UMB-XSRF-TOKEN" + /// + public const string AngularCookieName = "UMB-XSRF-TOKEN"; + + /// + /// The header name that angular uses to pass in the token to validate the cookie + /// + public const string AngularHeadername = "X-UMB-XSRF-TOKEN"; + } } } diff --git a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs b/src/Umbraco.Core/ContentApps/ContentAppFactoryCollection.cs similarity index 85% rename from src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs rename to src/Umbraco.Core/ContentApps/ContentAppFactoryCollection.cs index f8f57ce4fd..4e85e51af3 100644 --- a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollection.cs +++ b/src/Umbraco.Core/ContentApps/ContentAppFactoryCollection.cs @@ -4,7 +4,6 @@ using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Models.ContentEditing; using Umbraco.Core.Logging; -using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; namespace Umbraco.Web.ContentApps @@ -12,18 +11,18 @@ namespace Umbraco.Web.ContentApps public class ContentAppFactoryCollection : BuilderCollectionBase { private readonly ILogger _logger; - private readonly ICurrentUserAccessor _currentUserAccessor; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; - public ContentAppFactoryCollection(IEnumerable items, ILogger logger, ICurrentUserAccessor currentUserAccessor) + public ContentAppFactoryCollection(IEnumerable items, ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(items) { _logger = logger; - _currentUserAccessor = currentUserAccessor; + _umbracoContextAccessor = umbracoContextAccessor; } private IEnumerable GetCurrentUserGroups() { - var currentUser = _currentUserAccessor.TryGetCurrentUser(); + var currentUser = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser; return currentUser == null ? Enumerable.Empty() : currentUser.Groups; diff --git a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs b/src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs similarity index 92% rename from src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs rename to src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs index 0e21823b90..f3d3a149d5 100644 --- a/src/Umbraco.Abstractions/ContentApps/ContentAppFactoryCollectionBuilder.cs +++ b/src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs @@ -19,8 +19,8 @@ namespace Umbraco.Web.ContentApps { // get the logger just-in-time - see note below for manifest parser var logger = factory.GetInstance(); - var currentUserAccessor = factory.GetInstance(); - return new ContentAppFactoryCollection(CreateItems(factory), logger, currentUserAccessor); + var umbracoContextAccessor = factory.GetInstance(); + return new ContentAppFactoryCollection(CreateItems(factory), logger, umbracoContextAccessor); } protected override IEnumerable CreateItems(IFactory factory) diff --git a/src/Umbraco.Abstractions/ContentApps/ContentEditorContentAppFactory.cs b/src/Umbraco.Core/ContentApps/ContentEditorContentAppFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/ContentApps/ContentEditorContentAppFactory.cs rename to src/Umbraco.Core/ContentApps/ContentEditorContentAppFactory.cs diff --git a/src/Umbraco.Abstractions/ContentApps/ContentInfoContentAppFactory.cs b/src/Umbraco.Core/ContentApps/ContentInfoContentAppFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/ContentApps/ContentInfoContentAppFactory.cs rename to src/Umbraco.Core/ContentApps/ContentInfoContentAppFactory.cs diff --git a/src/Umbraco.Abstractions/ContentApps/ListViewContentAppFactory.cs b/src/Umbraco.Core/ContentApps/ListViewContentAppFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/ContentApps/ListViewContentAppFactory.cs rename to src/Umbraco.Core/ContentApps/ListViewContentAppFactory.cs diff --git a/src/Umbraco.Abstractions/ContentExtensions.cs b/src/Umbraco.Core/ContentExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ContentExtensions.cs rename to src/Umbraco.Core/ContentExtensions.cs diff --git a/src/Umbraco.Abstractions/ContentVariationExtensions.cs b/src/Umbraco.Core/ContentVariationExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ContentVariationExtensions.cs rename to src/Umbraco.Core/ContentVariationExtensions.cs diff --git a/src/Umbraco.Core/Cookie/ICookieManager.cs b/src/Umbraco.Core/Cookie/ICookieManager.cs new file mode 100644 index 0000000000..0eced07b37 --- /dev/null +++ b/src/Umbraco.Core/Cookie/ICookieManager.cs @@ -0,0 +1,11 @@ +namespace Umbraco.Core.Cookie +{ + public interface ICookieManager + { + void ExpireCookie(string cookieName); + string GetCookieValue(string cookieName); + void SetCookieValue(string cookieName, string value); + bool HasCookie(string cookieName); + } + +} diff --git a/src/Umbraco.Abstractions/CustomBooleanTypeConverter.cs b/src/Umbraco.Core/CustomBooleanTypeConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/CustomBooleanTypeConverter.cs rename to src/Umbraco.Core/CustomBooleanTypeConverter.cs diff --git a/src/Umbraco.Abstractions/Dashboards/AccessRule.cs b/src/Umbraco.Core/Dashboards/AccessRule.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/AccessRule.cs rename to src/Umbraco.Core/Dashboards/AccessRule.cs diff --git a/src/Umbraco.Abstractions/Dashboards/AccessRuleType.cs b/src/Umbraco.Core/Dashboards/AccessRuleType.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/AccessRuleType.cs rename to src/Umbraco.Core/Dashboards/AccessRuleType.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/ContentDashboard.cs b/src/Umbraco.Core/Dashboards/ContentDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/ContentDashboard.cs rename to src/Umbraco.Core/Dashboards/ContentDashboard.cs diff --git a/src/Umbraco.Abstractions/Dashboards/DashboardCollection.cs b/src/Umbraco.Core/Dashboards/DashboardCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/DashboardCollection.cs rename to src/Umbraco.Core/Dashboards/DashboardCollection.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/DashboardCollectionBuilder.cs b/src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/DashboardCollectionBuilder.cs rename to src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Dashboards/DashboardSlim.cs b/src/Umbraco.Core/Dashboards/DashboardSlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/DashboardSlim.cs rename to src/Umbraco.Core/Dashboards/DashboardSlim.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/ExamineDashboard.cs b/src/Umbraco.Core/Dashboards/ExamineDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/ExamineDashboard.cs rename to src/Umbraco.Core/Dashboards/ExamineDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/FormsDashboard.cs b/src/Umbraco.Core/Dashboards/FormsDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/FormsDashboard.cs rename to src/Umbraco.Core/Dashboards/FormsDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/HealthCheckDashboard.cs b/src/Umbraco.Core/Dashboards/HealthCheckDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/HealthCheckDashboard.cs rename to src/Umbraco.Core/Dashboards/HealthCheckDashboard.cs diff --git a/src/Umbraco.Abstractions/Dashboards/IAccessRule.cs b/src/Umbraco.Core/Dashboards/IAccessRule.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/IAccessRule.cs rename to src/Umbraco.Core/Dashboards/IAccessRule.cs diff --git a/src/Umbraco.Abstractions/Dashboards/IDashboard.cs b/src/Umbraco.Core/Dashboards/IDashboard.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/IDashboard.cs rename to src/Umbraco.Core/Dashboards/IDashboard.cs diff --git a/src/Umbraco.Abstractions/Dashboards/IDashboardSlim.cs b/src/Umbraco.Core/Dashboards/IDashboardSlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Dashboards/IDashboardSlim.cs rename to src/Umbraco.Core/Dashboards/IDashboardSlim.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/MediaDashboard.cs b/src/Umbraco.Core/Dashboards/MediaDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/MediaDashboard.cs rename to src/Umbraco.Core/Dashboards/MediaDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/MembersDashboard.cs b/src/Umbraco.Core/Dashboards/MembersDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/MembersDashboard.cs rename to src/Umbraco.Core/Dashboards/MembersDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/ProfilerDashboard.cs b/src/Umbraco.Core/Dashboards/ProfilerDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/ProfilerDashboard.cs rename to src/Umbraco.Core/Dashboards/ProfilerDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/PublishedStatusDashboard.cs b/src/Umbraco.Core/Dashboards/PublishedStatusDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/PublishedStatusDashboard.cs rename to src/Umbraco.Core/Dashboards/PublishedStatusDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/RedirectUrlDashboard.cs b/src/Umbraco.Core/Dashboards/RedirectUrlDashboard.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/RedirectUrlDashboard.cs rename to src/Umbraco.Core/Dashboards/RedirectUrlDashboard.cs diff --git a/src/Umbraco.Web.BackOffice/Dashboards/SettingsDashboards.cs b/src/Umbraco.Core/Dashboards/SettingsDashboards.cs similarity index 100% rename from src/Umbraco.Web.BackOffice/Dashboards/SettingsDashboards.cs rename to src/Umbraco.Core/Dashboards/SettingsDashboards.cs diff --git a/src/Umbraco.Abstractions/DataTableExtensions.cs b/src/Umbraco.Core/DataTableExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/DataTableExtensions.cs rename to src/Umbraco.Core/DataTableExtensions.cs diff --git a/src/Umbraco.Abstractions/DateTimeExtensions.cs b/src/Umbraco.Core/DateTimeExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/DateTimeExtensions.cs rename to src/Umbraco.Core/DateTimeExtensions.cs diff --git a/src/Umbraco.Abstractions/DecimalExtensions.cs b/src/Umbraco.Core/DecimalExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/DecimalExtensions.cs rename to src/Umbraco.Core/DecimalExtensions.cs diff --git a/src/Umbraco.Abstractions/DelegateEqualityComparer.cs b/src/Umbraco.Core/DelegateEqualityComparer.cs similarity index 100% rename from src/Umbraco.Abstractions/DelegateEqualityComparer.cs rename to src/Umbraco.Core/DelegateEqualityComparer.cs diff --git a/src/Umbraco.Abstractions/DelegateExtensions.cs b/src/Umbraco.Core/DelegateExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/DelegateExtensions.cs rename to src/Umbraco.Core/DelegateExtensions.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactBase.cs b/src/Umbraco.Core/Deploy/ArtifactBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactBase.cs rename to src/Umbraco.Core/Deploy/ArtifactBase.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactDependency.cs b/src/Umbraco.Core/Deploy/ArtifactDependency.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactDependency.cs rename to src/Umbraco.Core/Deploy/ArtifactDependency.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactDependencyCollection.cs b/src/Umbraco.Core/Deploy/ArtifactDependencyCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactDependencyCollection.cs rename to src/Umbraco.Core/Deploy/ArtifactDependencyCollection.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactDependencyMode.cs b/src/Umbraco.Core/Deploy/ArtifactDependencyMode.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactDependencyMode.cs rename to src/Umbraco.Core/Deploy/ArtifactDependencyMode.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactDeployState.cs b/src/Umbraco.Core/Deploy/ArtifactDeployState.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactDeployState.cs rename to src/Umbraco.Core/Deploy/ArtifactDeployState.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs b/src/Umbraco.Core/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs rename to src/Umbraco.Core/Deploy/ArtifactDeployStateOfTArtifactTEntity.cs diff --git a/src/Umbraco.Abstractions/Deploy/ArtifactSignature.cs b/src/Umbraco.Core/Deploy/ArtifactSignature.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ArtifactSignature.cs rename to src/Umbraco.Core/Deploy/ArtifactSignature.cs diff --git a/src/Umbraco.Abstractions/Deploy/Difference.cs b/src/Umbraco.Core/Deploy/Difference.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/Difference.cs rename to src/Umbraco.Core/Deploy/Difference.cs diff --git a/src/Umbraco.Abstractions/Deploy/Direction.cs b/src/Umbraco.Core/Deploy/Direction.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/Direction.cs rename to src/Umbraco.Core/Deploy/Direction.cs diff --git a/src/Umbraco.Abstractions/Deploy/IArtifact.cs b/src/Umbraco.Core/Deploy/IArtifact.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IArtifact.cs rename to src/Umbraco.Core/Deploy/IArtifact.cs diff --git a/src/Umbraco.Abstractions/Deploy/IArtifactSignature.cs b/src/Umbraco.Core/Deploy/IArtifactSignature.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IArtifactSignature.cs rename to src/Umbraco.Core/Deploy/IArtifactSignature.cs diff --git a/src/Umbraco.Abstractions/Deploy/IDataTypeConfigurationConnector.cs b/src/Umbraco.Core/Deploy/IDataTypeConfigurationConnector.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IDataTypeConfigurationConnector.cs rename to src/Umbraco.Core/Deploy/IDataTypeConfigurationConnector.cs diff --git a/src/Umbraco.Abstractions/Deploy/IDeployContext.cs b/src/Umbraco.Core/Deploy/IDeployContext.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IDeployContext.cs rename to src/Umbraco.Core/Deploy/IDeployContext.cs diff --git a/src/Umbraco.Abstractions/Deploy/IFileSource.cs b/src/Umbraco.Core/Deploy/IFileSource.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IFileSource.cs rename to src/Umbraco.Core/Deploy/IFileSource.cs diff --git a/src/Umbraco.Abstractions/Deploy/IFileType.cs b/src/Umbraco.Core/Deploy/IFileType.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IFileType.cs rename to src/Umbraco.Core/Deploy/IFileType.cs diff --git a/src/Umbraco.Abstractions/Deploy/IFileTypeCollection.cs b/src/Umbraco.Core/Deploy/IFileTypeCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IFileTypeCollection.cs rename to src/Umbraco.Core/Deploy/IFileTypeCollection.cs diff --git a/src/Umbraco.Abstractions/Deploy/IImageSourceParser.cs b/src/Umbraco.Core/Deploy/IImageSourceParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IImageSourceParser.cs rename to src/Umbraco.Core/Deploy/IImageSourceParser.cs diff --git a/src/Umbraco.Abstractions/Deploy/ILocalLinkParser.cs b/src/Umbraco.Core/Deploy/ILocalLinkParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/ILocalLinkParser.cs rename to src/Umbraco.Core/Deploy/ILocalLinkParser.cs diff --git a/src/Umbraco.Abstractions/Deploy/IMacroParser.cs b/src/Umbraco.Core/Deploy/IMacroParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IMacroParser.cs rename to src/Umbraco.Core/Deploy/IMacroParser.cs diff --git a/src/Umbraco.Abstractions/Deploy/IServiceConnector.cs b/src/Umbraco.Core/Deploy/IServiceConnector.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IServiceConnector.cs rename to src/Umbraco.Core/Deploy/IServiceConnector.cs diff --git a/src/Umbraco.Abstractions/Deploy/IUniqueIdentifyingServiceConnector.cs b/src/Umbraco.Core/Deploy/IUniqueIdentifyingServiceConnector.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IUniqueIdentifyingServiceConnector.cs rename to src/Umbraco.Core/Deploy/IUniqueIdentifyingServiceConnector.cs diff --git a/src/Umbraco.Abstractions/Deploy/IValueConnector.cs b/src/Umbraco.Core/Deploy/IValueConnector.cs similarity index 100% rename from src/Umbraco.Abstractions/Deploy/IValueConnector.cs rename to src/Umbraco.Core/Deploy/IValueConnector.cs diff --git a/src/Umbraco.Abstractions/Dictionary/ICultureDictionary.cs b/src/Umbraco.Core/Dictionary/ICultureDictionary.cs similarity index 100% rename from src/Umbraco.Abstractions/Dictionary/ICultureDictionary.cs rename to src/Umbraco.Core/Dictionary/ICultureDictionary.cs diff --git a/src/Umbraco.Abstractions/Dictionary/ICultureDictionaryFactory.cs b/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Dictionary/ICultureDictionaryFactory.cs rename to src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs diff --git a/src/Umbraco.Abstractions/DictionaryExtensions.cs b/src/Umbraco.Core/DictionaryExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/DictionaryExtensions.cs rename to src/Umbraco.Core/DictionaryExtensions.cs diff --git a/src/Umbraco.Abstractions/Direction.cs b/src/Umbraco.Core/Direction.cs similarity index 100% rename from src/Umbraco.Abstractions/Direction.cs rename to src/Umbraco.Core/Direction.cs diff --git a/src/Umbraco.Abstractions/DisposableObjectSlim.cs b/src/Umbraco.Core/DisposableObjectSlim.cs similarity index 100% rename from src/Umbraco.Abstractions/DisposableObjectSlim.cs rename to src/Umbraco.Core/DisposableObjectSlim.cs diff --git a/src/Umbraco.Web/Editors/EditorModelEventArgs.cs b/src/Umbraco.Core/Editors/EditorModelEventArgs.cs similarity index 81% rename from src/Umbraco.Web/Editors/EditorModelEventArgs.cs rename to src/Umbraco.Core/Editors/EditorModelEventArgs.cs index daf262fce5..24ee1a3d85 100644 --- a/src/Umbraco.Web/Editors/EditorModelEventArgs.cs +++ b/src/Umbraco.Core/Editors/EditorModelEventArgs.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.Editors Model = (T)baseArgs.Model; } - public EditorModelEventArgs(T model, UmbracoContext umbracoContext) + public EditorModelEventArgs(T model, IUmbracoContext umbracoContext) : base(model, umbracoContext) { Model = model; @@ -34,13 +34,13 @@ namespace Umbraco.Web.Editors public class EditorModelEventArgs : EventArgs { - public EditorModelEventArgs(object model, UmbracoContext umbracoContext) + public EditorModelEventArgs(object model, IUmbracoContext umbracoContext) { Model = model; UmbracoContext = umbracoContext; } public object Model { get; set; } - public UmbracoContext UmbracoContext { get; } + public IUmbracoContext UmbracoContext { get; } } } diff --git a/src/Umbraco.Web/Editors/EditorValidatorCollection.cs b/src/Umbraco.Core/Editors/EditorValidatorCollection.cs similarity index 100% rename from src/Umbraco.Web/Editors/EditorValidatorCollection.cs rename to src/Umbraco.Core/Editors/EditorValidatorCollection.cs diff --git a/src/Umbraco.Web/Editors/EditorValidatorCollectionBuilder.cs b/src/Umbraco.Core/Editors/EditorValidatorCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Web/Editors/EditorValidatorCollectionBuilder.cs rename to src/Umbraco.Core/Editors/EditorValidatorCollectionBuilder.cs diff --git a/src/Umbraco.Web/Editors/EditorValidatorOfT.cs b/src/Umbraco.Core/Editors/EditorValidatorOfT.cs similarity index 100% rename from src/Umbraco.Web/Editors/EditorValidatorOfT.cs rename to src/Umbraco.Core/Editors/EditorValidatorOfT.cs diff --git a/src/Umbraco.Web/Editors/IEditorValidator.cs b/src/Umbraco.Core/Editors/IEditorValidator.cs similarity index 100% rename from src/Umbraco.Web/Editors/IEditorValidator.cs rename to src/Umbraco.Core/Editors/IEditorValidator.cs diff --git a/src/Umbraco.Abstractions/EmailSender.cs b/src/Umbraco.Core/EmailSender.cs similarity index 100% rename from src/Umbraco.Abstractions/EmailSender.cs rename to src/Umbraco.Core/EmailSender.cs diff --git a/src/Umbraco.Abstractions/Enum.cs b/src/Umbraco.Core/Enum.cs similarity index 100% rename from src/Umbraco.Abstractions/Enum.cs rename to src/Umbraco.Core/Enum.cs diff --git a/src/Umbraco.Abstractions/EnumExtensions.cs b/src/Umbraco.Core/EnumExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/EnumExtensions.cs rename to src/Umbraco.Core/EnumExtensions.cs diff --git a/src/Umbraco.Abstractions/EnumerableExtensions.cs b/src/Umbraco.Core/EnumerableExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/EnumerableExtensions.cs rename to src/Umbraco.Core/EnumerableExtensions.cs diff --git a/src/Umbraco.Abstractions/Events/CancellableEnumerableObjectEventArgs.cs b/src/Umbraco.Core/Events/CancellableEnumerableObjectEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/CancellableEnumerableObjectEventArgs.cs rename to src/Umbraco.Core/Events/CancellableEnumerableObjectEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/CancellableEventArgs.cs b/src/Umbraco.Core/Events/CancellableEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/CancellableEventArgs.cs rename to src/Umbraco.Core/Events/CancellableEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/CancellableObjectEventArgs.cs b/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/CancellableObjectEventArgs.cs rename to src/Umbraco.Core/Events/CancellableObjectEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/CancellableObjectEventArgsOfTEventObject.cs b/src/Umbraco.Core/Events/CancellableObjectEventArgsOfTEventObject.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/CancellableObjectEventArgsOfTEventObject.cs rename to src/Umbraco.Core/Events/CancellableObjectEventArgsOfTEventObject.cs diff --git a/src/Umbraco.Abstractions/Events/ContentCacheEventArgs.cs b/src/Umbraco.Core/Events/ContentCacheEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ContentCacheEventArgs.cs rename to src/Umbraco.Core/Events/ContentCacheEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/ContentPublishedEventArgs.cs b/src/Umbraco.Core/Events/ContentPublishedEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ContentPublishedEventArgs.cs rename to src/Umbraco.Core/Events/ContentPublishedEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/ContentPublishingEventArgs.cs b/src/Umbraco.Core/Events/ContentPublishingEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ContentPublishingEventArgs.cs rename to src/Umbraco.Core/Events/ContentPublishingEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/ContentSavedEventArgs.cs b/src/Umbraco.Core/Events/ContentSavedEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ContentSavedEventArgs.cs rename to src/Umbraco.Core/Events/ContentSavedEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/ContentSavingEventArgs.cs b/src/Umbraco.Core/Events/ContentSavingEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ContentSavingEventArgs.cs rename to src/Umbraco.Core/Events/ContentSavingEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/CopyEventArgs.cs b/src/Umbraco.Core/Events/CopyEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/CopyEventArgs.cs rename to src/Umbraco.Core/Events/CopyEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/DatabaseCreationEventArgs.cs b/src/Umbraco.Core/Events/DatabaseCreationEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/DatabaseCreationEventArgs.cs rename to src/Umbraco.Core/Events/DatabaseCreationEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/DeleteEventArgs.cs b/src/Umbraco.Core/Events/DeleteEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/DeleteEventArgs.cs rename to src/Umbraco.Core/Events/DeleteEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/DeleteRevisionsEventArgs.cs b/src/Umbraco.Core/Events/DeleteRevisionsEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/DeleteRevisionsEventArgs.cs rename to src/Umbraco.Core/Events/DeleteRevisionsEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/EventDefinition.cs b/src/Umbraco.Core/Events/EventDefinition.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventDefinition.cs rename to src/Umbraco.Core/Events/EventDefinition.cs diff --git a/src/Umbraco.Abstractions/Events/EventDefinitionBase.cs b/src/Umbraco.Core/Events/EventDefinitionBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventDefinitionBase.cs rename to src/Umbraco.Core/Events/EventDefinitionBase.cs diff --git a/src/Umbraco.Abstractions/Events/EventDefinitionFilter.cs b/src/Umbraco.Core/Events/EventDefinitionFilter.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventDefinitionFilter.cs rename to src/Umbraco.Core/Events/EventDefinitionFilter.cs diff --git a/src/Umbraco.Abstractions/Events/EventExtensions.cs b/src/Umbraco.Core/Events/EventExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventExtensions.cs rename to src/Umbraco.Core/Events/EventExtensions.cs diff --git a/src/Umbraco.Abstractions/Events/EventMessage.cs b/src/Umbraco.Core/Events/EventMessage.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventMessage.cs rename to src/Umbraco.Core/Events/EventMessage.cs diff --git a/src/Umbraco.Abstractions/Events/EventMessageType.cs b/src/Umbraco.Core/Events/EventMessageType.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventMessageType.cs rename to src/Umbraco.Core/Events/EventMessageType.cs diff --git a/src/Umbraco.Abstractions/Events/EventMessages.cs b/src/Umbraco.Core/Events/EventMessages.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventMessages.cs rename to src/Umbraco.Core/Events/EventMessages.cs diff --git a/src/Umbraco.Abstractions/Events/EventNameExtractor.cs b/src/Umbraco.Core/Events/EventNameExtractor.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventNameExtractor.cs rename to src/Umbraco.Core/Events/EventNameExtractor.cs diff --git a/src/Umbraco.Abstractions/Events/EventNameExtractorError.cs b/src/Umbraco.Core/Events/EventNameExtractorError.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventNameExtractorError.cs rename to src/Umbraco.Core/Events/EventNameExtractorError.cs diff --git a/src/Umbraco.Abstractions/Events/EventNameExtractorResult.cs b/src/Umbraco.Core/Events/EventNameExtractorResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/EventNameExtractorResult.cs rename to src/Umbraco.Core/Events/EventNameExtractorResult.cs diff --git a/src/Umbraco.Abstractions/Events/ExportedMemberEventArgs.cs b/src/Umbraco.Core/Events/ExportedMemberEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ExportedMemberEventArgs.cs rename to src/Umbraco.Core/Events/ExportedMemberEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/IDeletingMediaFilesEventArgs.cs b/src/Umbraco.Core/Events/IDeletingMediaFilesEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/IDeletingMediaFilesEventArgs.cs rename to src/Umbraco.Core/Events/IDeletingMediaFilesEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/IEventDefinition.cs b/src/Umbraco.Core/Events/IEventDefinition.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/IEventDefinition.cs rename to src/Umbraco.Core/Events/IEventDefinition.cs diff --git a/src/Umbraco.Abstractions/Events/IEventDispatcher.cs b/src/Umbraco.Core/Events/IEventDispatcher.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/IEventDispatcher.cs rename to src/Umbraco.Core/Events/IEventDispatcher.cs diff --git a/src/Umbraco.Abstractions/Events/IEventMessagesAccessor.cs b/src/Umbraco.Core/Events/IEventMessagesAccessor.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/IEventMessagesAccessor.cs rename to src/Umbraco.Core/Events/IEventMessagesAccessor.cs diff --git a/src/Umbraco.Abstractions/Events/IEventMessagesFactory.cs b/src/Umbraco.Core/Events/IEventMessagesFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/IEventMessagesFactory.cs rename to src/Umbraco.Core/Events/IEventMessagesFactory.cs diff --git a/src/Umbraco.Abstractions/Events/ImportPackageEventArgs.cs b/src/Umbraco.Core/Events/ImportPackageEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/ImportPackageEventArgs.cs rename to src/Umbraco.Core/Events/ImportPackageEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/MacroErrorEventArgs.cs b/src/Umbraco.Core/Events/MacroErrorEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/MacroErrorEventArgs.cs rename to src/Umbraco.Core/Events/MacroErrorEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/MoveEventArgs.cs b/src/Umbraco.Core/Events/MoveEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/MoveEventArgs.cs rename to src/Umbraco.Core/Events/MoveEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/MoveEventInfo.cs b/src/Umbraco.Core/Events/MoveEventInfo.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/MoveEventInfo.cs rename to src/Umbraco.Core/Events/MoveEventInfo.cs diff --git a/src/Umbraco.Abstractions/Events/NewEventArgs.cs b/src/Umbraco.Core/Events/NewEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/NewEventArgs.cs rename to src/Umbraco.Core/Events/NewEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/PassThroughEventDispatcher.cs b/src/Umbraco.Core/Events/PassThroughEventDispatcher.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/PassThroughEventDispatcher.cs rename to src/Umbraco.Core/Events/PassThroughEventDispatcher.cs diff --git a/src/Umbraco.Abstractions/Events/PublishEventArgs.cs b/src/Umbraco.Core/Events/PublishEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/PublishEventArgs.cs rename to src/Umbraco.Core/Events/PublishEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/QueuingEventDispatcherBase.cs b/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/QueuingEventDispatcherBase.cs rename to src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs diff --git a/src/Umbraco.Abstractions/Events/RecycleBinEventArgs.cs b/src/Umbraco.Core/Events/RecycleBinEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/RecycleBinEventArgs.cs rename to src/Umbraco.Core/Events/RecycleBinEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/RefreshContentEventArgs.cs b/src/Umbraco.Core/Events/RefreshContentEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/RefreshContentEventArgs.cs rename to src/Umbraco.Core/Events/RefreshContentEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/RolesEventArgs.cs b/src/Umbraco.Core/Events/RolesEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/RolesEventArgs.cs rename to src/Umbraco.Core/Events/RolesEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/RollbackEventArgs.cs b/src/Umbraco.Core/Events/RollbackEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/RollbackEventArgs.cs rename to src/Umbraco.Core/Events/RollbackEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/SaveEventArgs.cs b/src/Umbraco.Core/Events/SaveEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/SaveEventArgs.cs rename to src/Umbraco.Core/Events/SaveEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/SendEmailEventArgs.cs b/src/Umbraco.Core/Events/SendEmailEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/SendEmailEventArgs.cs rename to src/Umbraco.Core/Events/SendEmailEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/SendToPublishEventArgs.cs b/src/Umbraco.Core/Events/SendToPublishEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/SendToPublishEventArgs.cs rename to src/Umbraco.Core/Events/SendToPublishEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/SupersedeEventAttribute.cs b/src/Umbraco.Core/Events/SupersedeEventAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/SupersedeEventAttribute.cs rename to src/Umbraco.Core/Events/SupersedeEventAttribute.cs diff --git a/src/Umbraco.Abstractions/Events/TransientEventMessagesFactory.cs b/src/Umbraco.Core/Events/TransientEventMessagesFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/TransientEventMessagesFactory.cs rename to src/Umbraco.Core/Events/TransientEventMessagesFactory.cs diff --git a/src/Umbraco.Abstractions/Events/TypedEventHandler.cs b/src/Umbraco.Core/Events/TypedEventHandler.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/TypedEventHandler.cs rename to src/Umbraco.Core/Events/TypedEventHandler.cs diff --git a/src/Umbraco.Abstractions/Events/UninstallPackageEventArgs.cs b/src/Umbraco.Core/Events/UninstallPackageEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/UninstallPackageEventArgs.cs rename to src/Umbraco.Core/Events/UninstallPackageEventArgs.cs diff --git a/src/Umbraco.Abstractions/Events/UserGroupWithUsers.cs b/src/Umbraco.Core/Events/UserGroupWithUsers.cs similarity index 100% rename from src/Umbraco.Abstractions/Events/UserGroupWithUsers.cs rename to src/Umbraco.Core/Events/UserGroupWithUsers.cs diff --git a/src/Umbraco.Abstractions/Exceptions/AuthorizationException.cs b/src/Umbraco.Core/Exceptions/AuthorizationException.cs similarity index 100% rename from src/Umbraco.Abstractions/Exceptions/AuthorizationException.cs rename to src/Umbraco.Core/Exceptions/AuthorizationException.cs diff --git a/src/Umbraco.Abstractions/Exceptions/BootFailedException.cs b/src/Umbraco.Core/Exceptions/BootFailedException.cs similarity index 100% rename from src/Umbraco.Abstractions/Exceptions/BootFailedException.cs rename to src/Umbraco.Core/Exceptions/BootFailedException.cs diff --git a/src/Umbraco.Abstractions/Exceptions/DataOperationException.cs b/src/Umbraco.Core/Exceptions/DataOperationException.cs similarity index 100% rename from src/Umbraco.Abstractions/Exceptions/DataOperationException.cs rename to src/Umbraco.Core/Exceptions/DataOperationException.cs diff --git a/src/Umbraco.Abstractions/Exceptions/InvalidCompositionException.cs b/src/Umbraco.Core/Exceptions/InvalidCompositionException.cs similarity index 100% rename from src/Umbraco.Abstractions/Exceptions/InvalidCompositionException.cs rename to src/Umbraco.Core/Exceptions/InvalidCompositionException.cs diff --git a/src/Umbraco.Abstractions/Exceptions/PanicException.cs b/src/Umbraco.Core/Exceptions/PanicException.cs similarity index 100% rename from src/Umbraco.Abstractions/Exceptions/PanicException.cs rename to src/Umbraco.Core/Exceptions/PanicException.cs diff --git a/src/Umbraco.Abstractions/ExpressionExtensions.cs b/src/Umbraco.Core/ExpressionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ExpressionExtensions.cs rename to src/Umbraco.Core/ExpressionExtensions.cs diff --git a/src/Umbraco.Abstractions/ExpressionHelper.cs b/src/Umbraco.Core/ExpressionHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/ExpressionHelper.cs rename to src/Umbraco.Core/ExpressionHelper.cs diff --git a/src/Umbraco.Abstractions/FactoryExtensions.cs b/src/Umbraco.Core/FactoryExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/FactoryExtensions.cs rename to src/Umbraco.Core/FactoryExtensions.cs diff --git a/src/Umbraco.Web/Features/DisabledFeatures.cs b/src/Umbraco.Core/Features/DisabledFeatures.cs similarity index 82% rename from src/Umbraco.Web/Features/DisabledFeatures.cs rename to src/Umbraco.Core/Features/DisabledFeatures.cs index 62fb019c70..9bd091a570 100644 --- a/src/Umbraco.Web/Features/DisabledFeatures.cs +++ b/src/Umbraco.Core/Features/DisabledFeatures.cs @@ -1,5 +1,4 @@ using Umbraco.Core.Collections; -using Umbraco.Web.WebApi; namespace Umbraco.Web.Features { @@ -13,19 +12,19 @@ namespace Umbraco.Web.Features /// public DisabledFeatures() { - Controllers = new TypeList(); + Controllers = new TypeList(); } /// /// Gets the disabled controllers. /// - public TypeList Controllers { get; } + public TypeList Controllers { get; } /// /// Disables the device preview feature of previewing. /// public bool DisableDevicePreview { get; set; } - + /// /// If true, all references to templates will be removed in the back office and routing /// diff --git a/src/Umbraco.Web/Features/EnabledFeatures.cs b/src/Umbraco.Core/Features/EnabledFeatures.cs similarity index 100% rename from src/Umbraco.Web/Features/EnabledFeatures.cs rename to src/Umbraco.Core/Features/EnabledFeatures.cs diff --git a/src/Umbraco.Core/Features/IUmbracoFeature.cs b/src/Umbraco.Core/Features/IUmbracoFeature.cs new file mode 100644 index 0000000000..ccb80b0a9f --- /dev/null +++ b/src/Umbraco.Core/Features/IUmbracoFeature.cs @@ -0,0 +1,10 @@ +namespace Umbraco.Web.Features +{ + /// + /// This is a marker interface to allow controllers to be disabled if also marked with FeatureAuthorizeAttribute. + /// + public interface IUmbracoFeature + { + + } +} diff --git a/src/Umbraco.Web/Features/UmbracoFeatures.cs b/src/Umbraco.Core/Features/UmbracoFeatures.cs similarity index 90% rename from src/Umbraco.Web/Features/UmbracoFeatures.cs rename to src/Umbraco.Core/Features/UmbracoFeatures.cs index d1c3899271..69fe58f76d 100644 --- a/src/Umbraco.Web/Features/UmbracoFeatures.cs +++ b/src/Umbraco.Core/Features/UmbracoFeatures.cs @@ -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(); } - + /// /// Gets the disabled features. /// @@ -32,7 +31,7 @@ namespace Umbraco.Web.Features /// 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."); diff --git a/src/Umbraco.Abstractions/GuidUdi.cs b/src/Umbraco.Core/GuidUdi.cs similarity index 100% rename from src/Umbraco.Abstractions/GuidUdi.cs rename to src/Umbraco.Core/GuidUdi.cs diff --git a/src/Umbraco.Abstractions/GuidUtils.cs b/src/Umbraco.Core/GuidUtils.cs similarity index 100% rename from src/Umbraco.Abstractions/GuidUtils.cs rename to src/Umbraco.Core/GuidUtils.cs diff --git a/src/Umbraco.Abstractions/HashCodeCombiner.cs b/src/Umbraco.Core/HashCodeCombiner.cs similarity index 100% rename from src/Umbraco.Abstractions/HashCodeCombiner.cs rename to src/Umbraco.Core/HashCodeCombiner.cs diff --git a/src/Umbraco.Abstractions/HashCodeHelper.cs b/src/Umbraco.Core/HashCodeHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/HashCodeHelper.cs rename to src/Umbraco.Core/HashCodeHelper.cs diff --git a/src/Umbraco.Abstractions/HashGenerator.cs b/src/Umbraco.Core/HashGenerator.cs similarity index 99% rename from src/Umbraco.Abstractions/HashGenerator.cs rename to src/Umbraco.Core/HashGenerator.cs index 62be0dacdd..c7fad08089 100644 --- a/src/Umbraco.Abstractions/HashGenerator.cs +++ b/src/Umbraco.Core/HashGenerator.cs @@ -41,7 +41,7 @@ namespace Umbraco.Core public void AddDateTime(DateTime d) { - _writer.Write(d.Ticks);; + _writer.Write(d.Ticks); } public void AddString(string s) diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Permissions/FolderAndFilePermissionsCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Permissions/FolderAndFilePermissionsCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Permissions/FolderAndFilePermissionsCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Permissions/FolderAndFilePermissionsCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/BaseHttpHeaderCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/BaseHttpHeaderCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/BaseHttpHeaderCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/BaseHttpHeaderCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/ClickJackingCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/ClickJackingCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/ClickJackingCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/ClickJackingCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/ExcessiveHeadersCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/ExcessiveHeadersCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/ExcessiveHeadersCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/ExcessiveHeadersCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/HstsCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/HstsCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/HstsCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/HstsCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/HttpsCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/HttpsCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/HttpsCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/HttpsCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/NoSniffCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/NoSniffCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/NoSniffCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/NoSniffCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Security/XssProtectionCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Security/XssProtectionCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Security/XssProtectionCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Security/XssProtectionCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/Checks/Services/SmtpCheck.cs b/src/Umbraco.Core/HealthCheck/Checks/Services/SmtpCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/Checks/Services/SmtpCheck.cs rename to src/Umbraco.Core/HealthCheck/Checks/Services/SmtpCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheck.cs b/src/Umbraco.Core/HealthCheck/HealthCheck.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheck.cs rename to src/Umbraco.Core/HealthCheck/HealthCheck.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheckAction.cs b/src/Umbraco.Core/HealthCheck/HealthCheckAction.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheckAction.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckAction.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheckAttribute.cs b/src/Umbraco.Core/HealthCheck/HealthCheckAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheckAttribute.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckAttribute.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheckCollection.cs b/src/Umbraco.Core/HealthCheck/HealthCheckCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheckCollection.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckCollection.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheckGroup.cs b/src/Umbraco.Core/HealthCheck/HealthCheckGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheckGroup.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckGroup.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheckNotificationMethodAttribute.cs b/src/Umbraco.Core/HealthCheck/HealthCheckNotificationMethodAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheckNotificationMethodAttribute.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckNotificationMethodAttribute.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HealthCheckStatus.cs b/src/Umbraco.Core/HealthCheck/HealthCheckStatus.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HealthCheckStatus.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckStatus.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/HeathCheckCollectionBuilder.cs b/src/Umbraco.Core/HealthCheck/HeathCheckCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/HeathCheckCollectionBuilder.cs rename to src/Umbraco.Core/HealthCheck/HeathCheckCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/HealthCheck/StatusResultType.cs b/src/Umbraco.Core/HealthCheck/StatusResultType.cs similarity index 100% rename from src/Umbraco.Abstractions/HealthCheck/StatusResultType.cs rename to src/Umbraco.Core/HealthCheck/StatusResultType.cs diff --git a/src/Umbraco.Abstractions/HexEncoder.cs b/src/Umbraco.Core/HexEncoder.cs similarity index 100% rename from src/Umbraco.Abstractions/HexEncoder.cs rename to src/Umbraco.Core/HexEncoder.cs diff --git a/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs b/src/Umbraco.Core/Hosting/IHostingEnvironment.cs similarity index 75% rename from src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs rename to src/Umbraco.Core/Hosting/IHostingEnvironment.cs index 1662879cf2..5b97d8e4f3 100644 --- a/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs +++ b/src/Umbraco.Core/Hosting/IHostingEnvironment.cs @@ -11,8 +11,6 @@ namespace Umbraco.Core.Hosting string LocalTempPath { get; } string ApplicationVirtualPath { get; } - int CurrentDomainId { get; } - bool IsDebugMode { get; } /// /// Gets a value indicating whether Umbraco is hosted. @@ -22,11 +20,6 @@ namespace Umbraco.Core.Hosting string MapPath(string path); string ToAbsolute(string virtualPath, string root); - /// - /// Terminates the current application. The application restarts the next time a request is received for it. - /// - void LazyRestartApplication(); - void RegisterObject(IRegisteredObject registeredObject); void UnregisterObject(IRegisteredObject registeredObject); } diff --git a/src/Umbraco.Web/HybridAccessorBase.cs b/src/Umbraco.Core/HybridAccessorBase.cs similarity index 71% rename from src/Umbraco.Web/HybridAccessorBase.cs rename to src/Umbraco.Core/HybridAccessorBase.cs index ec18b6f3d4..ad33fbf067 100644 --- a/src/Umbraco.Web/HybridAccessorBase.cs +++ b/src/Umbraco.Core/HybridAccessorBase.cs @@ -1,6 +1,7 @@ using System; -using System.Runtime.Remoting.Messaging; using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.Scoping; namespace Umbraco.Web { @@ -16,13 +17,13 @@ namespace Umbraco.Web public abstract class HybridAccessorBase where T : class { + private readonly IRequestCache _requestCache; + // ReSharper disable StaticMemberInGenericType private static readonly object Locker = new object(); private static bool _registered; // ReSharper restore StaticMemberInGenericType - private readonly IHttpContextAccessor _httpContextAccessor; - protected abstract string ItemKey { get; } // read @@ -42,17 +43,16 @@ namespace Umbraco.Web // yes! flows with async! private T NonContextValue { - get => (T) CallContext.LogicalGetData(ItemKey); + get => CallContext.GetData(ItemKey); set { - if (value == null) CallContext.FreeNamedDataSlot(ItemKey); - else CallContext.LogicalSetData(ItemKey, value); + CallContext.SetData(ItemKey, value); } } - protected HybridAccessorBase(IHttpContextAccessor httpContextAccessor) + protected HybridAccessorBase(IRequestCache requestCache) { - _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); + _requestCache = requestCache ?? throw new ArgumentNullException(nameof(requestCache)); lock (Locker) { @@ -65,15 +65,14 @@ namespace Umbraco.Web var itemKey = ItemKey; // virtual SafeCallContext.Register(() => { - var value = CallContext.LogicalGetData(itemKey); - CallContext.FreeNamedDataSlot(itemKey); + var value = CallContext.GetData(itemKey); return value; }, o => { if (o == null) return; var value = o as T; if (value == null) throw new ArgumentException($"Expected type {typeof(T).FullName}, got {o.GetType().FullName}", nameof(o)); - CallContext.LogicalSetData(itemKey, value); + CallContext.SetData(itemKey, value); }); } @@ -81,20 +80,23 @@ namespace Umbraco.Web { get { - var httpContext = _httpContextAccessor.HttpContext; - if (httpContext == null) return NonContextValue; - return (T) httpContext.Items[ItemKey]; + if (!_requestCache.IsAvailable) + { + return NonContextValue; + } + return (T) _requestCache.Get(ItemKey); } set { - var httpContext = _httpContextAccessor.HttpContext; - if (httpContext == null) + if (!_requestCache.IsAvailable) + { NonContextValue = value; + } else if (value == null) - httpContext.Items.Remove(ItemKey); + _requestCache.Remove(ItemKey); else - httpContext.Items[ItemKey] = value; + _requestCache.Set(ItemKey, value); } } } diff --git a/src/Umbraco.Web/HybridEventMessagesAccessor.cs b/src/Umbraco.Core/HybridEventMessagesAccessor.cs similarity index 70% rename from src/Umbraco.Web/HybridEventMessagesAccessor.cs rename to src/Umbraco.Core/HybridEventMessagesAccessor.cs index fddde403d8..b2700eb137 100644 --- a/src/Umbraco.Web/HybridEventMessagesAccessor.cs +++ b/src/Umbraco.Core/HybridEventMessagesAccessor.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Events; +using Umbraco.Core.Cache; +using Umbraco.Core.Events; namespace Umbraco.Web { @@ -6,8 +7,8 @@ namespace Umbraco.Web { protected override string ItemKey => "Umbraco.Core.Events.HybridEventMessagesAccessor"; - public HybridEventMessagesAccessor(IHttpContextAccessor httpContextAccessor) - : base(httpContextAccessor) + public HybridEventMessagesAccessor(IRequestCache requestCache) + : base(requestCache) { } public EventMessages EventMessages diff --git a/src/Umbraco.Abstractions/IBackOfficeInfo.cs b/src/Umbraco.Core/IBackOfficeInfo.cs similarity index 100% rename from src/Umbraco.Abstractions/IBackOfficeInfo.cs rename to src/Umbraco.Core/IBackOfficeInfo.cs diff --git a/src/Umbraco.Abstractions/ICompletable.cs b/src/Umbraco.Core/ICompletable.cs similarity index 100% rename from src/Umbraco.Abstractions/ICompletable.cs rename to src/Umbraco.Core/ICompletable.cs diff --git a/src/Umbraco.Abstractions/IDisposeOnRequestEnd.cs b/src/Umbraco.Core/IDisposeOnRequestEnd.cs similarity index 100% rename from src/Umbraco.Abstractions/IDisposeOnRequestEnd.cs rename to src/Umbraco.Core/IDisposeOnRequestEnd.cs diff --git a/src/Umbraco.Abstractions/IEmailSender.cs b/src/Umbraco.Core/IEmailSender.cs similarity index 100% rename from src/Umbraco.Abstractions/IEmailSender.cs rename to src/Umbraco.Core/IEmailSender.cs diff --git a/src/Umbraco.Abstractions/IO/FileSystemExtensions.cs b/src/Umbraco.Core/IO/FileSystemExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/FileSystemExtensions.cs rename to src/Umbraco.Core/IO/FileSystemExtensions.cs diff --git a/src/Umbraco.Abstractions/IO/FileSystemWrapper.cs b/src/Umbraco.Core/IO/FileSystemWrapper.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/FileSystemWrapper.cs rename to src/Umbraco.Core/IO/FileSystemWrapper.cs diff --git a/src/Umbraco.Abstractions/IO/FileSystems.cs b/src/Umbraco.Core/IO/FileSystems.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/FileSystems.cs rename to src/Umbraco.Core/IO/FileSystems.cs diff --git a/src/Umbraco.Abstractions/IO/IFileSystem.cs b/src/Umbraco.Core/IO/IFileSystem.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/IFileSystem.cs rename to src/Umbraco.Core/IO/IFileSystem.cs diff --git a/src/Umbraco.Abstractions/IO/IFileSystems.cs b/src/Umbraco.Core/IO/IFileSystems.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/IFileSystems.cs rename to src/Umbraco.Core/IO/IFileSystems.cs diff --git a/src/Umbraco.Abstractions/IO/IIOHelper.cs b/src/Umbraco.Core/IO/IIOHelper.cs similarity index 99% rename from src/Umbraco.Abstractions/IO/IIOHelper.cs rename to src/Umbraco.Core/IO/IIOHelper.cs index e8ef6d2973..11f5c6c565 100644 --- a/src/Umbraco.Abstractions/IO/IIOHelper.cs +++ b/src/Umbraco.Core/IO/IIOHelper.cs @@ -75,5 +75,6 @@ namespace Umbraco.Core.IO get; set; //Only required for unit tests } + } } diff --git a/src/Umbraco.Abstractions/IO/IMediaFileSystem.cs b/src/Umbraco.Core/IO/IMediaFileSystem.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/IMediaFileSystem.cs rename to src/Umbraco.Core/IO/IMediaFileSystem.cs diff --git a/src/Umbraco.Abstractions/IO/IMediaPathScheme.cs b/src/Umbraco.Core/IO/IMediaPathScheme.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/IMediaPathScheme.cs rename to src/Umbraco.Core/IO/IMediaPathScheme.cs diff --git a/src/Umbraco.Abstractions/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/IOHelper.cs rename to src/Umbraco.Core/IO/IOHelper.cs diff --git a/src/Umbraco.Core/IO/IOHelperExtensions.cs b/src/Umbraco.Core/IO/IOHelperExtensions.cs new file mode 100644 index 0000000000..64b57e7dc1 --- /dev/null +++ b/src/Umbraco.Core/IO/IOHelperExtensions.cs @@ -0,0 +1,39 @@ +using System; +using System.IO; + +namespace Umbraco.Core.IO +{ + public static class IOHelperExtensions + { + /// + /// Tries to create a directory. + /// + /// The IOHelper. + /// the directory path. + /// true if the directory was created, false otherwise. + public static bool TryCreateDirectory(this IIOHelper ioHelper, string dir) + { + try + { + var dirPath = ioHelper.MapPath(dir); + + if (Directory.Exists(dirPath) == false) + Directory.CreateDirectory(dirPath); + + var filePath = dirPath + "/" + CreateRandomFileName(ioHelper) + ".tmp"; + File.WriteAllText(filePath, "This is an Umbraco internal test file. It is safe to delete it."); + File.Delete(filePath); + return true; + } + catch + { + return false; + } + } + + public static string CreateRandomFileName(this IIOHelper ioHelper) + { + return "umbraco-test." + Guid.NewGuid().ToString("N").Substring(0, 8); + } + } +} diff --git a/src/Umbraco.Abstractions/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/MediaFileSystem.cs rename to src/Umbraco.Core/IO/MediaFileSystem.cs diff --git a/src/Umbraco.Abstractions/IO/MediaPathSchemes/CombinedGuidsMediaPathScheme.cs b/src/Umbraco.Core/IO/MediaPathSchemes/CombinedGuidsMediaPathScheme.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/MediaPathSchemes/CombinedGuidsMediaPathScheme.cs rename to src/Umbraco.Core/IO/MediaPathSchemes/CombinedGuidsMediaPathScheme.cs diff --git a/src/Umbraco.Abstractions/IO/MediaPathSchemes/OriginalMediaPathScheme.cs b/src/Umbraco.Core/IO/MediaPathSchemes/OriginalMediaPathScheme.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/MediaPathSchemes/OriginalMediaPathScheme.cs rename to src/Umbraco.Core/IO/MediaPathSchemes/OriginalMediaPathScheme.cs diff --git a/src/Umbraco.Abstractions/IO/MediaPathSchemes/TwoGuidsMediaPathScheme.cs b/src/Umbraco.Core/IO/MediaPathSchemes/TwoGuidsMediaPathScheme.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/MediaPathSchemes/TwoGuidsMediaPathScheme.cs rename to src/Umbraco.Core/IO/MediaPathSchemes/TwoGuidsMediaPathScheme.cs diff --git a/src/Umbraco.Abstractions/IO/MediaPathSchemes/UniqueMediaPathScheme.cs b/src/Umbraco.Core/IO/MediaPathSchemes/UniqueMediaPathScheme.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/MediaPathSchemes/UniqueMediaPathScheme.cs rename to src/Umbraco.Core/IO/MediaPathSchemes/UniqueMediaPathScheme.cs diff --git a/src/Umbraco.Abstractions/IO/PhysicalFileSystem.cs b/src/Umbraco.Core/IO/PhysicalFileSystem.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/PhysicalFileSystem.cs rename to src/Umbraco.Core/IO/PhysicalFileSystem.cs diff --git a/src/Umbraco.Abstractions/IO/ShadowFileSystem.cs b/src/Umbraco.Core/IO/ShadowFileSystem.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/ShadowFileSystem.cs rename to src/Umbraco.Core/IO/ShadowFileSystem.cs diff --git a/src/Umbraco.Abstractions/IO/ShadowFileSystems.cs b/src/Umbraco.Core/IO/ShadowFileSystems.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/ShadowFileSystems.cs rename to src/Umbraco.Core/IO/ShadowFileSystems.cs diff --git a/src/Umbraco.Abstractions/IO/ShadowWrapper.cs b/src/Umbraco.Core/IO/ShadowWrapper.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/ShadowWrapper.cs rename to src/Umbraco.Core/IO/ShadowWrapper.cs diff --git a/src/Umbraco.Abstractions/IO/SupportingFileSystems.cs b/src/Umbraco.Core/IO/SupportingFileSystems.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/SupportingFileSystems.cs rename to src/Umbraco.Core/IO/SupportingFileSystems.cs diff --git a/src/Umbraco.Abstractions/IO/SystemFiles.cs b/src/Umbraco.Core/IO/SystemFiles.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/SystemFiles.cs rename to src/Umbraco.Core/IO/SystemFiles.cs diff --git a/src/Umbraco.Abstractions/IO/ViewHelper.cs b/src/Umbraco.Core/IO/ViewHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/IO/ViewHelper.cs rename to src/Umbraco.Core/IO/ViewHelper.cs diff --git a/src/Umbraco.Abstractions/IRegisteredObject.cs b/src/Umbraco.Core/IRegisteredObject.cs similarity index 100% rename from src/Umbraco.Abstractions/IRegisteredObject.cs rename to src/Umbraco.Core/IRegisteredObject.cs diff --git a/src/Umbraco.Abstractions/ITagQuery.cs b/src/Umbraco.Core/ITagQuery.cs similarity index 100% rename from src/Umbraco.Abstractions/ITagQuery.cs rename to src/Umbraco.Core/ITagQuery.cs diff --git a/src/Umbraco.Core/IUmbracoContext.cs b/src/Umbraco.Core/IUmbracoContext.cs new file mode 100644 index 0000000000..66b3dc3965 --- /dev/null +++ b/src/Umbraco.Core/IUmbracoContext.cs @@ -0,0 +1,83 @@ +using System; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Web.PublishedCache; +using Umbraco.Web.Routing; +using Umbraco.Web.Security; + +namespace Umbraco.Web +{ + public interface IUmbracoContext + { + /// + /// This is used internally for performance calculations, the ObjectCreated DateTime is set as soon as this + /// object is instantiated which in the web site is created during the BeginRequest phase. + /// We can then determine complete rendering time from that. + /// + DateTime ObjectCreated { get; } + + /// + /// Gets the WebSecurity class + /// + IWebSecurity Security { get; } + + /// + /// Gets the uri that is handled by ASP.NET after server-side rewriting took place. + /// + Uri OriginalRequestUrl { get; } + + /// + /// Gets the cleaned up url that is handled by Umbraco. + /// + /// That is, lowercase, no trailing slash after path, no .aspx... + Uri CleanedUmbracoUrl { get; } + + /// + /// Gets the published snapshot. + /// + IPublishedSnapshot PublishedSnapshot { get; } + + /// + /// Gets the published content cache. + /// + IPublishedContentCache Content { get; } + + /// + /// Gets the published media cache. + /// + IPublishedMediaCache Media { get; } + + /// + /// Gets the domains cache. + /// + IDomainCache Domains { get; } + + /// + /// Boolean value indicating whether the current request is a front-end umbraco request + /// + bool IsFrontEndUmbracoRequest { get; } + + /// + /// Gets/sets the PublishedRequest object + /// + IPublishedRequest PublishedRequest { get; set; } + + /// + /// Gets the variation context accessor. + /// + IVariationContextAccessor VariationContextAccessor { get; } + + /// + /// Gets a value indicating whether the request has debugging enabled + /// + /// true if this instance is debug; otherwise, false. + bool IsDebug { get; } + + /// + /// Determines whether the current user is in a preview mode and browsing the site (ie. not in the admin UI) + /// + bool InPreviewMode { get; } + + IDisposable ForcedPreview(bool preview); + void Dispose(); + } +} diff --git a/src/Umbraco.Web/IUmbracoContextAccessor.cs b/src/Umbraco.Core/IUmbracoContextAccessor.cs similarity index 75% rename from src/Umbraco.Web/IUmbracoContextAccessor.cs rename to src/Umbraco.Core/IUmbracoContextAccessor.cs index 74df940865..5c7549bff6 100644 --- a/src/Umbraco.Web/IUmbracoContextAccessor.cs +++ b/src/Umbraco.Core/IUmbracoContextAccessor.cs @@ -5,6 +5,6 @@ /// public interface IUmbracoContextAccessor { - UmbracoContext UmbracoContext { get; set; } + IUmbracoContext UmbracoContext { get; set; } } } diff --git a/src/Umbraco.Web/IUmbracoContextFactory.cs b/src/Umbraco.Core/IUmbracoContextFactory.cs similarity index 70% rename from src/Umbraco.Web/IUmbracoContextFactory.cs rename to src/Umbraco.Core/IUmbracoContextFactory.cs index 6d89578da7..2a6dd50618 100644 --- a/src/Umbraco.Web/IUmbracoContextFactory.cs +++ b/src/Umbraco.Core/IUmbracoContextFactory.cs @@ -3,15 +3,15 @@ namespace Umbraco.Web { /// - /// Creates and manages instances. + /// Creates and manages instances. /// public interface IUmbracoContextFactory { /// - /// Ensures that a current exists. + /// Ensures that a current exists. /// /// - /// If an is already registered in the + /// If an is already registered in the /// , returns a non-root reference to it. /// Otherwise, create a new instance, registers it, and return a root reference /// to it. @@ -26,7 +26,6 @@ namespace Umbraco.Web /// // use umbracoContext... /// } /// - /// An optional http context. - UmbracoContextReference EnsureUmbracoContext(HttpContextBase httpContext = null); + UmbracoContextReference EnsureUmbracoContext(); } -} \ No newline at end of file +} diff --git a/src/Umbraco.Abstractions/IfExtensions.cs b/src/Umbraco.Core/IfExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/IfExtensions.cs rename to src/Umbraco.Core/IfExtensions.cs diff --git a/src/Umbraco.Abstractions/Install/IFilePermissionHelper.cs b/src/Umbraco.Core/Install/IFilePermissionHelper.cs similarity index 52% rename from src/Umbraco.Abstractions/Install/IFilePermissionHelper.cs rename to src/Umbraco.Core/Install/IFilePermissionHelper.cs index 90f550f2c9..b60839cb00 100644 --- a/src/Umbraco.Abstractions/Install/IFilePermissionHelper.cs +++ b/src/Umbraco.Core/Install/IFilePermissionHelper.cs @@ -7,10 +7,5 @@ namespace Umbraco.Core.Install bool RunFilePermissionTestSuite(out Dictionary> report); bool EnsureDirectories(string[] dirs, out IEnumerable errors, bool writeCausesRestart = false); bool EnsureFiles(string[] files, out IEnumerable errors); - bool EnsureCanCreateSubDirectory(string dir, out IEnumerable errors); - bool EnsureCanCreateSubDirectories(IEnumerable dirs, out IEnumerable errors); - bool TestPublishedSnapshotService(out IEnumerable errors); - bool TryCreateDirectory(string dir); - bool TryAccessDirectory(string dir, bool canWrite); } } diff --git a/src/Umbraco.Web/Install/InstallException.cs b/src/Umbraco.Core/Install/InstallException.cs similarity index 100% rename from src/Umbraco.Web/Install/InstallException.cs rename to src/Umbraco.Core/Install/InstallException.cs diff --git a/src/Umbraco.Web/Install/InstallStatusTracker.cs b/src/Umbraco.Core/Install/InstallStatusTracker.cs similarity index 69% rename from src/Umbraco.Web/Install/InstallStatusTracker.cs rename to src/Umbraco.Core/Install/InstallStatusTracker.cs index 58e8507ec8..c0c9a696fd 100644 --- a/src/Umbraco.Web/Install/InstallStatusTracker.cs +++ b/src/Umbraco.Core/Install/InstallStatusTracker.cs @@ -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 /// /// An internal in-memory status tracker for the current installation /// - 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 _steps = new ConcurrentHashSet(); - 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(); 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 InitializeFromFile(Guid installId) + public IEnumerable 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>( + var deserialized = _jsonSerializer.Deserialize>( File.ReadAllText(file)); foreach (var item in deserialized) { @@ -70,7 +78,7 @@ namespace Umbraco.Web.Install return new List(_steps); } - public static IEnumerable Initialize(Guid installId, IEnumerable steps) + public IEnumerable Initialize(Guid installId, IEnumerable 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>( + var deserialized = _jsonSerializer.Deserialize>( 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(_steps)); + var serialized = _jsonSerializer.Serialize(new List(_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(_steps)); + var serialized = _jsonSerializer.Serialize(new List(_steps)); Directory.CreateDirectory(Path.GetDirectoryName(file)); File.WriteAllText(file, serialized); } @@ -119,7 +127,7 @@ namespace Umbraco.Web.Install return new List(_steps); } - public static void SetComplete(Guid installId, string name, IDictionary additionalData = null) + public void SetComplete(Guid installId, string name, IDictionary 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(_steps)); + var serialized = _jsonSerializer.Serialize(new List(_steps)); File.WriteAllText(file, serialized); } diff --git a/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs b/src/Umbraco.Core/Install/InstallSteps/FilePermissionsStep.cs similarity index 98% rename from src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs rename to src/Umbraco.Core/Install/InstallSteps/FilePermissionsStep.cs index b4be0b0a21..c3d7493084 100644 --- a/src/Umbraco.Web/Install/InstallSteps/FilePermissionsStep.cs +++ b/src/Umbraco.Core/Install/InstallSteps/FilePermissionsStep.cs @@ -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 diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitCleanupStep.cs b/src/Umbraco.Core/Install/InstallSteps/StarterKitCleanupStep.cs similarity index 100% rename from src/Umbraco.Web/Install/InstallSteps/StarterKitCleanupStep.cs rename to src/Umbraco.Core/Install/InstallSteps/StarterKitCleanupStep.cs diff --git a/src/Umbraco.Web/Install/InstallSteps/UpgradeStep.cs b/src/Umbraco.Core/Install/InstallSteps/UpgradeStep.cs similarity index 84% rename from src/Umbraco.Web/Install/InstallSteps/UpgradeStep.cs rename to src/Umbraco.Core/Install/InstallSteps/UpgradeStep.cs index a59d7394f0..0979f31dc5 100644 --- a/src/Umbraco.Web/Install/InstallSteps/UpgradeStep.cs +++ b/src/Umbraco.Core/Install/InstallSteps/UpgradeStep.cs @@ -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 ExecuteAsync(object model) => Task.FromResult(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}¬es=1"; diff --git a/src/Umbraco.Web/Install/Models/DatabaseModel.cs b/src/Umbraco.Core/Install/Models/DatabaseModel.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/DatabaseModel.cs rename to src/Umbraco.Core/Install/Models/DatabaseModel.cs diff --git a/src/Umbraco.Web/Install/Models/DatabaseType.cs b/src/Umbraco.Core/Install/Models/DatabaseType.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/DatabaseType.cs rename to src/Umbraco.Core/Install/Models/DatabaseType.cs diff --git a/src/Umbraco.Web/Install/Models/InstallInstructions.cs b/src/Umbraco.Core/Install/Models/InstallInstructions.cs similarity index 80% rename from src/Umbraco.Web/Install/Models/InstallInstructions.cs rename to src/Umbraco.Core/Install/Models/InstallInstructions.cs index da4dfb1671..159edda9e6 100644 --- a/src/Umbraco.Web/Install/Models/InstallInstructions.cs +++ b/src/Umbraco.Core/Install/Models/InstallInstructions.cs @@ -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 Instructions { get; set; } + public IDictionary Instructions { get; set; } [DataMember(Name = "installId")] public Guid InstallId { get; set; } diff --git a/src/Umbraco.Web/Install/Models/InstallProgressResultModel.cs b/src/Umbraco.Core/Install/Models/InstallProgressResultModel.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/InstallProgressResultModel.cs rename to src/Umbraco.Core/Install/Models/InstallProgressResultModel.cs diff --git a/src/Umbraco.Web/Install/Models/InstallSetup.cs b/src/Umbraco.Core/Install/Models/InstallSetup.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/InstallSetup.cs rename to src/Umbraco.Core/Install/Models/InstallSetup.cs diff --git a/src/Umbraco.Web/Install/Models/InstallSetupResult.cs b/src/Umbraco.Core/Install/Models/InstallSetupResult.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/InstallSetupResult.cs rename to src/Umbraco.Core/Install/Models/InstallSetupResult.cs diff --git a/src/Umbraco.Web/Install/Models/InstallSetupStep.cs b/src/Umbraco.Core/Install/Models/InstallSetupStep.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/InstallSetupStep.cs rename to src/Umbraco.Core/Install/Models/InstallSetupStep.cs diff --git a/src/Umbraco.Web/Install/Models/InstallSetupStepAttribute.cs b/src/Umbraco.Core/Install/Models/InstallSetupStepAttribute.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/InstallSetupStepAttribute.cs rename to src/Umbraco.Core/Install/Models/InstallSetupStepAttribute.cs diff --git a/src/Umbraco.Web/Install/Models/InstallTrackingItem.cs b/src/Umbraco.Core/Install/Models/InstallTrackingItem.cs similarity index 96% rename from src/Umbraco.Web/Install/Models/InstallTrackingItem.cs rename to src/Umbraco.Core/Install/Models/InstallTrackingItem.cs index 1b1985dd1e..9bc8201ba9 100644 --- a/src/Umbraco.Web/Install/Models/InstallTrackingItem.cs +++ b/src/Umbraco.Core/Install/Models/InstallTrackingItem.cs @@ -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) { diff --git a/src/Umbraco.Web/Install/Models/InstallationType.cs b/src/Umbraco.Core/Install/Models/InstallationType.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/InstallationType.cs rename to src/Umbraco.Core/Install/Models/InstallationType.cs diff --git a/src/Umbraco.Web/Install/Models/Package.cs b/src/Umbraco.Core/Install/Models/Package.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/Package.cs rename to src/Umbraco.Core/Install/Models/Package.cs diff --git a/src/Umbraco.Web/Install/Models/UserModel.cs b/src/Umbraco.Core/Install/Models/UserModel.cs similarity index 100% rename from src/Umbraco.Web/Install/Models/UserModel.cs rename to src/Umbraco.Core/Install/Models/UserModel.cs diff --git a/src/Umbraco.Core/InstallLog.cs b/src/Umbraco.Core/InstallLog.cs new file mode 100644 index 0000000000..cb14ebd650 --- /dev/null +++ b/src/Umbraco.Core/InstallLog.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Umbraco.Core.Models +{ + public class InstallLog + { + public Guid InstallId { get; } + public bool IsUpgrade { get; set; } + public bool InstallCompleted { get; set; } + public DateTime Timestamp { get; set; } + public int VersionMajor { get; } + public int VersionMinor { get; } + public int VersionPatch { get; } + public string VersionComment { get; } + public string Error { get; } + public string UserAgent { get; } + public string DbProvider { get; set; } + + public InstallLog(Guid installId, bool isUpgrade, bool installCompleted, DateTime timestamp, int versionMajor, int versionMinor, int versionPatch, string versionComment, string error, string userAgent, string dbProvider) + { + InstallId = installId; + IsUpgrade = isUpgrade; + InstallCompleted = installCompleted; + Timestamp = timestamp; + VersionMajor = versionMajor; + VersionMinor = versionMinor; + VersionPatch = versionPatch; + VersionComment = versionComment; + Error = error; + UserAgent = userAgent; + DbProvider = dbProvider; + } + } +} diff --git a/src/Umbraco.Abstractions/IntExtensions.cs b/src/Umbraco.Core/IntExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/IntExtensions.cs rename to src/Umbraco.Core/IntExtensions.cs diff --git a/src/Umbraco.Abstractions/KeyValuePairExtensions.cs b/src/Umbraco.Core/KeyValuePairExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/KeyValuePairExtensions.cs rename to src/Umbraco.Core/KeyValuePairExtensions.cs diff --git a/src/Umbraco.Abstractions/LambdaExpressionCacheKey.cs b/src/Umbraco.Core/LambdaExpressionCacheKey.cs similarity index 100% rename from src/Umbraco.Abstractions/LambdaExpressionCacheKey.cs rename to src/Umbraco.Core/LambdaExpressionCacheKey.cs diff --git a/src/Umbraco.Abstractions/Logging/DebugDiagnosticsLogger.cs b/src/Umbraco.Core/Logging/DebugDiagnosticsLogger.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/DebugDiagnosticsLogger.cs rename to src/Umbraco.Core/Logging/DebugDiagnosticsLogger.cs diff --git a/src/Umbraco.Abstractions/Logging/DisposableTimer.cs b/src/Umbraco.Core/Logging/DisposableTimer.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/DisposableTimer.cs rename to src/Umbraco.Core/Logging/DisposableTimer.cs diff --git a/src/Umbraco.Abstractions/Logging/ILogger.cs b/src/Umbraco.Core/Logging/ILogger.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/ILogger.cs rename to src/Umbraco.Core/Logging/ILogger.cs diff --git a/src/Umbraco.Abstractions/Logging/IMessageTemplates.cs b/src/Umbraco.Core/Logging/IMessageTemplates.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/IMessageTemplates.cs rename to src/Umbraco.Core/Logging/IMessageTemplates.cs diff --git a/src/Umbraco.Abstractions/Logging/IProfiler.cs b/src/Umbraco.Core/Logging/IProfiler.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/IProfiler.cs rename to src/Umbraco.Core/Logging/IProfiler.cs diff --git a/src/Umbraco.Abstractions/Logging/IProfilingLogger.cs b/src/Umbraco.Core/Logging/IProfilingLogger.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/IProfilingLogger.cs rename to src/Umbraco.Core/Logging/IProfilingLogger.cs diff --git a/src/Umbraco.Abstractions/Logging/LogLevel.cs b/src/Umbraco.Core/Logging/LogLevel.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/LogLevel.cs rename to src/Umbraco.Core/Logging/LogLevel.cs diff --git a/src/Umbraco.Abstractions/Logging/LogProfiler.cs b/src/Umbraco.Core/Logging/LogProfiler.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/LogProfiler.cs rename to src/Umbraco.Core/Logging/LogProfiler.cs diff --git a/src/Umbraco.Abstractions/Logging/LoggerExtensions.cs b/src/Umbraco.Core/Logging/LoggerExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/LoggerExtensions.cs rename to src/Umbraco.Core/Logging/LoggerExtensions.cs diff --git a/src/Umbraco.Abstractions/Logging/LoggingTaskExtension.cs b/src/Umbraco.Core/Logging/LoggingTaskExtension.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/LoggingTaskExtension.cs rename to src/Umbraco.Core/Logging/LoggingTaskExtension.cs diff --git a/src/Umbraco.Abstractions/Logging/NullLogger.cs b/src/Umbraco.Core/Logging/NullLogger.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/NullLogger.cs rename to src/Umbraco.Core/Logging/NullLogger.cs diff --git a/src/Umbraco.Abstractions/Logging/ProfilerExtensions.cs b/src/Umbraco.Core/Logging/ProfilerExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/ProfilerExtensions.cs rename to src/Umbraco.Core/Logging/ProfilerExtensions.cs diff --git a/src/Umbraco.Abstractions/Logging/ProfilingLogger.cs b/src/Umbraco.Core/Logging/ProfilingLogger.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/ProfilingLogger.cs rename to src/Umbraco.Core/Logging/ProfilingLogger.cs diff --git a/src/Umbraco.Abstractions/Logging/VoidProfiler.cs b/src/Umbraco.Core/Logging/VoidProfiler.cs similarity index 100% rename from src/Umbraco.Abstractions/Logging/VoidProfiler.cs rename to src/Umbraco.Core/Logging/VoidProfiler.cs diff --git a/src/Umbraco.Web/Macros/IMacroRenderer.cs b/src/Umbraco.Core/Macros/IMacroRenderer.cs similarity index 100% rename from src/Umbraco.Web/Macros/IMacroRenderer.cs rename to src/Umbraco.Core/Macros/IMacroRenderer.cs diff --git a/src/Umbraco.Core/Macros/MacroContent.cs b/src/Umbraco.Core/Macros/MacroContent.cs new file mode 100644 index 0000000000..60dfb9210d --- /dev/null +++ b/src/Umbraco.Core/Macros/MacroContent.cs @@ -0,0 +1,20 @@ +using System; + +namespace Umbraco.Web.Macros +{ + // represents the content of a macro + public class MacroContent + { + // gets or sets the text content + public string Text { get; set; } + + // gets or sets the date the content was generated + public DateTime Date { get; set; } = DateTime.Now; + + // a value indicating whether the content is empty + public bool IsEmpty => Text is null; + + // gets an empty macro content + public static MacroContent Empty { get; } = new MacroContent(); + } +} diff --git a/src/Umbraco.Abstractions/Macros/MacroErrorBehaviour.cs b/src/Umbraco.Core/Macros/MacroErrorBehaviour.cs similarity index 100% rename from src/Umbraco.Abstractions/Macros/MacroErrorBehaviour.cs rename to src/Umbraco.Core/Macros/MacroErrorBehaviour.cs diff --git a/src/Umbraco.Web/Macros/MacroModel.cs b/src/Umbraco.Core/Macros/MacroModel.cs similarity index 91% rename from src/Umbraco.Web/Macros/MacroModel.cs rename to src/Umbraco.Core/Macros/MacroModel.cs index dd9a73b147..6b5013115a 100644 --- a/src/Umbraco.Web/Macros/MacroModel.cs +++ b/src/Umbraco.Core/Macros/MacroModel.cs @@ -20,8 +20,6 @@ namespace Umbraco.Web.Macros /// public string Alias { get; set; } - public MacroTypes MacroType { get; set; } - public string MacroSource { get; set; } public int CacheDuration { get; set; } @@ -46,7 +44,6 @@ namespace Umbraco.Web.Macros Id = macro.Id; Name = macro.Name; Alias = macro.Alias; - MacroType = macro.MacroType; MacroSource = macro.MacroSource; CacheDuration = macro.CacheDuration; CacheByPage = macro.CacheByPage; @@ -55,8 +52,6 @@ namespace Umbraco.Web.Macros foreach (var prop in macro.Properties) Properties.Add(new MacroPropertyModel(prop.Alias, string.Empty, prop.EditorAlias)); - - MacroType = macro.MacroType; } } } diff --git a/src/Umbraco.Web/Macros/MacroPropertyModel.cs b/src/Umbraco.Core/Macros/MacroPropertyModel.cs similarity index 100% rename from src/Umbraco.Web/Macros/MacroPropertyModel.cs rename to src/Umbraco.Core/Macros/MacroPropertyModel.cs diff --git a/src/Umbraco.Abstractions/Manifest/IManifestFilter.cs b/src/Umbraco.Core/Manifest/IManifestFilter.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/IManifestFilter.cs rename to src/Umbraco.Core/Manifest/IManifestFilter.cs diff --git a/src/Umbraco.Abstractions/Manifest/IManifestParser.cs b/src/Umbraco.Core/Manifest/IManifestParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/IManifestParser.cs rename to src/Umbraco.Core/Manifest/IManifestParser.cs diff --git a/src/Umbraco.Abstractions/Manifest/IPackageManifest.cs b/src/Umbraco.Core/Manifest/IPackageManifest.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/IPackageManifest.cs rename to src/Umbraco.Core/Manifest/IPackageManifest.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestContentAppDefinition.cs b/src/Umbraco.Core/Manifest/ManifestContentAppDefinition.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/ManifestContentAppDefinition.cs rename to src/Umbraco.Core/Manifest/ManifestContentAppDefinition.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestContentAppFactory.cs b/src/Umbraco.Core/Manifest/ManifestContentAppFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/ManifestContentAppFactory.cs rename to src/Umbraco.Core/Manifest/ManifestContentAppFactory.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestDashboard.cs b/src/Umbraco.Core/Manifest/ManifestDashboard.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/ManifestDashboard.cs rename to src/Umbraco.Core/Manifest/ManifestDashboard.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestFilterCollection.cs b/src/Umbraco.Core/Manifest/ManifestFilterCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/ManifestFilterCollection.cs rename to src/Umbraco.Core/Manifest/ManifestFilterCollection.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestFilterCollectionBuilder.cs b/src/Umbraco.Core/Manifest/ManifestFilterCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/ManifestFilterCollectionBuilder.cs rename to src/Umbraco.Core/Manifest/ManifestFilterCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestSection.cs b/src/Umbraco.Core/Manifest/ManifestSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/ManifestSection.cs rename to src/Umbraco.Core/Manifest/ManifestSection.cs diff --git a/src/Umbraco.Abstractions/Manifest/ManifestWatcher.cs b/src/Umbraco.Core/Manifest/ManifestWatcher.cs similarity index 86% rename from src/Umbraco.Abstractions/Manifest/ManifestWatcher.cs rename to src/Umbraco.Core/Manifest/ManifestWatcher.cs index 8d81ac3de5..23caac3a1b 100644 --- a/src/Umbraco.Abstractions/Manifest/ManifestWatcher.cs +++ b/src/Umbraco.Core/Manifest/ManifestWatcher.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; +using Umbraco.Net; namespace Umbraco.Core.Manifest { @@ -13,13 +14,13 @@ namespace Umbraco.Core.Manifest private static volatile bool _isRestarting; private readonly ILogger _logger; - private readonly IHostingEnvironment _hostingEnvironment; + private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; private readonly List _fws = new List(); - public ManifestWatcher(ILogger logger, IHostingEnvironment hostingEnvironment) + public ManifestWatcher(ILogger logger, IUmbracoApplicationLifetime umbracoApplicationLifetime) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _hostingEnvironment = hostingEnvironment; + _umbracoApplicationLifetime = umbracoApplicationLifetime; } public void Start(params string[] packageFolders) @@ -57,7 +58,7 @@ namespace Umbraco.Core.Manifest _isRestarting = true; _logger.Info("Manifest has changed, app pool is restarting ({Path})", e.FullPath); - _hostingEnvironment.LazyRestartApplication(); + _umbracoApplicationLifetime.Restart(); Dispose(); // uh? if the app restarts then this should be disposed anyways? } } diff --git a/src/Umbraco.Abstractions/Manifest/PackageManifest.cs b/src/Umbraco.Core/Manifest/PackageManifest.cs similarity index 100% rename from src/Umbraco.Abstractions/Manifest/PackageManifest.cs rename to src/Umbraco.Core/Manifest/PackageManifest.cs diff --git a/src/Umbraco.Abstractions/Mapping/IMapDefinition.cs b/src/Umbraco.Core/Mapping/IMapDefinition.cs similarity index 100% rename from src/Umbraco.Abstractions/Mapping/IMapDefinition.cs rename to src/Umbraco.Core/Mapping/IMapDefinition.cs diff --git a/src/Umbraco.Abstractions/Mapping/MapDefinitionCollection.cs b/src/Umbraco.Core/Mapping/MapDefinitionCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Mapping/MapDefinitionCollection.cs rename to src/Umbraco.Core/Mapping/MapDefinitionCollection.cs diff --git a/src/Umbraco.Abstractions/Mapping/MapDefinitionCollectionBuilder.cs b/src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Mapping/MapDefinitionCollectionBuilder.cs rename to src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Mapping/MapperContext.cs b/src/Umbraco.Core/Mapping/MapperContext.cs similarity index 100% rename from src/Umbraco.Abstractions/Mapping/MapperContext.cs rename to src/Umbraco.Core/Mapping/MapperContext.cs diff --git a/src/Umbraco.Abstractions/Mapping/UmbracoMapper.cs b/src/Umbraco.Core/Mapping/UmbracoMapper.cs similarity index 100% rename from src/Umbraco.Abstractions/Mapping/UmbracoMapper.cs rename to src/Umbraco.Core/Mapping/UmbracoMapper.cs diff --git a/src/Umbraco.Abstractions/Media/IEmbedProvider.cs b/src/Umbraco.Core/Media/IEmbedProvider.cs similarity index 100% rename from src/Umbraco.Abstractions/Media/IEmbedProvider.cs rename to src/Umbraco.Core/Media/IEmbedProvider.cs diff --git a/src/Umbraco.Abstractions/Media/OEmbedResult.cs b/src/Umbraco.Core/Media/OEmbedResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Media/OEmbedResult.cs rename to src/Umbraco.Core/Media/OEmbedResult.cs diff --git a/src/Umbraco.Abstractions/Media/OEmbedStatus.cs b/src/Umbraco.Core/Media/OEmbedStatus.cs similarity index 100% rename from src/Umbraco.Abstractions/Media/OEmbedStatus.cs rename to src/Umbraco.Core/Media/OEmbedStatus.cs diff --git a/src/Umbraco.Abstractions/MediaTypeExtensions.cs b/src/Umbraco.Core/MediaTypeExtensions.cs similarity index 68% rename from src/Umbraco.Abstractions/MediaTypeExtensions.cs rename to src/Umbraco.Core/MediaTypeExtensions.cs index 4e2ae5822a..3a2a3ba6e2 100644 --- a/src/Umbraco.Abstractions/MediaTypeExtensions.cs +++ b/src/Umbraco.Core/MediaTypeExtensions.cs @@ -1,8 +1,8 @@ namespace Umbraco.Core.Models { - internal static class MediaTypeExtensions + public static class MediaTypeExtensions { - internal static bool IsSystemMediaType(this IMediaType mediaType) => + public static bool IsSystemMediaType(this IMediaType mediaType) => mediaType.Alias == Constants.Conventions.MediaTypes.File || mediaType.Alias == Constants.Conventions.MediaTypes.Folder || mediaType.Alias == Constants.Conventions.MediaTypes.Image; diff --git a/src/Umbraco.Abstractions/Migrations/IMigration.cs b/src/Umbraco.Core/Migrations/IMigration.cs similarity index 100% rename from src/Umbraco.Abstractions/Migrations/IMigration.cs rename to src/Umbraco.Core/Migrations/IMigration.cs diff --git a/src/Umbraco.Abstractions/Migrations/IncompleteMigrationExpressionException.cs b/src/Umbraco.Core/Migrations/IncompleteMigrationExpressionException.cs similarity index 100% rename from src/Umbraco.Abstractions/Migrations/IncompleteMigrationExpressionException.cs rename to src/Umbraco.Core/Migrations/IncompleteMigrationExpressionException.cs diff --git a/src/Umbraco.Abstractions/Migrations/NoopMigration.cs b/src/Umbraco.Core/Migrations/NoopMigration.cs similarity index 100% rename from src/Umbraco.Abstractions/Migrations/NoopMigration.cs rename to src/Umbraco.Core/Migrations/NoopMigration.cs diff --git a/src/Umbraco.Abstractions/Models/AnchorsModel.cs b/src/Umbraco.Core/Models/AnchorsModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/AnchorsModel.cs rename to src/Umbraco.Core/Models/AnchorsModel.cs diff --git a/src/Umbraco.Abstractions/Models/AuditEntry.cs b/src/Umbraco.Core/Models/AuditEntry.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/AuditEntry.cs rename to src/Umbraco.Core/Models/AuditEntry.cs diff --git a/src/Umbraco.Abstractions/Models/AuditItem.cs b/src/Umbraco.Core/Models/AuditItem.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/AuditItem.cs rename to src/Umbraco.Core/Models/AuditItem.cs diff --git a/src/Umbraco.Abstractions/Models/AuditType.cs b/src/Umbraco.Core/Models/AuditType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/AuditType.cs rename to src/Umbraco.Core/Models/AuditType.cs diff --git a/src/Umbraco.Abstractions/Models/ChangingPasswordModel.cs b/src/Umbraco.Core/Models/ChangingPasswordModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ChangingPasswordModel.cs rename to src/Umbraco.Core/Models/ChangingPasswordModel.cs diff --git a/src/Umbraco.Abstractions/Models/Consent.cs b/src/Umbraco.Core/Models/Consent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Consent.cs rename to src/Umbraco.Core/Models/Consent.cs diff --git a/src/Umbraco.Abstractions/Models/ConsentExtensions.cs b/src/Umbraco.Core/Models/ConsentExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ConsentExtensions.cs rename to src/Umbraco.Core/Models/ConsentExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/ConsentState.cs b/src/Umbraco.Core/Models/ConsentState.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ConsentState.cs rename to src/Umbraco.Core/Models/ConsentState.cs diff --git a/src/Umbraco.Abstractions/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentBase.cs rename to src/Umbraco.Core/Models/ContentBase.cs diff --git a/src/Umbraco.Abstractions/Models/ContentCultureInfos.cs b/src/Umbraco.Core/Models/ContentCultureInfos.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentCultureInfos.cs rename to src/Umbraco.Core/Models/ContentCultureInfos.cs diff --git a/src/Umbraco.Abstractions/Models/ContentCultureInfosCollection.cs b/src/Umbraco.Core/Models/ContentCultureInfosCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentCultureInfosCollection.cs rename to src/Umbraco.Core/Models/ContentCultureInfosCollection.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/AuditLog.cs b/src/Umbraco.Core/Models/ContentEditing/AuditLog.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/AuditLog.cs rename to src/Umbraco.Core/Models/ContentEditing/AuditLog.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentApp.cs b/src/Umbraco.Core/Models/ContentEditing/ContentApp.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentApp.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentApp.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentAppBadge.cs b/src/Umbraco.Core/Models/ContentEditing/ContentAppBadge.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentAppBadge.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentAppBadge.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentAppBadgeType.cs b/src/Umbraco.Core/Models/ContentEditing/ContentAppBadgeType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentAppBadgeType.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentAppBadgeType.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentDomainsAndCulture.cs b/src/Umbraco.Core/Models/ContentEditing/ContentDomainsAndCulture.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentDomainsAndCulture.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentDomainsAndCulture.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentItemSave.cs b/src/Umbraco.Core/Models/ContentEditing/ContentItemSave.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentItemSave.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentItemSave.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyBasic.cs b/src/Umbraco.Core/Models/ContentEditing/ContentPropertyBasic.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyBasic.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentPropertyBasic.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyCollectionDto.cs b/src/Umbraco.Core/Models/ContentEditing/ContentPropertyCollectionDto.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyCollectionDto.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentPropertyCollectionDto.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/ContentPropertyDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentPropertyDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyDto.cs b/src/Umbraco.Core/Models/ContentEditing/ContentPropertyDto.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentPropertyDto.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentPropertyDto.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentRedirectUrl.cs b/src/Umbraco.Core/Models/ContentEditing/ContentRedirectUrl.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentRedirectUrl.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentRedirectUrl.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentSaveAction.cs b/src/Umbraco.Core/Models/ContentEditing/ContentSaveAction.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentSaveAction.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentSaveAction.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentSavedState.cs b/src/Umbraco.Core/Models/ContentEditing/ContentSavedState.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentSavedState.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentSavedState.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentSortOrder.cs b/src/Umbraco.Core/Models/ContentEditing/ContentSortOrder.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentSortOrder.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentSortOrder.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ContentVariantSave.cs b/src/Umbraco.Core/Models/ContentEditing/ContentVariantSave.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ContentVariantSave.cs rename to src/Umbraco.Core/Models/ContentEditing/ContentVariantSave.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/CreatedDocumentTypeCollectionResult.cs b/src/Umbraco.Core/Models/ContentEditing/CreatedDocumentTypeCollectionResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/CreatedDocumentTypeCollectionResult.cs rename to src/Umbraco.Core/Models/ContentEditing/CreatedDocumentTypeCollectionResult.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/DictionaryOverviewDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/DictionaryOverviewDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/DictionaryOverviewDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/DictionaryOverviewDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/DictionaryOverviewTranslationDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/DictionaryOverviewTranslationDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/DictionaryOverviewTranslationDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/DictionaryOverviewTranslationDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/DictionaryTranslationDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/DictionaryTranslationDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/DictionaryTranslationDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/DictionaryTranslationDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/DictionaryTranslationSave.cs b/src/Umbraco.Core/Models/ContentEditing/DictionaryTranslationSave.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/DictionaryTranslationSave.cs rename to src/Umbraco.Core/Models/ContentEditing/DictionaryTranslationSave.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/DomainDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/DomainDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/DomainDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/DomainDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/IContentAppFactory.cs b/src/Umbraco.Core/Models/ContentEditing/IContentAppFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/IContentAppFactory.cs rename to src/Umbraco.Core/Models/ContentEditing/IContentAppFactory.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/IContentProperties.cs b/src/Umbraco.Core/Models/ContentEditing/IContentProperties.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/IContentProperties.cs rename to src/Umbraco.Core/Models/ContentEditing/IContentProperties.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/IContentSave.cs b/src/Umbraco.Core/Models/ContentEditing/IContentSave.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/IContentSave.cs rename to src/Umbraco.Core/Models/ContentEditing/IContentSave.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/IHaveUploadedFiles.cs b/src/Umbraco.Core/Models/ContentEditing/IHaveUploadedFiles.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/IHaveUploadedFiles.cs rename to src/Umbraco.Core/Models/ContentEditing/IHaveUploadedFiles.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ITabbedContent.cs b/src/Umbraco.Core/Models/ContentEditing/ITabbedContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ITabbedContent.cs rename to src/Umbraco.Core/Models/ContentEditing/ITabbedContent.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/Language.cs b/src/Umbraco.Core/Models/ContentEditing/Language.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/Language.cs rename to src/Umbraco.Core/Models/ContentEditing/Language.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/LinkDisplay.cs similarity index 96% rename from src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/LinkDisplay.cs index 650b7b8db5..5b6379288f 100644 --- a/src/Umbraco.Abstractions/Models/ContentEditing/LinkDisplay.cs +++ b/src/Umbraco.Core/Models/ContentEditing/LinkDisplay.cs @@ -4,7 +4,7 @@ using Umbraco.Core; namespace Umbraco.Web.Models.ContentEditing { [DataContract(Name = "link", Namespace = "")] - internal class LinkDisplay + public class LinkDisplay { [DataMember(Name = "icon")] public string Icon { get; set; } diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/MemberPropertyTypeBasic.cs b/src/Umbraco.Core/Models/ContentEditing/MemberPropertyTypeBasic.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/MemberPropertyTypeBasic.cs rename to src/Umbraco.Core/Models/ContentEditing/MemberPropertyTypeBasic.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/MemberPropertyTypeDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/MemberPropertyTypeDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/MemberPropertyTypeDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/MemberPropertyTypeDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/MoveOrCopy.cs b/src/Umbraco.Core/Models/ContentEditing/MoveOrCopy.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/MoveOrCopy.cs rename to src/Umbraco.Core/Models/ContentEditing/MoveOrCopy.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/NotificationStyle.cs b/src/Umbraco.Core/Models/ContentEditing/NotificationStyle.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/NotificationStyle.cs rename to src/Umbraco.Core/Models/ContentEditing/NotificationStyle.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/NotifySetting.cs b/src/Umbraco.Core/Models/ContentEditing/NotifySetting.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/NotifySetting.cs rename to src/Umbraco.Core/Models/ContentEditing/NotifySetting.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/ObjectType.cs b/src/Umbraco.Core/Models/ContentEditing/ObjectType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/ObjectType.cs rename to src/Umbraco.Core/Models/ContentEditing/ObjectType.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/Permission.cs b/src/Umbraco.Core/Models/ContentEditing/Permission.cs similarity index 95% rename from src/Umbraco.Abstractions/Models/ContentEditing/Permission.cs rename to src/Umbraco.Core/Models/ContentEditing/Permission.cs index 7b444e5959..2bb905200a 100644 --- a/src/Umbraco.Abstractions/Models/ContentEditing/Permission.cs +++ b/src/Umbraco.Core/Models/ContentEditing/Permission.cs @@ -22,7 +22,7 @@ namespace Umbraco.Web.Models.ContentEditing /// We'll use this to map the categories but it wont' be returned in the json /// [IgnoreDataMember] - internal string Category { get; set; } + public string Category { get; set; } /// /// The letter from the IAction diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/PostedFolder.cs b/src/Umbraco.Core/Models/ContentEditing/PostedFolder.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/PostedFolder.cs rename to src/Umbraco.Core/Models/ContentEditing/PostedFolder.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/PropertyEditorBasic.cs b/src/Umbraco.Core/Models/ContentEditing/PropertyEditorBasic.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/PropertyEditorBasic.cs rename to src/Umbraco.Core/Models/ContentEditing/PropertyEditorBasic.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/PropertyGroupBasic.cs b/src/Umbraco.Core/Models/ContentEditing/PropertyGroupBasic.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/PropertyGroupBasic.cs rename to src/Umbraco.Core/Models/ContentEditing/PropertyGroupBasic.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/PropertyTypeBasic.cs b/src/Umbraco.Core/Models/ContentEditing/PropertyTypeBasic.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/PropertyTypeBasic.cs rename to src/Umbraco.Core/Models/ContentEditing/PropertyTypeBasic.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/PropertyTypeDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/PropertyTypeDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/PropertyTypeDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/PropertyTypeDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/PropertyTypeValidation.cs b/src/Umbraco.Core/Models/ContentEditing/PropertyTypeValidation.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/PropertyTypeValidation.cs rename to src/Umbraco.Core/Models/ContentEditing/PropertyTypeValidation.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/RedirectUrlSearchResults.cs b/src/Umbraco.Core/Models/ContentEditing/RedirectUrlSearchResults.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/RedirectUrlSearchResults.cs rename to src/Umbraco.Core/Models/ContentEditing/RedirectUrlSearchResults.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/RelationDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/RelationDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/RelationDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/RelationDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/RichTextEditorPlugin.cs b/src/Umbraco.Core/Models/ContentEditing/RichTextEditorPlugin.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/RichTextEditorPlugin.cs rename to src/Umbraco.Core/Models/ContentEditing/RichTextEditorPlugin.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/RollbackVersion.cs b/src/Umbraco.Core/Models/ContentEditing/RollbackVersion.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/RollbackVersion.cs rename to src/Umbraco.Core/Models/ContentEditing/RollbackVersion.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/SearchResult.cs b/src/Umbraco.Core/Models/ContentEditing/SearchResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/SearchResult.cs rename to src/Umbraco.Core/Models/ContentEditing/SearchResult.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/Section.cs b/src/Umbraco.Core/Models/ContentEditing/Section.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/Section.cs rename to src/Umbraco.Core/Models/ContentEditing/Section.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/SnippetDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/SnippetDisplay.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/SnippetDisplay.cs rename to src/Umbraco.Core/Models/ContentEditing/SnippetDisplay.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/StyleSheet.cs b/src/Umbraco.Core/Models/ContentEditing/StyleSheet.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/StyleSheet.cs rename to src/Umbraco.Core/Models/ContentEditing/StyleSheet.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/StylesheetRule.cs b/src/Umbraco.Core/Models/ContentEditing/StylesheetRule.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/StylesheetRule.cs rename to src/Umbraco.Core/Models/ContentEditing/StylesheetRule.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/Tab.cs b/src/Umbraco.Core/Models/ContentEditing/Tab.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/Tab.cs rename to src/Umbraco.Core/Models/ContentEditing/Tab.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/UmbracoEntityTypes.cs b/src/Umbraco.Core/Models/ContentEditing/UmbracoEntityTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/UmbracoEntityTypes.cs rename to src/Umbraco.Core/Models/ContentEditing/UmbracoEntityTypes.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/UnpublishContent.cs b/src/Umbraco.Core/Models/ContentEditing/UnpublishContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/UnpublishContent.cs rename to src/Umbraco.Core/Models/ContentEditing/UnpublishContent.cs diff --git a/src/Umbraco.Abstractions/Models/ContentEditing/UrlAndAnchors.cs b/src/Umbraco.Core/Models/ContentEditing/UrlAndAnchors.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentEditing/UrlAndAnchors.cs rename to src/Umbraco.Core/Models/ContentEditing/UrlAndAnchors.cs diff --git a/src/Umbraco.Abstractions/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentExtensions.cs rename to src/Umbraco.Core/Models/ContentExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/ContentModel.cs b/src/Umbraco.Core/Models/ContentModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentModel.cs rename to src/Umbraco.Core/Models/ContentModel.cs diff --git a/src/Umbraco.Abstractions/Models/ContentModelOfTContent.cs b/src/Umbraco.Core/Models/ContentModelOfTContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentModelOfTContent.cs rename to src/Umbraco.Core/Models/ContentModelOfTContent.cs diff --git a/src/Umbraco.Abstractions/Models/ContentRepositoryExtensions.cs b/src/Umbraco.Core/Models/ContentRepositoryExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentRepositoryExtensions.cs rename to src/Umbraco.Core/Models/ContentRepositoryExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/ContentSchedule.cs b/src/Umbraco.Core/Models/ContentSchedule.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentSchedule.cs rename to src/Umbraco.Core/Models/ContentSchedule.cs diff --git a/src/Umbraco.Abstractions/Models/ContentScheduleAction.cs b/src/Umbraco.Core/Models/ContentScheduleAction.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentScheduleAction.cs rename to src/Umbraco.Core/Models/ContentScheduleAction.cs diff --git a/src/Umbraco.Abstractions/Models/ContentScheduleCollection.cs b/src/Umbraco.Core/Models/ContentScheduleCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentScheduleCollection.cs rename to src/Umbraco.Core/Models/ContentScheduleCollection.cs diff --git a/src/Umbraco.Abstractions/Models/ContentStatus.cs b/src/Umbraco.Core/Models/ContentStatus.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentStatus.cs rename to src/Umbraco.Core/Models/ContentStatus.cs diff --git a/src/Umbraco.Abstractions/Models/ContentTypeAvailableCompositionsResult.cs b/src/Umbraco.Core/Models/ContentTypeAvailableCompositionsResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentTypeAvailableCompositionsResult.cs rename to src/Umbraco.Core/Models/ContentTypeAvailableCompositionsResult.cs diff --git a/src/Umbraco.Abstractions/Models/ContentTypeAvailableCompositionsResults.cs b/src/Umbraco.Core/Models/ContentTypeAvailableCompositionsResults.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentTypeAvailableCompositionsResults.cs rename to src/Umbraco.Core/Models/ContentTypeAvailableCompositionsResults.cs diff --git a/src/Umbraco.Abstractions/Models/ContentTypeBaseExtensions.cs b/src/Umbraco.Core/Models/ContentTypeBaseExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentTypeBaseExtensions.cs rename to src/Umbraco.Core/Models/ContentTypeBaseExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/ContentTypeSort.cs b/src/Umbraco.Core/Models/ContentTypeSort.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentTypeSort.cs rename to src/Umbraco.Core/Models/ContentTypeSort.cs diff --git a/src/Umbraco.Abstractions/Models/ContentVariation.cs b/src/Umbraco.Core/Models/ContentVariation.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ContentVariation.cs rename to src/Umbraco.Core/Models/ContentVariation.cs diff --git a/src/Umbraco.Abstractions/Models/CultureImpact.cs b/src/Umbraco.Core/Models/CultureImpact.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/CultureImpact.cs rename to src/Umbraco.Core/Models/CultureImpact.cs diff --git a/src/Umbraco.Abstractions/Models/DataTypeExtensions.cs b/src/Umbraco.Core/Models/DataTypeExtensions.cs similarity index 96% rename from src/Umbraco.Abstractions/Models/DataTypeExtensions.cs rename to src/Umbraco.Core/Models/DataTypeExtensions.cs index c2116c6c45..4f4bd4d6c3 100644 --- a/src/Umbraco.Abstractions/Models/DataTypeExtensions.cs +++ b/src/Umbraco.Core/Models/DataTypeExtensions.cs @@ -75,7 +75,7 @@ namespace Umbraco.Core.Models /// /// The data type definition. /// - internal static bool IsBuildInDataType(this IDataType dataType) + public static bool IsBuildInDataType(this IDataType dataType) { return IsBuildInDataType(dataType.Key); } @@ -83,7 +83,7 @@ namespace Umbraco.Core.Models /// /// Returns true if this date type is build-in/default. /// - internal static bool IsBuildInDataType(Guid key) + public static bool IsBuildInDataType(Guid key) { return IdsOfBuildInDataTypes.Contains(key); } diff --git a/src/Umbraco.Abstractions/Models/DeepCloneHelper.cs b/src/Umbraco.Core/Models/DeepCloneHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/DeepCloneHelper.cs rename to src/Umbraco.Core/Models/DeepCloneHelper.cs diff --git a/src/Umbraco.Abstractions/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/DictionaryItem.cs rename to src/Umbraco.Core/Models/DictionaryItem.cs diff --git a/src/Umbraco.Abstractions/Models/DictionaryItemExtensions.cs b/src/Umbraco.Core/Models/DictionaryItemExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/DictionaryItemExtensions.cs rename to src/Umbraco.Core/Models/DictionaryItemExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/DictionaryTranslation.cs b/src/Umbraco.Core/Models/DictionaryTranslation.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/DictionaryTranslation.cs rename to src/Umbraco.Core/Models/DictionaryTranslation.cs diff --git a/src/Umbraco.Abstractions/Models/DoNotCloneAttribute.cs b/src/Umbraco.Core/Models/DoNotCloneAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/DoNotCloneAttribute.cs rename to src/Umbraco.Core/Models/DoNotCloneAttribute.cs diff --git a/src/Umbraco.Abstractions/Models/Editors/ContentPropertyData.cs b/src/Umbraco.Core/Models/Editors/ContentPropertyData.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Editors/ContentPropertyData.cs rename to src/Umbraco.Core/Models/Editors/ContentPropertyData.cs diff --git a/src/Umbraco.Abstractions/Models/Editors/ContentPropertyFile.cs b/src/Umbraco.Core/Models/Editors/ContentPropertyFile.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Editors/ContentPropertyFile.cs rename to src/Umbraco.Core/Models/Editors/ContentPropertyFile.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/BeingDirty.cs b/src/Umbraco.Core/Models/Entities/BeingDirty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/BeingDirty.cs rename to src/Umbraco.Core/Models/Entities/BeingDirty.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/BeingDirtyBase.cs b/src/Umbraco.Core/Models/Entities/BeingDirtyBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/BeingDirtyBase.cs rename to src/Umbraco.Core/Models/Entities/BeingDirtyBase.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/ContentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/ContentEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/ContentEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/ContentEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/DocumentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/DocumentEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/DocumentEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/DocumentEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/EntityBase.cs b/src/Umbraco.Core/Models/Entities/EntityBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/EntityBase.cs rename to src/Umbraco.Core/Models/Entities/EntityBase.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/EntityExtensions.cs b/src/Umbraco.Core/Models/Entities/EntityExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/EntityExtensions.cs rename to src/Umbraco.Core/Models/Entities/EntityExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/EntitySlim.cs b/src/Umbraco.Core/Models/Entities/EntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/EntitySlim.cs rename to src/Umbraco.Core/Models/Entities/EntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/ICanBeDirty.cs b/src/Umbraco.Core/Models/Entities/ICanBeDirty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/ICanBeDirty.cs rename to src/Umbraco.Core/Models/Entities/ICanBeDirty.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IContentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IContentEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IContentEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/IContentEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IDocumentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IDocumentEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IDocumentEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/IDocumentEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IEntity.cs b/src/Umbraco.Core/Models/Entities/IEntity.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IEntity.cs rename to src/Umbraco.Core/Models/Entities/IEntity.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/IEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IHaveAdditionalData.cs b/src/Umbraco.Core/Models/Entities/IHaveAdditionalData.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IHaveAdditionalData.cs rename to src/Umbraco.Core/Models/Entities/IHaveAdditionalData.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IMediaEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IMediaEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IMediaEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/IMediaEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IMemberEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IMemberEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IMemberEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/IMemberEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IRememberBeingDirty.cs b/src/Umbraco.Core/Models/Entities/IRememberBeingDirty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IRememberBeingDirty.cs rename to src/Umbraco.Core/Models/Entities/IRememberBeingDirty.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/ITreeEntity.cs b/src/Umbraco.Core/Models/Entities/ITreeEntity.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/ITreeEntity.cs rename to src/Umbraco.Core/Models/Entities/ITreeEntity.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IUmbracoEntity.cs b/src/Umbraco.Core/Models/Entities/IUmbracoEntity.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IUmbracoEntity.cs rename to src/Umbraco.Core/Models/Entities/IUmbracoEntity.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/IValueObject.cs b/src/Umbraco.Core/Models/Entities/IValueObject.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/IValueObject.cs rename to src/Umbraco.Core/Models/Entities/IValueObject.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/MediaEntitySlim.cs b/src/Umbraco.Core/Models/Entities/MediaEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/MediaEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/MediaEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/MemberEntitySlim.cs b/src/Umbraco.Core/Models/Entities/MemberEntitySlim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/MemberEntitySlim.cs rename to src/Umbraco.Core/Models/Entities/MemberEntitySlim.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/TreeEntityBase.cs b/src/Umbraco.Core/Models/Entities/TreeEntityBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/TreeEntityBase.cs rename to src/Umbraco.Core/Models/Entities/TreeEntityBase.cs diff --git a/src/Umbraco.Abstractions/Models/Entities/TreeEntityPath.cs b/src/Umbraco.Core/Models/Entities/TreeEntityPath.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Entities/TreeEntityPath.cs rename to src/Umbraco.Core/Models/Entities/TreeEntityPath.cs diff --git a/src/Umbraco.Abstractions/Models/EntityContainer.cs b/src/Umbraco.Core/Models/EntityContainer.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/EntityContainer.cs rename to src/Umbraco.Core/Models/EntityContainer.cs diff --git a/src/Umbraco.Abstractions/Models/EntityExtensions.cs b/src/Umbraco.Core/Models/EntityExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/EntityExtensions.cs rename to src/Umbraco.Core/Models/EntityExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/File.cs b/src/Umbraco.Core/Models/File.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/File.cs rename to src/Umbraco.Core/Models/File.cs diff --git a/src/Umbraco.Abstractions/Models/Folder.cs b/src/Umbraco.Core/Models/Folder.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Folder.cs rename to src/Umbraco.Core/Models/Folder.cs diff --git a/src/Umbraco.Abstractions/Models/IAuditEntry.cs b/src/Umbraco.Core/Models/IAuditEntry.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IAuditEntry.cs rename to src/Umbraco.Core/Models/IAuditEntry.cs diff --git a/src/Umbraco.Abstractions/Models/IAuditItem.cs b/src/Umbraco.Core/Models/IAuditItem.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IAuditItem.cs rename to src/Umbraco.Core/Models/IAuditItem.cs diff --git a/src/Umbraco.Abstractions/Models/IConsent.cs b/src/Umbraco.Core/Models/IConsent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IConsent.cs rename to src/Umbraco.Core/Models/IConsent.cs diff --git a/src/Umbraco.Abstractions/Models/IContent.cs b/src/Umbraco.Core/Models/IContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IContent.cs rename to src/Umbraco.Core/Models/IContent.cs diff --git a/src/Umbraco.Abstractions/Models/IContentBase.cs b/src/Umbraco.Core/Models/IContentBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IContentBase.cs rename to src/Umbraco.Core/Models/IContentBase.cs diff --git a/src/Umbraco.Abstractions/Models/IContentModel.cs b/src/Umbraco.Core/Models/IContentModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IContentModel.cs rename to src/Umbraco.Core/Models/IContentModel.cs diff --git a/src/Umbraco.Abstractions/Models/IContentType.cs b/src/Umbraco.Core/Models/IContentType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IContentType.cs rename to src/Umbraco.Core/Models/IContentType.cs diff --git a/src/Umbraco.Abstractions/Models/IContentTypeBase.cs b/src/Umbraco.Core/Models/IContentTypeBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IContentTypeBase.cs rename to src/Umbraco.Core/Models/IContentTypeBase.cs diff --git a/src/Umbraco.Abstractions/Models/IContentTypeComposition.cs b/src/Umbraco.Core/Models/IContentTypeComposition.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IContentTypeComposition.cs rename to src/Umbraco.Core/Models/IContentTypeComposition.cs diff --git a/src/Umbraco.Abstractions/Models/IDataType.cs b/src/Umbraco.Core/Models/IDataType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IDataType.cs rename to src/Umbraco.Core/Models/IDataType.cs diff --git a/src/Umbraco.Abstractions/Models/IDataValueEditor.cs b/src/Umbraco.Core/Models/IDataValueEditor.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IDataValueEditor.cs rename to src/Umbraco.Core/Models/IDataValueEditor.cs diff --git a/src/Umbraco.Abstractions/Models/IDeepCloneable.cs b/src/Umbraco.Core/Models/IDeepCloneable.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IDeepCloneable.cs rename to src/Umbraco.Core/Models/IDeepCloneable.cs diff --git a/src/Umbraco.Abstractions/Models/IDictionaryItem.cs b/src/Umbraco.Core/Models/IDictionaryItem.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IDictionaryItem.cs rename to src/Umbraco.Core/Models/IDictionaryItem.cs diff --git a/src/Umbraco.Abstractions/Models/IDictionaryTranslation.cs b/src/Umbraco.Core/Models/IDictionaryTranslation.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IDictionaryTranslation.cs rename to src/Umbraco.Core/Models/IDictionaryTranslation.cs diff --git a/src/Umbraco.Abstractions/Models/IDomain.cs b/src/Umbraco.Core/Models/IDomain.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IDomain.cs rename to src/Umbraco.Core/Models/IDomain.cs diff --git a/src/Umbraco.Abstractions/Models/IFile.cs b/src/Umbraco.Core/Models/IFile.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IFile.cs rename to src/Umbraco.Core/Models/IFile.cs diff --git a/src/Umbraco.Abstractions/Models/IImageUrlGenerator.cs b/src/Umbraco.Core/Models/IImageUrlGenerator.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IImageUrlGenerator.cs rename to src/Umbraco.Core/Models/IImageUrlGenerator.cs diff --git a/src/Umbraco.Abstractions/Models/ILanguage.cs b/src/Umbraco.Core/Models/ILanguage.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ILanguage.cs rename to src/Umbraco.Core/Models/ILanguage.cs diff --git a/src/Umbraco.Abstractions/Models/IMacro.cs b/src/Umbraco.Core/Models/IMacro.cs similarity index 83% rename from src/Umbraco.Abstractions/Models/IMacro.cs rename to src/Umbraco.Core/Models/IMacro.cs index c3d37b0700..9d1c47154c 100644 --- a/src/Umbraco.Abstractions/Models/IMacro.cs +++ b/src/Umbraco.Core/Models/IMacro.cs @@ -58,22 +58,10 @@ namespace Umbraco.Core.Models [DataMember] string MacroSource { get; set; } - /// - /// Gets or set the macro type - /// - [DataMember] - MacroTypes MacroType { get; set; } - /// /// Gets or sets a list of Macro Properties /// [DataMember] MacroPropertyCollection Properties { get; } - - ///// - ///// Returns an enum based on the properties on the Macro - ///// - ///// - //MacroTypes MacroType(); } } diff --git a/src/Umbraco.Abstractions/Models/IMacroProperty.cs b/src/Umbraco.Core/Models/IMacroProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMacroProperty.cs rename to src/Umbraco.Core/Models/IMacroProperty.cs diff --git a/src/Umbraco.Abstractions/Models/IMedia.cs b/src/Umbraco.Core/Models/IMedia.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMedia.cs rename to src/Umbraco.Core/Models/IMedia.cs diff --git a/src/Umbraco.Abstractions/Models/IMediaType.cs b/src/Umbraco.Core/Models/IMediaType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMediaType.cs rename to src/Umbraco.Core/Models/IMediaType.cs diff --git a/src/Umbraco.Core/Models/IMediaUrlGenerator.cs b/src/Umbraco.Core/Models/IMediaUrlGenerator.cs new file mode 100644 index 0000000000..41e1be8d6c --- /dev/null +++ b/src/Umbraco.Core/Models/IMediaUrlGenerator.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.PropertyEditors +{ + /// + /// Used to generate paths to media items for a specified property editor alias + /// + public interface IMediaUrlGenerator + { + /// + /// Tries to get a media path for a given property editor alias + /// + /// The property editor alias + /// The value of the property + /// + /// True if a media path was returned + /// + bool TryGetMediaPath(string alias, object value, out string mediaPath); + } +} diff --git a/src/Umbraco.Abstractions/Models/IMember.cs b/src/Umbraco.Core/Models/IMember.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMember.cs rename to src/Umbraco.Core/Models/IMember.cs diff --git a/src/Umbraco.Abstractions/Models/IMemberGroup.cs b/src/Umbraco.Core/Models/IMemberGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMemberGroup.cs rename to src/Umbraco.Core/Models/IMemberGroup.cs diff --git a/src/Umbraco.Abstractions/Models/IMemberType.cs b/src/Umbraco.Core/Models/IMemberType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMemberType.cs rename to src/Umbraco.Core/Models/IMemberType.cs diff --git a/src/Umbraco.Abstractions/Models/IMigrationEntry.cs b/src/Umbraco.Core/Models/IMigrationEntry.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IMigrationEntry.cs rename to src/Umbraco.Core/Models/IMigrationEntry.cs diff --git a/src/Umbraco.Abstractions/Models/IPartialView.cs b/src/Umbraco.Core/Models/IPartialView.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IPartialView.cs rename to src/Umbraco.Core/Models/IPartialView.cs diff --git a/src/Umbraco.Abstractions/Models/IProperty.cs b/src/Umbraco.Core/Models/IProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IProperty.cs rename to src/Umbraco.Core/Models/IProperty.cs diff --git a/src/Umbraco.Abstractions/Models/IPropertyCollection.cs b/src/Umbraco.Core/Models/IPropertyCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IPropertyCollection.cs rename to src/Umbraco.Core/Models/IPropertyCollection.cs diff --git a/src/Umbraco.Abstractions/Models/IPropertyType.cs b/src/Umbraco.Core/Models/IPropertyType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IPropertyType.cs rename to src/Umbraco.Core/Models/IPropertyType.cs diff --git a/src/Umbraco.Abstractions/Models/IPropertyValue.cs b/src/Umbraco.Core/Models/IPropertyValue.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IPropertyValue.cs rename to src/Umbraco.Core/Models/IPropertyValue.cs diff --git a/src/Umbraco.Abstractions/Models/IRedirectUrl.cs b/src/Umbraco.Core/Models/IRedirectUrl.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IRedirectUrl.cs rename to src/Umbraco.Core/Models/IRedirectUrl.cs diff --git a/src/Umbraco.Abstractions/Models/IRelation.cs b/src/Umbraco.Core/Models/IRelation.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IRelation.cs rename to src/Umbraco.Core/Models/IRelation.cs diff --git a/src/Umbraco.Abstractions/Models/IRelationType.cs b/src/Umbraco.Core/Models/IRelationType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IRelationType.cs rename to src/Umbraco.Core/Models/IRelationType.cs diff --git a/src/Umbraco.Abstractions/Models/IScript.cs b/src/Umbraco.Core/Models/IScript.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IScript.cs rename to src/Umbraco.Core/Models/IScript.cs diff --git a/src/Umbraco.Abstractions/Models/IServerRegistration.cs b/src/Umbraco.Core/Models/IServerRegistration.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IServerRegistration.cs rename to src/Umbraco.Core/Models/IServerRegistration.cs diff --git a/src/Umbraco.Abstractions/Models/ISimpleContentType.cs b/src/Umbraco.Core/Models/ISimpleContentType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ISimpleContentType.cs rename to src/Umbraco.Core/Models/ISimpleContentType.cs diff --git a/src/Umbraco.Abstractions/Models/IStylesheet.cs b/src/Umbraco.Core/Models/IStylesheet.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IStylesheet.cs rename to src/Umbraco.Core/Models/IStylesheet.cs diff --git a/src/Umbraco.Abstractions/Models/IStylesheetProperty.cs b/src/Umbraco.Core/Models/IStylesheetProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/IStylesheetProperty.cs rename to src/Umbraco.Core/Models/IStylesheetProperty.cs diff --git a/src/Umbraco.Abstractions/Models/ITag.cs b/src/Umbraco.Core/Models/ITag.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ITag.cs rename to src/Umbraco.Core/Models/ITag.cs diff --git a/src/Umbraco.Abstractions/Models/ITemplate.cs b/src/Umbraco.Core/Models/ITemplate.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ITemplate.cs rename to src/Umbraco.Core/Models/ITemplate.cs diff --git a/src/Umbraco.Abstractions/Models/Identity/IIdentityUserLogin.cs b/src/Umbraco.Core/Models/Identity/IIdentityUserLogin.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Identity/IIdentityUserLogin.cs rename to src/Umbraco.Core/Models/Identity/IIdentityUserLogin.cs diff --git a/src/Umbraco.Abstractions/Models/Identity/IUserLoginInfo.cs b/src/Umbraco.Core/Models/Identity/IUserLoginInfo.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Identity/IUserLoginInfo.cs rename to src/Umbraco.Core/Models/Identity/IUserLoginInfo.cs diff --git a/src/Umbraco.Abstractions/Models/Identity/IdentityUserClaim.cs b/src/Umbraco.Core/Models/Identity/IdentityUserClaim.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Identity/IdentityUserClaim.cs rename to src/Umbraco.Core/Models/Identity/IdentityUserClaim.cs diff --git a/src/Umbraco.Abstractions/Models/Identity/IdentityUserLogin.cs b/src/Umbraco.Core/Models/Identity/IdentityUserLogin.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Identity/IdentityUserLogin.cs rename to src/Umbraco.Core/Models/Identity/IdentityUserLogin.cs diff --git a/src/Umbraco.Abstractions/Models/Identity/IdentityUserRole.cs b/src/Umbraco.Core/Models/Identity/IdentityUserRole.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Identity/IdentityUserRole.cs rename to src/Umbraco.Core/Models/Identity/IdentityUserRole.cs diff --git a/src/Umbraco.Abstractions/Models/ImageCropAnchor.cs b/src/Umbraco.Core/Models/ImageCropAnchor.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ImageCropAnchor.cs rename to src/Umbraco.Core/Models/ImageCropAnchor.cs diff --git a/src/Umbraco.Abstractions/Models/ImageCropMode.cs b/src/Umbraco.Core/Models/ImageCropMode.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ImageCropMode.cs rename to src/Umbraco.Core/Models/ImageCropMode.cs diff --git a/src/Umbraco.Abstractions/Models/ImageCropRatioMode.cs b/src/Umbraco.Core/Models/ImageCropRatioMode.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ImageCropRatioMode.cs rename to src/Umbraco.Core/Models/ImageCropRatioMode.cs diff --git a/src/Umbraco.Abstractions/Models/ImageUrlGenerationOptions.cs b/src/Umbraco.Core/Models/ImageUrlGenerationOptions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ImageUrlGenerationOptions.cs rename to src/Umbraco.Core/Models/ImageUrlGenerationOptions.cs diff --git a/src/Umbraco.Abstractions/Models/Link.cs b/src/Umbraco.Core/Models/Link.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Link.cs rename to src/Umbraco.Core/Models/Link.cs diff --git a/src/Umbraco.Abstractions/Models/LinkType.cs b/src/Umbraco.Core/Models/LinkType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/LinkType.cs rename to src/Umbraco.Core/Models/LinkType.cs diff --git a/src/Umbraco.Abstractions/Models/LoginModel.cs b/src/Umbraco.Core/Models/LoginModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/LoginModel.cs rename to src/Umbraco.Core/Models/LoginModel.cs diff --git a/src/Umbraco.Abstractions/Models/MacroProperty.cs b/src/Umbraco.Core/Models/MacroProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/MacroProperty.cs rename to src/Umbraco.Core/Models/MacroProperty.cs diff --git a/src/Umbraco.Abstractions/Models/MacroPropertyCollection.cs b/src/Umbraco.Core/Models/MacroPropertyCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/MacroPropertyCollection.cs rename to src/Umbraco.Core/Models/MacroPropertyCollection.cs diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicMapper.cs b/src/Umbraco.Core/Models/Mapping/ContentPropertyBasicMapper.cs similarity index 100% rename from src/Umbraco.Web/Models/Mapping/ContentPropertyBasicMapper.cs rename to src/Umbraco.Core/Models/Mapping/ContentPropertyBasicMapper.cs diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayMapper.cs b/src/Umbraco.Core/Models/Mapping/ContentPropertyDisplayMapper.cs similarity index 100% rename from src/Umbraco.Web/Models/Mapping/ContentPropertyDisplayMapper.cs rename to src/Umbraco.Core/Models/Mapping/ContentPropertyDisplayMapper.cs diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyDtoMapper.cs b/src/Umbraco.Core/Models/Mapping/ContentPropertyDtoMapper.cs similarity index 100% rename from src/Umbraco.Web/Models/Mapping/ContentPropertyDtoMapper.cs rename to src/Umbraco.Core/Models/Mapping/ContentPropertyDtoMapper.cs diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyMapDefinition.cs b/src/Umbraco.Core/Models/Mapping/ContentPropertyMapDefinition.cs similarity index 100% rename from src/Umbraco.Web/Models/Mapping/ContentPropertyMapDefinition.cs rename to src/Umbraco.Core/Models/Mapping/ContentPropertyMapDefinition.cs diff --git a/src/Umbraco.Infrastructure/Models/Mapping/MapperContextExtensions.cs b/src/Umbraco.Core/Models/Mapping/MapperContextExtensions.cs similarity index 100% rename from src/Umbraco.Infrastructure/Models/Mapping/MapperContextExtensions.cs rename to src/Umbraco.Core/Models/Mapping/MapperContextExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/MemberGroup.cs b/src/Umbraco.Core/Models/MemberGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/MemberGroup.cs rename to src/Umbraco.Core/Models/MemberGroup.cs diff --git a/src/Umbraco.Abstractions/Models/MemberTypePropertyProfileAccess.cs b/src/Umbraco.Core/Models/MemberTypePropertyProfileAccess.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/MemberTypePropertyProfileAccess.cs rename to src/Umbraco.Core/Models/MemberTypePropertyProfileAccess.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/ContentPermissionSet.cs b/src/Umbraco.Core/Models/Membership/ContentPermissionSet.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/ContentPermissionSet.cs rename to src/Umbraco.Core/Models/Membership/ContentPermissionSet.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/EntityPermission.cs b/src/Umbraco.Core/Models/Membership/EntityPermission.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/EntityPermission.cs rename to src/Umbraco.Core/Models/Membership/EntityPermission.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/EntityPermissionCollection.cs b/src/Umbraco.Core/Models/Membership/EntityPermissionCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/EntityPermissionCollection.cs rename to src/Umbraco.Core/Models/Membership/EntityPermissionCollection.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/EntityPermissionSet.cs b/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/EntityPermissionSet.cs rename to src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/IMembershipUser.cs b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/IMembershipUser.cs rename to src/Umbraco.Core/Models/Membership/IMembershipUser.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/IProfile.cs b/src/Umbraco.Core/Models/Membership/IProfile.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/IProfile.cs rename to src/Umbraco.Core/Models/Membership/IProfile.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/IReadOnlyUserGroup.cs b/src/Umbraco.Core/Models/Membership/IReadOnlyUserGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/IReadOnlyUserGroup.cs rename to src/Umbraco.Core/Models/Membership/IReadOnlyUserGroup.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/IUser.cs rename to src/Umbraco.Core/Models/Membership/IUser.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/IUserGroup.cs b/src/Umbraco.Core/Models/Membership/IUserGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/IUserGroup.cs rename to src/Umbraco.Core/Models/Membership/IUserGroup.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/MemberCountType.cs b/src/Umbraco.Core/Models/Membership/MemberCountType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/MemberCountType.cs rename to src/Umbraco.Core/Models/Membership/MemberCountType.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/MemberExportModel.cs b/src/Umbraco.Core/Models/Membership/MemberExportModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/MemberExportModel.cs rename to src/Umbraco.Core/Models/Membership/MemberExportModel.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/MemberExportProperty.cs b/src/Umbraco.Core/Models/Membership/MemberExportProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/MemberExportProperty.cs rename to src/Umbraco.Core/Models/Membership/MemberExportProperty.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/ReadOnlyUserGroup.cs b/src/Umbraco.Core/Models/Membership/ReadOnlyUserGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/ReadOnlyUserGroup.cs rename to src/Umbraco.Core/Models/Membership/ReadOnlyUserGroup.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/UserProfile.cs b/src/Umbraco.Core/Models/Membership/UserProfile.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/UserProfile.cs rename to src/Umbraco.Core/Models/Membership/UserProfile.cs diff --git a/src/Umbraco.Abstractions/Models/Membership/UserState.cs b/src/Umbraco.Core/Models/Membership/UserState.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Membership/UserState.cs rename to src/Umbraco.Core/Models/Membership/UserState.cs diff --git a/src/Umbraco.Abstractions/Models/MigrationEntry.cs b/src/Umbraco.Core/Models/MigrationEntry.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/MigrationEntry.cs rename to src/Umbraco.Core/Models/MigrationEntry.cs diff --git a/src/Umbraco.Abstractions/Models/Notification.cs b/src/Umbraco.Core/Models/Notification.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Notification.cs rename to src/Umbraco.Core/Models/Notification.cs diff --git a/src/Umbraco.Abstractions/Models/NotificationEmailBodyParams.cs b/src/Umbraco.Core/Models/NotificationEmailBodyParams.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/NotificationEmailBodyParams.cs rename to src/Umbraco.Core/Models/NotificationEmailBodyParams.cs diff --git a/src/Umbraco.Abstractions/Models/NotificationEmailSubjectParams.cs b/src/Umbraco.Core/Models/NotificationEmailSubjectParams.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/NotificationEmailSubjectParams.cs rename to src/Umbraco.Core/Models/NotificationEmailSubjectParams.cs diff --git a/src/Umbraco.Abstractions/Models/PackageInstallModel.cs b/src/Umbraco.Core/Models/PackageInstallModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PackageInstallModel.cs rename to src/Umbraco.Core/Models/PackageInstallModel.cs diff --git a/src/Umbraco.Abstractions/Models/PackageInstallResult.cs b/src/Umbraco.Core/Models/PackageInstallResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PackageInstallResult.cs rename to src/Umbraco.Core/Models/PackageInstallResult.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/ActionRunAt.cs b/src/Umbraco.Core/Models/Packaging/ActionRunAt.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/ActionRunAt.cs rename to src/Umbraco.Core/Models/Packaging/ActionRunAt.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/CompiledPackage.cs b/src/Umbraco.Core/Models/Packaging/CompiledPackage.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/CompiledPackage.cs rename to src/Umbraco.Core/Models/Packaging/CompiledPackage.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/CompiledPackageDocument.cs b/src/Umbraco.Core/Models/Packaging/CompiledPackageDocument.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/CompiledPackageDocument.cs rename to src/Umbraco.Core/Models/Packaging/CompiledPackageDocument.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/CompiledPackageFile.cs b/src/Umbraco.Core/Models/Packaging/CompiledPackageFile.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/CompiledPackageFile.cs rename to src/Umbraco.Core/Models/Packaging/CompiledPackageFile.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/IPackageInfo.cs b/src/Umbraco.Core/Models/Packaging/IPackageInfo.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/IPackageInfo.cs rename to src/Umbraco.Core/Models/Packaging/IPackageInfo.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/PackageAction.cs b/src/Umbraco.Core/Models/Packaging/PackageAction.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/PackageAction.cs rename to src/Umbraco.Core/Models/Packaging/PackageAction.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/PreInstallWarnings.cs b/src/Umbraco.Core/Models/Packaging/PreInstallWarnings.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/PreInstallWarnings.cs rename to src/Umbraco.Core/Models/Packaging/PreInstallWarnings.cs diff --git a/src/Umbraco.Abstractions/Models/Packaging/RequirementsType.cs b/src/Umbraco.Core/Models/Packaging/RequirementsType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Packaging/RequirementsType.cs rename to src/Umbraco.Core/Models/Packaging/RequirementsType.cs diff --git a/src/Umbraco.Abstractions/Models/PagedResult.cs b/src/Umbraco.Core/Models/PagedResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PagedResult.cs rename to src/Umbraco.Core/Models/PagedResult.cs diff --git a/src/Umbraco.Abstractions/Models/PagedResultOfT.cs b/src/Umbraco.Core/Models/PagedResultOfT.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PagedResultOfT.cs rename to src/Umbraco.Core/Models/PagedResultOfT.cs diff --git a/src/Umbraco.Abstractions/Models/PartialView.cs b/src/Umbraco.Core/Models/PartialView.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PartialView.cs rename to src/Umbraco.Core/Models/PartialView.cs diff --git a/src/Umbraco.Abstractions/Models/PartialViewMacroModel.cs b/src/Umbraco.Core/Models/PartialViewMacroModel.cs similarity index 94% rename from src/Umbraco.Abstractions/Models/PartialViewMacroModel.cs rename to src/Umbraco.Core/Models/PartialViewMacroModel.cs index 9964877cba..f3272644f4 100644 --- a/src/Umbraco.Abstractions/Models/PartialViewMacroModel.cs +++ b/src/Umbraco.Core/Models/PartialViewMacroModel.cs @@ -6,7 +6,7 @@ namespace Umbraco.Web.Models /// /// The model used when rendering Partial View Macros /// - public class PartialViewMacroModel + public class PartialViewMacroModel : IContentModel { public PartialViewMacroModel(IPublishedContent page, diff --git a/src/Umbraco.Abstractions/Models/PartialViewMacroModelExtensions.cs b/src/Umbraco.Core/Models/PartialViewMacroModelExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PartialViewMacroModelExtensions.cs rename to src/Umbraco.Core/Models/PartialViewMacroModelExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/PartialViewType.cs b/src/Umbraco.Core/Models/PartialViewType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PartialViewType.cs rename to src/Umbraco.Core/Models/PartialViewType.cs diff --git a/src/Umbraco.Abstractions/Models/PasswordChangedModel.cs b/src/Umbraco.Core/Models/PasswordChangedModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PasswordChangedModel.cs rename to src/Umbraco.Core/Models/PasswordChangedModel.cs diff --git a/src/Umbraco.Abstractions/Models/PostRedirectModel.cs b/src/Umbraco.Core/Models/PostRedirectModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PostRedirectModel.cs rename to src/Umbraco.Core/Models/PostRedirectModel.cs diff --git a/src/Umbraco.Abstractions/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PropertyGroup.cs rename to src/Umbraco.Core/Models/PropertyGroup.cs diff --git a/src/Umbraco.Abstractions/Models/PropertyGroupCollection.cs b/src/Umbraco.Core/Models/PropertyGroupCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PropertyGroupCollection.cs rename to src/Umbraco.Core/Models/PropertyGroupCollection.cs diff --git a/src/Umbraco.Abstractions/Models/PropertyTypeCollection.cs b/src/Umbraco.Core/Models/PropertyTypeCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PropertyTypeCollection.cs rename to src/Umbraco.Core/Models/PropertyTypeCollection.cs diff --git a/src/Umbraco.Abstractions/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublicAccessEntry.cs rename to src/Umbraco.Core/Models/PublicAccessEntry.cs diff --git a/src/Umbraco.Abstractions/Models/PublicAccessRule.cs b/src/Umbraco.Core/Models/PublicAccessRule.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublicAccessRule.cs rename to src/Umbraco.Core/Models/PublicAccessRule.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/Fallback.cs b/src/Umbraco.Core/Models/PublishedContent/Fallback.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/Fallback.cs rename to src/Umbraco.Core/Models/PublishedContent/Fallback.cs diff --git a/src/Umbraco.Web/Models/PublishedContent/HttpContextVariationContextAccessor.cs b/src/Umbraco.Core/Models/PublishedContent/HttpContextVariationContextAccessor.cs similarity index 50% rename from src/Umbraco.Web/Models/PublishedContent/HttpContextVariationContextAccessor.cs rename to src/Umbraco.Core/Models/PublishedContent/HttpContextVariationContextAccessor.cs index 0007b346c5..09604281dc 100644 --- a/src/Umbraco.Web/Models/PublishedContent/HttpContextVariationContextAccessor.cs +++ b/src/Umbraco.Core/Models/PublishedContent/HttpContextVariationContextAccessor.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Cache; +using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Web.Models.PublishedContent { @@ -7,22 +8,22 @@ namespace Umbraco.Web.Models.PublishedContent /// public class HttpContextVariationContextAccessor : IVariationContextAccessor { - public const string ContextKey = "Umbraco.Web.Models.PublishedContent.DefaultVariationContextAccessor"; - public readonly IHttpContextAccessor HttpContextAccessor; + private readonly IRequestCache _requestCache; + private const string ContextKey = "Umbraco.Web.Models.PublishedContent.DefaultVariationContextAccessor"; /// /// Initializes a new instance of the class. /// - public HttpContextVariationContextAccessor(IHttpContextAccessor httpContextAccessor) + public HttpContextVariationContextAccessor(IRequestCache requestCache) { - HttpContextAccessor = httpContextAccessor; + _requestCache = requestCache; } /// public VariationContext VariationContext { - get => (VariationContext) HttpContextAccessor.HttpContext?.Items[ContextKey]; - set => HttpContextAccessor.HttpContext.Items[ContextKey] = value; + get => (VariationContext) _requestCache.Get(ContextKey); + set => _requestCache.Set(ContextKey, value); } } } diff --git a/src/Umbraco.Web/Models/PublishedContent/HybridVariationContextAccessor.cs b/src/Umbraco.Core/Models/PublishedContent/HybridVariationContextAccessor.cs similarity index 64% rename from src/Umbraco.Web/Models/PublishedContent/HybridVariationContextAccessor.cs rename to src/Umbraco.Core/Models/PublishedContent/HybridVariationContextAccessor.cs index cb002e11b0..6f97c1dc5c 100644 --- a/src/Umbraco.Web/Models/PublishedContent/HybridVariationContextAccessor.cs +++ b/src/Umbraco.Core/Models/PublishedContent/HybridVariationContextAccessor.cs @@ -1,14 +1,15 @@ -using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Cache; +using Umbraco.Core.Models.PublishedContent; namespace Umbraco.Web.Models.PublishedContent { /// /// Implements a hybrid . /// - internal class HybridVariationContextAccessor : HybridAccessorBase, IVariationContextAccessor + public class HybridVariationContextAccessor : HybridAccessorBase, IVariationContextAccessor { - public HybridVariationContextAccessor(IHttpContextAccessor httpContextAccessor) - : base(httpContextAccessor) + public HybridVariationContextAccessor(IRequestCache requestCache) + : base(requestCache) { } /// @@ -23,4 +24,4 @@ namespace Umbraco.Web.Models.PublishedContent set => Value = value; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/ILivePublishedModelFactory.cs b/src/Umbraco.Core/Models/PublishedContent/ILivePublishedModelFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/ILivePublishedModelFactory.cs rename to src/Umbraco.Core/Models/PublishedContent/ILivePublishedModelFactory.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedContent.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedContent.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedContentType.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedContentType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedContentType.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedContentType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedContentTypeFactory.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedContentTypeFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedContentTypeFactory.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedContentTypeFactory.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedElement.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedElement.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedElement.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedElement.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedModelFactory.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedModelFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedModelFactory.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedModelFactory.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedProperty.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedProperty.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedProperty.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedPropertyType.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedPropertyType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedPropertyType.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedPropertyType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IPublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IPublishedValueFallback.cs rename to src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IVariationContextAccessor.cs b/src/Umbraco.Core/Models/PublishedContent/IVariationContextAccessor.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IVariationContextAccessor.cs rename to src/Umbraco.Core/Models/PublishedContent/IVariationContextAccessor.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/IndexedArrayItem.cs b/src/Umbraco.Core/Models/PublishedContent/IndexedArrayItem.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/IndexedArrayItem.cs rename to src/Umbraco.Core/Models/PublishedContent/IndexedArrayItem.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/ModelType.cs b/src/Umbraco.Core/Models/PublishedContent/ModelType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/ModelType.cs rename to src/Umbraco.Core/Models/PublishedContent/ModelType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/NoopPublishedModelFactory.cs b/src/Umbraco.Core/Models/PublishedContent/NoopPublishedModelFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/NoopPublishedModelFactory.cs rename to src/Umbraco.Core/Models/PublishedContent/NoopPublishedModelFactory.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/NoopPublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/NoopPublishedValueFallback.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/NoopPublishedValueFallback.cs rename to src/Umbraco.Core/Models/PublishedContent/NoopPublishedValueFallback.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentBase.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentBase.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedContentBase.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentType.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentType.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedContentType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentTypeConverter.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentTypeConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentTypeConverter.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedContentTypeConverter.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentWrapped.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedContentWrapped.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedCultureInfos.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedCultureInfos.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedCultureInfos.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedCultureInfos.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedDataType.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedDataType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedDataType.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedDataType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedElementModel.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedElementModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedElementModel.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedElementModel.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedElementWrapped.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedElementWrapped.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedElementWrapped.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedElementWrapped.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedItemType.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedItemType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedItemType.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedItemType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedModelAttribute.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedModelAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedModelAttribute.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedModelAttribute.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedPropertyBase.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedPropertyBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedPropertyBase.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedPropertyBase.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedPropertyType.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedPropertyType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedPropertyType.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedPropertyType.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/PublishedSearchResult.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedSearchResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/PublishedSearchResult.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedSearchResult.cs diff --git a/src/Umbraco.Web/Models/PublishedContent/PublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs similarity index 97% rename from src/Umbraco.Web/Models/PublishedContent/PublishedValueFallback.cs rename to src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs index 7b467b6d15..7c207c23c0 100644 --- a/src/Umbraco.Web/Models/PublishedContent/PublishedValueFallback.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs @@ -182,7 +182,7 @@ namespace Umbraco.Web.Models.PublishedContent // if we found a content with the property having a value, return that property value if (property != null && property.HasValue(culture, segment)) { - value = property.Value(culture, segment); + value = property.Value(this, culture, segment); return true; } @@ -216,7 +216,7 @@ namespace Umbraco.Web.Models.PublishedContent if (property.HasValue(culture2, segment)) { - value = property.Value(culture2, segment); + value = property.Value(this, culture2, segment); return true; } @@ -250,7 +250,7 @@ namespace Umbraco.Web.Models.PublishedContent if (content.HasValue(alias, culture2, segment)) { - value = content.Value(alias, culture2, segment); + value = content.Value(this, alias, culture2, segment); return true; } @@ -287,7 +287,7 @@ namespace Umbraco.Web.Models.PublishedContent if (content.HasValue(alias, culture2, segment)) { - value = content.Value(alias, culture2, segment); + value = content.Value(this, alias, culture2, segment); return true; } diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/RawValueProperty.cs b/src/Umbraco.Core/Models/PublishedContent/RawValueProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/RawValueProperty.cs rename to src/Umbraco.Core/Models/PublishedContent/RawValueProperty.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/ThreadCultureVariationContextAccessor.cs b/src/Umbraco.Core/Models/PublishedContent/ThreadCultureVariationContextAccessor.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/ThreadCultureVariationContextAccessor.cs rename to src/Umbraco.Core/Models/PublishedContent/ThreadCultureVariationContextAccessor.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/UrlMode.cs b/src/Umbraco.Core/Models/PublishedContent/UrlMode.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/UrlMode.cs rename to src/Umbraco.Core/Models/PublishedContent/UrlMode.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedContent/VariationContext.cs b/src/Umbraco.Core/Models/PublishedContent/VariationContext.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedContent/VariationContext.cs rename to src/Umbraco.Core/Models/PublishedContent/VariationContext.cs diff --git a/src/Umbraco.Infrastructure/Models/PublishedContent/VariationContextAccessorExtensions.cs b/src/Umbraco.Core/Models/PublishedContent/VariationContextAccessorExtensions.cs similarity index 100% rename from src/Umbraco.Infrastructure/Models/PublishedContent/VariationContextAccessorExtensions.cs rename to src/Umbraco.Core/Models/PublishedContent/VariationContextAccessorExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/PublishedState.cs b/src/Umbraco.Core/Models/PublishedState.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/PublishedState.cs rename to src/Umbraco.Core/Models/PublishedState.cs diff --git a/src/Umbraco.Abstractions/Models/Range.cs b/src/Umbraco.Core/Models/Range.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Range.cs rename to src/Umbraco.Core/Models/Range.cs diff --git a/src/Umbraco.Abstractions/Models/RedirectUrl.cs b/src/Umbraco.Core/Models/RedirectUrl.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/RedirectUrl.cs rename to src/Umbraco.Core/Models/RedirectUrl.cs diff --git a/src/Umbraco.Abstractions/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Relation.cs rename to src/Umbraco.Core/Models/Relation.cs diff --git a/src/Umbraco.Abstractions/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/RelationType.cs rename to src/Umbraco.Core/Models/RelationType.cs diff --git a/src/Umbraco.Abstractions/Models/RequestPasswordResetModel.cs b/src/Umbraco.Core/Models/RequestPasswordResetModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/RequestPasswordResetModel.cs rename to src/Umbraco.Core/Models/RequestPasswordResetModel.cs diff --git a/src/Umbraco.Abstractions/Models/Script.cs b/src/Umbraco.Core/Models/Script.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Script.cs rename to src/Umbraco.Core/Models/Script.cs diff --git a/src/Umbraco.Abstractions/Models/SendCodeViewModel.cs b/src/Umbraco.Core/Models/SendCodeViewModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/SendCodeViewModel.cs rename to src/Umbraco.Core/Models/SendCodeViewModel.cs diff --git a/src/Umbraco.Abstractions/Models/ServerRegistration.cs b/src/Umbraco.Core/Models/ServerRegistration.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ServerRegistration.cs rename to src/Umbraco.Core/Models/ServerRegistration.cs diff --git a/src/Umbraco.Abstractions/Models/SetPasswordModel.cs b/src/Umbraco.Core/Models/SetPasswordModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/SetPasswordModel.cs rename to src/Umbraco.Core/Models/SetPasswordModel.cs diff --git a/src/Umbraco.Abstractions/Models/SimpleContentType.cs b/src/Umbraco.Core/Models/SimpleContentType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/SimpleContentType.cs rename to src/Umbraco.Core/Models/SimpleContentType.cs diff --git a/src/Umbraco.Abstractions/Models/Stylesheet.cs b/src/Umbraco.Core/Models/Stylesheet.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Stylesheet.cs rename to src/Umbraco.Core/Models/Stylesheet.cs diff --git a/src/Umbraco.Abstractions/Models/StylesheetProperty.cs b/src/Umbraco.Core/Models/StylesheetProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/StylesheetProperty.cs rename to src/Umbraco.Core/Models/StylesheetProperty.cs diff --git a/src/Umbraco.Abstractions/Models/Tag.cs b/src/Umbraco.Core/Models/Tag.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Tag.cs rename to src/Umbraco.Core/Models/Tag.cs diff --git a/src/Umbraco.Abstractions/Models/TagModel.cs b/src/Umbraco.Core/Models/TagModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TagModel.cs rename to src/Umbraco.Core/Models/TagModel.cs diff --git a/src/Umbraco.Abstractions/Models/TaggableObjectTypes.cs b/src/Umbraco.Core/Models/TaggableObjectTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TaggableObjectTypes.cs rename to src/Umbraco.Core/Models/TaggableObjectTypes.cs diff --git a/src/Umbraco.Abstractions/Models/TaggedEntity.cs b/src/Umbraco.Core/Models/TaggedEntity.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TaggedEntity.cs rename to src/Umbraco.Core/Models/TaggedEntity.cs diff --git a/src/Umbraco.Abstractions/Models/TaggedProperty.cs b/src/Umbraco.Core/Models/TaggedProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TaggedProperty.cs rename to src/Umbraco.Core/Models/TaggedProperty.cs diff --git a/src/Umbraco.Abstractions/Models/TagsStorageType.cs b/src/Umbraco.Core/Models/TagsStorageType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TagsStorageType.cs rename to src/Umbraco.Core/Models/TagsStorageType.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateNode.cs b/src/Umbraco.Core/Models/TemplateNode.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateNode.cs rename to src/Umbraco.Core/Models/TemplateNode.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/ContentTypeModel.cs b/src/Umbraco.Core/Models/TemplateQuery/ContentTypeModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/ContentTypeModel.cs rename to src/Umbraco.Core/Models/TemplateQuery/ContentTypeModel.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/Operator.cs b/src/Umbraco.Core/Models/TemplateQuery/Operator.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/Operator.cs rename to src/Umbraco.Core/Models/TemplateQuery/Operator.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/OperatorFactory.cs b/src/Umbraco.Core/Models/TemplateQuery/OperatorFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/OperatorFactory.cs rename to src/Umbraco.Core/Models/TemplateQuery/OperatorFactory.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/OperatorTerm.cs b/src/Umbraco.Core/Models/TemplateQuery/OperatorTerm.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/OperatorTerm.cs rename to src/Umbraco.Core/Models/TemplateQuery/OperatorTerm.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/PropertyModel.cs b/src/Umbraco.Core/Models/TemplateQuery/PropertyModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/PropertyModel.cs rename to src/Umbraco.Core/Models/TemplateQuery/PropertyModel.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/QueryCondition.cs b/src/Umbraco.Core/Models/TemplateQuery/QueryCondition.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/QueryCondition.cs rename to src/Umbraco.Core/Models/TemplateQuery/QueryCondition.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/QueryConditionExtensions.cs b/src/Umbraco.Core/Models/TemplateQuery/QueryConditionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/QueryConditionExtensions.cs rename to src/Umbraco.Core/Models/TemplateQuery/QueryConditionExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/QueryModel.cs b/src/Umbraco.Core/Models/TemplateQuery/QueryModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/QueryModel.cs rename to src/Umbraco.Core/Models/TemplateQuery/QueryModel.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/QueryResultModel.cs b/src/Umbraco.Core/Models/TemplateQuery/QueryResultModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/QueryResultModel.cs rename to src/Umbraco.Core/Models/TemplateQuery/QueryResultModel.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/SortExpression.cs b/src/Umbraco.Core/Models/TemplateQuery/SortExpression.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/SortExpression.cs rename to src/Umbraco.Core/Models/TemplateQuery/SortExpression.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/SourceModel.cs b/src/Umbraco.Core/Models/TemplateQuery/SourceModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/SourceModel.cs rename to src/Umbraco.Core/Models/TemplateQuery/SourceModel.cs diff --git a/src/Umbraco.Abstractions/Models/TemplateQuery/TemplateQueryResult.cs b/src/Umbraco.Core/Models/TemplateQuery/TemplateQueryResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/TemplateQuery/TemplateQueryResult.cs rename to src/Umbraco.Core/Models/TemplateQuery/TemplateQueryResult.cs diff --git a/src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs b/src/Umbraco.Core/Models/Trees/ActionMenuItem.cs similarity index 96% rename from src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs rename to src/Umbraco.Core/Models/Trees/ActionMenuItem.cs index 9354417155..fe760fb94d 100644 --- a/src/Umbraco.Abstractions/Models/Trees/ActionMenuItem.cs +++ b/src/Umbraco.Core/Models/Trees/ActionMenuItem.cs @@ -1,6 +1,4 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using Umbraco.Core; +using Umbraco.Core; using Umbraco.Core.Services; namespace Umbraco.Web.Models.Trees diff --git a/src/Umbraco.Web/Models/Trees/CreateChildEntity.cs b/src/Umbraco.Core/Models/Trees/CreateChildEntity.cs similarity index 100% rename from src/Umbraco.Web/Models/Trees/CreateChildEntity.cs rename to src/Umbraco.Core/Models/Trees/CreateChildEntity.cs diff --git a/src/Umbraco.Web/Models/Trees/ExportMember.cs b/src/Umbraco.Core/Models/Trees/ExportMember.cs similarity index 100% rename from src/Umbraco.Web/Models/Trees/ExportMember.cs rename to src/Umbraco.Core/Models/Trees/ExportMember.cs diff --git a/src/Umbraco.Abstractions/Models/Trees/MenuItem.cs b/src/Umbraco.Core/Models/Trees/MenuItem.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Trees/MenuItem.cs rename to src/Umbraco.Core/Models/Trees/MenuItem.cs diff --git a/src/Umbraco.Abstractions/Models/Trees/RefreshNode.cs b/src/Umbraco.Core/Models/Trees/RefreshNode.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Trees/RefreshNode.cs rename to src/Umbraco.Core/Models/Trees/RefreshNode.cs diff --git a/src/Umbraco.Abstractions/Models/UmbracoDomain.cs b/src/Umbraco.Core/Models/UmbracoDomain.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UmbracoDomain.cs rename to src/Umbraco.Core/Models/UmbracoDomain.cs diff --git a/src/Umbraco.Abstractions/Models/UmbracoObjectTypes.cs b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UmbracoObjectTypes.cs rename to src/Umbraco.Core/Models/UmbracoObjectTypes.cs diff --git a/src/Umbraco.Abstractions/Models/UmbracoProperty.cs b/src/Umbraco.Core/Models/UmbracoProperty.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UmbracoProperty.cs rename to src/Umbraco.Core/Models/UmbracoProperty.cs diff --git a/src/Umbraco.Abstractions/Models/UmbracoUserExtensions.cs b/src/Umbraco.Core/Models/UmbracoUserExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UmbracoUserExtensions.cs rename to src/Umbraco.Core/Models/UmbracoUserExtensions.cs diff --git a/src/Umbraco.Abstractions/Models/UnLinkLoginModel.cs b/src/Umbraco.Core/Models/UnLinkLoginModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UnLinkLoginModel.cs rename to src/Umbraco.Core/Models/UnLinkLoginModel.cs diff --git a/src/Umbraco.Abstractions/Models/UpgradeCheckResponse.cs b/src/Umbraco.Core/Models/UpgradeCheckResponse.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UpgradeCheckResponse.cs rename to src/Umbraco.Core/Models/UpgradeCheckResponse.cs diff --git a/src/Umbraco.Abstractions/Models/UserTourStatus.cs b/src/Umbraco.Core/Models/UserTourStatus.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/UserTourStatus.cs rename to src/Umbraco.Core/Models/UserTourStatus.cs diff --git a/src/Umbraco.Abstractions/Models/ValidatePasswordResetCodeModel.cs b/src/Umbraco.Core/Models/ValidatePasswordResetCodeModel.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ValidatePasswordResetCodeModel.cs rename to src/Umbraco.Core/Models/ValidatePasswordResetCodeModel.cs diff --git a/src/Umbraco.Abstractions/Models/Validation/RequiredForPersistenceAttribute.cs b/src/Umbraco.Core/Models/Validation/RequiredForPersistenceAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/Validation/RequiredForPersistenceAttribute.cs rename to src/Umbraco.Core/Models/Validation/RequiredForPersistenceAttribute.cs diff --git a/src/Umbraco.Abstractions/Models/ValueStorageType.cs b/src/Umbraco.Core/Models/ValueStorageType.cs similarity index 100% rename from src/Umbraco.Abstractions/Models/ValueStorageType.cs rename to src/Umbraco.Core/Models/ValueStorageType.cs diff --git a/src/Umbraco.Abstractions/MonitorLock.cs b/src/Umbraco.Core/MonitorLock.cs similarity index 100% rename from src/Umbraco.Abstractions/MonitorLock.cs rename to src/Umbraco.Core/MonitorLock.cs diff --git a/src/Umbraco.Abstractions/NameValueCollectionExtensions.cs b/src/Umbraco.Core/NameValueCollectionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/NameValueCollectionExtensions.cs rename to src/Umbraco.Core/NameValueCollectionExtensions.cs diff --git a/src/Umbraco.Abstractions/NamedUdiRange.cs b/src/Umbraco.Core/NamedUdiRange.cs similarity index 100% rename from src/Umbraco.Abstractions/NamedUdiRange.cs rename to src/Umbraco.Core/NamedUdiRange.cs diff --git a/src/Umbraco.Abstractions/Net/IIpResolver.cs b/src/Umbraco.Core/Net/IIpResolver.cs similarity index 100% rename from src/Umbraco.Abstractions/Net/IIpResolver.cs rename to src/Umbraco.Core/Net/IIpResolver.cs diff --git a/src/Umbraco.Abstractions/Net/ISessionIdResolver.cs b/src/Umbraco.Core/Net/ISessionIdResolver.cs similarity index 100% rename from src/Umbraco.Abstractions/Net/ISessionIdResolver.cs rename to src/Umbraco.Core/Net/ISessionIdResolver.cs diff --git a/src/Umbraco.Core/Net/IUmbracoApplicationLifetime.cs b/src/Umbraco.Core/Net/IUmbracoApplicationLifetime.cs new file mode 100644 index 0000000000..10d5b10955 --- /dev/null +++ b/src/Umbraco.Core/Net/IUmbracoApplicationLifetime.cs @@ -0,0 +1,14 @@ +namespace Umbraco.Net +{ + public interface IUmbracoApplicationLifetime + { + /// + /// A value indicating whether the application is restarting after the current request. + /// + bool IsRestarting { get; } + /// + /// Terminates the current application. The application restarts the next time a request is received for it. + /// + void Restart(); + } +} diff --git a/src/Umbraco.Core/Net/IUserAgentProvider.cs b/src/Umbraco.Core/Net/IUserAgentProvider.cs new file mode 100644 index 0000000000..14246ea99e --- /dev/null +++ b/src/Umbraco.Core/Net/IUserAgentProvider.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Net +{ + public interface IUserAgentProvider + { + string GetUserAgent(); + } +} diff --git a/src/Umbraco.Abstractions/NetworkHelper.cs b/src/Umbraco.Core/NetworkHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/NetworkHelper.cs rename to src/Umbraco.Core/NetworkHelper.cs diff --git a/src/Umbraco.Abstractions/ObjectExtensions.cs b/src/Umbraco.Core/ObjectExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ObjectExtensions.cs rename to src/Umbraco.Core/ObjectExtensions.cs diff --git a/src/Umbraco.Abstractions/PackageActions/AllowDoctype.cs b/src/Umbraco.Core/PackageActions/AllowDoctype.cs similarity index 100% rename from src/Umbraco.Abstractions/PackageActions/AllowDoctype.cs rename to src/Umbraco.Core/PackageActions/AllowDoctype.cs diff --git a/src/Umbraco.Abstractions/PackageActions/IPackageAction.cs b/src/Umbraco.Core/PackageActions/IPackageAction.cs similarity index 100% rename from src/Umbraco.Abstractions/PackageActions/IPackageAction.cs rename to src/Umbraco.Core/PackageActions/IPackageAction.cs diff --git a/src/Umbraco.Abstractions/PackageActions/PackageActionCollection.cs b/src/Umbraco.Core/PackageActions/PackageActionCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/PackageActions/PackageActionCollection.cs rename to src/Umbraco.Core/PackageActions/PackageActionCollection.cs diff --git a/src/Umbraco.Abstractions/PackageActions/PackageActionCollectionBuilder.cs b/src/Umbraco.Core/PackageActions/PackageActionCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/PackageActions/PackageActionCollectionBuilder.cs rename to src/Umbraco.Core/PackageActions/PackageActionCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/PackageActions/PublishRootDocument.cs b/src/Umbraco.Core/PackageActions/PublishRootDocument.cs similarity index 100% rename from src/Umbraco.Abstractions/PackageActions/PublishRootDocument.cs rename to src/Umbraco.Core/PackageActions/PublishRootDocument.cs diff --git a/src/Umbraco.Abstractions/Packaging/CompiledPackageXmlParser.cs b/src/Umbraco.Core/Packaging/CompiledPackageXmlParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/CompiledPackageXmlParser.cs rename to src/Umbraco.Core/Packaging/CompiledPackageXmlParser.cs diff --git a/src/Umbraco.Abstractions/Packaging/ConflictingPackageData.cs b/src/Umbraco.Core/Packaging/ConflictingPackageData.cs similarity index 97% rename from src/Umbraco.Abstractions/Packaging/ConflictingPackageData.cs rename to src/Umbraco.Core/Packaging/ConflictingPackageData.cs index 7425f64727..9a976bea41 100644 --- a/src/Umbraco.Abstractions/Packaging/ConflictingPackageData.cs +++ b/src/Umbraco.Core/Packaging/ConflictingPackageData.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Services; namespace Umbraco.Core.Packaging { - public class ConflictingPackageData + public class ConflictingPackageData { private readonly IMacroService _macroService; private readonly IFileService _fileService; @@ -23,7 +23,7 @@ namespace Umbraco.Core.Packaging return stylesheetNodes .Select(n => { - var xElement = n.Element("Name") ?? n.Element("name"); ; + var xElement = n.Element("Name") ?? n.Element("name"); if (xElement == null) throw new FormatException("Missing \"Name\" element"); diff --git a/src/Umbraco.Abstractions/Packaging/ICreatedPackagesRepository.cs b/src/Umbraco.Core/Packaging/ICreatedPackagesRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/ICreatedPackagesRepository.cs rename to src/Umbraco.Core/Packaging/ICreatedPackagesRepository.cs diff --git a/src/Umbraco.Abstractions/Packaging/IInstalledPackagesRepository.cs b/src/Umbraco.Core/Packaging/IInstalledPackagesRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/IInstalledPackagesRepository.cs rename to src/Umbraco.Core/Packaging/IInstalledPackagesRepository.cs diff --git a/src/Umbraco.Abstractions/Packaging/IPackageActionRunner.cs b/src/Umbraco.Core/Packaging/IPackageActionRunner.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/IPackageActionRunner.cs rename to src/Umbraco.Core/Packaging/IPackageActionRunner.cs diff --git a/src/Umbraco.Abstractions/Packaging/IPackageDefinitionRepository.cs b/src/Umbraco.Core/Packaging/IPackageDefinitionRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/IPackageDefinitionRepository.cs rename to src/Umbraco.Core/Packaging/IPackageDefinitionRepository.cs diff --git a/src/Umbraco.Abstractions/Packaging/IPackageInstallation.cs b/src/Umbraco.Core/Packaging/IPackageInstallation.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/IPackageInstallation.cs rename to src/Umbraco.Core/Packaging/IPackageInstallation.cs diff --git a/src/Umbraco.Abstractions/Packaging/InstallationSummary.cs b/src/Umbraco.Core/Packaging/InstallationSummary.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/InstallationSummary.cs rename to src/Umbraco.Core/Packaging/InstallationSummary.cs diff --git a/src/Umbraco.Abstractions/Packaging/PackageActionRunner.cs b/src/Umbraco.Core/Packaging/PackageActionRunner.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/PackageActionRunner.cs rename to src/Umbraco.Core/Packaging/PackageActionRunner.cs diff --git a/src/Umbraco.Abstractions/Packaging/PackageDefinition.cs b/src/Umbraco.Core/Packaging/PackageDefinition.cs similarity index 98% rename from src/Umbraco.Abstractions/Packaging/PackageDefinition.cs rename to src/Umbraco.Core/Packaging/PackageDefinition.cs index 11bf26c579..29a1919a2b 100644 --- a/src/Umbraco.Abstractions/Packaging/PackageDefinition.cs +++ b/src/Umbraco.Core/Packaging/PackageDefinition.cs @@ -19,7 +19,7 @@ namespace Umbraco.Core.Models.Packaging /// /// This is used only for conversions and will not 'get' a PackageDefinition from the repository with a valid ID /// - internal static PackageDefinition FromCompiledPackage(CompiledPackage compiled) + public static PackageDefinition FromCompiledPackage(CompiledPackage compiled) { return new PackageDefinition { diff --git a/src/Umbraco.Abstractions/Packaging/PackageDefinitionXmlParser.cs b/src/Umbraco.Core/Packaging/PackageDefinitionXmlParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/PackageDefinitionXmlParser.cs rename to src/Umbraco.Core/Packaging/PackageDefinitionXmlParser.cs diff --git a/src/Umbraco.Abstractions/Packaging/PackageExtraction.cs b/src/Umbraco.Core/Packaging/PackageExtraction.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/PackageExtraction.cs rename to src/Umbraco.Core/Packaging/PackageExtraction.cs diff --git a/src/Umbraco.Abstractions/Packaging/PackageFileInstallation.cs b/src/Umbraco.Core/Packaging/PackageFileInstallation.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/PackageFileInstallation.cs rename to src/Umbraco.Core/Packaging/PackageFileInstallation.cs diff --git a/src/Umbraco.Abstractions/Packaging/PackageInstallType.cs b/src/Umbraco.Core/Packaging/PackageInstallType.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/PackageInstallType.cs rename to src/Umbraco.Core/Packaging/PackageInstallType.cs diff --git a/src/Umbraco.Abstractions/Packaging/PackagesRepository.cs b/src/Umbraco.Core/Packaging/PackagesRepository.cs similarity index 99% rename from src/Umbraco.Abstractions/Packaging/PackagesRepository.cs rename to src/Umbraco.Core/Packaging/PackagesRepository.cs index a2a30f3a06..2c5b964518 100644 --- a/src/Umbraco.Abstractions/Packaging/PackagesRepository.cs +++ b/src/Umbraco.Core/Packaging/PackagesRepository.cs @@ -90,7 +90,7 @@ namespace Umbraco.Core.Packaging { var packagesXml = EnsureStorage(out _); if (packagesXml?.Root == null) - yield break;; + yield break; foreach (var packageXml in packagesXml.Root.Elements("package")) yield return _parser.ToPackageDefinition(packageXml); @@ -518,7 +518,6 @@ namespace Umbraco.Core.Packaging private XElement GetStylesheetXml(string name, bool includeProperties) { if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(name)); -; var sts = _fileService.GetStylesheetByName(name); if (sts == null) return null; var stylesheetXml = new XElement("Stylesheet"); diff --git a/src/Umbraco.Abstractions/Packaging/UninstallationSummary.cs b/src/Umbraco.Core/Packaging/UninstallationSummary.cs similarity index 100% rename from src/Umbraco.Abstractions/Packaging/UninstallationSummary.cs rename to src/Umbraco.Core/Packaging/UninstallationSummary.cs diff --git a/src/Umbraco.Web/PasswordConfigurationExtensions.cs b/src/Umbraco.Core/PasswordConfigurationExtensions.cs similarity index 96% rename from src/Umbraco.Web/PasswordConfigurationExtensions.cs rename to src/Umbraco.Core/PasswordConfigurationExtensions.cs index 1105fc31a7..be13b574ed 100644 --- a/src/Umbraco.Web/PasswordConfigurationExtensions.cs +++ b/src/Umbraco.Core/PasswordConfigurationExtensions.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Services; namespace Umbraco.Web { - internal static class PasswordConfigurationExtensions + public static class PasswordConfigurationExtensions { /// /// Returns the configuration of the membership provider used to configure change password editors diff --git a/src/Umbraco.Abstractions/Persistence/Constants-DatabaseSchema.cs b/src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Constants-DatabaseSchema.cs rename to src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs diff --git a/src/Umbraco.Abstractions/Persistence/Constants-DbProviderNames.cs b/src/Umbraco.Core/Persistence/Constants-DbProviderNames.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Constants-DbProviderNames.cs rename to src/Umbraco.Core/Persistence/Constants-DbProviderNames.cs diff --git a/src/Umbraco.Abstractions/Persistence/Constants-Locks.cs b/src/Umbraco.Core/Persistence/Constants-Locks.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Constants-Locks.cs rename to src/Umbraco.Core/Persistence/Constants-Locks.cs diff --git a/src/Umbraco.Abstractions/Persistence/IQueryRepository.cs b/src/Umbraco.Core/Persistence/IQueryRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/IQueryRepository.cs rename to src/Umbraco.Core/Persistence/IQueryRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/IReadRepository.cs b/src/Umbraco.Core/Persistence/IReadRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/IReadRepository.cs rename to src/Umbraco.Core/Persistence/IReadRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/IReadWriteQueryRepository.cs b/src/Umbraco.Core/Persistence/IReadWriteQueryRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/IReadWriteQueryRepository.cs rename to src/Umbraco.Core/Persistence/IReadWriteQueryRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/IRepository.cs b/src/Umbraco.Core/Persistence/IRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/IRepository.cs rename to src/Umbraco.Core/Persistence/IRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/IWriteRepository.cs b/src/Umbraco.Core/Persistence/IWriteRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/IWriteRepository.cs rename to src/Umbraco.Core/Persistence/IWriteRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Querying/IQuery.cs b/src/Umbraco.Core/Persistence/Querying/IQuery.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Querying/IQuery.cs rename to src/Umbraco.Core/Persistence/Querying/IQuery.cs diff --git a/src/Umbraco.Abstractions/Persistence/Querying/StringPropertyMatchType.cs b/src/Umbraco.Core/Persistence/Querying/StringPropertyMatchType.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Querying/StringPropertyMatchType.cs rename to src/Umbraco.Core/Persistence/Querying/StringPropertyMatchType.cs diff --git a/src/Umbraco.Abstractions/Persistence/Querying/ValuePropertyMatchType.cs b/src/Umbraco.Core/Persistence/Querying/ValuePropertyMatchType.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Querying/ValuePropertyMatchType.cs rename to src/Umbraco.Core/Persistence/Querying/ValuePropertyMatchType.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IAuditEntryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IAuditEntryRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IAuditEntryRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IAuditEntryRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IAuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IAuditRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IAuditRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IAuditRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IConsentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IConsentRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IConsentRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IConsentRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IContentTypeCommonRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IContentTypeCommonRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IContentTypeCommonRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IContentTypeCommonRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IDataTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IDataTypeContainerRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IDataTypeContainerRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IDataTypeContainerRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IDictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IDictionaryRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IDictionaryRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IDictionaryRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IDocumentTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IDocumentTypeContainerRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IDocumentTypeContainerRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IDocumentTypeContainerRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IDomainRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IDomainRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IDomainRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IDomainRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IEntityContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IEntityContainerRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IEntityContainerRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IEntityContainerRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IExternalLoginRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IExternalLoginRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IExternalLoginRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IExternalLoginRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IInstallationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IInstallationRepository.cs new file mode 100644 index 0000000000..fbc7d2cfbc --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/IInstallationRepository.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading.Tasks; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Persistence.Repositories +{ + public interface IInstallationRepository + { + Task SaveInstallLogAsync(InstallLog installLog); + } +} diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/ILanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ILanguageRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/ILanguageRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/ILanguageRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMacroRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IMacroRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IMacroRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IMediaTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMediaTypeContainerRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IMediaTypeContainerRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IMediaTypeContainerRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IMemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IMemberGroupRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/INotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/INotificationsRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/INotificationsRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/INotificationsRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IPartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IPartialViewMacroRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IPartialViewMacroRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IPartialViewMacroRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IPartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IPartialViewRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IPartialViewRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IPartialViewRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IRedirectUrlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IRedirectUrlRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IRedirectUrlRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IRedirectUrlRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IRelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IRelationRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IRelationRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IRelationRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IRelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IRelationTypeRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IRelationTypeRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IRelationTypeRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IScriptRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IScriptRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IScriptRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IServerRegistrationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IServerRegistrationRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IServerRegistrationRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IServerRegistrationRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IStylesheetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IStylesheetRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IStylesheetRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IStylesheetRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/ITagRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITagRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/ITagRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/ITagRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/ITemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITemplateRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/ITemplateRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/ITemplateRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IUpgradeCheckRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IUpgradeCheckRepository.cs new file mode 100644 index 0000000000..6d56994781 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/IUpgradeCheckRepository.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using Semver; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Persistence.Repositories +{ + public interface IUpgradeCheckRepository + { + Task CheckUpgradeAsync(SemVersion version); + } +} diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IUserGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IUserGroupRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IUserGroupRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IUserGroupRepository.cs diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/IUserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IUserRepository.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/IUserRepository.cs rename to src/Umbraco.Core/Persistence/Repositories/IUserRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/InstallationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/InstallationRepository.cs new file mode 100644 index 0000000000..01c91fe051 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/InstallationRepository.cs @@ -0,0 +1,36 @@ +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Umbraco.Core.Models; +using Umbraco.Core.Serialization; + +namespace Umbraco.Core.Persistence.Repositories.Implement +{ + public class InstallationRepository : IInstallationRepository + { + private readonly IJsonSerializer _jsonSerializer; + private static HttpClient _httpClient; + private const string RestApiInstallUrl = "https://our.umbraco.com/umbraco/api/Installation/Install"; + + public InstallationRepository(IJsonSerializer jsonSerializer) + { + _jsonSerializer = jsonSerializer; + } + + public async Task SaveInstallLogAsync(InstallLog installLog) + { + try + { + if (_httpClient == null) + _httpClient = new HttpClient(); + + var content = new StringContent(_jsonSerializer.Serialize(installLog), Encoding.UTF8, "application/json"); + + await _httpClient.PostAsync(RestApiInstallUrl, content); + } + // this occurs if the server for Our is down or cannot be reached + catch (HttpRequestException) + { } + } + } +} diff --git a/src/Umbraco.Abstractions/Persistence/Repositories/RepositoryCacheKeys.cs b/src/Umbraco.Core/Persistence/Repositories/RepositoryCacheKeys.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/Repositories/RepositoryCacheKeys.cs rename to src/Umbraco.Core/Persistence/Repositories/RepositoryCacheKeys.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/UpgradeCheckRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UpgradeCheckRepository.cs new file mode 100644 index 0000000000..b20c6d26b9 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/UpgradeCheckRepository.cs @@ -0,0 +1,58 @@ +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Semver; +using Umbraco.Core.Models; +using Umbraco.Core.Serialization; + +namespace Umbraco.Core.Persistence.Repositories.Implement +{ + public class UpgradeCheckRepository : IUpgradeCheckRepository + { + private readonly IJsonSerializer _jsonSerializer; + private static HttpClient _httpClient; + private const string RestApiUpgradeChecklUrl = "https://our.umbraco.com/umbraco/api/UpgradeCheck/CheckUpgrade"; + + public UpgradeCheckRepository(IJsonSerializer jsonSerializer) + { + _jsonSerializer = jsonSerializer; + } + + public async Task CheckUpgradeAsync(SemVersion version) + { + try + { + if (_httpClient == null) + _httpClient = new HttpClient(); + + var content = new StringContent(_jsonSerializer.Serialize(new CheckUpgradeDto(version)), Encoding.UTF8, "application/json"); + + var task = await _httpClient.PostAsync(RestApiUpgradeChecklUrl,content); + var json = await task.Content.ReadAsStringAsync(); + var result = _jsonSerializer.Deserialize(json); + + return result ?? new UpgradeResult("None", "", ""); + } + catch (HttpRequestException) + { + // this occurs if the server for Our is down or cannot be reached + return new UpgradeResult("None", "", ""); + } + } + private class CheckUpgradeDto + { + public CheckUpgradeDto(SemVersion version) + { + VersionMajor = version.Major; + VersionMinor = version.Minor; + VersionPatch = version.Patch; + VersionComment = version.Prerelease; + } + + public int VersionMajor { get; } + public int VersionMinor { get; } + public int VersionPatch { get; } + public string VersionComment { get; } + } + } +} diff --git a/src/Umbraco.Abstractions/Persistence/SqlExtensionsStatics.cs b/src/Umbraco.Core/Persistence/SqlExtensionsStatics.cs similarity index 100% rename from src/Umbraco.Abstractions/Persistence/SqlExtensionsStatics.cs rename to src/Umbraco.Core/Persistence/SqlExtensionsStatics.cs diff --git a/src/Umbraco.Abstractions/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs similarity index 96% rename from src/Umbraco.Abstractions/Properties/AssemblyInfo.cs rename to src/Umbraco.Core/Properties/AssemblyInfo.cs index 6d5520f975..f129ca7731 100644 --- a/src/Umbraco.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs @@ -8,7 +8,6 @@ using System.Runtime.InteropServices; // Umbraco Cms [assembly: InternalsVisibleTo("Umbraco.Web")] [assembly: InternalsVisibleTo("Umbraco.Web.UI")] -[assembly: InternalsVisibleTo("Umbraco.Examine")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder.Embedded")] [assembly: InternalsVisibleTo("Umbraco.Tests")] diff --git a/src/Umbraco.Abstractions/PropertyEditors/ColorPickerConfiguration.cs b/src/Umbraco.Core/PropertyEditors/ColorPickerConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ColorPickerConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/ColorPickerConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ConfigurationField.cs b/src/Umbraco.Core/PropertyEditors/ConfigurationField.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ConfigurationField.cs rename to src/Umbraco.Core/PropertyEditors/ConfigurationField.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ConfigurationFieldAttribute.cs b/src/Umbraco.Core/PropertyEditors/ConfigurationFieldAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ConfigurationFieldAttribute.cs rename to src/Umbraco.Core/PropertyEditors/ConfigurationFieldAttribute.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ContentPickerConfiguration.cs b/src/Umbraco.Core/PropertyEditors/ContentPickerConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ContentPickerConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/ContentPickerConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DataEditorAttribute.cs b/src/Umbraco.Core/PropertyEditors/DataEditorAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DataEditorAttribute.cs rename to src/Umbraco.Core/PropertyEditors/DataEditorAttribute.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DataEditorCollection.cs b/src/Umbraco.Core/PropertyEditors/DataEditorCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DataEditorCollection.cs rename to src/Umbraco.Core/PropertyEditors/DataEditorCollection.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DataEditorCollectionBuilder.cs b/src/Umbraco.Core/PropertyEditors/DataEditorCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DataEditorCollectionBuilder.cs rename to src/Umbraco.Core/PropertyEditors/DataEditorCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DateTimeConfiguration.cs b/src/Umbraco.Core/PropertyEditors/DateTimeConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DateTimeConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/DateTimeConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DefaultPropertyIndexValueFactory.cs b/src/Umbraco.Core/PropertyEditors/DefaultPropertyIndexValueFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DefaultPropertyIndexValueFactory.cs rename to src/Umbraco.Core/PropertyEditors/DefaultPropertyIndexValueFactory.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DefaultPropertyValueConverterAttribute.cs b/src/Umbraco.Core/PropertyEditors/DefaultPropertyValueConverterAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DefaultPropertyValueConverterAttribute.cs rename to src/Umbraco.Core/PropertyEditors/DefaultPropertyValueConverterAttribute.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/DropDownFlexibleConfiguration.cs b/src/Umbraco.Core/PropertyEditors/DropDownFlexibleConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/DropDownFlexibleConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/DropDownFlexibleConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/EditorType.cs b/src/Umbraco.Core/PropertyEditors/EditorType.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/EditorType.cs rename to src/Umbraco.Core/PropertyEditors/EditorType.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/EmailAddressConfiguration.cs b/src/Umbraco.Core/PropertyEditors/EmailAddressConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/EmailAddressConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/EmailAddressConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/GridEditor.cs b/src/Umbraco.Core/PropertyEditors/GridEditor.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/GridEditor.cs rename to src/Umbraco.Core/PropertyEditors/GridEditor.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IConfigurationEditor.cs b/src/Umbraco.Core/PropertyEditors/IConfigurationEditor.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IConfigurationEditor.cs rename to src/Umbraco.Core/PropertyEditors/IConfigurationEditor.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IConfigureValueType.cs b/src/Umbraco.Core/PropertyEditors/IConfigureValueType.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IConfigureValueType.cs rename to src/Umbraco.Core/PropertyEditors/IConfigureValueType.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IDataEditor.cs b/src/Umbraco.Core/PropertyEditors/IDataEditor.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IDataEditor.cs rename to src/Umbraco.Core/PropertyEditors/IDataEditor.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IIgnoreUserStartNodesConfig.cs b/src/Umbraco.Core/PropertyEditors/IIgnoreUserStartNodesConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IIgnoreUserStartNodesConfig.cs rename to src/Umbraco.Core/PropertyEditors/IIgnoreUserStartNodesConfig.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IManifestValueValidator.cs b/src/Umbraco.Core/PropertyEditors/IManifestValueValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IManifestValueValidator.cs rename to src/Umbraco.Core/PropertyEditors/IManifestValueValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IPropertyIndexValueFactory.cs b/src/Umbraco.Core/PropertyEditors/IPropertyIndexValueFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IPropertyIndexValueFactory.cs rename to src/Umbraco.Core/PropertyEditors/IPropertyIndexValueFactory.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IPropertyValueConverter.cs b/src/Umbraco.Core/PropertyEditors/IPropertyValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IPropertyValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/IPropertyValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IValueFormatValidator.cs b/src/Umbraco.Core/PropertyEditors/IValueFormatValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IValueFormatValidator.cs rename to src/Umbraco.Core/PropertyEditors/IValueFormatValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IValueRequiredValidator.cs b/src/Umbraco.Core/PropertyEditors/IValueRequiredValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IValueRequiredValidator.cs rename to src/Umbraco.Core/PropertyEditors/IValueRequiredValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/IValueValidator.cs b/src/Umbraco.Core/PropertyEditors/IValueValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/IValueValidator.cs rename to src/Umbraco.Core/PropertyEditors/IValueValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ImageCropperConfiguration.cs b/src/Umbraco.Core/PropertyEditors/ImageCropperConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ImageCropperConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/ImageCropperConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/LabelConfiguration.cs b/src/Umbraco.Core/PropertyEditors/LabelConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/LabelConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/LabelConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ManifestValueValidatorCollection.cs b/src/Umbraco.Core/PropertyEditors/ManifestValueValidatorCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ManifestValueValidatorCollection.cs rename to src/Umbraco.Core/PropertyEditors/ManifestValueValidatorCollection.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ManifestValueValidatorCollectionBuilder.cs b/src/Umbraco.Core/PropertyEditors/ManifestValueValidatorCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ManifestValueValidatorCollectionBuilder.cs rename to src/Umbraco.Core/PropertyEditors/ManifestValueValidatorCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/MarkdownConfiguration.cs b/src/Umbraco.Core/PropertyEditors/MarkdownConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/MarkdownConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/MarkdownConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/MediaPickerConfiguration.cs b/src/Umbraco.Core/PropertyEditors/MediaPickerConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/MediaPickerConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/MediaPickerConfiguration.cs diff --git a/src/Umbraco.Core/PropertyEditors/MediaUrlGeneratorCollection.cs b/src/Umbraco.Core/PropertyEditors/MediaUrlGeneratorCollection.cs new file mode 100644 index 0000000000..0374ca5cd2 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/MediaUrlGeneratorCollection.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using Umbraco.Core.Composing; + +namespace Umbraco.Core.PropertyEditors +{ + public class MediaUrlGeneratorCollection : BuilderCollectionBase + { + public MediaUrlGeneratorCollection(IEnumerable items) : base(items) + { + } + + public bool TryGetMediaPath(string alias, object value, out string mediaPath) + { + foreach(var generator in this) + { + if (generator.TryGetMediaPath(alias, value, out var mp)) + { + mediaPath = mp; + return true; + } + } + mediaPath = null; + return false; + } + + + } +} diff --git a/src/Umbraco.Core/PropertyEditors/MediaUrlGeneratorCollectionBuilder.cs b/src/Umbraco.Core/PropertyEditors/MediaUrlGeneratorCollectionBuilder.cs new file mode 100644 index 0000000000..40a68fd4e3 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/MediaUrlGeneratorCollectionBuilder.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.Composing; + +namespace Umbraco.Core.PropertyEditors +{ + public class MediaUrlGeneratorCollectionBuilder : LazyCollectionBuilderBase + { + protected override MediaUrlGeneratorCollectionBuilder This => this; + } +} diff --git a/src/Umbraco.Abstractions/PropertyEditors/MultiUrlPickerConfiguration.cs b/src/Umbraco.Core/PropertyEditors/MultiUrlPickerConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/MultiUrlPickerConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/MultiUrlPickerConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/MultipleTextStringConfiguration.cs b/src/Umbraco.Core/PropertyEditors/MultipleTextStringConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/MultipleTextStringConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/MultipleTextStringConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ParameterEditorCollection.cs b/src/Umbraco.Core/PropertyEditors/ParameterEditorCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ParameterEditorCollection.cs rename to src/Umbraco.Core/PropertyEditors/ParameterEditorCollection.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyCacheLevel.cs b/src/Umbraco.Core/PropertyEditors/PropertyCacheLevel.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyCacheLevel.cs rename to src/Umbraco.Core/PropertyEditors/PropertyCacheLevel.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyEditorCollection.cs b/src/Umbraco.Core/PropertyEditors/PropertyEditorCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyEditorCollection.cs rename to src/Umbraco.Core/PropertyEditors/PropertyEditorCollection.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyEditorTagsExtensions.cs b/src/Umbraco.Core/PropertyEditors/PropertyEditorTagsExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyEditorTagsExtensions.cs rename to src/Umbraco.Core/PropertyEditors/PropertyEditorTagsExtensions.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyValueConverterBase.cs b/src/Umbraco.Core/PropertyEditors/PropertyValueConverterBase.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyValueConverterBase.cs rename to src/Umbraco.Core/PropertyEditors/PropertyValueConverterBase.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyValueConverterCollection.cs b/src/Umbraco.Core/PropertyEditors/PropertyValueConverterCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyValueConverterCollection.cs rename to src/Umbraco.Core/PropertyEditors/PropertyValueConverterCollection.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyValueConverterCollectionBuilder.cs b/src/Umbraco.Core/PropertyEditors/PropertyValueConverterCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyValueConverterCollectionBuilder.cs rename to src/Umbraco.Core/PropertyEditors/PropertyValueConverterCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/PropertyValueLevel.cs b/src/Umbraco.Core/PropertyEditors/PropertyValueLevel.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/PropertyValueLevel.cs rename to src/Umbraco.Core/PropertyEditors/PropertyValueLevel.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/SliderConfiguration.cs b/src/Umbraco.Core/PropertyEditors/SliderConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/SliderConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/SliderConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/TagConfiguration.cs b/src/Umbraco.Core/PropertyEditors/TagConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/TagConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/TagConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/TagsPropertyEditorAttribute.cs b/src/Umbraco.Core/PropertyEditors/TagsPropertyEditorAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/TagsPropertyEditorAttribute.cs rename to src/Umbraco.Core/PropertyEditors/TagsPropertyEditorAttribute.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/TextAreaConfiguration.cs b/src/Umbraco.Core/PropertyEditors/TextAreaConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/TextAreaConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/TextAreaConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/TextboxConfiguration.cs b/src/Umbraco.Core/PropertyEditors/TextboxConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/TextboxConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/TextboxConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/TrueFalseConfiguration.cs b/src/Umbraco.Core/PropertyEditors/TrueFalseConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/TrueFalseConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/TrueFalseConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/DateTimeValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/DateTimeValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/DateTimeValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/DateTimeValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/DecimalValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/DecimalValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/DecimalValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/DecimalValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/DelimitedValueValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/DelimitedValueValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/DelimitedValueValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/DelimitedValueValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/EmailValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/EmailValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/EmailValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/EmailValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/IntegerValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/IntegerValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/IntegerValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/IntegerValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/RegexValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/RegexValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/RegexValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/RegexValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/Validators/RequiredValidator.cs b/src/Umbraco.Core/PropertyEditors/Validators/RequiredValidator.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/Validators/RequiredValidator.cs rename to src/Umbraco.Core/PropertyEditors/Validators/RequiredValidator.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/CheckboxListValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/DatePickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DatePickerValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/DatePickerValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/DatePickerValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/DecimalValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/DecimalValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/EmailAddressValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/IntegerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/IntegerValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/IntegerValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/IntegerValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/MemberGroupPickerValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/MultipleTextStringValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/MultipleTextStringValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/MultipleTextStringValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/MultipleTextStringValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/MustBeStringValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/MustBeStringValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/MustBeStringValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/MustBeStringValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/RadioButtonListValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/SliderValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/SliderValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/SliderValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/TagsValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/TagsValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/TagsValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/TextStringValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/TextStringValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/TextStringValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/TextStringValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/UploadPropertyConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/UploadPropertyConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/UploadPropertyConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/UploadPropertyConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueConverters/YesNoValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/YesNoValueConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueConverters/YesNoValueConverter.cs rename to src/Umbraco.Core/PropertyEditors/ValueConverters/YesNoValueConverter.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueListConfiguration.cs b/src/Umbraco.Core/PropertyEditors/ValueListConfiguration.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueListConfiguration.cs rename to src/Umbraco.Core/PropertyEditors/ValueListConfiguration.cs diff --git a/src/Umbraco.Abstractions/PropertyEditors/ValueTypes.cs b/src/Umbraco.Core/PropertyEditors/ValueTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/PropertyEditors/ValueTypes.cs rename to src/Umbraco.Core/PropertyEditors/ValueTypes.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/DefaultCultureAccessor.cs b/src/Umbraco.Core/PublishedCache/DefaultCultureAccessor.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/DefaultCultureAccessor.cs rename to src/Umbraco.Core/PublishedCache/DefaultCultureAccessor.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IDefaultCultureAccessor.cs b/src/Umbraco.Core/PublishedCache/IDefaultCultureAccessor.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IDefaultCultureAccessor.cs rename to src/Umbraco.Core/PublishedCache/IDefaultCultureAccessor.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IDomainCache.cs b/src/Umbraco.Core/PublishedCache/IDomainCache.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IDomainCache.cs rename to src/Umbraco.Core/PublishedCache/IDomainCache.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedCache.cs b/src/Umbraco.Core/PublishedCache/IPublishedCache.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedCache.cs rename to src/Umbraco.Core/PublishedCache/IPublishedCache.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedContentCache.cs b/src/Umbraco.Core/PublishedCache/IPublishedContentCache.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedContentCache.cs rename to src/Umbraco.Core/PublishedCache/IPublishedContentCache.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedMediaCache.cs b/src/Umbraco.Core/PublishedCache/IPublishedMediaCache.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedMediaCache.cs rename to src/Umbraco.Core/PublishedCache/IPublishedMediaCache.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedMemberCache.cs b/src/Umbraco.Core/PublishedCache/IPublishedMemberCache.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedMemberCache.cs rename to src/Umbraco.Core/PublishedCache/IPublishedMemberCache.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshot.cs b/src/Umbraco.Core/PublishedCache/IPublishedSnapshot.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshot.cs rename to src/Umbraco.Core/PublishedCache/IPublishedSnapshot.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshotAccessor.cs b/src/Umbraco.Core/PublishedCache/IPublishedSnapshotAccessor.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshotAccessor.cs rename to src/Umbraco.Core/PublishedCache/IPublishedSnapshotAccessor.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshotService.cs b/src/Umbraco.Core/PublishedCache/IPublishedSnapshotService.cs similarity index 99% rename from src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshotService.cs rename to src/Umbraco.Core/PublishedCache/IPublishedSnapshotService.cs index a1894c902c..b23c8ae10f 100644 --- a/src/Umbraco.Abstractions/PublishedCache/IPublishedSnapshotService.cs +++ b/src/Umbraco.Core/PublishedCache/IPublishedSnapshotService.cs @@ -167,7 +167,7 @@ namespace Umbraco.Web.PublishedCache string StatusUrl { get; } - #endregion + #endregion void Collect(); } diff --git a/src/Umbraco.Abstractions/PublishedCache/PublishedCacheBase.cs b/src/Umbraco.Core/PublishedCache/PublishedCacheBase.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/PublishedCacheBase.cs rename to src/Umbraco.Core/PublishedCache/PublishedCacheBase.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/PublishedElement.cs b/src/Umbraco.Core/PublishedCache/PublishedElement.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/PublishedElement.cs rename to src/Umbraco.Core/PublishedCache/PublishedElement.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/PublishedElementPropertyBase.cs b/src/Umbraco.Core/PublishedCache/PublishedElementPropertyBase.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/PublishedElementPropertyBase.cs rename to src/Umbraco.Core/PublishedCache/PublishedElementPropertyBase.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/PublishedMember.cs b/src/Umbraco.Core/PublishedCache/PublishedMember.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/PublishedMember.cs rename to src/Umbraco.Core/PublishedCache/PublishedMember.cs diff --git a/src/Umbraco.Abstractions/PublishedCache/PublishedSnapshotServiceBase.cs b/src/Umbraco.Core/PublishedCache/PublishedSnapshotServiceBase.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedCache/PublishedSnapshotServiceBase.cs rename to src/Umbraco.Core/PublishedCache/PublishedSnapshotServiceBase.cs diff --git a/src/Umbraco.Web/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs b/src/Umbraco.Core/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs similarity index 99% rename from src/Umbraco.Web/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs rename to src/Umbraco.Core/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs index 76936dd2cb..7e0ebc6f13 100644 --- a/src/Umbraco.Web/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs +++ b/src/Umbraco.Core/PublishedCache/UmbracoContextPublishedSnapshotAccessor.cs @@ -1,5 +1,4 @@ using System; - namespace Umbraco.Web.PublishedCache { public class UmbracoContextPublishedSnapshotAccessor : IPublishedSnapshotAccessor diff --git a/src/Umbraco.Abstractions/PublishedContentExtensions.cs b/src/Umbraco.Core/PublishedContentExtensions.cs similarity index 96% rename from src/Umbraco.Abstractions/PublishedContentExtensions.cs rename to src/Umbraco.Core/PublishedContentExtensions.cs index aa432459dd..84ee8c314b 100644 --- a/src/Umbraco.Abstractions/PublishedContentExtensions.cs +++ b/src/Umbraco.Core/PublishedContentExtensions.cs @@ -1,9 +1,13 @@ using System; using System.Collections.Generic; using System.Linq; +using Umbraco.Composing; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; +using Umbraco.Web; using Umbraco.Web.PublishedCache; +using Umbraco.Web.Routing; namespace Umbraco.Core { @@ -144,6 +148,14 @@ namespace Umbraco.Core return template == null ? string.Empty : template.Alias; } + public static bool IsAllowedTemplate(this IPublishedContent content, IContentTypeService contentTypeService, + IUmbracoSettingsSection umbracoSettingsSection, int templateId) + { + return content.IsAllowedTemplate(contentTypeService, + umbracoSettingsSection.WebRouting.DisableAlternativeTemplates, + umbracoSettingsSection.WebRouting.ValidateAlternativeTemplates, templateId); + } + public static bool IsAllowedTemplate(this IPublishedContent content, IContentTypeService contentTypeService, bool disableAlternativeTemplates, bool validateAlternativeTemplates, int templateId) { if (disableAlternativeTemplates) @@ -1075,5 +1087,39 @@ namespace Umbraco.Core } #endregion + + #region Url + + /// + /// Gets the url of the content item. + /// + /// + /// If the content item is a document, then this method returns the url of the + /// document. If it is a media, then this methods return the media url for the + /// 'umbracoFile' property. Use the MediaUrl() method to get the media url for other + /// properties. + /// The value of this property is contextual. It depends on the 'current' request uri, + /// if any. In addition, when the content type is multi-lingual, this is the url for the + /// specified culture. Otherwise, it is the invariant url. + /// + public static string Url(this IPublishedContent content, IPublishedUrlProvider publishedUrlProvider, string culture = null, UrlMode mode = UrlMode.Default) + { + if (publishedUrlProvider == null) + throw new InvalidOperationException("Cannot resolve a Url when Current.UmbracoContext.UrlProvider is null."); + + switch (content.ContentType.ItemType) + { + case PublishedItemType.Content: + return publishedUrlProvider.GetUrl(content, mode, culture); + + case PublishedItemType.Media: + return publishedUrlProvider.GetMediaUrl(content, mode, culture, Constants.Conventions.Media.File); + + default: + throw new NotSupportedException(); + } + } + + #endregion } } diff --git a/src/Umbraco.Abstractions/PublishedElementExtensions.cs b/src/Umbraco.Core/PublishedElementExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedElementExtensions.cs rename to src/Umbraco.Core/PublishedElementExtensions.cs diff --git a/src/Umbraco.Abstractions/PublishedModelFactoryExtensions.cs b/src/Umbraco.Core/PublishedModelFactoryExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedModelFactoryExtensions.cs rename to src/Umbraco.Core/PublishedModelFactoryExtensions.cs diff --git a/src/Umbraco.Abstractions/PublishedPropertyExtension.cs b/src/Umbraco.Core/PublishedPropertyExtension.cs similarity index 100% rename from src/Umbraco.Abstractions/PublishedPropertyExtension.cs rename to src/Umbraco.Core/PublishedPropertyExtension.cs diff --git a/src/Umbraco.Abstractions/ReadLock.cs b/src/Umbraco.Core/ReadLock.cs similarity index 100% rename from src/Umbraco.Abstractions/ReadLock.cs rename to src/Umbraco.Core/ReadLock.cs diff --git a/src/Umbraco.Abstractions/ReflectionUtilities.cs b/src/Umbraco.Core/ReflectionUtilities.cs similarity index 100% rename from src/Umbraco.Abstractions/ReflectionUtilities.cs rename to src/Umbraco.Core/ReflectionUtilities.cs diff --git a/src/Umbraco.Abstractions/RegisterExtensions.cs b/src/Umbraco.Core/RegisterExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/RegisterExtensions.cs rename to src/Umbraco.Core/RegisterExtensions.cs diff --git a/src/Umbraco.Core/Request/IRequestAccessor.cs b/src/Umbraco.Core/Request/IRequestAccessor.cs new file mode 100644 index 0000000000..63a8de6b1e --- /dev/null +++ b/src/Umbraco.Core/Request/IRequestAccessor.cs @@ -0,0 +1,13 @@ +using System; +using Umbraco.Web.Routing; + +namespace Umbraco.Core.Request +{ + public interface IRequestAccessor + { + string GetRequestValue(string name); + string GetQueryStringValue(string culture); + event EventHandler EndRequest; + event EventHandler RouteAttempt; + } +} diff --git a/src/Umbraco.Web/Routing/AliasUrlProvider.cs b/src/Umbraco.Core/Routing/AliasUrlProvider.cs similarity index 79% rename from src/Umbraco.Web/Routing/AliasUrlProvider.cs rename to src/Umbraco.Core/Routing/AliasUrlProvider.cs index f84ac608d2..c9cc3d5156 100644 --- a/src/Umbraco.Web/Routing/AliasUrlProvider.cs +++ b/src/Umbraco.Core/Routing/AliasUrlProvider.cs @@ -16,12 +16,18 @@ namespace Umbraco.Web.Routing private readonly IGlobalSettings _globalSettings; private readonly IRequestHandlerSection _requestConfig; private readonly ISiteDomainHelper _siteDomainHelper; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly UriUtility _uriUtility; + private readonly IPublishedValueFallback _publishedValueFallback; - public AliasUrlProvider(IGlobalSettings globalSettings, IRequestHandlerSection requestConfig, ISiteDomainHelper siteDomainHelper) + public AliasUrlProvider(IGlobalSettings globalSettings, IRequestHandlerSection requestConfig, ISiteDomainHelper siteDomainHelper, UriUtility uriUtility, IPublishedValueFallback publishedValueFallback, IUmbracoContextAccessor umbracoContextAccessor) { _globalSettings = globalSettings; _requestConfig = requestConfig; _siteDomainHelper = siteDomainHelper; + _uriUtility = uriUtility; + _publishedValueFallback = publishedValueFallback; + _umbracoContextAccessor = umbracoContextAccessor; } // note - at the moment we seem to accept pretty much anything as an alias @@ -31,7 +37,7 @@ namespace Umbraco.Web.Routing #region GetUrl /// - public UrlInfo GetUrl(UmbracoContext umbracoContext, IPublishedContent content, UrlMode mode, string culture, Uri current) + public UrlInfo GetUrl(IPublishedContent content, UrlMode mode, string culture, Uri current) { return null; // we have nothing to say } @@ -51,8 +57,9 @@ namespace Umbraco.Web.Routing /// Other urls are those that GetUrl would not return in the current context, but would be valid /// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...). /// - public IEnumerable GetOtherUrls(UmbracoContext umbracoContext, int id, Uri current) + public IEnumerable GetOtherUrls(int id, Uri current) { + var umbracoContext = _umbracoContextAccessor.UmbracoContext; var node = umbracoContext.Content.GetById(id); if (node == null) yield break; @@ -83,7 +90,7 @@ namespace Umbraco.Web.Routing if (varies) yield break; - var umbracoUrlName = node.Value(Constants.Conventions.Content.UrlAlias); + var umbracoUrlName = node.Value(_publishedValueFallback, Constants.Conventions.Content.UrlAlias); var aliases = umbracoUrlName?.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (aliases == null || aliases.Any() == false) @@ -93,7 +100,7 @@ namespace Umbraco.Web.Routing { var path = "/" + alias; var uri = new Uri(path, UriKind.Relative); - yield return UrlInfo.Url(UriUtility.UriFromUmbraco(uri, _globalSettings, _requestConfig).ToString()); + yield return UrlInfo.Url(_uriUtility.UriFromUmbraco(uri, _globalSettings, _requestConfig).ToString()); } } else @@ -108,8 +115,8 @@ namespace Umbraco.Web.Routing if (varies && !node.HasCulture(domainUri.Culture.Name)) continue; var umbracoUrlName = varies - ? node.Value(Constants.Conventions.Content.UrlAlias, culture: domainUri.Culture.Name) - : node.Value(Constants.Conventions.Content.UrlAlias); + ? node.Value(_publishedValueFallback,Constants.Conventions.Content.UrlAlias, culture: domainUri.Culture.Name) + : node.Value(_publishedValueFallback, Constants.Conventions.Content.UrlAlias); var aliases = umbracoUrlName?.Split(new [] {','}, StringSplitOptions.RemoveEmptyEntries); @@ -120,7 +127,7 @@ namespace Umbraco.Web.Routing { var path = "/" + alias; var uri = new Uri(CombinePaths(domainUri.Uri.GetLeftPart(UriPartial.Path), path)); - yield return UrlInfo.Url(UriUtility.UriFromUmbraco(uri, _globalSettings, _requestConfig).ToString(), domainUri.Culture.Name); + yield return UrlInfo.Url(_uriUtility.UriFromUmbraco(uri, _globalSettings, _requestConfig).ToString(), domainUri.Culture.Name); } } } diff --git a/src/Umbraco.Web/Routing/ContentFinderByIdPath.cs b/src/Umbraco.Core/Routing/ContentFinderByIdPath.cs similarity index 86% rename from src/Umbraco.Web/Routing/ContentFinderByIdPath.cs rename to src/Umbraco.Core/Routing/ContentFinderByIdPath.cs index b339198928..c4bfd5a697 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByIdPath.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByIdPath.cs @@ -4,6 +4,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models.PublishedContent; using System.Globalization; +using Umbraco.Core.Request; namespace Umbraco.Web.Routing { @@ -16,12 +17,14 @@ namespace Umbraco.Web.Routing public class ContentFinderByIdPath : IContentFinder { private readonly ILogger _logger; + private readonly IRequestAccessor _requestAccessor; private readonly IWebRoutingSection _webRoutingSection; - - public ContentFinderByIdPath(IWebRoutingSection webRoutingSection, ILogger logger) + + public ContentFinderByIdPath(IWebRoutingSection webRoutingSection, ILogger logger, IRequestAccessor requestAccessor) { _webRoutingSection = webRoutingSection ?? throw new System.ArgumentNullException(nameof(webRoutingSection)); _logger = logger ?? throw new System.ArgumentNullException(nameof(logger)); + _requestAccessor = requestAccessor; } /// @@ -29,7 +32,7 @@ namespace Umbraco.Web.Routing /// /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. - public bool TryFindContent(PublishedRequest frequest) + public bool TryFindContent(IPublishedRequest frequest) { if (frequest.UmbracoContext != null && frequest.UmbracoContext.InPreviewMode == false @@ -54,11 +57,14 @@ namespace Umbraco.Web.Routing if (node != null) { + + var cultureFromQuerystring = _requestAccessor.GetQueryStringValue("culture"); + //if we have a node, check if we have a culture in the query string - if (frequest.UmbracoContext.HttpContext.Request.QueryString.ContainsKey("culture")) + if (!string.IsNullOrEmpty(cultureFromQuerystring)) { //we're assuming it will match a culture, if an invalid one is passed in, an exception will throw (there is no TryGetCultureInfo method), i think this is ok though - frequest.Culture = CultureInfo.GetCultureInfo(frequest.UmbracoContext.HttpContext.Request.QueryString["culture"]); + frequest.Culture = CultureInfo.GetCultureInfo(cultureFromQuerystring); } frequest.PublishedContent = node; diff --git a/src/Umbraco.Web/Routing/ContentFinderByPageIdQuery.cs b/src/Umbraco.Core/Routing/ContentFinderByPageIdQuery.cs similarity index 62% rename from src/Umbraco.Web/Routing/ContentFinderByPageIdQuery.cs rename to src/Umbraco.Core/Routing/ContentFinderByPageIdQuery.cs index 70a920f6f0..6a9adda5f8 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByPageIdQuery.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByPageIdQuery.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Web.Routing +using Umbraco.Core.Request; + +namespace Umbraco.Web.Routing { /// /// This looks up a document by checking for the umbPageId of a request/query string @@ -9,10 +11,17 @@ /// public class ContentFinderByPageIdQuery : IContentFinder { - public bool TryFindContent(PublishedRequest frequest) + private readonly IRequestAccessor _requestAccessor; + + public ContentFinderByPageIdQuery(IRequestAccessor requestAccessor) + { + _requestAccessor = requestAccessor; + } + + public bool TryFindContent(IPublishedRequest frequest) { int pageId; - if (int.TryParse(frequest.UmbracoContext.HttpContext.Request["umbPageID"], out pageId)) + if (int.TryParse(_requestAccessor.GetRequestValue("umbPageID"), out pageId)) { var doc = frequest.UmbracoContext.Content.GetById(pageId); diff --git a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs b/src/Umbraco.Core/Routing/ContentFinderByRedirectUrl.cs similarity index 86% rename from src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs rename to src/Umbraco.Core/Routing/ContentFinderByRedirectUrl.cs index 46e44dc5a3..5b3e0a5d99 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByRedirectUrl.cs @@ -17,11 +17,13 @@ namespace Umbraco.Web.Routing { private readonly IRedirectUrlService _redirectUrlService; private readonly ILogger _logger; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public ContentFinderByRedirectUrl(IRedirectUrlService redirectUrlService, ILogger logger) + public ContentFinderByRedirectUrl(IRedirectUrlService redirectUrlService, ILogger logger, IPublishedUrlProvider publishedUrlProvider) { _redirectUrlService = redirectUrlService; _logger = logger; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -30,7 +32,7 @@ namespace Umbraco.Web.Routing /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. /// Optionally, can also assign the template or anything else on the document request, although that is not required. - public bool TryFindContent(PublishedRequest frequest) + public bool TryFindContent(IPublishedRequest frequest) { var route = frequest.HasDomain ? frequest.Domain.ContentId + DomainUtilities.PathRelativeToDomain(frequest.Domain.Uri, frequest.Uri.GetAbsolutePathDecoded()) @@ -45,7 +47,7 @@ namespace Umbraco.Web.Routing } var content = frequest.UmbracoContext.Content.GetById(redirectUrl.ContentId); - var url = content == null ? "#" : content.Url(redirectUrl.Culture); + var url = content == null ? "#" : content.Url(_publishedUrlProvider, redirectUrl.Culture); if (url.StartsWith("#")) { _logger.Debug("Route {Route} matches content {ContentId} which has no url.", route, redirectUrl.ContentId); @@ -63,7 +65,8 @@ namespace Umbraco.Web.Routing // See http://issues.umbraco.org/issue/U4-8361#comment=67-30532 // Setting automatic 301 redirects to not be cached because browsers cache these very aggressively which then leads // to problems if you rename a page back to it's original name or create a new page with the original name - frequest.Cacheability = HttpCacheability.NoCache; + //frequest.Cacheability = HttpCacheability.NoCache; + frequest.CacheabilityNoCache = true; frequest.CacheExtensions = new List { "no-store, must-revalidate" }; frequest.Headers = new Dictionary { { "Pragma", "no-cache" }, { "Expires", "0" } }; diff --git a/src/Umbraco.Web/Routing/ContentFinderByUrl.cs b/src/Umbraco.Core/Routing/ContentFinderByUrl.cs similarity index 93% rename from src/Umbraco.Web/Routing/ContentFinderByUrl.cs rename to src/Umbraco.Core/Routing/ContentFinderByUrl.cs index 0a14dc97fe..3fcffff842 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByUrl.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByUrl.cs @@ -24,7 +24,7 @@ namespace Umbraco.Web.Routing /// /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. - public virtual bool TryFindContent(PublishedRequest frequest) + public virtual bool TryFindContent(IPublishedRequest frequest) { string route; if (frequest.HasDomain) @@ -42,7 +42,7 @@ namespace Umbraco.Web.Routing /// The document request. /// The route. /// The document node, or null. - protected IPublishedContent FindContent(PublishedRequest docreq, string route) + protected IPublishedContent FindContent(IPublishedRequest docreq, string route) { if (docreq == null) throw new System.ArgumentNullException(nameof(docreq)); diff --git a/src/Umbraco.Web/Routing/ContentFinderByUrlAlias.cs b/src/Umbraco.Core/Routing/ContentFinderByUrlAlias.cs similarity index 79% rename from src/Umbraco.Web/Routing/ContentFinderByUrlAlias.cs rename to src/Umbraco.Core/Routing/ContentFinderByUrlAlias.cs index cf71611047..6bc1b329ed 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByUrlAlias.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByUrlAlias.cs @@ -18,10 +18,14 @@ namespace Umbraco.Web.Routing /// public class ContentFinderByUrlAlias : IContentFinder { + private readonly IPublishedValueFallback _publishedValueFallback; + private readonly IVariationContextAccessor _variationContextAccessor; protected ILogger Logger { get; } - public ContentFinderByUrlAlias(ILogger logger) + public ContentFinderByUrlAlias(ILogger logger, IPublishedValueFallback publishedValueFallback, IVariationContextAccessor variationContextAccessor) { + _publishedValueFallback = publishedValueFallback; + _variationContextAccessor = variationContextAccessor; Logger = logger; } @@ -30,7 +34,7 @@ namespace Umbraco.Web.Routing /// /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. - public bool TryFindContent(PublishedRequest frequest) + public bool TryFindContent(IPublishedRequest frequest) { IPublishedContent node = null; @@ -51,7 +55,7 @@ namespace Umbraco.Web.Routing return node != null; } - private static IPublishedContent FindContentByAlias(IPublishedContentCache cache, int rootNodeId, string culture, string alias) + private IPublishedContent FindContentByAlias(IPublishedContentCache cache, int rootNodeId, string culture, string alias) { if (alias == null) throw new ArgumentNullException(nameof(alias)); @@ -84,11 +88,11 @@ namespace Umbraco.Web.Routing if (varies) { if (!c.HasCulture(culture)) return false; - v = c.Value(propertyAlias, culture); + v = c.Value(_publishedValueFallback, propertyAlias, culture); } else { - v = c.Value(propertyAlias); + v = c.Value(_publishedValueFallback, propertyAlias); } if (string.IsNullOrWhiteSpace(v)) return false; v = "," + v.Replace(" ", "") + ","; @@ -101,12 +105,12 @@ namespace Umbraco.Web.Routing if (rootNodeId > 0) { var rootNode = cache.GetById(rootNodeId); - return rootNode?.Descendants().FirstOrDefault(x => IsMatch(x, test1, test2)); + return rootNode?.Descendants(_variationContextAccessor).FirstOrDefault(x => IsMatch(x, test1, test2)); } foreach (var rootContent in cache.GetAtRoot()) { - var c = rootContent.DescendantsOrSelf().FirstOrDefault(x => IsMatch(x, test1, test2)); + var c = rootContent.DescendantsOrSelf(_variationContextAccessor).FirstOrDefault(x => IsMatch(x, test1, test2)); if (c != null) return c; } diff --git a/src/Umbraco.Web/Routing/ContentFinderByUrlAndTemplate.cs b/src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs similarity index 85% rename from src/Umbraco.Web/Routing/ContentFinderByUrlAndTemplate.cs rename to src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs index 16dfa63596..933ab47150 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByUrlAndTemplate.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs @@ -1,9 +1,7 @@ using Umbraco.Core.Logging; -using Umbraco.Core.Models; using Umbraco.Core; -using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Web.Composing; using Umbraco.Core.Services; namespace Umbraco.Web.Routing @@ -19,11 +17,15 @@ namespace Umbraco.Web.Routing public class ContentFinderByUrlAndTemplate : ContentFinderByUrl { private readonly IFileService _fileService; + private readonly IUmbracoSettingsSection _umbracoSettingsSection; + private readonly IContentTypeService _contentTypeService; - public ContentFinderByUrlAndTemplate(ILogger logger, IFileService fileService) + public ContentFinderByUrlAndTemplate(ILogger logger, IFileService fileService, IUmbracoSettingsSection umbracoSettingsSection, IContentTypeService contentTypeService) : base(logger) { _fileService = fileService; + _umbracoSettingsSection = umbracoSettingsSection; + _contentTypeService = contentTypeService; } /// @@ -32,7 +34,7 @@ namespace Umbraco.Web.Routing /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. /// If successful, also assigns the template. - public override bool TryFindContent(PublishedRequest frequest) + public override bool TryFindContent(IPublishedRequest frequest) { IPublishedContent node = null; var path = frequest.Uri.GetAbsolutePathDecoded(); @@ -73,7 +75,7 @@ namespace Umbraco.Web.Routing } // IsAllowedTemplate deals both with DisableAlternativeTemplates and ValidateAlternativeTemplates settings - if (!node.IsAllowedTemplate(template.Id)) + if (!node.IsAllowedTemplate(_contentTypeService, _umbracoSettingsSection, template.Id)) { Logger.Warn("Alternative template '{TemplateAlias}' is not allowed on node {NodeId}.", template.Alias, node.Id); frequest.PublishedContent = null; // clear diff --git a/src/Umbraco.Web/Routing/ContentFinderCollection.cs b/src/Umbraco.Core/Routing/ContentFinderCollection.cs similarity index 100% rename from src/Umbraco.Web/Routing/ContentFinderCollection.cs rename to src/Umbraco.Core/Routing/ContentFinderCollection.cs diff --git a/src/Umbraco.Web/Routing/ContentFinderCollectionBuilder.cs b/src/Umbraco.Core/Routing/ContentFinderCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Web/Routing/ContentFinderCollectionBuilder.cs rename to src/Umbraco.Core/Routing/ContentFinderCollectionBuilder.cs diff --git a/src/Umbraco.Web/Routing/DefaultMediaUrlProvider.cs b/src/Umbraco.Core/Routing/DefaultMediaUrlProvider.cs similarity index 61% rename from src/Umbraco.Web/Routing/DefaultMediaUrlProvider.cs rename to src/Umbraco.Core/Routing/DefaultMediaUrlProvider.cs index beaf5f5864..3e6413ff90 100644 --- a/src/Umbraco.Web/Routing/DefaultMediaUrlProvider.cs +++ b/src/Umbraco.Core/Routing/DefaultMediaUrlProvider.cs @@ -1,5 +1,4 @@ using System; -using Umbraco.Core.Composing; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; @@ -10,15 +9,17 @@ namespace Umbraco.Web.Routing /// public class DefaultMediaUrlProvider : IMediaUrlProvider { - private readonly PropertyEditorCollection _propertyEditors; + private readonly UriUtility _uriUtility; + private readonly MediaUrlGeneratorCollection _mediaPathGenerators; - public DefaultMediaUrlProvider(PropertyEditorCollection propertyEditors) + public DefaultMediaUrlProvider(MediaUrlGeneratorCollection mediaPathGenerators, UriUtility uriUtility) { - _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); + _mediaPathGenerators = mediaPathGenerators ?? throw new ArgumentNullException(nameof(mediaPathGenerators)); + _uriUtility = uriUtility; } /// - public virtual UrlInfo GetMediaUrl(UmbracoContext umbracoContext, IPublishedContent content, + public virtual UrlInfo GetMediaUrl(IPublishedContent content, string propertyAlias, UrlMode mode, string culture, Uri current) { var prop = content.GetProperty(propertyAlias); @@ -31,25 +32,23 @@ namespace Umbraco.Web.Routing } var propType = prop.PropertyType; - string path = null; - if (_propertyEditors.TryGet(propType.EditorAlias, out var editor) - && editor is IDataEditorWithMediaPath dataEditor) + if (_mediaPathGenerators.TryGetMediaPath(propType.EditorAlias, value, out var path)) { - path = dataEditor.GetMediaPath(value); + var url = AssembleUrl(path, current, mode); + return UrlInfo.Url(url.ToString(), culture); } - var url = AssembleUrl(path, current, mode); - return url == null ? null : UrlInfo.Url(url.ToString(), culture); + return null; } private Uri AssembleUrl(string path, Uri current, UrlMode mode) { - if (string.IsNullOrEmpty(path)) - return null; + if (string.IsNullOrWhiteSpace(path)) + throw new ArgumentException($"{nameof(path)} cannot be null or whitespace", nameof(path)); // the stored path is absolute so we just return it as is - if(Uri.IsWellFormedUriString(path, UriKind.Absolute)) + if (Uri.IsWellFormedUriString(path, UriKind.Absolute)) return new Uri(path); Uri uri; @@ -70,7 +69,7 @@ namespace Umbraco.Web.Routing throw new ArgumentOutOfRangeException(nameof(mode)); } - return UriUtility.MediaUriFromUmbraco(uri); + return _uriUtility.MediaUriFromUmbraco(uri); } } } diff --git a/src/Umbraco.Web/Routing/DefaultUrlProvider.cs b/src/Umbraco.Core/Routing/DefaultUrlProvider.cs similarity index 86% rename from src/Umbraco.Web/Routing/DefaultUrlProvider.cs rename to src/Umbraco.Core/Routing/DefaultUrlProvider.cs index 4092538481..81102810e8 100644 --- a/src/Umbraco.Web/Routing/DefaultUrlProvider.cs +++ b/src/Umbraco.Core/Routing/DefaultUrlProvider.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; @@ -17,29 +16,34 @@ namespace Umbraco.Web.Routing private readonly ILogger _logger; private readonly IGlobalSettings _globalSettings; private readonly ISiteDomainHelper _siteDomainHelper; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly UriUtility _uriUtility; - public DefaultUrlProvider(IRequestHandlerSection requestSettings, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper) + public DefaultUrlProvider(IRequestHandlerSection requestSettings, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, IUmbracoContextAccessor umbracoContextAccessor, UriUtility uriUtility) { _requestSettings = requestSettings; _logger = logger; _globalSettings = globalSettings; _siteDomainHelper = siteDomainHelper; + _uriUtility = uriUtility; + _umbracoContextAccessor = umbracoContextAccessor; } #region GetUrl /// - public virtual UrlInfo GetUrl(UmbracoContext umbracoContext, IPublishedContent content, UrlMode mode, string culture, Uri current) + public virtual UrlInfo GetUrl(IPublishedContent content, UrlMode mode, string culture, Uri current) { if (!current.IsAbsoluteUri) throw new ArgumentException("Current url must be absolute.", nameof(current)); + var umbracoContext = _umbracoContextAccessor.UmbracoContext; // will not use cache if previewing var route = umbracoContext.Content.GetRouteById(content.Id, culture); return GetUrlFromRoute(route, umbracoContext, content.Id, current, mode, culture); } - internal UrlInfo GetUrlFromRoute(string route, UmbracoContext umbracoContext, int id, Uri current, UrlMode mode, string culture) + internal UrlInfo GetUrlFromRoute(string route, IUmbracoContext umbracoContext, int id, Uri current, UrlMode mode, string culture) { if (string.IsNullOrWhiteSpace(route)) { @@ -68,7 +72,7 @@ namespace Umbraco.Web.Routing /// /// Gets the other urls of a published content. /// - /// The Umbraco context. + /// The Umbraco context. /// The published content id. /// The current absolute url. /// The other urls for the published content. @@ -76,8 +80,9 @@ namespace Umbraco.Web.Routing /// Other urls are those that GetUrl would not return in the current context, but would be valid /// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...). /// - public virtual IEnumerable GetOtherUrls(UmbracoContext umbracoContext, int id, Uri current) + public virtual IEnumerable GetOtherUrls(int id, Uri current) { + var umbracoContext = _umbracoContextAccessor.UmbracoContext; var node = umbracoContext.Content.GetById(id); if (node == null) yield break; @@ -108,7 +113,7 @@ namespace Umbraco.Web.Routing var path = pos == 0 ? route : route.Substring(pos); var uri = new Uri(CombinePaths(d.Uri.GetLeftPart(UriPartial.Path), path)); - uri = UriUtility.UriFromUmbraco(uri, _globalSettings, _requestSettings); + uri = _uriUtility.UriFromUmbraco(uri, _globalSettings, _requestSettings); yield return UrlInfo.Url(uri.ToString(), culture); } } @@ -167,7 +172,7 @@ namespace Umbraco.Web.Routing // UriFromUmbraco will handle vdir // meaning it will add vdir into domain urls too! - return UriUtility.UriFromUmbraco(uri, _globalSettings, _requestSettings); + return _uriUtility.UriFromUmbraco(uri, _globalSettings, _requestSettings); } string CombinePaths(string path1, string path2) diff --git a/src/Umbraco.Abstractions/Routing/Domain.cs b/src/Umbraco.Core/Routing/Domain.cs similarity index 100% rename from src/Umbraco.Abstractions/Routing/Domain.cs rename to src/Umbraco.Core/Routing/Domain.cs diff --git a/src/Umbraco.Web/Routing/DomainAndUri.cs b/src/Umbraco.Core/Routing/DomainAndUri.cs similarity index 100% rename from src/Umbraco.Web/Routing/DomainAndUri.cs rename to src/Umbraco.Core/Routing/DomainAndUri.cs diff --git a/src/Umbraco.Web/Routing/DomainUtilities.cs b/src/Umbraco.Core/Routing/DomainUtilities.cs similarity index 98% rename from src/Umbraco.Web/Routing/DomainUtilities.cs rename to src/Umbraco.Core/Routing/DomainUtilities.cs index fb0c56b28d..c459ae4d14 100644 --- a/src/Umbraco.Web/Routing/DomainUtilities.cs +++ b/src/Umbraco.Core/Routing/DomainUtilities.cs @@ -27,7 +27,7 @@ namespace Umbraco.Web.Routing /// one document per culture), and domains, withing the context of a current Uri, assign /// a culture to that document. /// - internal static string GetCultureFromDomains(int contentId, string contentPath, Uri current, UmbracoContext umbracoContext, ISiteDomainHelper siteDomainHelper) + internal static string GetCultureFromDomains(int contentId, string contentPath, Uri current, IUmbracoContext umbracoContext, ISiteDomainHelper siteDomainHelper) { if (umbracoContext == null) throw new InvalidOperationException("A current UmbracoContext is required."); @@ -295,7 +295,7 @@ namespace Umbraco.Web.Routing ? currentUri.GetLeftPart(UriPartial.Authority) + domainName : domainName; var scheme = currentUri?.Scheme ?? Uri.UriSchemeHttp; - return new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(name, scheme))); + return new Uri(UriUtilityCore.TrimPathEndSlash(UriUtilityCore.StartWithScheme(name, scheme))); } #endregion @@ -344,7 +344,7 @@ namespace Umbraco.Web.Routing /// The current domain root node identifier, or null. /// The deepest wildcard Domain in the path, or null. /// Looks _under_ rootNodeId but not _at_ rootNodeId. - internal static Domain FindWildcardDomainInPath(IEnumerable domains, string path, int? rootNodeId) + public static Domain FindWildcardDomainInPath(IEnumerable domains, string path, int? rootNodeId) { var stopNodeId = rootNodeId ?? -1; diff --git a/src/Umbraco.Web/Routing/EnsureRoutableOutcome.cs b/src/Umbraco.Core/Routing/EnsureRoutableOutcome.cs similarity index 100% rename from src/Umbraco.Web/Routing/EnsureRoutableOutcome.cs rename to src/Umbraco.Core/Routing/EnsureRoutableOutcome.cs diff --git a/src/Umbraco.Web/Routing/IContentFinder.cs b/src/Umbraco.Core/Routing/IContentFinder.cs similarity index 92% rename from src/Umbraco.Web/Routing/IContentFinder.cs rename to src/Umbraco.Core/Routing/IContentFinder.cs index 2e388c4814..39d31741a6 100644 --- a/src/Umbraco.Web/Routing/IContentFinder.cs +++ b/src/Umbraco.Core/Routing/IContentFinder.cs @@ -11,6 +11,6 @@ namespace Umbraco.Web.Routing /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. /// Optionally, can also assign the template or anything else on the document request, although that is not required. - bool TryFindContent(PublishedRequest request); + bool TryFindContent(IPublishedRequest request); } } diff --git a/src/Umbraco.Web/Routing/IContentLastChanceFinder.cs b/src/Umbraco.Core/Routing/IContentLastChanceFinder.cs similarity index 100% rename from src/Umbraco.Web/Routing/IContentLastChanceFinder.cs rename to src/Umbraco.Core/Routing/IContentLastChanceFinder.cs diff --git a/src/Umbraco.Web/Routing/IMediaUrlProvider.cs b/src/Umbraco.Core/Routing/IMediaUrlProvider.cs similarity index 85% rename from src/Umbraco.Web/Routing/IMediaUrlProvider.cs rename to src/Umbraco.Core/Routing/IMediaUrlProvider.cs index 8a81b27415..1b966c6fdd 100644 --- a/src/Umbraco.Web/Routing/IMediaUrlProvider.cs +++ b/src/Umbraco.Core/Routing/IMediaUrlProvider.cs @@ -1,6 +1,7 @@ using System; using Umbraco.Core.Models.PublishedContent; + namespace Umbraco.Web.Routing { /// @@ -11,7 +12,6 @@ namespace Umbraco.Web.Routing /// /// Gets the url of a media item. /// - /// The Umbraco context. /// The published content. /// The property alias to resolve the url from. /// The url mode. @@ -26,6 +26,6 @@ namespace Umbraco.Web.Routing /// e.g. a cdn url provider will most likely always return an absolute url. /// If the provider is unable to provide a url, it returns null. /// - UrlInfo GetMediaUrl(UmbracoContext umbracoContext, IPublishedContent content, string propertyAlias, UrlMode mode, string culture, Uri current); + UrlInfo GetMediaUrl(IPublishedContent content, string propertyAlias, UrlMode mode, string culture, Uri current); } } diff --git a/src/Umbraco.Core/Routing/IPublishedRequest.cs b/src/Umbraco.Core/Routing/IPublishedRequest.cs new file mode 100644 index 0000000000..f357108a4e --- /dev/null +++ b/src/Umbraco.Core/Routing/IPublishedRequest.cs @@ -0,0 +1,224 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Web.Routing +{ + public interface IPublishedRequest + { + /// + /// Gets the UmbracoContext. + /// + IUmbracoContext UmbracoContext { get; } + + /// + /// Gets or sets the cleaned up Uri used for routing. + /// + /// The cleaned up Uri has no virtual directory, no trailing slash, no .aspx extension, etc. + Uri Uri { get; set; } + + /// + /// Gets or sets a value indicating whether the Umbraco Backoffice should ignore a collision for this request. + /// + bool IgnorePublishedContentCollisions { get; set; } + + /// + /// Gets or sets the requested content. + /// + /// Setting the requested content clears Template. + IPublishedContent PublishedContent { get; set; } + + /// + /// Gets the initial requested content. + /// + /// The initial requested content is the content that was found by the finders, + /// before anything such as 404, redirect... took place. + IPublishedContent InitialPublishedContent { get; } + + /// + /// Gets value indicating whether the current published content is the initial one. + /// + bool IsInitialPublishedContent { get; } + + /// + /// Gets or sets a value indicating whether the current published content has been obtained + /// from the initial published content following internal redirections exclusively. + /// + /// Used by PublishedContentRequestEngine.FindTemplate() to figure out whether to + /// apply the internal redirect or not, when content is not the initial content. + bool IsInternalRedirectPublishedContent { get; } + + /// + /// Gets a value indicating whether the content request has a content. + /// + bool HasPublishedContent { get; } + + ITemplate TemplateModel { get; set; } + + /// + /// Gets the alias of the template to use to display the requested content. + /// + string TemplateAlias { get; } + + /// + /// Gets a value indicating whether the content request has a template. + /// + bool HasTemplate { get; } + + void UpdateToNotFound(); + + /// + /// Gets or sets the content request's domain. + /// + /// Is a DomainAndUri object ie a standard Domain plus the fully qualified uri. For example, + /// the Domain may contain "example.com" whereas the Uri will be fully qualified eg "http://example.com/". + DomainAndUri Domain { get; set; } + + /// + /// Gets a value indicating whether the content request has a domain. + /// + bool HasDomain { get; } + + /// + /// Gets or sets the content request's culture. + /// + CultureInfo Culture { get; set; } + + /// + /// Gets or sets a value indicating whether the requested content could not be found. + /// + /// This is set in the PublishedContentRequestBuilder and can also be used in + /// custom content finders or Prepared event handlers, where we want to allow developers + /// to indicate a request is 404 but not to cancel it. + bool Is404 { get; set; } + + /// + /// Gets a value indicating whether the content request triggers a redirect (permanent or not). + /// + bool IsRedirect { get; } + + /// + /// Gets or sets a value indicating whether the redirect is permanent. + /// + bool IsRedirectPermanent { get; } + + /// + /// Gets or sets the url to redirect to, when the content request triggers a redirect. + /// + string RedirectUrl { get; } + + /// + /// Gets or sets the content request http response status code. + /// + /// Does not actually set the http response status code, only registers that the response + /// should use the specified code. The code will or will not be used, in due time. + int ResponseStatusCode { get; } + + /// + /// Gets or sets the content request http response status description. + /// + /// Does not actually set the http response status description, only registers that the response + /// should use the specified description. The description will or will not be used, in due time. + string ResponseStatusDescription { get; } + + /// + /// Gets or sets a list of Extensions to append to the Response.Cache object. + /// + List CacheExtensions { get; set; } + + /// + /// Gets or sets a dictionary of Headers to append to the Response object. + /// + Dictionary Headers { get; set; } + + bool CacheabilityNoCache { get; set; } + + /// + /// Prepares the request. + /// + void Prepare(); + + /// + /// Triggers the Preparing event. + /// + void OnPreparing(); + + /// + /// Triggers the Prepared event. + /// + void OnPrepared(); + + /// + /// Sets the requested content, following an internal redirect. + /// + /// The requested content. + /// Depending on UmbracoSettings.InternalRedirectPreservesTemplate, will + /// preserve or reset the template, if any. + void SetInternalRedirectPublishedContent(IPublishedContent content); + + /// + /// Indicates that the current PublishedContent is the initial one. + /// + void SetIsInitialPublishedContent(); + + /// + /// Tries to set the template to use to display the requested content. + /// + /// The alias of the template. + /// A value indicating whether a valid template with the specified alias was found. + /// + /// Successfully setting the template does refresh RenderingEngine. + /// If setting the template fails, then the previous template (if any) remains in place. + /// + bool TrySetTemplate(string alias); + + /// + /// Sets the template to use to display the requested content. + /// + /// The template. + /// Setting the template does refresh RenderingEngine. + void SetTemplate(ITemplate template); + + /// + /// Resets the template. + /// + void ResetTemplate(); + + /// + /// Indicates that the content request should trigger a redirect (302). + /// + /// The url to redirect to. + /// Does not actually perform a redirect, only registers that the response should + /// redirect. Redirect will or will not take place in due time. + void SetRedirect(string url); + + /// + /// Indicates that the content request should trigger a permanent redirect (301). + /// + /// The url to redirect to. + /// Does not actually perform a redirect, only registers that the response should + /// redirect. Redirect will or will not take place in due time. + void SetRedirectPermanent(string url); + + /// + /// Indicates that the content request should trigger a redirect, with a specified status code. + /// + /// The url to redirect to. + /// The status code (300-308). + /// Does not actually perform a redirect, only registers that the response should + /// redirect. Redirect will or will not take place in due time. + void SetRedirect(string url, int status); + + /// + /// Sets the http response status code, along with an optional associated description. + /// + /// The http status code. + /// The description. + /// Does not actually set the http response status code and description, only registers that + /// the response should use the specified code and description. The code and description will or will + /// not be used, in due time. + void SetResponseStatus(int code, string description = null); + } +} diff --git a/src/Umbraco.Web/Routing/IPublishedRouter.cs b/src/Umbraco.Core/Routing/IPublishedRouter.cs similarity index 86% rename from src/Umbraco.Web/Routing/IPublishedRouter.cs rename to src/Umbraco.Core/Routing/IPublishedRouter.cs index df06e42e55..db9d69df20 100644 --- a/src/Umbraco.Web/Routing/IPublishedRouter.cs +++ b/src/Umbraco.Core/Routing/IPublishedRouter.cs @@ -17,21 +17,21 @@ namespace Umbraco.Web.Routing /// The current Umbraco context. /// The (optional) request Uri. /// A published request. - PublishedRequest CreateRequest(UmbracoContext umbracoContext, Uri uri = null); + IPublishedRequest CreateRequest(IUmbracoContext umbracoContext, Uri uri = null); /// /// Prepares a request for rendering. /// /// The request. /// A value indicating whether the request was successfully prepared and can be rendered. - bool PrepareRequest(PublishedRequest request); + bool PrepareRequest(IPublishedRequest request); /// /// Tries to route a request. /// /// The request. /// A value indicating whether the request can be routed to a document. - bool TryRouteRequest(PublishedRequest request); + bool TryRouteRequest(IPublishedRequest request); /// /// Gets a template. @@ -49,6 +49,6 @@ namespace Umbraco.Web.Routing /// the request, for whatever reason, and wants to force it to be re-routed /// and rendered as if no document were found (404). /// - void UpdateRequestToNotFound(PublishedRequest request); + void UpdateRequestToNotFound(IPublishedRequest request); } } diff --git a/src/Umbraco.Core/Routing/IPublishedUrlProvider.cs b/src/Umbraco.Core/Routing/IPublishedUrlProvider.cs new file mode 100644 index 0000000000..45faf76772 --- /dev/null +++ b/src/Umbraco.Core/Routing/IPublishedUrlProvider.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using Umbraco.Core; +using Umbraco.Core.Models.PublishedContent; + +namespace Umbraco.Web.Routing +{ + public interface IPublishedUrlProvider + { + /// + /// Gets or sets the provider url mode. + /// + UrlMode Mode { get; set; } + + /// + /// Gets the url of a published content. + /// + /// The published content identifier. + /// The url mode. + /// A culture. + /// The current absolute url. + /// The url for the published content. + string GetUrl(Guid id, UrlMode mode = UrlMode.Default, string culture = null, Uri current = null); + + /// + /// Gets the url of a published content. + /// + /// The published content identifier. + /// The url mode. + /// A culture. + /// The current absolute url. + /// The url for the published content. + string GetUrl(int id, UrlMode mode = UrlMode.Default, string culture = null, Uri current = null); + + /// + /// Gets the url of a published content. + /// + /// The published content. + /// The url mode. + /// A culture. + /// The current absolute url. + /// The url for the published content. + /// + /// The url is absolute or relative depending on mode and on current. + /// If the published content is multi-lingual, gets the url for the specified culture or, + /// when no culture is specified, the current culture. + /// If the provider is unable to provide a url, it returns "#". + /// + string GetUrl(IPublishedContent content, UrlMode mode = UrlMode.Default, string culture = null, Uri current = null); + + string GetUrlFromRoute(int id, string route, string culture); + + /// + /// Gets the other urls of a published content. + /// + /// The published content id. + /// The other urls for the published content. + /// + /// Other urls are those that GetUrl would not return in the current context, but would be valid + /// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...). + /// The results depend on the current url. + /// + IEnumerable GetOtherUrls(int id); + + /// + /// Gets the other urls of a published content. + /// + /// The published content id. + /// The current absolute url. + /// The other urls for the published content. + /// + /// Other urls are those that GetUrl would not return in the current context, but would be valid + /// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...). + /// + IEnumerable GetOtherUrls(int id, Uri current); + + /// + /// Gets the url of a media item. + /// + /// + /// + /// + /// + /// + /// + string GetMediaUrl(Guid id, UrlMode mode = UrlMode.Default, string culture = null, string propertyAlias = Constants.Conventions.Media.File, Uri current = null); + + /// + /// Gets the url of a media item. + /// + /// The published content. + /// The property alias to resolve the url from. + /// The url mode. + /// The variation language. + /// The current absolute url. + /// The url for the media. + /// + /// The url is absolute or relative depending on mode and on current. + /// If the media is multi-lingual, gets the url for the specified culture or, + /// when no culture is specified, the current culture. + /// If the provider is unable to provide a url, it returns . + /// + string GetMediaUrl(IPublishedContent content, UrlMode mode = UrlMode.Default, string culture = null, string propertyAlias = Constants.Conventions.Media.File, Uri current = null); + } +} diff --git a/src/Umbraco.Web/Routing/ISiteDomainHelper.cs b/src/Umbraco.Core/Routing/ISiteDomainHelper.cs similarity index 100% rename from src/Umbraco.Web/Routing/ISiteDomainHelper.cs rename to src/Umbraco.Core/Routing/ISiteDomainHelper.cs diff --git a/src/Umbraco.Web/Routing/IUrlProvider.cs b/src/Umbraco.Core/Routing/IUrlProvider.cs similarity index 82% rename from src/Umbraco.Web/Routing/IUrlProvider.cs rename to src/Umbraco.Core/Routing/IUrlProvider.cs index c0ce1fef39..ba1d48a113 100644 --- a/src/Umbraco.Web/Routing/IUrlProvider.cs +++ b/src/Umbraco.Core/Routing/IUrlProvider.cs @@ -12,7 +12,6 @@ namespace Umbraco.Web.Routing /// /// Gets the url of a published content. /// - /// The Umbraco context. /// The published content. /// The url mode. /// A culture. @@ -24,12 +23,11 @@ namespace Umbraco.Web.Routing /// when no culture is specified, the current culture. /// If the provider is unable to provide a url, it should return null. /// - UrlInfo GetUrl(UmbracoContext umbracoContext, IPublishedContent content, UrlMode mode, string culture, Uri current); + UrlInfo GetUrl(IPublishedContent content, UrlMode mode, string culture, Uri current); /// /// Gets the other urls of a published content. /// - /// The Umbraco context. /// The published content id. /// The current absolute url. /// The other urls for the published content. @@ -37,6 +35,6 @@ namespace Umbraco.Web.Routing /// Other urls are those that GetUrl would not return in the current context, but would be valid /// urls for the node in other contexts (different domain for current request, umbracoUrlAlias...). /// - IEnumerable GetOtherUrls(UmbracoContext umbracoContext, int id, Uri current); + IEnumerable GetOtherUrls(int id, Uri current); } } diff --git a/src/Umbraco.Web/Routing/MediaUrlProviderCollection.cs b/src/Umbraco.Core/Routing/MediaUrlProviderCollection.cs similarity index 100% rename from src/Umbraco.Web/Routing/MediaUrlProviderCollection.cs rename to src/Umbraco.Core/Routing/MediaUrlProviderCollection.cs diff --git a/src/Umbraco.Web/Routing/MediaUrlProviderCollectionBuilder.cs b/src/Umbraco.Core/Routing/MediaUrlProviderCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Web/Routing/MediaUrlProviderCollectionBuilder.cs rename to src/Umbraco.Core/Routing/MediaUrlProviderCollectionBuilder.cs diff --git a/src/Umbraco.Web/Routing/PublishedRequest.cs b/src/Umbraco.Core/Routing/PublishedRequest.cs similarity index 93% rename from src/Umbraco.Web/Routing/PublishedRequest.cs rename to src/Umbraco.Core/Routing/PublishedRequest.cs index 37a58ad375..9b00e59deb 100644 --- a/src/Umbraco.Web/Routing/PublishedRequest.cs +++ b/src/Umbraco.Core/Routing/PublishedRequest.cs @@ -2,21 +2,18 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Threading; -using System.Web; -using Umbraco.Core; -using Umbraco.Web.Composing; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Web.Macros; using Umbraco.Core.Configuration.UmbracoSettings; namespace Umbraco.Web.Routing { + /// /// Represents a request for one specified Umbraco IPublishedContent to be rendered /// by one specified template, using one specified Culture and RenderingEngine. /// - public class PublishedRequest + public class PublishedRequest : IPublishedRequest { private readonly IPublishedRouter _publishedRouter; private readonly IUmbracoSettingsSection _umbracoSettingsSection; @@ -29,15 +26,14 @@ namespace Umbraco.Web.Routing private CultureInfo _culture; private IPublishedContent _publishedContent; private IPublishedContent _initialPublishedContent; // found by finders before 404, redirects, etc - private PublishedContentHashtableConverter _umbracoPage; // legacy /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The published router. /// The Umbraco context. /// The request Uri. - internal PublishedRequest(IPublishedRouter publishedRouter, UmbracoContext umbracoContext, IUmbracoSettingsSection umbracoSettingsSection, Uri uri = null) + internal PublishedRequest(IPublishedRouter publishedRouter, IUmbracoContext umbracoContext, IUmbracoSettingsSection umbracoSettingsSection, Uri uri = null) { UmbracoContext = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext)); _publishedRouter = publishedRouter ?? throw new ArgumentNullException(nameof(publishedRouter)); @@ -48,7 +44,7 @@ namespace Umbraco.Web.Routing /// /// Gets the UmbracoContext. /// - public UmbracoContext UmbracoContext { get; } + public IUmbracoContext UmbracoContext { get; } /// /// Gets or sets the cleaned up Uri used for routing. @@ -66,12 +62,14 @@ namespace Umbraco.Web.Routing } // utility for ensuring it is ok to set some properties - private void EnsureWriteable() + public void EnsureWriteable() { if (_readonly) throw new InvalidOperationException("Cannot modify a PublishedRequest once it is read-only."); } + public bool CacheabilityNoCache { get; set; } + /// /// Prepares the request. /// @@ -106,7 +104,7 @@ namespace Umbraco.Web.Routing /// /// Triggers the Preparing event. /// - internal void OnPreparing() + public void OnPreparing() { Preparing?.Invoke(this, EventArgs.Empty); _readonlyUri = true; @@ -115,7 +113,7 @@ namespace Umbraco.Web.Routing /// /// Triggers the Prepared event. /// - internal void OnPrepared() + public void OnPrepared() { Prepared?.Invoke(this, EventArgs.Empty); @@ -231,7 +229,7 @@ namespace Umbraco.Web.Routing /// /// Gets or sets the template model to use to display the requested content. /// - internal ITemplate TemplateModel { get; set; } + public ITemplate TemplateModel { get; set; } /// /// Gets the alias of the template to use to display the requested content. @@ -293,7 +291,7 @@ namespace Umbraco.Web.Routing /// public bool HasTemplate => TemplateModel != null; - internal void UpdateToNotFound() + public void UpdateToNotFound() { var __readonly = _readonly; _readonly = false; @@ -464,7 +462,7 @@ namespace Umbraco.Web.Routing // Note: we used to set a default value here but that would then be the default // for ALL requests, we shouldn't overwrite it though if people are using [OutputCache] for example // see: https://our.umbraco.com/forum/using-umbraco-and-getting-started/79715-output-cache-in-umbraco-752 - public HttpCacheability Cacheability { get; set; } + //public HttpCacheability Cacheability { get; set; } /// /// Gets or sets a list of Extensions to append to the Response.Cache object. @@ -477,23 +475,5 @@ namespace Umbraco.Web.Routing public Dictionary Headers { get; set; } = new Dictionary(); #endregion - - #region Legacy - - // for legacy/webforms/macro code - - // TODO: get rid of it eventually - internal PublishedContentHashtableConverter LegacyContentHashTable - { - get - { - if (_umbracoPage == null) - throw new InvalidOperationException("The UmbracoPage object has not been initialized yet."); - - return _umbracoPage; - } - set => _umbracoPage = value; - } - - #endregion } } diff --git a/src/Umbraco.Web/Routing/PublishedRouter.cs b/src/Umbraco.Core/Routing/PublishedRouter.cs similarity index 82% rename from src/Umbraco.Web/Routing/PublishedRouter.cs rename to src/Umbraco.Core/Routing/PublishedRouter.cs index 9148ce2e31..f521c3a95a 100644 --- a/src/Umbraco.Web/Routing/PublishedRouter.cs +++ b/src/Umbraco.Core/Routing/PublishedRouter.cs @@ -4,13 +4,12 @@ using System.Threading; using System.Globalization; using System.IO; using Umbraco.Core; -using Umbraco.Web.Composing; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Request; using Umbraco.Core.Services; -using Umbraco.Web.Macros; using Umbraco.Web.Security; namespace Umbraco.Web.Routing @@ -23,12 +22,17 @@ namespace Umbraco.Web.Routing private readonly IWebRoutingSection _webRoutingSection; private readonly ContentFinderCollection _contentFinders; private readonly IContentLastChanceFinder _contentLastChanceFinder; - private readonly ServiceContext _services; private readonly IProfilingLogger _profilingLogger; private readonly IVariationContextAccessor _variationContextAccessor; private readonly ILogger _logger; private readonly IUmbracoSettingsSection _umbracoSettingsSection; - private readonly IUserService _userService; + private readonly IPublishedUrlProvider _publishedUrlProvider; + private readonly IRequestAccessor _requestAccessor; + private readonly IPublishedValueFallback _publishedValueFallback; + private readonly IPublicAccessChecker _publicAccessChecker; + private readonly IFileService _fileService; + private readonly IContentTypeService _contentTypeService; + private readonly IPublicAccessService _publicAccessService; /// /// Initializes a new instance of the class. @@ -38,24 +42,34 @@ namespace Umbraco.Web.Routing ContentFinderCollection contentFinders, IContentLastChanceFinder contentLastChanceFinder, IVariationContextAccessor variationContextAccessor, - ServiceContext services, IProfilingLogger proflog, IUmbracoSettingsSection umbracoSettingsSection, - IUserService userService) + IPublishedUrlProvider publishedUrlProvider, + IRequestAccessor requestAccessor, + IPublishedValueFallback publishedValueFallback, + IPublicAccessChecker publicAccessChecker, + IFileService fileService, + IContentTypeService contentTypeService, + IPublicAccessService publicAccessService) { _webRoutingSection = webRoutingSection ?? throw new ArgumentNullException(nameof(webRoutingSection)); _contentFinders = contentFinders ?? throw new ArgumentNullException(nameof(contentFinders)); _contentLastChanceFinder = contentLastChanceFinder ?? throw new ArgumentNullException(nameof(contentLastChanceFinder)); - _services = services ?? throw new ArgumentNullException(nameof(services)); _profilingLogger = proflog ?? throw new ArgumentNullException(nameof(proflog)); _variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); _logger = proflog; _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); - _userService = userService ?? throw new ArgumentNullException(nameof(userService)); + _publishedUrlProvider = publishedUrlProvider; + _requestAccessor = requestAccessor; + _publishedValueFallback = publishedValueFallback; + _publicAccessChecker = publicAccessChecker; + _fileService = fileService; + _contentTypeService = contentTypeService; + _publicAccessService = publicAccessService; } /// - public PublishedRequest CreateRequest(UmbracoContext umbracoContext, Uri uri = null) + public IPublishedRequest CreateRequest(IUmbracoContext umbracoContext, Uri uri = null) { return new PublishedRequest(this, umbracoContext, _umbracoSettingsSection, uri ?? umbracoContext.CleanedUmbracoUrl); } @@ -63,7 +77,7 @@ namespace Umbraco.Web.Routing #region Request /// - public bool TryRouteRequest(PublishedRequest request) + public bool TryRouteRequest(IPublishedRequest request) { // disabled - is it going to change the routing? //_pcr.OnPreparing(); @@ -94,7 +108,7 @@ namespace Umbraco.Web.Routing } /// - public bool PrepareRequest(PublishedRequest request) + public bool PrepareRequest(IPublishedRequest request) { // note - at that point the original legacy module did something do handle IIS custom 404 errors // ie pages looking like /anything.aspx?404;/path/to/document - I guess the reason was to support @@ -165,7 +179,7 @@ namespace Umbraco.Web.Routing /// This method logic has been put into it's own method in case developers have created a custom PCR or are assigning their own values /// but need to finalize it themselves. /// - public bool ConfigureRequest(PublishedRequest frequest) + public bool ConfigureRequest(IPublishedRequest frequest) { if (frequest.HasPublishedContent == false) { @@ -188,22 +202,11 @@ namespace Umbraco.Web.Routing // can't go beyond that point without a PublishedContent to render // it's ok not to have a template, in order to give MVC a chance to hijack routes - // note - the page() ctor below will cause the "page" to get the value of all its - // "elements" ie of all the IPublishedContent property. If we use the object value, - // that will trigger macro execution - which can't happen because macro execution - // requires that _pcr.UmbracoPage is already initialized = catch-22. The "legacy" - // pipeline did _not_ evaluate the macros, ie it is using the data value, and we - // have to keep doing it because of that catch-22. - - // assign the legacy page back to the request - // handlers like default.aspx will want it and most macros currently need it - frequest.LegacyContentHashTable = new PublishedContentHashtableConverter(frequest, _userService); - return true; } /// - public void UpdateRequestToNotFound(PublishedRequest request) + public void UpdateRequestToNotFound(IPublishedRequest request) { // clear content var content = request.PublishedContent; @@ -232,12 +235,6 @@ namespace Umbraco.Web.Routing // to Mvc since Mvc can't do much either return; } - - // see note in PrepareRequest() - - // assign the legacy page back to the docrequest - // handlers like default.aspx will want it and most macros currently need it - request.LegacyContentHashTable = new PublishedContentHashtableConverter(request, _userService); } #endregion @@ -248,7 +245,7 @@ namespace Umbraco.Web.Routing /// Finds the site root (if any) matching the http request, and updates the PublishedRequest accordingly. /// /// A value indicating whether a domain was found. - internal bool FindDomain(PublishedRequest request) + internal bool FindDomain(IPublishedRequest request) { const string tracePrefix = "FindDomain: "; @@ -319,7 +316,7 @@ namespace Umbraco.Web.Routing /// /// Looks for wildcard domains in the path and updates Culture accordingly. /// - internal void HandleWildcardDomains(PublishedRequest request) + internal void HandleWildcardDomains(IPublishedRequest request) { const string tracePrefix = "HandleWildcardDomains: "; @@ -372,14 +369,14 @@ namespace Umbraco.Web.Routing /// public ITemplate GetTemplate(string alias) { - return _services.FileService.GetTemplate(alias); + return _fileService.GetTemplate(alias); } /// /// Finds the Umbraco document (if any) matching the request, and updates the PublishedRequest accordingly. /// /// A value indicating whether a document and template were found. - private void FindPublishedContentAndTemplate(PublishedRequest request) + private void FindPublishedContentAndTemplate(IPublishedRequest request) { _logger.Debug("FindPublishedContentAndTemplate: Path={UriAbsolutePath}", request.Uri.AbsolutePath); @@ -409,7 +406,7 @@ namespace Umbraco.Web.Routing /// Tries to find the document matching the request, by running the IPublishedContentFinder instances. /// /// There is no finder collection. - internal void FindPublishedContent(PublishedRequest request) + internal void FindPublishedContent(IPublishedRequest request) { const string tracePrefix = "FindPublishedContent: "; @@ -441,7 +438,7 @@ namespace Umbraco.Web.Routing /// Handles "not found", internal redirects, access validation... /// things that must be handled in one place because they can create loops /// - private void HandlePublishedContent(PublishedRequest request) + private void HandlePublishedContent(IPublishedRequest request) { // because these might loop, we have to have some sort of infinite loop detection int i = 0, j = 0; @@ -500,7 +497,7 @@ namespace Umbraco.Web.Routing /// Redirecting to a different site root and/or culture will not pick the new site root nor the new culture. /// As per legacy, if the redirect does not work, we just ignore it. /// - private bool FollowInternalRedirects(PublishedRequest request) + private bool FollowInternalRedirects(IPublishedRequest request) { if (request.PublishedContent == null) throw new InvalidOperationException("There is no PublishedContent."); @@ -512,7 +509,7 @@ namespace Umbraco.Web.Routing var redirect = false; var valid = false; IPublishedContent internalRedirectNode = null; - var internalRedirectId = request.PublishedContent.Value(Constants.Conventions.Content.InternalRedirectId, defaultValue: -1); + var internalRedirectId = request.PublishedContent.Value(_publishedValueFallback, Constants.Conventions.Content.InternalRedirectId, defaultValue: -1); if (internalRedirectId > 0) { @@ -522,7 +519,7 @@ namespace Umbraco.Web.Routing } else { - var udiInternalRedirectId = request.PublishedContent.Value(Constants.Conventions.Content.InternalRedirectId); + var udiInternalRedirectId = request.PublishedContent.Value(_publishedValueFallback, Constants.Conventions.Content.InternalRedirectId); if (udiInternalRedirectId != null) { // try and get the redirect node from a UDI Guid @@ -562,65 +559,41 @@ namespace Umbraco.Web.Routing /// Ensures that access to current node is permitted. /// /// Redirecting to a different site root and/or culture will not pick the new site root nor the new culture. - private void EnsurePublishedContentAccess(PublishedRequest request) + private void EnsurePublishedContentAccess(IPublishedRequest request) { if (request.PublishedContent == null) throw new InvalidOperationException("There is no PublishedContent."); var path = request.PublishedContent.Path; - var publicAccessAttempt = _services.PublicAccessService.IsProtected(path); + var publicAccessAttempt = _publicAccessService.IsProtected(path); if (publicAccessAttempt) { _logger.Debug("EnsurePublishedContentAccess: Page is protected, check for access"); - var membershipHelper = Current.Factory.GetInstance(); - - if (membershipHelper.IsLoggedIn() == false) + var status = _publicAccessChecker.HasMemberAccessToContent(request.PublishedContent.Id); + switch (status) { - _logger.Debug("EnsurePublishedContentAccess: Not logged in, redirect to login page"); - - var loginPageId = publicAccessAttempt.Result.LoginNodeId; - - if (loginPageId != request.PublishedContent.Id) - request.PublishedContent = request.UmbracoContext.PublishedSnapshot.Content.GetById(loginPageId); - } - else if (_services.PublicAccessService.HasAccess(request.PublishedContent.Id, _services.ContentService, membershipHelper.CurrentUserName, membershipHelper.GetCurrentUserRoles()) == false) - { - _logger.Debug("EnsurePublishedContentAccess: Current member has not access, redirect to error page"); - var errorPageId = publicAccessAttempt.Result.NoAccessNodeId; - if (errorPageId != request.PublishedContent.Id) - request.PublishedContent = request.UmbracoContext.PublishedSnapshot.Content.GetById(errorPageId); - } - else - { - // grab the current member - var member = membershipHelper.GetCurrentMember(); - // if the member has the "approved" and/or "locked out" properties, make sure they're correctly set before allowing access - var memberIsActive = true; - if (member != null) - { - if (member.HasProperty(Constants.Conventions.Member.IsApproved) == false) - memberIsActive = member.Value(Constants.Conventions.Member.IsApproved); - - if (member.HasProperty(Constants.Conventions.Member.IsLockedOut) == false) - memberIsActive = member.Value(Constants.Conventions.Member.IsLockedOut) == false; - } - - if (memberIsActive == false) - { - _logger.Debug( - "Current member is either unapproved or locked out, redirect to error page"); - var errorPageId = publicAccessAttempt.Result.NoAccessNodeId; - if (errorPageId != request.PublishedContent.Id) - request.PublishedContent = - request.UmbracoContext.PublishedSnapshot.Content.GetById(errorPageId); - } - else - { + case PublicAccessStatus.NotLoggedIn: + _logger.Debug("EnsurePublishedContentAccess: Not logged in, redirect to login page"); + SetPublishedContentAsOtherPage(request, publicAccessAttempt.Result.LoginNodeId); + break; + case PublicAccessStatus.AccessDenied: + _logger.Debug("EnsurePublishedContentAccess: Current member has not access, redirect to error page"); + SetPublishedContentAsOtherPage(request, publicAccessAttempt.Result.NoAccessNodeId); + break; + case PublicAccessStatus.LockedOut: + _logger.Debug("Current member is locked out, redirect to error page"); + SetPublishedContentAsOtherPage(request, publicAccessAttempt.Result.NoAccessNodeId); + break; + case PublicAccessStatus.NotApproved: + _logger.Debug("Current member is unapproved, redirect to error page"); + SetPublishedContentAsOtherPage(request, publicAccessAttempt.Result.NoAccessNodeId); + break; + case PublicAccessStatus.AccessAccepted: _logger.Debug("Current member has access"); - } + break; } } else @@ -629,10 +602,16 @@ namespace Umbraco.Web.Routing } } + private static void SetPublishedContentAsOtherPage(IPublishedRequest request, int errorPageId) + { + if (errorPageId != request.PublishedContent.Id) + request.PublishedContent = request.UmbracoContext.PublishedSnapshot.Content.GetById(errorPageId); + } + /// /// Finds a template for the current node, if any. /// - private void FindTemplate(PublishedRequest request) + private void FindTemplate(IPublishedRequest request) { // NOTE: at the moment there is only 1 way to find a template, and then ppl must // use the Prepared event to change the template if they wish. Should we also @@ -651,7 +630,7 @@ namespace Umbraco.Web.Routing var useAltTemplate = request.IsInitialPublishedContent || (_webRoutingSection.InternalRedirectPreservesTemplate && request.IsInternalRedirectPublishedContent); var altTemplate = useAltTemplate - ? request.UmbracoContext.HttpContext.Request[Constants.Conventions.Url.AltTemplate] + ? _requestAccessor.GetRequestValue(Constants.Conventions.Url.AltTemplate) : null; if (string.IsNullOrWhiteSpace(altTemplate)) @@ -662,7 +641,7 @@ namespace Umbraco.Web.Routing if (request.HasTemplate) { - _logger.Debug("FindTemplate: Has a template already, and no alternate template."); + _logger.Debug("FindTemplate: Has a template already, and no alternate template."); return; } @@ -688,10 +667,15 @@ namespace Umbraco.Web.Routing _logger.Debug("FindTemplate: Look for alternative template alias={AltTemplate}", altTemplate); // IsAllowedTemplate deals both with DisableAlternativeTemplates and ValidateAlternativeTemplates settings - if (request.PublishedContent.IsAllowedTemplate(altTemplate)) + if (request.PublishedContent.IsAllowedTemplate( + _fileService, + _contentTypeService, + _umbracoSettingsSection.WebRouting.DisableAlternativeTemplates, + _umbracoSettingsSection.WebRouting.ValidateAlternativeTemplates, + altTemplate)) { // allowed, use - var template = _services.FileService.GetTemplate(altTemplate); + var template = _fileService.GetTemplate(altTemplate); if (template != null) { @@ -745,7 +729,7 @@ namespace Umbraco.Web.Routing if (templateId == null) throw new InvalidOperationException("The template is not set, the page cannot render."); - var template = _services.FileService.GetTemplate(templateId.Value); + var template = _fileService.GetTemplate(templateId.Value); if (template == null) throw new InvalidOperationException("The template with Id " + templateId + " does not exist, the page cannot render."); _logger.Debug("GetTemplateModel: Got template id={TemplateId} alias={TemplateAlias}", template.Id, template.Alias); @@ -756,7 +740,7 @@ namespace Umbraco.Web.Routing /// Follows external redirection through umbracoRedirect document property. /// /// As per legacy, if the redirect does not work, we just ignore it. - private void FollowExternalRedirect(PublishedRequest request) + private void FollowExternalRedirect(IPublishedRequest request) { if (request.HasPublishedContent == false) return; @@ -764,18 +748,18 @@ namespace Umbraco.Web.Routing if (request.PublishedContent.HasProperty(Constants.Conventions.Content.Redirect) == false) return; - var redirectId = request.PublishedContent.Value(Constants.Conventions.Content.Redirect, defaultValue: -1); + var redirectId = request.PublishedContent.Value(_publishedValueFallback, Constants.Conventions.Content.Redirect, defaultValue: -1); var redirectUrl = "#"; if (redirectId > 0) { - redirectUrl = request.UmbracoContext.UrlProvider.GetUrl(redirectId); + redirectUrl = _publishedUrlProvider.GetUrl(redirectId); } else { // might be a UDI instead of an int Id - var redirectUdi = request.PublishedContent.Value(Constants.Conventions.Content.Redirect); + var redirectUdi = request.PublishedContent.Value(_publishedValueFallback, Constants.Conventions.Content.Redirect); if (redirectUdi != null) - redirectUrl = request.UmbracoContext.UrlProvider.GetUrl(redirectUdi.Guid); + redirectUrl = _publishedUrlProvider.GetUrl(redirectUdi.Guid); } if (redirectUrl != "#") request.SetRedirect(redirectUrl); diff --git a/src/Umbraco.Web/Routing/RoutableAttemptEventArgs.cs b/src/Umbraco.Core/Routing/RoutableAttemptEventArgs.cs similarity index 80% rename from src/Umbraco.Web/Routing/RoutableAttemptEventArgs.cs rename to src/Umbraco.Core/Routing/RoutableAttemptEventArgs.cs index 96b377b103..54ea98b3a4 100644 --- a/src/Umbraco.Web/Routing/RoutableAttemptEventArgs.cs +++ b/src/Umbraco.Core/Routing/RoutableAttemptEventArgs.cs @@ -9,8 +9,8 @@ namespace Umbraco.Web.Routing { public EnsureRoutableOutcome Outcome { get; private set; } - public RoutableAttemptEventArgs(EnsureRoutableOutcome reason, UmbracoContext umbracoContext, HttpContextBase httpContext) - : base(umbracoContext, httpContext) + public RoutableAttemptEventArgs(EnsureRoutableOutcome reason, IUmbracoContext umbracoContext) + : base(umbracoContext) { Outcome = reason; } diff --git a/src/Umbraco.Web/Routing/SiteDomainHelper.cs b/src/Umbraco.Core/Routing/SiteDomainHelper.cs similarity index 99% rename from src/Umbraco.Web/Routing/SiteDomainHelper.cs rename to src/Umbraco.Core/Routing/SiteDomainHelper.cs index 6173dfb43c..35475ae292 100644 --- a/src/Umbraco.Web/Routing/SiteDomainHelper.cs +++ b/src/Umbraco.Core/Routing/SiteDomainHelper.cs @@ -266,7 +266,7 @@ namespace Umbraco.Web.Routing return _qualifiedSites[current.Scheme] = _sites .ToDictionary( kvp => kvp.Key, - kvp => kvp.Value.Select(d => new Uri(UriUtility.StartWithScheme(d, current.Scheme)).GetLeftPart(UriPartial.Authority)).ToArray() + kvp => kvp.Value.Select(d => new Uri(UriUtilityCore.StartWithScheme(d, current.Scheme)).GetLeftPart(UriPartial.Authority)).ToArray() ); // .ToDictionary will evaluate and create the dictionary immediately diff --git a/src/Umbraco.Web/Routing/UmbracoRequestEventArgs.cs b/src/Umbraco.Core/Routing/UmbracoRequestEventArgs.cs similarity index 54% rename from src/Umbraco.Web/Routing/UmbracoRequestEventArgs.cs rename to src/Umbraco.Core/Routing/UmbracoRequestEventArgs.cs index 5b2be178fd..4430d9689f 100644 --- a/src/Umbraco.Web/Routing/UmbracoRequestEventArgs.cs +++ b/src/Umbraco.Core/Routing/UmbracoRequestEventArgs.cs @@ -8,13 +8,11 @@ namespace Umbraco.Web.Routing /// public class UmbracoRequestEventArgs : EventArgs { - public UmbracoContext UmbracoContext { get; private set; } - public HttpContextBase HttpContext { get; private set; } + public IUmbracoContext UmbracoContext { get; private set; } - public UmbracoRequestEventArgs(UmbracoContext umbracoContext, HttpContextBase httpContext) + public UmbracoRequestEventArgs(IUmbracoContext umbracoContext) { UmbracoContext = umbracoContext; - HttpContext = httpContext; } } } diff --git a/src/Umbraco.Web/UriUtility.cs b/src/Umbraco.Core/Routing/UriUtility.cs similarity index 71% rename from src/Umbraco.Web/UriUtility.cs rename to src/Umbraco.Core/Routing/UriUtility.cs index 9e94a4a20a..11bb1dabfb 100644 --- a/src/Umbraco.Web/UriUtility.cs +++ b/src/Umbraco.Core/Routing/UriUtility.cs @@ -4,21 +4,22 @@ using System.Web; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Hosting; namespace Umbraco.Web { - public static class UriUtility + public sealed class UriUtility { static string _appPath; static string _appPathPrefix; - static UriUtility() + public UriUtility(IHostingEnvironment hostingEnvironment) { - ResetAppDomainAppVirtualPath(); + ResetAppDomainAppVirtualPath(hostingEnvironment); } // internal for unit testing only - internal static void SetAppDomainAppVirtualPath(string appPath) + internal void SetAppDomainAppVirtualPath(string appPath) { _appPath = appPath ?? "/"; _appPathPrefix = _appPath; @@ -26,20 +27,20 @@ namespace Umbraco.Web _appPathPrefix = String.Empty; } - internal static void ResetAppDomainAppVirtualPath() + internal void ResetAppDomainAppVirtualPath(IHostingEnvironment hostingEnvironment) { - SetAppDomainAppVirtualPath(HttpRuntime.AppDomainAppVirtualPath); + SetAppDomainAppVirtualPath(hostingEnvironment.ApplicationVirtualPath); } // will be "/" or "/foo" - public static string AppPath => _appPath; + public string AppPath => _appPath; // will be "" or "/foo" - public static string AppPathPrefix => _appPathPrefix; + public string AppPathPrefix => _appPathPrefix; // adds the virtual directory if any // see also VirtualPathUtility.ToAbsolute - public static string ToAbsolute(string url) + public string ToAbsolute(string url) { //return ResolveUrl(url); url = url.TrimStart('~'); @@ -48,7 +49,7 @@ namespace Umbraco.Web // strips the virtual directory if any // see also VirtualPathUtility.ToAppRelative - public static string ToAppRelative(string virtualPath) + public string ToAppRelative(string virtualPath) { if (virtualPath.InvariantStartsWith(_appPathPrefix) && (virtualPath.Length == _appPathPrefix.Length || virtualPath[_appPathPrefix.Length] == '/')) @@ -60,7 +61,7 @@ namespace Umbraco.Web // maps an internal umbraco uri to a public uri // ie with virtual directory, .aspx if required... - public static Uri UriFromUmbraco(Uri uri, IGlobalSettings globalSettings, IRequestHandlerSection requestConfig) + public Uri UriFromUmbraco(Uri uri, IGlobalSettings globalSettings, IRequestHandlerSection requestConfig) { var path = uri.GetSafeAbsolutePath(); @@ -74,7 +75,7 @@ namespace Umbraco.Web // maps a media umbraco uri to a public uri // ie with virtual directory - that is all for media - public static Uri MediaUriFromUmbraco(Uri uri) + public Uri MediaUriFromUmbraco(Uri uri) { var path = uri.GetSafeAbsolutePath(); path = ToAbsolute(path); @@ -83,7 +84,7 @@ namespace Umbraco.Web // maps a public uri to an internal umbraco uri // ie no virtual directory, no .aspx, lowercase... - public static Uri UriToUmbraco(Uri uri) + public Uri UriToUmbraco(Uri uri) { // note: no need to decode uri here because we're returning a uri // so it will be re-encoded anyway @@ -120,7 +121,7 @@ namespace Umbraco.Web // ResolveUrl("page2.aspx") returns "/page2.aspx" // Page.ResolveUrl("page2.aspx") returns "/sub/page2.aspx" (relative...) // - public static string ResolveUrl(string relativeUrl) + public string ResolveUrl(string relativeUrl) { if (relativeUrl == null) throw new ArgumentNullException("relativeUrl"); @@ -177,74 +178,27 @@ namespace Umbraco.Web #endregion - #region Uri string utilities - - public static bool HasScheme(string uri) - { - return uri.IndexOf("://") > 0; - } - - public static string StartWithScheme(string uri) - { - return StartWithScheme(uri, null); - } - - public static string StartWithScheme(string uri, string scheme) - { - return HasScheme(uri) ? uri : String.Format("{0}://{1}", scheme ?? Uri.UriSchemeHttp, uri); - } - - public static string EndPathWithSlash(string uri) - { - var pos1 = Math.Max(0, uri.IndexOf('?')); - var pos2 = Math.Max(0, uri.IndexOf('#')); - var pos = Math.Min(pos1, pos2); - - var path = pos > 0 ? uri.Substring(0, pos) : uri; - path = path.EnsureEndsWith('/'); - - if (pos > 0) - path += uri.Substring(pos); - - return path; - } - - public static string TrimPathEndSlash(string uri) - { - var pos1 = Math.Max(0, uri.IndexOf('?')); - var pos2 = Math.Max(0, uri.IndexOf('#')); - var pos = Math.Min(pos1, pos2); - - var path = pos > 0 ? uri.Substring(0, pos) : uri; - path = path.TrimEnd('/'); - - if (pos > 0) - path += uri.Substring(pos); - - return path; - } - - #endregion /// /// Returns an full url with the host, port, etc... /// /// An absolute path (i.e. starts with a '/' ) - /// + /// /// /// /// Based on http://stackoverflow.com/questions/3681052/get-absolute-url-from-relative-path-refactored-method /// - internal static Uri ToFullUrl(string absolutePath, HttpContextBase httpContext) + internal Uri ToFullUrl(string absolutePath, Uri curentRequestUrl) { - if (httpContext == null) throw new ArgumentNullException("httpContext"); if (string.IsNullOrEmpty(absolutePath)) - throw new ArgumentNullException("absolutePath"); + throw new ArgumentNullException(nameof(absolutePath)); if (!absolutePath.StartsWith("/")) throw new FormatException("The absolutePath specified does not start with a '/'"); - return new Uri(absolutePath, UriKind.Relative).MakeAbsolute(httpContext.Request.Url); + return new Uri(absolutePath, UriKind.Relative).MakeAbsolute(curentRequestUrl); } + + } } diff --git a/src/Umbraco.Infrastructure/Routing/UrlInfo.cs b/src/Umbraco.Core/Routing/UrlInfo.cs similarity index 100% rename from src/Umbraco.Infrastructure/Routing/UrlInfo.cs rename to src/Umbraco.Core/Routing/UrlInfo.cs diff --git a/src/Umbraco.Web/Routing/UrlProvider.cs b/src/Umbraco.Core/Routing/UrlProvider.cs similarity index 79% rename from src/Umbraco.Web/Routing/UrlProvider.cs rename to src/Umbraco.Core/Routing/UrlProvider.cs index d42639b781..80169e54e2 100644 --- a/src/Umbraco.Web/Routing/UrlProvider.cs +++ b/src/Umbraco.Core/Routing/UrlProvider.cs @@ -4,30 +4,31 @@ using System.Linq; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Web.Composing; namespace Umbraco.Web.Routing { + /// /// Provides urls. /// - public class UrlProvider + public class UrlProvider : IPublishedUrlProvider { #region Ctor and configuration /// /// Initializes a new instance of the class with an Umbraco context and a list of url providers. /// - /// The Umbraco context. + /// The Umbraco context accessor. /// Routing settings. /// The list of url providers. /// The list of media url providers. /// The current variation accessor. - public UrlProvider(UmbracoContext umbracoContext, IWebRoutingSection routingSettings, IEnumerable urlProviders, IEnumerable mediaUrlProviders, IVariationContextAccessor variationContextAccessor) + /// + public UrlProvider(IUmbracoContextAccessor umbracoContextAccessor, IWebRoutingSection routingSettings, UrlProviderCollection urlProviders, MediaUrlProviderCollection mediaUrlProviders, IVariationContextAccessor variationContextAccessor) { if (routingSettings == null) throw new ArgumentNullException(nameof(routingSettings)); - _umbracoContext = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext)); + _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _urlProviders = urlProviders; _mediaUrlProviders = mediaUrlProviders; _variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); @@ -40,25 +41,8 @@ namespace Umbraco.Web.Routing } } - /// - /// Initializes a new instance of the class with an Umbraco context and a list of url providers. - /// - /// The Umbraco context. - /// The list of url providers. - /// The list of media url providers - /// The current variation accessor. - /// An optional provider mode. - public UrlProvider(UmbracoContext umbracoContext, IEnumerable urlProviders, IEnumerable mediaUrlProviders, IVariationContextAccessor variationContextAccessor, UrlMode mode = UrlMode.Auto) - { - _umbracoContext = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext)); - _urlProviders = urlProviders; - _mediaUrlProviders = mediaUrlProviders; - _variationContextAccessor = variationContextAccessor; - Mode = mode; - } - - private readonly UmbracoContext _umbracoContext; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly IEnumerable _urlProviders; private readonly IEnumerable _mediaUrlProviders; private readonly IVariationContextAccessor _variationContextAccessor; @@ -72,10 +56,9 @@ namespace Umbraco.Web.Routing #region GetUrl - private UrlMode GetMode(bool absolute) => absolute ? UrlMode.Absolute : Mode; - private IPublishedContent GetDocument(int id) => _umbracoContext.Content.GetById(id); - private IPublishedContent GetDocument(Guid id) => _umbracoContext.Content.GetById(id); - private IPublishedContent GetMedia(Guid id) => _umbracoContext.Media.GetById(id); + private IPublishedContent GetDocument(int id) => _umbracoContextAccessor.UmbracoContext.Content.GetById(id); + private IPublishedContent GetDocument(Guid id) => _umbracoContextAccessor.UmbracoContext.Content.GetById(id); + private IPublishedContent GetMedia(Guid id) => _umbracoContextAccessor.UmbracoContext.Media.GetById(id); /// /// Gets the url of a published content. @@ -131,19 +114,19 @@ namespace Umbraco.Web.Routing } if (current == null) - current = _umbracoContext.CleanedUmbracoUrl; + current = _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl; - var url = _urlProviders.Select(provider => provider.GetUrl(_umbracoContext, content, mode, culture, current)) + var url = _urlProviders.Select(provider => provider.GetUrl(content, mode, culture, current)) .FirstOrDefault(u => u != null); return url?.Text ?? "#"; // legacy wants this } - internal string GetUrlFromRoute(int id, string route, string culture) + public string GetUrlFromRoute(int id, string route, string culture) { var provider = _urlProviders.OfType().FirstOrDefault(); var url = provider == null ? route // what else? - : provider.GetUrlFromRoute(route, Current.UmbracoContext, id, _umbracoContext.CleanedUmbracoUrl, Mode, culture)?.Text; + : provider.GetUrlFromRoute(route, _umbracoContextAccessor.UmbracoContext, id, _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl, Mode, culture)?.Text; return url ?? "#"; } @@ -163,7 +146,7 @@ namespace Umbraco.Web.Routing /// public IEnumerable GetOtherUrls(int id) { - return GetOtherUrls(id, _umbracoContext.CleanedUmbracoUrl); + return GetOtherUrls(id, _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl); } /// @@ -178,7 +161,7 @@ namespace Umbraco.Web.Routing /// public IEnumerable GetOtherUrls(int id, Uri current) { - return _urlProviders.SelectMany(provider => provider.GetOtherUrls(_umbracoContext, id, current) ?? Enumerable.Empty()); + return _urlProviders.SelectMany(provider => provider.GetOtherUrls(id, current) ?? Enumerable.Empty()); } #endregion @@ -232,10 +215,10 @@ namespace Umbraco.Web.Routing } if (current == null) - current = _umbracoContext.CleanedUmbracoUrl; + current = _umbracoContextAccessor.UmbracoContext.CleanedUmbracoUrl; var url = _mediaUrlProviders.Select(provider => - provider.GetMediaUrl(_umbracoContext, content, propertyAlias, mode, culture, current)) + provider.GetMediaUrl(content, propertyAlias, mode, culture, current)) .FirstOrDefault(u => u != null); return url?.Text ?? ""; diff --git a/src/Umbraco.Web/Routing/UrlProviderCollection.cs b/src/Umbraco.Core/Routing/UrlProviderCollection.cs similarity index 100% rename from src/Umbraco.Web/Routing/UrlProviderCollection.cs rename to src/Umbraco.Core/Routing/UrlProviderCollection.cs diff --git a/src/Umbraco.Web/Routing/UrlProviderCollectionBuilder.cs b/src/Umbraco.Core/Routing/UrlProviderCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Web/Routing/UrlProviderCollectionBuilder.cs rename to src/Umbraco.Core/Routing/UrlProviderCollectionBuilder.cs diff --git a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs b/src/Umbraco.Core/Routing/UrlProviderExtensions.cs similarity index 88% rename from src/Umbraco.Web/Routing/UrlProviderExtensions.cs rename to src/Umbraco.Core/Routing/UrlProviderExtensions.cs index 9a0579daa1..a7f8a97c6d 100644 --- a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs +++ b/src/Umbraco.Core/Routing/UrlProviderExtensions.cs @@ -20,12 +20,14 @@ namespace Umbraco.Web.Routing /// public static IEnumerable GetContentUrls(this IContent content, IPublishedRouter publishedRouter, - UmbracoContext umbracoContext, + IUmbracoContext umbracoContext, ILocalizationService localizationService, ILocalizedTextService textService, IContentService contentService, IVariationContextAccessor variationContextAccessor, - ILogger logger) + ILogger logger, + UriUtility uriUtility, + IPublishedUrlProvider publishedUrlProvider) { if (content == null) throw new ArgumentNullException(nameof(content)); if (publishedRouter == null) throw new ArgumentNullException(nameof(publishedRouter)); @@ -34,6 +36,8 @@ namespace Umbraco.Web.Routing if (textService == null) throw new ArgumentNullException(nameof(textService)); if (contentService == null) throw new ArgumentNullException(nameof(contentService)); if (logger == null) throw new ArgumentNullException(nameof(logger)); + if (publishedUrlProvider == null) throw new ArgumentNullException(nameof(publishedUrlProvider)); + if (uriUtility == null) throw new ArgumentNullException(nameof(uriUtility)); if (variationContextAccessor == null) throw new ArgumentNullException(nameof(variationContextAccessor)); if (content.Published == false) @@ -59,7 +63,7 @@ namespace Umbraco.Web.Routing //get all URLs for all cultures //in a HashSet, so de-duplicates too - foreach (var cultureUrl in GetContentUrlsByCulture(content, cultures, publishedRouter, umbracoContext, contentService, textService, variationContextAccessor, logger)) + foreach (var cultureUrl in GetContentUrlsByCulture(content, cultures, publishedRouter, umbracoContext, contentService, textService, variationContextAccessor, logger, uriUtility, publishedUrlProvider)) { urls.Add(cultureUrl); } @@ -77,7 +81,7 @@ namespace Umbraco.Web.Routing // get the 'other' urls - ie not what you'd get with GetUrl() but urls that would route to the document, nevertheless. // for these 'other' urls, we don't check whether they are routable, collide, anything - we just report them. - foreach (var otherUrl in umbracoContext.UrlProvider.GetOtherUrls(content.Id).OrderBy(x => x.Text).ThenBy(x => x.Culture)) + foreach (var otherUrl in publishedUrlProvider.GetOtherUrls(content.Id).OrderBy(x => x.Text).ThenBy(x => x.Culture)) if (urls.Add(otherUrl)) //avoid duplicates yield return otherUrl; } @@ -96,11 +100,13 @@ namespace Umbraco.Web.Routing private static IEnumerable GetContentUrlsByCulture(IContent content, IEnumerable cultures, IPublishedRouter publishedRouter, - UmbracoContext umbracoContext, + IUmbracoContext umbracoContext, IContentService contentService, ILocalizedTextService textService, IVariationContextAccessor variationContextAccessor, - ILogger logger) + ILogger logger, + UriUtility uriUtility, + IPublishedUrlProvider publishedUrlProvider) { foreach (var culture in cultures) { @@ -113,7 +119,7 @@ namespace Umbraco.Web.Routing string url; try { - url = umbracoContext.UrlProvider.GetUrl(content.Id, culture: culture); + url = publishedUrlProvider.GetUrl(content.Id, culture: culture); } catch (Exception ex) { @@ -135,7 +141,7 @@ namespace Umbraco.Web.Routing // got a url, deal with collisions, add url default: - if (DetectCollision(content, url, culture, umbracoContext, publishedRouter, textService, variationContextAccessor, out var urlInfo)) // detect collisions, etc + if (DetectCollision(content, url, culture, umbracoContext, publishedRouter, textService, variationContextAccessor, uriUtility, out var urlInfo)) // detect collisions, etc yield return urlInfo; else yield return UrlInfo.Url(url, culture); @@ -165,12 +171,12 @@ namespace Umbraco.Web.Routing return UrlInfo.Message(textService.Localize("content/parentCultureNotPublished", new[] {parent.Name}), culture); } - private static bool DetectCollision(IContent content, string url, string culture, UmbracoContext umbracoContext, IPublishedRouter publishedRouter, ILocalizedTextService textService, IVariationContextAccessor variationContextAccessor, out UrlInfo urlInfo) + private static bool DetectCollision(IContent content, string url, string culture, IUmbracoContext umbracoContext, IPublishedRouter publishedRouter, ILocalizedTextService textService, IVariationContextAccessor variationContextAccessor, UriUtility uriUtility, out UrlInfo urlInfo) { // test for collisions on the 'main' url var uri = new Uri(url.TrimEnd('/'), UriKind.RelativeOrAbsolute); if (uri.IsAbsoluteUri == false) uri = uri.MakeAbsolute(umbracoContext.CleanedUmbracoUrl); - uri = UriUtility.UriToUmbraco(uri); + uri = uriUtility.UriToUmbraco(uri); var pcr = publishedRouter.CreateRequest(umbracoContext, uri); publishedRouter.TryRouteRequest(pcr); diff --git a/src/Umbraco.Abstractions/Runtime/IMainDom.cs b/src/Umbraco.Core/Runtime/IMainDom.cs similarity index 100% rename from src/Umbraco.Abstractions/Runtime/IMainDom.cs rename to src/Umbraco.Core/Runtime/IMainDom.cs diff --git a/src/Umbraco.Abstractions/Runtime/IMainDomLock.cs b/src/Umbraco.Core/Runtime/IMainDomLock.cs similarity index 100% rename from src/Umbraco.Abstractions/Runtime/IMainDomLock.cs rename to src/Umbraco.Core/Runtime/IMainDomLock.cs diff --git a/src/Umbraco.Abstractions/Runtime/IUmbracoBootPermissionChecker.cs b/src/Umbraco.Core/Runtime/IUmbracoBootPermissionChecker.cs similarity index 100% rename from src/Umbraco.Abstractions/Runtime/IUmbracoBootPermissionChecker.cs rename to src/Umbraco.Core/Runtime/IUmbracoBootPermissionChecker.cs diff --git a/src/Umbraco.Abstractions/Runtime/MainDom.cs b/src/Umbraco.Core/Runtime/MainDom.cs similarity index 100% rename from src/Umbraco.Abstractions/Runtime/MainDom.cs rename to src/Umbraco.Core/Runtime/MainDom.cs diff --git a/src/Umbraco.Abstractions/RuntimeLevel.cs b/src/Umbraco.Core/RuntimeLevel.cs similarity index 100% rename from src/Umbraco.Abstractions/RuntimeLevel.cs rename to src/Umbraco.Core/RuntimeLevel.cs diff --git a/src/Umbraco.Abstractions/RuntimeLevelReason.cs b/src/Umbraco.Core/RuntimeLevelReason.cs similarity index 100% rename from src/Umbraco.Abstractions/RuntimeLevelReason.cs rename to src/Umbraco.Core/RuntimeLevelReason.cs diff --git a/src/Umbraco.Abstractions/SafeCallContext.cs b/src/Umbraco.Core/SafeCallContext.cs similarity index 100% rename from src/Umbraco.Abstractions/SafeCallContext.cs rename to src/Umbraco.Core/SafeCallContext.cs diff --git a/src/Umbraco.Abstractions/Scheduling/BackgroundTaskRunnerOptions.cs b/src/Umbraco.Core/Scheduling/BackgroundTaskRunnerOptions.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/BackgroundTaskRunnerOptions.cs rename to src/Umbraco.Core/Scheduling/BackgroundTaskRunnerOptions.cs diff --git a/src/Umbraco.Abstractions/Scheduling/IBackgroundTask.cs b/src/Umbraco.Core/Scheduling/IBackgroundTask.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/IBackgroundTask.cs rename to src/Umbraco.Core/Scheduling/IBackgroundTask.cs diff --git a/src/Umbraco.Abstractions/Scheduling/IBackgroundTaskRunner.cs b/src/Umbraco.Core/Scheduling/IBackgroundTaskRunner.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/IBackgroundTaskRunner.cs rename to src/Umbraco.Core/Scheduling/IBackgroundTaskRunner.cs diff --git a/src/Umbraco.Abstractions/Scheduling/ILatchedBackgroundTask.cs b/src/Umbraco.Core/Scheduling/ILatchedBackgroundTask.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/ILatchedBackgroundTask.cs rename to src/Umbraco.Core/Scheduling/ILatchedBackgroundTask.cs diff --git a/src/Umbraco.Abstractions/Scheduling/KeepAlive.cs b/src/Umbraco.Core/Scheduling/KeepAlive.cs similarity index 98% rename from src/Umbraco.Abstractions/Scheduling/KeepAlive.cs rename to src/Umbraco.Core/Scheduling/KeepAlive.cs index d1d9352ed6..c677c66b83 100644 --- a/src/Umbraco.Abstractions/Scheduling/KeepAlive.cs +++ b/src/Umbraco.Core/Scheduling/KeepAlive.cs @@ -9,7 +9,7 @@ using Umbraco.Core.Sync; namespace Umbraco.Web.Scheduling { - internal class KeepAlive : RecurringTaskBase + public class KeepAlive : RecurringTaskBase { private readonly IRuntimeState _runtime; private readonly IKeepAliveSection _keepAliveSection; diff --git a/src/Umbraco.Abstractions/Scheduling/LatchedBackgroundTaskBase.cs b/src/Umbraco.Core/Scheduling/LatchedBackgroundTaskBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/LatchedBackgroundTaskBase.cs rename to src/Umbraco.Core/Scheduling/LatchedBackgroundTaskBase.cs diff --git a/src/Umbraco.Abstractions/Scheduling/RecurringTaskBase.cs b/src/Umbraco.Core/Scheduling/RecurringTaskBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/RecurringTaskBase.cs rename to src/Umbraco.Core/Scheduling/RecurringTaskBase.cs diff --git a/src/Umbraco.Abstractions/Scheduling/TaskAndFactoryExtensions.cs b/src/Umbraco.Core/Scheduling/TaskAndFactoryExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/TaskAndFactoryExtensions.cs rename to src/Umbraco.Core/Scheduling/TaskAndFactoryExtensions.cs diff --git a/src/Umbraco.Abstractions/Scheduling/TaskEventArgs.cs b/src/Umbraco.Core/Scheduling/TaskEventArgs.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/TaskEventArgs.cs rename to src/Umbraco.Core/Scheduling/TaskEventArgs.cs diff --git a/src/Umbraco.Abstractions/Scheduling/TempFileCleanup.cs b/src/Umbraco.Core/Scheduling/TempFileCleanup.cs similarity index 97% rename from src/Umbraco.Abstractions/Scheduling/TempFileCleanup.cs rename to src/Umbraco.Core/Scheduling/TempFileCleanup.cs index 5d28bbfdb1..aefaf605db 100644 --- a/src/Umbraco.Abstractions/Scheduling/TempFileCleanup.cs +++ b/src/Umbraco.Core/Scheduling/TempFileCleanup.cs @@ -10,7 +10,7 @@ namespace Umbraco.Web.Scheduling /// /// Used to cleanup temporary file locations /// - internal class TempFileCleanup : RecurringTaskBase + public class TempFileCleanup : RecurringTaskBase { private readonly DirectoryInfo[] _tempFolders; private readonly TimeSpan _age; diff --git a/src/Umbraco.Abstractions/Scheduling/ThreadingTaskImmutable.cs b/src/Umbraco.Core/Scheduling/ThreadingTaskImmutable.cs similarity index 100% rename from src/Umbraco.Abstractions/Scheduling/ThreadingTaskImmutable.cs rename to src/Umbraco.Core/Scheduling/ThreadingTaskImmutable.cs diff --git a/src/Umbraco.Infrastructure/Scoping/CallContext.cs b/src/Umbraco.Core/Scoping/CallContext.cs similarity index 100% rename from src/Umbraco.Infrastructure/Scoping/CallContext.cs rename to src/Umbraco.Core/Scoping/CallContext.cs diff --git a/src/Umbraco.Abstractions/Scoping/IInstanceIdentifiable.cs b/src/Umbraco.Core/Scoping/IInstanceIdentifiable.cs similarity index 100% rename from src/Umbraco.Abstractions/Scoping/IInstanceIdentifiable.cs rename to src/Umbraco.Core/Scoping/IInstanceIdentifiable.cs diff --git a/src/Umbraco.Abstractions/Scoping/IScopeContext.cs b/src/Umbraco.Core/Scoping/IScopeContext.cs similarity index 100% rename from src/Umbraco.Abstractions/Scoping/IScopeContext.cs rename to src/Umbraco.Core/Scoping/IScopeContext.cs diff --git a/src/Umbraco.Abstractions/Search/SearchableTreeAttribute.cs b/src/Umbraco.Core/Search/SearchableTreeAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Search/SearchableTreeAttribute.cs rename to src/Umbraco.Core/Search/SearchableTreeAttribute.cs diff --git a/src/Umbraco.Abstractions/Sections/ContentSection.cs b/src/Umbraco.Core/Sections/ContentSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/ContentSection.cs rename to src/Umbraco.Core/Sections/ContentSection.cs diff --git a/src/Umbraco.Abstractions/Sections/FormsSection.cs b/src/Umbraco.Core/Sections/FormsSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/FormsSection.cs rename to src/Umbraco.Core/Sections/FormsSection.cs diff --git a/src/Umbraco.Abstractions/Sections/ISection.cs b/src/Umbraco.Core/Sections/ISection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/ISection.cs rename to src/Umbraco.Core/Sections/ISection.cs diff --git a/src/Umbraco.Abstractions/Sections/MediaSection.cs b/src/Umbraco.Core/Sections/MediaSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/MediaSection.cs rename to src/Umbraco.Core/Sections/MediaSection.cs diff --git a/src/Umbraco.Abstractions/Sections/MembersSection.cs b/src/Umbraco.Core/Sections/MembersSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/MembersSection.cs rename to src/Umbraco.Core/Sections/MembersSection.cs diff --git a/src/Umbraco.Abstractions/Sections/PackagesSection.cs b/src/Umbraco.Core/Sections/PackagesSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/PackagesSection.cs rename to src/Umbraco.Core/Sections/PackagesSection.cs diff --git a/src/Umbraco.Abstractions/Sections/SectionCollection.cs b/src/Umbraco.Core/Sections/SectionCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/SectionCollection.cs rename to src/Umbraco.Core/Sections/SectionCollection.cs diff --git a/src/Umbraco.Abstractions/Sections/SectionCollectionBuilder.cs b/src/Umbraco.Core/Sections/SectionCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/SectionCollectionBuilder.cs rename to src/Umbraco.Core/Sections/SectionCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Sections/SettingsSection.cs b/src/Umbraco.Core/Sections/SettingsSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/SettingsSection.cs rename to src/Umbraco.Core/Sections/SettingsSection.cs diff --git a/src/Umbraco.Abstractions/Sections/TranslationSection.cs b/src/Umbraco.Core/Sections/TranslationSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/TranslationSection.cs rename to src/Umbraco.Core/Sections/TranslationSection.cs diff --git a/src/Umbraco.Abstractions/Sections/UsersSection.cs b/src/Umbraco.Core/Sections/UsersSection.cs similarity index 100% rename from src/Umbraco.Abstractions/Sections/UsersSection.cs rename to src/Umbraco.Core/Sections/UsersSection.cs diff --git a/src/Umbraco.Core/Security/IMemberUserKeyProvider.cs b/src/Umbraco.Core/Security/IMemberUserKeyProvider.cs new file mode 100644 index 0000000000..439e7a82b8 --- /dev/null +++ b/src/Umbraco.Core/Security/IMemberUserKeyProvider.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Security +{ + public interface IMemberUserKeyProvider + { + object GetMemberProviderUserKey(); + } +} diff --git a/src/Umbraco.Abstractions/Security/IPasswordHasher.cs b/src/Umbraco.Core/Security/IPasswordHasher.cs similarity index 100% rename from src/Umbraco.Abstractions/Security/IPasswordHasher.cs rename to src/Umbraco.Core/Security/IPasswordHasher.cs diff --git a/src/Umbraco.Core/Security/IPublicAccessChecker.cs b/src/Umbraco.Core/Security/IPublicAccessChecker.cs new file mode 100644 index 0000000000..a47186394e --- /dev/null +++ b/src/Umbraco.Core/Security/IPublicAccessChecker.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Web.Security +{ + public interface IPublicAccessChecker + { + PublicAccessStatus HasMemberAccessToContent(int publishedContentId); + } +} diff --git a/src/Umbraco.Core/Security/IWebSecurity.cs b/src/Umbraco.Core/Security/IWebSecurity.cs new file mode 100644 index 0000000000..0822b5cb69 --- /dev/null +++ b/src/Umbraco.Core/Security/IWebSecurity.cs @@ -0,0 +1,62 @@ +using System; +using Umbraco.Core; +using Umbraco.Core.Models.Membership; + +namespace Umbraco.Web.Security +{ + public interface IWebSecurity + { + /// + /// Gets the current user. + /// + /// The current user. + IUser CurrentUser { get; } + + [Obsolete("This needs to be removed, ASP.NET Identity should always be used for this operation, this is currently only used in the installer which needs to be updated")] + double PerformLogin(int userId); + + [Obsolete("This needs to be removed, ASP.NET Identity should always be used for this operation, this is currently only used in the installer which needs to be updated")] + void ClearCurrentLogin(); + + /// + /// Gets the current user's id. + /// + /// + Attempt GetUserId(); + + /// + /// Validates the currently logged in user and ensures they are not timed out + /// + /// + bool ValidateCurrentUser(); + + /// + /// Validates the current user assigned to the request and ensures the stored user data is valid + /// + /// set to true if you want exceptions to be thrown if failed + /// If true requires that the user is approved to be validated + /// + ValidateRequestAttempt ValidateCurrentUser(bool throwExceptions, bool requiresApproval = true); + + /// + /// Authorizes the full request, checks for SSL and validates the current user + /// + /// set to true if you want exceptions to be thrown if failed + /// + ValidateRequestAttempt AuthorizeRequest(bool throwExceptions = false); + + /// + /// Checks if the specified user as access to the app + /// + /// + /// + /// + bool UserHasSectionAccess(string section, IUser user); + + /// + /// Ensures that a back office user is logged in + /// + /// + bool IsAuthenticated(); + } +} diff --git a/src/Umbraco.Abstractions/Security/PasswordGenerator.cs b/src/Umbraco.Core/Security/PasswordGenerator.cs similarity index 100% rename from src/Umbraco.Abstractions/Security/PasswordGenerator.cs rename to src/Umbraco.Core/Security/PasswordGenerator.cs diff --git a/src/Umbraco.Core/Security/PublicAccessStatus.cs b/src/Umbraco.Core/Security/PublicAccessStatus.cs new file mode 100644 index 0000000000..57df423749 --- /dev/null +++ b/src/Umbraco.Core/Security/PublicAccessStatus.cs @@ -0,0 +1,11 @@ +namespace Umbraco.Web.Security +{ + public enum PublicAccessStatus + { + NotLoggedIn, + AccessDenied, + NotApproved, + LockedOut, + AccessAccepted + } +} diff --git a/src/Umbraco.Web/Security/ValidateRequestAttempt.cs b/src/Umbraco.Core/Security/ValidateRequestAttempt.cs similarity index 100% rename from src/Umbraco.Web/Security/ValidateRequestAttempt.cs rename to src/Umbraco.Core/Security/ValidateRequestAttempt.cs diff --git a/src/Umbraco.Abstractions/SemVersionExtensions.cs b/src/Umbraco.Core/SemVersionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/SemVersionExtensions.cs rename to src/Umbraco.Core/SemVersionExtensions.cs diff --git a/src/Umbraco.Abstractions/Semver/Semver.cs b/src/Umbraco.Core/Semver/Semver.cs similarity index 100% rename from src/Umbraco.Abstractions/Semver/Semver.cs rename to src/Umbraco.Core/Semver/Semver.cs diff --git a/src/Umbraco.Abstractions/Serialization/IJsonSerializer.cs b/src/Umbraco.Core/Serialization/IJsonSerializer.cs similarity index 100% rename from src/Umbraco.Abstractions/Serialization/IJsonSerializer.cs rename to src/Umbraco.Core/Serialization/IJsonSerializer.cs diff --git a/src/Umbraco.Abstractions/ServiceContextExtensions.cs b/src/Umbraco.Core/ServiceContextExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ServiceContextExtensions.cs rename to src/Umbraco.Core/ServiceContextExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/ContentTypeChange.cs b/src/Umbraco.Core/Services/Changes/ContentTypeChange.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/ContentTypeChange.cs rename to src/Umbraco.Core/Services/Changes/ContentTypeChange.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/ContentTypeChangeExtensions.cs b/src/Umbraco.Core/Services/Changes/ContentTypeChangeExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/ContentTypeChangeExtensions.cs rename to src/Umbraco.Core/Services/Changes/ContentTypeChangeExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/ContentTypeChangeTypes.cs b/src/Umbraco.Core/Services/Changes/ContentTypeChangeTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/ContentTypeChangeTypes.cs rename to src/Umbraco.Core/Services/Changes/ContentTypeChangeTypes.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/DomainChangeTypes.cs b/src/Umbraco.Core/Services/Changes/DomainChangeTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/DomainChangeTypes.cs rename to src/Umbraco.Core/Services/Changes/DomainChangeTypes.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/TreeChange.cs b/src/Umbraco.Core/Services/Changes/TreeChange.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/TreeChange.cs rename to src/Umbraco.Core/Services/Changes/TreeChange.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/TreeChangeExtensions.cs b/src/Umbraco.Core/Services/Changes/TreeChangeExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/TreeChangeExtensions.cs rename to src/Umbraco.Core/Services/Changes/TreeChangeExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/Changes/TreeChangeTypes.cs b/src/Umbraco.Core/Services/Changes/TreeChangeTypes.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Changes/TreeChangeTypes.cs rename to src/Umbraco.Core/Services/Changes/TreeChangeTypes.cs diff --git a/src/Umbraco.Abstractions/Services/ContentServiceExtensions.cs b/src/Umbraco.Core/Services/ContentServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ContentServiceExtensions.cs rename to src/Umbraco.Core/Services/ContentServiceExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/ContentTypeServiceExtensions.cs b/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ContentTypeServiceExtensions.cs rename to src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/DateTypeServiceExtensions.cs b/src/Umbraco.Core/Services/DateTypeServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/DateTypeServiceExtensions.cs rename to src/Umbraco.Core/Services/DateTypeServiceExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/IAuditService.cs b/src/Umbraco.Core/Services/IAuditService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IAuditService.cs rename to src/Umbraco.Core/Services/IAuditService.cs diff --git a/src/Umbraco.Abstractions/Services/IConsentService.cs b/src/Umbraco.Core/Services/IConsentService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IConsentService.cs rename to src/Umbraco.Core/Services/IConsentService.cs diff --git a/src/Umbraco.Abstractions/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IContentService.cs rename to src/Umbraco.Core/Services/IContentService.cs diff --git a/src/Umbraco.Abstractions/Services/IContentServiceBase.cs b/src/Umbraco.Core/Services/IContentServiceBase.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IContentServiceBase.cs rename to src/Umbraco.Core/Services/IContentServiceBase.cs diff --git a/src/Umbraco.Abstractions/Services/IContentTypeBaseServiceProvider.cs b/src/Umbraco.Core/Services/IContentTypeBaseServiceProvider.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IContentTypeBaseServiceProvider.cs rename to src/Umbraco.Core/Services/IContentTypeBaseServiceProvider.cs diff --git a/src/Umbraco.Abstractions/Services/IContentTypeService.cs b/src/Umbraco.Core/Services/IContentTypeService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IContentTypeService.cs rename to src/Umbraco.Core/Services/IContentTypeService.cs diff --git a/src/Umbraco.Abstractions/Services/IContentTypeServiceBase.cs b/src/Umbraco.Core/Services/IContentTypeServiceBase.cs similarity index 91% rename from src/Umbraco.Abstractions/Services/IContentTypeServiceBase.cs rename to src/Umbraco.Core/Services/IContentTypeServiceBase.cs index 6ed3c85e91..4c818aa87c 100644 --- a/src/Umbraco.Abstractions/Services/IContentTypeServiceBase.cs +++ b/src/Umbraco.Core/Services/IContentTypeServiceBase.cs @@ -51,7 +51,10 @@ namespace Umbraco.Core.Services IEnumerable GetComposedOf(int id); // composition axis IEnumerable GetChildren(int id); + IEnumerable GetChildren(Guid id); + bool HasChildren(int id); + bool HasChildren(Guid id); void Save(TItem item, int userId = Constants.Security.SuperUserId); void Save(IEnumerable items, int userId = Constants.Security.SuperUserId); @@ -69,6 +72,13 @@ namespace Umbraco.Core.Services /// bool HasContainerInPath(string contentPath); + /// + /// Gets a value indicating whether there is a list view content item in the path. + /// + /// + /// + bool HasContainerInPath(params int[] ids); + Attempt> CreateContainer(int parentContainerId, string name, int userId = Constants.Security.SuperUserId); Attempt SaveContainer(EntityContainer container, int userId = Constants.Security.SuperUserId); EntityContainer GetContainer(int containerId); diff --git a/src/Umbraco.Abstractions/Services/IDashboardService.cs b/src/Umbraco.Core/Services/IDashboardService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IDashboardService.cs rename to src/Umbraco.Core/Services/IDashboardService.cs diff --git a/src/Umbraco.Abstractions/Services/IDataTypeService.cs b/src/Umbraco.Core/Services/IDataTypeService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IDataTypeService.cs rename to src/Umbraco.Core/Services/IDataTypeService.cs diff --git a/src/Umbraco.Abstractions/Services/IDomainService.cs b/src/Umbraco.Core/Services/IDomainService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IDomainService.cs rename to src/Umbraco.Core/Services/IDomainService.cs diff --git a/src/Umbraco.Abstractions/Services/IEntityService.cs b/src/Umbraco.Core/Services/IEntityService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IEntityService.cs rename to src/Umbraco.Core/Services/IEntityService.cs diff --git a/src/Umbraco.Abstractions/Services/IEntityXmlSerializer.cs b/src/Umbraco.Core/Services/IEntityXmlSerializer.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IEntityXmlSerializer.cs rename to src/Umbraco.Core/Services/IEntityXmlSerializer.cs diff --git a/src/Umbraco.Abstractions/Services/IExternalLoginService.cs b/src/Umbraco.Core/Services/IExternalLoginService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IExternalLoginService.cs rename to src/Umbraco.Core/Services/IExternalLoginService.cs diff --git a/src/Umbraco.Abstractions/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IFileService.cs rename to src/Umbraco.Core/Services/IFileService.cs diff --git a/src/Umbraco.Abstractions/Services/IIdKeyMap.cs b/src/Umbraco.Core/Services/IIdKeyMap.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IIdKeyMap.cs rename to src/Umbraco.Core/Services/IIdKeyMap.cs diff --git a/src/Umbraco.Abstractions/Services/IKeyValueService.cs b/src/Umbraco.Core/Services/IKeyValueService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IKeyValueService.cs rename to src/Umbraco.Core/Services/IKeyValueService.cs diff --git a/src/Umbraco.Abstractions/Services/ILocalizationService.cs b/src/Umbraco.Core/Services/ILocalizationService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ILocalizationService.cs rename to src/Umbraco.Core/Services/ILocalizationService.cs diff --git a/src/Umbraco.Abstractions/Services/ILocalizedTextService.cs b/src/Umbraco.Core/Services/ILocalizedTextService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ILocalizedTextService.cs rename to src/Umbraco.Core/Services/ILocalizedTextService.cs diff --git a/src/Umbraco.Abstractions/Services/IMacroService.cs b/src/Umbraco.Core/Services/IMacroService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMacroService.cs rename to src/Umbraco.Core/Services/IMacroService.cs diff --git a/src/Umbraco.Abstractions/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMediaService.cs rename to src/Umbraco.Core/Services/IMediaService.cs diff --git a/src/Umbraco.Abstractions/Services/IMediaTypeService.cs b/src/Umbraco.Core/Services/IMediaTypeService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMediaTypeService.cs rename to src/Umbraco.Core/Services/IMediaTypeService.cs diff --git a/src/Umbraco.Abstractions/Services/IMemberGroupService.cs b/src/Umbraco.Core/Services/IMemberGroupService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMemberGroupService.cs rename to src/Umbraco.Core/Services/IMemberGroupService.cs diff --git a/src/Umbraco.Abstractions/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMemberService.cs rename to src/Umbraco.Core/Services/IMemberService.cs diff --git a/src/Umbraco.Abstractions/Services/IMemberTypeService.cs b/src/Umbraco.Core/Services/IMemberTypeService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMemberTypeService.cs rename to src/Umbraco.Core/Services/IMemberTypeService.cs diff --git a/src/Umbraco.Abstractions/Services/IMembershipMemberService.cs b/src/Umbraco.Core/Services/IMembershipMemberService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMembershipMemberService.cs rename to src/Umbraco.Core/Services/IMembershipMemberService.cs diff --git a/src/Umbraco.Abstractions/Services/IMembershipRoleService.cs b/src/Umbraco.Core/Services/IMembershipRoleService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMembershipRoleService.cs rename to src/Umbraco.Core/Services/IMembershipRoleService.cs diff --git a/src/Umbraco.Abstractions/Services/IMembershipUserService.cs b/src/Umbraco.Core/Services/IMembershipUserService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IMembershipUserService.cs rename to src/Umbraco.Core/Services/IMembershipUserService.cs diff --git a/src/Umbraco.Abstractions/Services/INotificationService.cs b/src/Umbraco.Core/Services/INotificationService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/INotificationService.cs rename to src/Umbraco.Core/Services/INotificationService.cs diff --git a/src/Umbraco.Abstractions/Services/IPackagingService.cs b/src/Umbraco.Core/Services/IPackagingService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IPackagingService.cs rename to src/Umbraco.Core/Services/IPackagingService.cs diff --git a/src/Umbraco.Abstractions/Services/IPropertyValidationService.cs b/src/Umbraco.Core/Services/IPropertyValidationService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IPropertyValidationService.cs rename to src/Umbraco.Core/Services/IPropertyValidationService.cs diff --git a/src/Umbraco.Abstractions/Services/IPublicAccessService.cs b/src/Umbraco.Core/Services/IPublicAccessService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IPublicAccessService.cs rename to src/Umbraco.Core/Services/IPublicAccessService.cs diff --git a/src/Umbraco.Abstractions/Services/IRedirectUrlService.cs b/src/Umbraco.Core/Services/IRedirectUrlService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IRedirectUrlService.cs rename to src/Umbraco.Core/Services/IRedirectUrlService.cs diff --git a/src/Umbraco.Abstractions/Services/IRelationService.cs b/src/Umbraco.Core/Services/IRelationService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IRelationService.cs rename to src/Umbraco.Core/Services/IRelationService.cs diff --git a/src/Umbraco.Abstractions/Services/IRuntime.cs b/src/Umbraco.Core/Services/IRuntime.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IRuntime.cs rename to src/Umbraco.Core/Services/IRuntime.cs diff --git a/src/Umbraco.Abstractions/Services/IRuntimeState.cs b/src/Umbraco.Core/Services/IRuntimeState.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IRuntimeState.cs rename to src/Umbraco.Core/Services/IRuntimeState.cs diff --git a/src/Umbraco.Abstractions/Services/ISectionService.cs b/src/Umbraco.Core/Services/ISectionService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ISectionService.cs rename to src/Umbraco.Core/Services/ISectionService.cs diff --git a/src/Umbraco.Abstractions/Services/IServerRegistrationService.cs b/src/Umbraco.Core/Services/IServerRegistrationService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IServerRegistrationService.cs rename to src/Umbraco.Core/Services/IServerRegistrationService.cs diff --git a/src/Umbraco.Abstractions/Services/IService.cs b/src/Umbraco.Core/Services/IService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IService.cs rename to src/Umbraco.Core/Services/IService.cs diff --git a/src/Umbraco.Abstractions/Services/ITagService.cs b/src/Umbraco.Core/Services/ITagService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ITagService.cs rename to src/Umbraco.Core/Services/ITagService.cs diff --git a/src/Umbraco.Abstractions/Services/ITreeService.cs b/src/Umbraco.Core/Services/ITreeService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ITreeService.cs rename to src/Umbraco.Core/Services/ITreeService.cs diff --git a/src/Umbraco.Core/Services/IUpgradeService.cs b/src/Umbraco.Core/Services/IUpgradeService.cs new file mode 100644 index 0000000000..70bbb68085 --- /dev/null +++ b/src/Umbraco.Core/Services/IUpgradeService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using Semver; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Services +{ + public interface IUpgradeService + { + Task CheckUpgrade(SemVersion version); + } +} diff --git a/src/Umbraco.Abstractions/Services/IUserService.cs b/src/Umbraco.Core/Services/IUserService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/IUserService.cs rename to src/Umbraco.Core/Services/IUserService.cs diff --git a/src/Umbraco.Abstractions/Services/LocalizedTextServiceExtensions.cs b/src/Umbraco.Core/Services/LocalizedTextServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/LocalizedTextServiceExtensions.cs rename to src/Umbraco.Core/Services/LocalizedTextServiceExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/MediaServiceExtensions.cs b/src/Umbraco.Core/Services/MediaServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/MediaServiceExtensions.cs rename to src/Umbraco.Core/Services/MediaServiceExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/MoveOperationStatusType.cs b/src/Umbraco.Core/Services/MoveOperationStatusType.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/MoveOperationStatusType.cs rename to src/Umbraco.Core/Services/MoveOperationStatusType.cs diff --git a/src/Umbraco.Abstractions/Services/OperationResult.cs b/src/Umbraco.Core/Services/OperationResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/OperationResult.cs rename to src/Umbraco.Core/Services/OperationResult.cs diff --git a/src/Umbraco.Abstractions/Services/OperationResultType.cs b/src/Umbraco.Core/Services/OperationResultType.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/OperationResultType.cs rename to src/Umbraco.Core/Services/OperationResultType.cs diff --git a/src/Umbraco.Abstractions/Services/Ordering.cs b/src/Umbraco.Core/Services/Ordering.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/Ordering.cs rename to src/Umbraco.Core/Services/Ordering.cs diff --git a/src/Umbraco.Abstractions/Services/PublicAccessServiceExtensions.cs b/src/Umbraco.Core/Services/PublicAccessServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/PublicAccessServiceExtensions.cs rename to src/Umbraco.Core/Services/PublicAccessServiceExtensions.cs diff --git a/src/Umbraco.Abstractions/Services/PublishResult.cs b/src/Umbraco.Core/Services/PublishResult.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/PublishResult.cs rename to src/Umbraco.Core/Services/PublishResult.cs diff --git a/src/Umbraco.Abstractions/Services/PublishResultType.cs b/src/Umbraco.Core/Services/PublishResultType.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/PublishResultType.cs rename to src/Umbraco.Core/Services/PublishResultType.cs diff --git a/src/Umbraco.Abstractions/Services/SectionService.cs b/src/Umbraco.Core/Services/SectionService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/SectionService.cs rename to src/Umbraco.Core/Services/SectionService.cs diff --git a/src/Umbraco.Abstractions/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/ServiceContext.cs rename to src/Umbraco.Core/Services/ServiceContext.cs diff --git a/src/Umbraco.Abstractions/Services/TreeService.cs b/src/Umbraco.Core/Services/TreeService.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/TreeService.cs rename to src/Umbraco.Core/Services/TreeService.cs diff --git a/src/Umbraco.Core/Services/UpgradeService.cs b/src/Umbraco.Core/Services/UpgradeService.cs new file mode 100644 index 0000000000..ead5270b41 --- /dev/null +++ b/src/Umbraco.Core/Services/UpgradeService.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Semver; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Services; + +namespace Umbraco.Core +{ + public class UpgradeService : IUpgradeService + { + private readonly IUpgradeCheckRepository _upgradeCheckRepository; + + public UpgradeService(IUpgradeCheckRepository upgradeCheckRepository) + { + _upgradeCheckRepository = upgradeCheckRepository; + } + + public async Task CheckUpgrade(SemVersion version) + { + return await _upgradeCheckRepository.CheckUpgradeAsync(version); + } + } +} diff --git a/src/Umbraco.Abstractions/Services/UserServiceExtensions.cs b/src/Umbraco.Core/Services/UserServiceExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Services/UserServiceExtensions.cs rename to src/Umbraco.Core/Services/UserServiceExtensions.cs diff --git a/src/Umbraco.Core/Session/ISessionManager.cs b/src/Umbraco.Core/Session/ISessionManager.cs new file mode 100644 index 0000000000..f3a47202ee --- /dev/null +++ b/src/Umbraco.Core/Session/ISessionManager.cs @@ -0,0 +1,8 @@ +namespace Umbraco.Core.Session +{ + public interface ISessionManager + { + object GetSessionValue(string sessionName); + void SetSessionValue(string sessionName, object value); + } +} diff --git a/src/Umbraco.Abstractions/Settable.cs b/src/Umbraco.Core/Settable.cs similarity index 100% rename from src/Umbraco.Abstractions/Settable.cs rename to src/Umbraco.Core/Settable.cs diff --git a/src/Umbraco.Abstractions/SimpleMainDom.cs b/src/Umbraco.Core/SimpleMainDom.cs similarity index 100% rename from src/Umbraco.Abstractions/SimpleMainDom.cs rename to src/Umbraco.Core/SimpleMainDom.cs diff --git a/src/Umbraco.Abstractions/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/StringExtensions.cs rename to src/Umbraco.Core/StringExtensions.cs diff --git a/src/Umbraco.Abstractions/StringUdi.cs b/src/Umbraco.Core/StringUdi.cs similarity index 100% rename from src/Umbraco.Abstractions/StringUdi.cs rename to src/Umbraco.Core/StringUdi.cs diff --git a/src/Umbraco.Abstractions/Strings/CleanStringType.cs b/src/Umbraco.Core/Strings/CleanStringType.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/CleanStringType.cs rename to src/Umbraco.Core/Strings/CleanStringType.cs diff --git a/src/Umbraco.Abstractions/Strings/Css/StylesheetHelper.cs b/src/Umbraco.Core/Strings/Css/StylesheetHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/Css/StylesheetHelper.cs rename to src/Umbraco.Core/Strings/Css/StylesheetHelper.cs diff --git a/src/Umbraco.Abstractions/Strings/Css/StylesheetRule.cs b/src/Umbraco.Core/Strings/Css/StylesheetRule.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/Css/StylesheetRule.cs rename to src/Umbraco.Core/Strings/Css/StylesheetRule.cs diff --git a/src/Umbraco.Abstractions/Strings/DefaultShortStringHelper.cs b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/DefaultShortStringHelper.cs rename to src/Umbraco.Core/Strings/DefaultShortStringHelper.cs diff --git a/src/Umbraco.Abstractions/Strings/DefaultShortStringHelperConfig.cs b/src/Umbraco.Core/Strings/DefaultShortStringHelperConfig.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/DefaultShortStringHelperConfig.cs rename to src/Umbraco.Core/Strings/DefaultShortStringHelperConfig.cs diff --git a/src/Umbraco.Abstractions/Strings/DefaultUrlSegmentProvider.cs b/src/Umbraco.Core/Strings/DefaultUrlSegmentProvider.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/DefaultUrlSegmentProvider.cs rename to src/Umbraco.Core/Strings/DefaultUrlSegmentProvider.cs diff --git a/src/Umbraco.Abstractions/Strings/Diff.cs b/src/Umbraco.Core/Strings/Diff.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/Diff.cs rename to src/Umbraco.Core/Strings/Diff.cs diff --git a/src/Umbraco.Abstractions/Strings/HtmlEncodedString.cs b/src/Umbraco.Core/Strings/HtmlEncodedString.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/HtmlEncodedString.cs rename to src/Umbraco.Core/Strings/HtmlEncodedString.cs diff --git a/src/Umbraco.Abstractions/Strings/IHtmlEncodedString.cs b/src/Umbraco.Core/Strings/IHtmlEncodedString.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/IHtmlEncodedString.cs rename to src/Umbraco.Core/Strings/IHtmlEncodedString.cs diff --git a/src/Umbraco.Abstractions/Strings/IShortStringHelper.cs b/src/Umbraco.Core/Strings/IShortStringHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/IShortStringHelper.cs rename to src/Umbraco.Core/Strings/IShortStringHelper.cs diff --git a/src/Umbraco.Abstractions/Strings/IUrlSegmentProvider.cs b/src/Umbraco.Core/Strings/IUrlSegmentProvider.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/IUrlSegmentProvider.cs rename to src/Umbraco.Core/Strings/IUrlSegmentProvider.cs diff --git a/src/Umbraco.Abstractions/Strings/PathUtility.cs b/src/Umbraco.Core/Strings/PathUtility.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/PathUtility.cs rename to src/Umbraco.Core/Strings/PathUtility.cs diff --git a/src/Umbraco.Abstractions/Strings/UrlSegmentProviderCollection.cs b/src/Umbraco.Core/Strings/UrlSegmentProviderCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/UrlSegmentProviderCollection.cs rename to src/Umbraco.Core/Strings/UrlSegmentProviderCollection.cs diff --git a/src/Umbraco.Abstractions/Strings/UrlSegmentProviderCollectionBuilder.cs b/src/Umbraco.Core/Strings/UrlSegmentProviderCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/UrlSegmentProviderCollectionBuilder.cs rename to src/Umbraco.Core/Strings/UrlSegmentProviderCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Strings/Utf8ToAsciiConverter.cs b/src/Umbraco.Core/Strings/Utf8ToAsciiConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/Strings/Utf8ToAsciiConverter.cs rename to src/Umbraco.Core/Strings/Utf8ToAsciiConverter.cs diff --git a/src/Umbraco.Abstractions/Sync/DatabaseServerMessengerOptions.cs b/src/Umbraco.Core/Sync/DatabaseServerMessengerOptions.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/DatabaseServerMessengerOptions.cs rename to src/Umbraco.Core/Sync/DatabaseServerMessengerOptions.cs diff --git a/src/Umbraco.Abstractions/Sync/DatabaseServerRegistrar.cs b/src/Umbraco.Core/Sync/DatabaseServerRegistrar.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/DatabaseServerRegistrar.cs rename to src/Umbraco.Core/Sync/DatabaseServerRegistrar.cs diff --git a/src/Umbraco.Abstractions/Sync/DatabaseServerRegistrarOptions.cs b/src/Umbraco.Core/Sync/DatabaseServerRegistrarOptions.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/DatabaseServerRegistrarOptions.cs rename to src/Umbraco.Core/Sync/DatabaseServerRegistrarOptions.cs diff --git a/src/Umbraco.Core/Sync/IBatchedDatabaseServerMessenger.cs b/src/Umbraco.Core/Sync/IBatchedDatabaseServerMessenger.cs new file mode 100644 index 0000000000..d8ec82818d --- /dev/null +++ b/src/Umbraco.Core/Sync/IBatchedDatabaseServerMessenger.cs @@ -0,0 +1,12 @@ +namespace Umbraco.Core.Sync +{ + /// + /// An implementation that works by storing messages in the database. + /// + public interface IBatchedDatabaseServerMessenger : IDatabaseServerMessenger + { + void FlushBatch(); + DatabaseServerMessengerOptions Options { get; } + void Startup(); + } +} diff --git a/src/Umbraco.Core/Sync/IDatabaseServerMessenger.cs b/src/Umbraco.Core/Sync/IDatabaseServerMessenger.cs new file mode 100644 index 0000000000..a49cfdd023 --- /dev/null +++ b/src/Umbraco.Core/Sync/IDatabaseServerMessenger.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Sync +{ + public interface IDatabaseServerMessenger: IServerMessenger + { + void Sync(); + } +} diff --git a/src/Umbraco.Abstractions/Sync/IServerAddress.cs b/src/Umbraco.Core/Sync/IServerAddress.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/IServerAddress.cs rename to src/Umbraco.Core/Sync/IServerAddress.cs diff --git a/src/Umbraco.Abstractions/Sync/IServerMessenger.cs b/src/Umbraco.Core/Sync/IServerMessenger.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/IServerMessenger.cs rename to src/Umbraco.Core/Sync/IServerMessenger.cs diff --git a/src/Umbraco.Abstractions/Sync/IServerRegistrar.cs b/src/Umbraco.Core/Sync/IServerRegistrar.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/IServerRegistrar.cs rename to src/Umbraco.Core/Sync/IServerRegistrar.cs diff --git a/src/Umbraco.Abstractions/Sync/MessageType.cs b/src/Umbraco.Core/Sync/MessageType.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/MessageType.cs rename to src/Umbraco.Core/Sync/MessageType.cs diff --git a/src/Umbraco.Abstractions/Sync/RefreshMethodType.cs b/src/Umbraco.Core/Sync/RefreshMethodType.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/RefreshMethodType.cs rename to src/Umbraco.Core/Sync/RefreshMethodType.cs diff --git a/src/Umbraco.Abstractions/Sync/ServerRole.cs b/src/Umbraco.Core/Sync/ServerRole.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/ServerRole.cs rename to src/Umbraco.Core/Sync/ServerRole.cs diff --git a/src/Umbraco.Abstractions/Sync/SingleServerRegistrar.cs b/src/Umbraco.Core/Sync/SingleServerRegistrar.cs similarity index 100% rename from src/Umbraco.Abstractions/Sync/SingleServerRegistrar.cs rename to src/Umbraco.Core/Sync/SingleServerRegistrar.cs diff --git a/src/Umbraco.Abstractions/SystemLock.cs b/src/Umbraco.Core/SystemLock.cs similarity index 100% rename from src/Umbraco.Abstractions/SystemLock.cs rename to src/Umbraco.Core/SystemLock.cs diff --git a/src/Umbraco.Web/Templates/HtmlImageSourceParser.cs b/src/Umbraco.Core/Templates/HtmlImageSourceParser.cs similarity index 91% rename from src/Umbraco.Web/Templates/HtmlImageSourceParser.cs rename to src/Umbraco.Core/Templates/HtmlImageSourceParser.cs index 74333cf533..79d65e0829 100644 --- a/src/Umbraco.Web/Templates/HtmlImageSourceParser.cs +++ b/src/Umbraco.Core/Templates/HtmlImageSourceParser.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using Umbraco.Core; +using Umbraco.Web.Routing; namespace Umbraco.Web.Templates { @@ -13,10 +14,11 @@ namespace Umbraco.Web.Templates this._getMediaUrl = getMediaUrl; } - private readonly IUmbracoContextAccessor _umbracoContextAccessor; - public HtmlImageSourceParser(IUmbracoContextAccessor umbracoContextAccessor) + private readonly IPublishedUrlProvider _publishedUrlProvider; + + public HtmlImageSourceParser(IPublishedUrlProvider publishedUrlProvider) { - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } private static readonly Regex ResolveImgPattern = new Regex(@"(]*src="")([^""\?]*)((?:\?[^""]*)?""[^>]*data-udi="")([^""]*)(""[^>]*>)", @@ -54,7 +56,7 @@ namespace Umbraco.Web.Templates public string EnsureImageSources(string text) { if(_getMediaUrl == null) - _getMediaUrl = (guid) => _umbracoContextAccessor.UmbracoContext.UrlProvider.GetMediaUrl(guid); + _getMediaUrl = (guid) => _publishedUrlProvider.GetMediaUrl(guid); return ResolveImgPattern.Replace(text, match => { diff --git a/src/Umbraco.Web/Templates/HtmlLocalLinkParser.cs b/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs similarity index 89% rename from src/Umbraco.Web/Templates/HtmlLocalLinkParser.cs rename to src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs index ef89088a7a..2ecd61f7d2 100644 --- a/src/Umbraco.Web/Templates/HtmlLocalLinkParser.cs +++ b/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using Umbraco.Core; -using Umbraco.Core.Logging; -using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; namespace Umbraco.Web.Templates @@ -18,13 +16,15 @@ namespace Umbraco.Web.Templates RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public HtmlLocalLinkParser(IUmbracoContextAccessor umbracoContextAccessor) + public HtmlLocalLinkParser(IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider) { _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } - internal IEnumerable FindUdisFromLocalLinks(string text) + public IEnumerable FindUdisFromLocalLinks(string text) { foreach ((int? intId, GuidUdi udi, string tagValue) in FindLocalLinkIds(text)) { @@ -64,7 +64,6 @@ namespace Umbraco.Web.Templates if (_umbracoContextAccessor.UmbracoContext == null) throw new InvalidOperationException("Could not parse internal links, there is no current UmbracoContext"); - var urlProvider = _umbracoContextAccessor.UmbracoContext.UrlProvider; foreach((int? intId, GuidUdi udi, string tagValue) in FindLocalLinkIds(text)) { @@ -72,9 +71,9 @@ namespace Umbraco.Web.Templates { var newLink = "#"; if (udi.EntityType == Constants.UdiEntityType.Document) - newLink = urlProvider.GetUrl(udi.Guid); + newLink = _publishedUrlProvider.GetUrl(udi.Guid); else if (udi.EntityType == Constants.UdiEntityType.Media) - newLink = urlProvider.GetMediaUrl(udi.Guid); + newLink = _publishedUrlProvider.GetMediaUrl(udi.Guid); if (newLink == null) newLink = "#"; @@ -83,7 +82,7 @@ namespace Umbraco.Web.Templates } else if (intId.HasValue) { - var newLink = urlProvider.GetUrl(intId.Value); + var newLink = _publishedUrlProvider.GetUrl(intId.Value); text = text.Replace(tagValue, "href=\"" + newLink); } } diff --git a/src/Umbraco.Web/Templates/HtmlUrlParser.cs b/src/Umbraco.Core/Templates/HtmlUrlParser.cs similarity index 100% rename from src/Umbraco.Web/Templates/HtmlUrlParser.cs rename to src/Umbraco.Core/Templates/HtmlUrlParser.cs diff --git a/src/Umbraco.Web/Templates/ITemplateRenderer.cs b/src/Umbraco.Core/Templates/ITemplateRenderer.cs similarity index 100% rename from src/Umbraco.Web/Templates/ITemplateRenderer.cs rename to src/Umbraco.Core/Templates/ITemplateRenderer.cs diff --git a/src/Umbraco.Abstractions/ThreadExtensions.cs b/src/Umbraco.Core/ThreadExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/ThreadExtensions.cs rename to src/Umbraco.Core/ThreadExtensions.cs diff --git a/src/Umbraco.Abstractions/Tour/BackOfficeTourFilter.cs b/src/Umbraco.Core/Tour/BackOfficeTourFilter.cs similarity index 100% rename from src/Umbraco.Abstractions/Tour/BackOfficeTourFilter.cs rename to src/Umbraco.Core/Tour/BackOfficeTourFilter.cs diff --git a/src/Umbraco.Abstractions/Tour/TourFilterCollection.cs b/src/Umbraco.Core/Tour/TourFilterCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Tour/TourFilterCollection.cs rename to src/Umbraco.Core/Tour/TourFilterCollection.cs diff --git a/src/Umbraco.Abstractions/Tour/TourFilterCollectionBuilder.cs b/src/Umbraco.Core/Tour/TourFilterCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Abstractions/Tour/TourFilterCollectionBuilder.cs rename to src/Umbraco.Core/Tour/TourFilterCollectionBuilder.cs diff --git a/src/Umbraco.Abstractions/Trees/ActionUrlMethod.cs b/src/Umbraco.Core/Trees/ActionUrlMethod.cs similarity index 100% rename from src/Umbraco.Abstractions/Trees/ActionUrlMethod.cs rename to src/Umbraco.Core/Trees/ActionUrlMethod.cs diff --git a/src/Umbraco.Abstractions/Trees/CoreTreeAttribute.cs b/src/Umbraco.Core/Trees/CoreTreeAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/Trees/CoreTreeAttribute.cs rename to src/Umbraco.Core/Trees/CoreTreeAttribute.cs diff --git a/src/Umbraco.Core/Trees/IMenuItemCollectionFactory.cs b/src/Umbraco.Core/Trees/IMenuItemCollectionFactory.cs new file mode 100644 index 0000000000..dc4c53bac9 --- /dev/null +++ b/src/Umbraco.Core/Trees/IMenuItemCollectionFactory.cs @@ -0,0 +1,17 @@ +using Umbraco.Web.Models.Trees; + +namespace Umbraco.Web.Trees +{ + + /// + /// Represents a factory to create . + /// + public interface IMenuItemCollectionFactory + { + /// + /// Creates an empty . + /// + /// An empty . + MenuItemCollection Create(); + } +} diff --git a/src/Umbraco.Abstractions/Trees/ITree.cs b/src/Umbraco.Core/Trees/ITree.cs similarity index 100% rename from src/Umbraco.Abstractions/Trees/ITree.cs rename to src/Umbraco.Core/Trees/ITree.cs diff --git a/src/Umbraco.Web/Models/Trees/MenuItemCollection.cs b/src/Umbraco.Core/Trees/MenuItemCollection.cs similarity index 72% rename from src/Umbraco.Web/Models/Trees/MenuItemCollection.cs rename to src/Umbraco.Core/Trees/MenuItemCollection.cs index e6a75b15d4..84d46c0d11 100644 --- a/src/Umbraco.Web/Models/Trees/MenuItemCollection.cs +++ b/src/Umbraco.Core/Trees/MenuItemCollection.cs @@ -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 items) + public MenuItemCollection(ActionCollection actionCollection, IEnumerable items) { - _menuItems = new MenuItemList(items); + _menuItems = new MenuItemList(actionCollection, items); } /// diff --git a/src/Umbraco.Core/Trees/MenuItemCollectionFactory.cs b/src/Umbraco.Core/Trees/MenuItemCollectionFactory.cs new file mode 100644 index 0000000000..0a8ea000e3 --- /dev/null +++ b/src/Umbraco.Core/Trees/MenuItemCollectionFactory.cs @@ -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); + } + + } +} diff --git a/src/Umbraco.Web/Models/Trees/MenuItemList.cs b/src/Umbraco.Core/Trees/MenuItemList.cs similarity index 82% rename from src/Umbraco.Web/Models/Trees/MenuItemList.cs rename to src/Umbraco.Core/Trees/MenuItemList.cs index 7bfa5eca48..546fa0390f 100644 --- a/src/Umbraco.Web/Models/Trees/MenuItemList.cs +++ b/src/Umbraco.Core/Trees/MenuItemList.cs @@ -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 /// public class MenuItemList : List { - public MenuItemList() + private readonly ActionCollection _actionCollection; + + public MenuItemList(ActionCollection actionCollection) { + _actionCollection = actionCollection; } - public MenuItemList( IEnumerable items) + public MenuItemList(ActionCollection actionCollection, IEnumerable items) : base(items) { + _actionCollection = actionCollection; } /// @@ -44,7 +47,7 @@ namespace Umbraco.Web.Models.Trees private MenuItem CreateMenuItem(ILocalizedTextService textService, bool hasSeparator = false, bool opensDialog = false) where T : IAction { - var item = Current.Actions.GetAction(); + var item = _actionCollection.GetAction(); if (item == null) return null; var menuItem = new MenuItem(item, textService.Localize($"actions/{item.Alias}")) diff --git a/src/Umbraco.Abstractions/Trees/Tree.cs b/src/Umbraco.Core/Trees/Tree.cs similarity index 100% rename from src/Umbraco.Abstractions/Trees/Tree.cs rename to src/Umbraco.Core/Trees/Tree.cs diff --git a/src/Umbraco.Abstractions/Trees/TreeCollection.cs b/src/Umbraco.Core/Trees/TreeCollection.cs similarity index 100% rename from src/Umbraco.Abstractions/Trees/TreeCollection.cs rename to src/Umbraco.Core/Trees/TreeCollection.cs diff --git a/src/Umbraco.Abstractions/Trees/TreeUse.cs b/src/Umbraco.Core/Trees/TreeUse.cs similarity index 100% rename from src/Umbraco.Abstractions/Trees/TreeUse.cs rename to src/Umbraco.Core/Trees/TreeUse.cs diff --git a/src/Umbraco.Abstractions/TypeExtensions.cs b/src/Umbraco.Core/TypeExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/TypeExtensions.cs rename to src/Umbraco.Core/TypeExtensions.cs diff --git a/src/Umbraco.Abstractions/TypeLoaderExtensions.cs b/src/Umbraco.Core/TypeLoaderExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/TypeLoaderExtensions.cs rename to src/Umbraco.Core/TypeLoaderExtensions.cs diff --git a/src/Umbraco.Abstractions/Udi.cs b/src/Umbraco.Core/Udi.cs similarity index 100% rename from src/Umbraco.Abstractions/Udi.cs rename to src/Umbraco.Core/Udi.cs diff --git a/src/Umbraco.Abstractions/UdiDefinitionAttribute.cs b/src/Umbraco.Core/UdiDefinitionAttribute.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiDefinitionAttribute.cs rename to src/Umbraco.Core/UdiDefinitionAttribute.cs diff --git a/src/Umbraco.Abstractions/UdiEntityTypeHelper.cs b/src/Umbraco.Core/UdiEntityTypeHelper.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiEntityTypeHelper.cs rename to src/Umbraco.Core/UdiEntityTypeHelper.cs diff --git a/src/Umbraco.Abstractions/UdiGetterExtensions.cs b/src/Umbraco.Core/UdiGetterExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiGetterExtensions.cs rename to src/Umbraco.Core/UdiGetterExtensions.cs diff --git a/src/Umbraco.Abstractions/UdiParser.cs b/src/Umbraco.Core/UdiParser.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiParser.cs rename to src/Umbraco.Core/UdiParser.cs diff --git a/src/Umbraco.Abstractions/UdiParserServiceConnectors.cs b/src/Umbraco.Core/UdiParserServiceConnectors.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiParserServiceConnectors.cs rename to src/Umbraco.Core/UdiParserServiceConnectors.cs diff --git a/src/Umbraco.Abstractions/UdiRange.cs b/src/Umbraco.Core/UdiRange.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiRange.cs rename to src/Umbraco.Core/UdiRange.cs diff --git a/src/Umbraco.Abstractions/UdiType.cs b/src/Umbraco.Core/UdiType.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiType.cs rename to src/Umbraco.Core/UdiType.cs diff --git a/src/Umbraco.Abstractions/UdiTypeConverter.cs b/src/Umbraco.Core/UdiTypeConverter.cs similarity index 100% rename from src/Umbraco.Abstractions/UdiTypeConverter.cs rename to src/Umbraco.Core/UdiTypeConverter.cs diff --git a/src/Umbraco.Abstractions/Umbraco.Abstractions.csproj b/src/Umbraco.Core/Umbraco.Core.csproj similarity index 89% rename from src/Umbraco.Abstractions/Umbraco.Abstractions.csproj rename to src/Umbraco.Core/Umbraco.Core.csproj index 2eff63c4b8..7a15e7fbed 100644 --- a/src/Umbraco.Abstractions/Umbraco.Abstractions.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 7.3 + 8 Umbraco.Core 9.0.0 9.0.0 @@ -24,9 +24,4 @@ <_Parameter1>Umbraco.Tests.Benchmarks - - - - - diff --git a/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollection.cs b/src/Umbraco.Core/UmbracoApiControllerTypeCollection.cs similarity index 100% rename from src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollection.cs rename to src/Umbraco.Core/UmbracoApiControllerTypeCollection.cs diff --git a/src/Umbraco.Core/UmbracoContextAccessorExtensions.cs b/src/Umbraco.Core/UmbracoContextAccessorExtensions.cs new file mode 100644 index 0000000000..74e2dd7380 --- /dev/null +++ b/src/Umbraco.Core/UmbracoContextAccessorExtensions.cs @@ -0,0 +1,19 @@ +using System; +using Umbraco.Web; + +namespace Umbraco.Core +{ + public static class UmbracoContextAccessorExtensions + { + public static IUmbracoContext GetRequiredUmbracoContext(this IUmbracoContextAccessor umbracoContextAccessor) + { + if (umbracoContextAccessor == null) throw new ArgumentNullException(nameof(umbracoContextAccessor)); + + var umbracoContext = umbracoContextAccessor.UmbracoContext; + + if(umbracoContext is null) throw new InvalidOperationException("UmbracoContext is null"); + + return umbracoContext; + } + } +} diff --git a/src/Umbraco.Web/UmbracoContextReference.cs b/src/Umbraco.Core/UmbracoContextReference.cs similarity index 90% rename from src/Umbraco.Web/UmbracoContextReference.cs rename to src/Umbraco.Core/UmbracoContextReference.cs index 6c4ac7e54a..bd021494e6 100644 --- a/src/Umbraco.Web/UmbracoContextReference.cs +++ b/src/Umbraco.Core/UmbracoContextReference.cs @@ -20,18 +20,18 @@ namespace Umbraco.Web /// /// Initializes a new instance of the class. /// - internal UmbracoContextReference(UmbracoContext umbracoContext, bool isRoot, IUmbracoContextAccessor umbracoContextAccessor) + internal UmbracoContextReference(IUmbracoContext umbracoContext, bool isRoot, IUmbracoContextAccessor umbracoContextAccessor) { - UmbracoContext = umbracoContext; IsRoot = isRoot; + UmbracoContext = umbracoContext; _umbracoContextAccessor = umbracoContextAccessor; } /// /// Gets the . /// - public UmbracoContext UmbracoContext { get; } + public IUmbracoContext UmbracoContext { get; } /// /// Gets a value indicating whether the reference is a root reference. diff --git a/src/Umbraco.Abstractions/UnknownTypeUdi.cs b/src/Umbraco.Core/UnknownTypeUdi.cs similarity index 100% rename from src/Umbraco.Abstractions/UnknownTypeUdi.cs rename to src/Umbraco.Core/UnknownTypeUdi.cs diff --git a/src/Umbraco.Core/UpgradeResult.cs b/src/Umbraco.Core/UpgradeResult.cs new file mode 100644 index 0000000000..a27f6bb6a3 --- /dev/null +++ b/src/Umbraco.Core/UpgradeResult.cs @@ -0,0 +1,16 @@ +namespace Umbraco.Core.Models +{ + public class UpgradeResult + { + public string UpgradeType { get; } + public string Comment { get; } + public string UpgradeUrl { get; } + + public UpgradeResult(string upgradeType, string comment, string upgradeUrl) + { + UpgradeType = upgradeType; + Comment = comment; + UpgradeUrl = upgradeUrl; + } + } +} diff --git a/src/Umbraco.Abstractions/UpgradeableReadLock.cs b/src/Umbraco.Core/UpgradeableReadLock.cs similarity index 100% rename from src/Umbraco.Abstractions/UpgradeableReadLock.cs rename to src/Umbraco.Core/UpgradeableReadLock.cs diff --git a/src/Umbraco.Abstractions/UriExtensions.cs b/src/Umbraco.Core/UriExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/UriExtensions.cs rename to src/Umbraco.Core/UriExtensions.cs diff --git a/src/Umbraco.Core/UriUtilityCore.cs b/src/Umbraco.Core/UriUtilityCore.cs new file mode 100644 index 0000000000..9ca9d66229 --- /dev/null +++ b/src/Umbraco.Core/UriUtilityCore.cs @@ -0,0 +1,59 @@ +using System; +using Umbraco.Core; + +namespace Umbraco.Web +{ + public static class UriUtilityCore + { + + #region Uri string utilities + + public static bool HasScheme(string uri) + { + return uri.IndexOf("://") > 0; + } + + public static string StartWithScheme(string uri) + { + return StartWithScheme(uri, null); + } + + public static string StartWithScheme(string uri, string scheme) + { + return HasScheme(uri) ? uri : String.Format("{0}://{1}", scheme ?? Uri.UriSchemeHttp, uri); + } + + public static string EndPathWithSlash(string uri) + { + var pos1 = Math.Max(0, uri.IndexOf('?')); + var pos2 = Math.Max(0, uri.IndexOf('#')); + var pos = Math.Min(pos1, pos2); + + var path = pos > 0 ? uri.Substring(0, pos) : uri; + path = path.EnsureEndsWith('/'); + + if (pos > 0) + path += uri.Substring(pos); + + return path; + } + + public static string TrimPathEndSlash(string uri) + { + var pos1 = Math.Max(0, uri.IndexOf('?')); + var pos2 = Math.Max(0, uri.IndexOf('#')); + var pos = Math.Min(pos1, pos2); + + var path = pos > 0 ? uri.Substring(0, pos) : uri; + path = path.TrimEnd('/'); + + if (pos > 0) + path += uri.Substring(pos); + + return path; + } + + #endregion + + } +} diff --git a/src/Umbraco.Abstractions/VersionExtensions.cs b/src/Umbraco.Core/VersionExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/VersionExtensions.cs rename to src/Umbraco.Core/VersionExtensions.cs diff --git a/src/Umbraco.Abstractions/WaitHandleExtensions.cs b/src/Umbraco.Core/WaitHandleExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/WaitHandleExtensions.cs rename to src/Umbraco.Core/WaitHandleExtensions.cs diff --git a/src/Umbraco.Abstractions/WriteLock.cs b/src/Umbraco.Core/WriteLock.cs similarity index 100% rename from src/Umbraco.Abstractions/WriteLock.cs rename to src/Umbraco.Core/WriteLock.cs diff --git a/src/Umbraco.Abstractions/Xml/DynamicContext.cs b/src/Umbraco.Core/Xml/DynamicContext.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/DynamicContext.cs rename to src/Umbraco.Core/Xml/DynamicContext.cs diff --git a/src/Umbraco.Abstractions/Xml/UmbracoXPathPathSyntaxParser.cs b/src/Umbraco.Core/Xml/UmbracoXPathPathSyntaxParser.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/UmbracoXPathPathSyntaxParser.cs rename to src/Umbraco.Core/Xml/UmbracoXPathPathSyntaxParser.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/INavigableContent.cs b/src/Umbraco.Core/Xml/XPath/INavigableContent.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/INavigableContent.cs rename to src/Umbraco.Core/Xml/XPath/INavigableContent.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/INavigableContentType.cs b/src/Umbraco.Core/Xml/XPath/INavigableContentType.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/INavigableContentType.cs rename to src/Umbraco.Core/Xml/XPath/INavigableContentType.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/INavigableFieldType.cs b/src/Umbraco.Core/Xml/XPath/INavigableFieldType.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/INavigableFieldType.cs rename to src/Umbraco.Core/Xml/XPath/INavigableFieldType.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/INavigableSource.cs b/src/Umbraco.Core/Xml/XPath/INavigableSource.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/INavigableSource.cs rename to src/Umbraco.Core/Xml/XPath/INavigableSource.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/MacroNavigator.cs b/src/Umbraco.Core/Xml/XPath/MacroNavigator.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/MacroNavigator.cs rename to src/Umbraco.Core/Xml/XPath/MacroNavigator.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/NavigableNavigator.cs b/src/Umbraco.Core/Xml/XPath/NavigableNavigator.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/NavigableNavigator.cs rename to src/Umbraco.Core/Xml/XPath/NavigableNavigator.cs diff --git a/src/Umbraco.Abstractions/Xml/XPath/RenamedRootNavigator.cs b/src/Umbraco.Core/Xml/XPath/RenamedRootNavigator.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPath/RenamedRootNavigator.cs rename to src/Umbraco.Core/Xml/XPath/RenamedRootNavigator.cs diff --git a/src/Umbraco.Abstractions/Xml/XPathNavigatorExtensions.cs b/src/Umbraco.Core/Xml/XPathNavigatorExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPathNavigatorExtensions.cs rename to src/Umbraco.Core/Xml/XPathNavigatorExtensions.cs diff --git a/src/Umbraco.Abstractions/Xml/XPathVariable.cs b/src/Umbraco.Core/Xml/XPathVariable.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XPathVariable.cs rename to src/Umbraco.Core/Xml/XPathVariable.cs diff --git a/src/Umbraco.Abstractions/Xml/XmlHelper.cs b/src/Umbraco.Core/Xml/XmlHelper.cs similarity index 99% rename from src/Umbraco.Abstractions/Xml/XmlHelper.cs rename to src/Umbraco.Core/Xml/XmlHelper.cs index 099b73ef36..4b76dc3799 100644 --- a/src/Umbraco.Abstractions/Xml/XmlHelper.cs +++ b/src/Umbraco.Core/Xml/XmlHelper.cs @@ -336,7 +336,7 @@ namespace Umbraco.Core.Xml var child = parent.SelectSingleNode(name); if (child != null) { - child.InnerXml = ""; ; + child.InnerXml = ""; return child; } return AddCDataNode(xd, name, value); diff --git a/src/Umbraco.Abstractions/Xml/XmlNamespaces.cs b/src/Umbraco.Core/Xml/XmlNamespaces.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XmlNamespaces.cs rename to src/Umbraco.Core/Xml/XmlNamespaces.cs diff --git a/src/Umbraco.Abstractions/Xml/XmlNodeListFactory.cs b/src/Umbraco.Core/Xml/XmlNodeListFactory.cs similarity index 100% rename from src/Umbraco.Abstractions/Xml/XmlNodeListFactory.cs rename to src/Umbraco.Core/Xml/XmlNodeListFactory.cs diff --git a/src/Umbraco.Abstractions/XmlExtensions.cs b/src/Umbraco.Core/XmlExtensions.cs similarity index 100% rename from src/Umbraco.Abstractions/XmlExtensions.cs rename to src/Umbraco.Core/XmlExtensions.cs diff --git a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs index cfa9de5fa6..d73dc89948 100644 --- a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs +++ b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs @@ -9,6 +9,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Identity; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Web; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Examine @@ -17,19 +18,19 @@ namespace Umbraco.Examine { private readonly IExamineManager _examineManager; private readonly ILocalizationService _languageService; - private readonly ICurrentUserAccessor _currentUserAccessor; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly IEntityService _entityService; private readonly IUmbracoTreeSearcherFields _treeSearcherFields; public BackOfficeExamineSearcher(IExamineManager examineManager, ILocalizationService languageService, - ICurrentUserAccessor currentUserAccessor, + IUmbracoContextAccessor umbracoContextAccessor, IEntityService entityService, IUmbracoTreeSearcherFields treeSearcherFields) { _examineManager = examineManager; _languageService = languageService; - _currentUserAccessor = currentUserAccessor; + _umbracoContextAccessor = umbracoContextAccessor; _entityService = entityService; _treeSearcherFields = treeSearcherFields; } @@ -48,7 +49,7 @@ namespace Umbraco.Examine query = "\"" + g.ToString() + "\""; } - var currentUser = _currentUserAccessor.TryGetCurrentUser(); + var currentUser = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser; switch (entityType) { diff --git a/src/Umbraco.Examine.Lucene/LuceneIndexCreator.cs b/src/Umbraco.Examine.Lucene/LuceneIndexCreator.cs index ccc0248868..b1d529e6c6 100644 --- a/src/Umbraco.Examine.Lucene/LuceneIndexCreator.cs +++ b/src/Umbraco.Examine.Lucene/LuceneIndexCreator.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; -using System.Configuration; using System.IO; using Examine; using Examine.LuceneEngine.Directories; using Lucene.Net.Store; +using Umbraco.Core.Configuration; using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.IO; @@ -19,11 +19,13 @@ namespace Umbraco.Examine { private readonly ITypeFinder _typeFinder; private readonly IIOHelper _ioHelper; + private readonly IIndexCreatorSettings _settings; - protected LuceneIndexCreator(ITypeFinder typeFinder, IIOHelper ioHelper) + protected LuceneIndexCreator(ITypeFinder typeFinder, IIOHelper ioHelper, IIndexCreatorSettings settings) { _typeFinder = typeFinder; _ioHelper = ioHelper; + _settings = settings; } public abstract IEnumerable Create(); @@ -43,7 +45,8 @@ namespace Umbraco.Examine System.IO.Directory.CreateDirectory(dirInfo.FullName); //check if there's a configured directory factory, if so create it and use that to create the lucene dir - var configuredDirectoryFactory = ConfigurationManager.AppSettings["Umbraco.Examine.LuceneDirectoryFactory"]; + var configuredDirectoryFactory = _settings.LuceneDirectoryFactory; + if (!configuredDirectoryFactory.IsNullOrWhiteSpace()) { //this should be a fully qualified type diff --git a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj index 264f487b70..932d6d318b 100644 --- a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj +++ b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj @@ -5,6 +5,7 @@ Umbraco.Examine Umbraco CMS Umbraco.Examine.Lucene + 8 @@ -25,8 +26,7 @@ - - + diff --git a/src/Umbraco.Examine.Lucene/UmbracoIndexesCreator.cs b/src/Umbraco.Examine.Lucene/UmbracoIndexesCreator.cs index 173300a472..0f60a7580c 100644 --- a/src/Umbraco.Examine.Lucene/UmbracoIndexesCreator.cs +++ b/src/Umbraco.Examine.Lucene/UmbracoIndexesCreator.cs @@ -4,6 +4,7 @@ using Umbraco.Core.Services; using Lucene.Net.Analysis.Standard; using Examine.LuceneEngine; using Examine; +using Umbraco.Core.Configuration; using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.IO; @@ -25,7 +26,8 @@ namespace Umbraco.Examine IMemberService memberService, IUmbracoIndexConfig umbracoIndexConfig, IIOHelper ioHelper, - IRuntimeState runtimeState) : base(typeFinder, ioHelper) + IRuntimeState runtimeState, + IIndexCreatorSettings settings) : base(typeFinder, ioHelper, settings) { ProfilingLogger = profilingLogger ?? throw new System.ArgumentNullException(nameof(profilingLogger)); LanguageService = languageService ?? throw new System.ArgumentNullException(nameof(languageService)); diff --git a/src/Umbraco.Examine/Umbraco.Examine.csproj b/src/Umbraco.Examine/Umbraco.Examine.csproj deleted file mode 100644 index 03fab50692..0000000000 --- a/src/Umbraco.Examine/Umbraco.Examine.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - netstandard2.0 - Umbraco.Examine - Umbraco.Examine - - - - - - - - - - - - diff --git a/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs b/src/Umbraco.Infrastructure/BatchedDatabaseServerMessenger.cs similarity index 73% rename from src/Umbraco.Web/BatchedDatabaseServerMessenger.cs rename to src/Umbraco.Infrastructure/BatchedDatabaseServerMessenger.cs index 5662883d2a..78b9589a2e 100644 --- a/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs +++ b/src/Umbraco.Infrastructure/BatchedDatabaseServerMessenger.cs @@ -1,21 +1,17 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Web; using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Cache; -using Umbraco.Core.Configuration; using Umbraco.Core.Sync; using Umbraco.Web.Routing; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Scoping; -using Umbraco.Web.Composing; -using System.ComponentModel; using Umbraco.Core.Hosting; -using Umbraco.Core.IO; +using Umbraco.Core.Request; namespace Umbraco.Web { @@ -25,21 +21,34 @@ namespace Umbraco.Web /// /// This binds to appropriate umbraco events in order to trigger the Boot(), Sync() & FlushBatch() calls /// - public class BatchedDatabaseServerMessenger : DatabaseServerMessenger + public class BatchedDatabaseServerMessenger : DatabaseServerMessenger, IBatchedDatabaseServerMessenger { private readonly IUmbracoDatabaseFactory _databaseFactory; + private readonly IRequestCache _requestCache; + private readonly IRequestAccessor _requestAccessor; public BatchedDatabaseServerMessenger( - IRuntimeState runtime, IUmbracoDatabaseFactory databaseFactory, IScopeProvider scopeProvider, ISqlContext sqlContext, IProfilingLogger proflog, DatabaseServerMessengerOptions options, IHostingEnvironment hostingEnvironment, CacheRefresherCollection cacheRefreshers) + IRuntimeState runtime, + IUmbracoDatabaseFactory databaseFactory, + IScopeProvider scopeProvider, + ISqlContext sqlContext, + IProfilingLogger proflog, + DatabaseServerMessengerOptions options, + IHostingEnvironment hostingEnvironment, + CacheRefresherCollection cacheRefreshers, + IRequestCache requestCache, + IRequestAccessor requestAccessor) : base(runtime, scopeProvider, sqlContext, proflog, true, options, hostingEnvironment, cacheRefreshers) { _databaseFactory = databaseFactory; + _requestCache = requestCache; + _requestAccessor = requestAccessor; } // invoked by DatabaseServerRegistrarAndMessengerComponent - internal void Startup() + public void Startup() { - UmbracoModule.EndRequest += UmbracoModule_EndRequest; + _requestAccessor.EndRequest += UmbracoModule_EndRequest; if (_databaseFactory.CanConnect == false) { @@ -102,24 +111,18 @@ namespace Umbraco.Web protected ICollection GetBatch(bool create) { - // try get the http context from the UmbracoContext, we do this because in the case we are launching an async - // thread and we know that the cache refreshers will execute, we will ensure the UmbracoContext and therefore we - // can get the http context from it - var httpContext = (Current.UmbracoContext == null ? null : Current.UmbracoContext.HttpContext) - // if this is null, it could be that an async thread is calling this method that we weren't aware of and the UmbracoContext - // wasn't ensured at the beginning of the thread. We can try to see if the HttpContext.Current is available which might be - // the case if the asp.net synchronization context has kicked in - ?? (HttpContext.Current == null ? null : new HttpContextWrapper(HttpContext.Current)); + var key = nameof(BatchedDatabaseServerMessenger); - // if no context was found, return null - we cannot not batch - if (httpContext == null) return null; - - var key = typeof (BatchedDatabaseServerMessenger).Name; + if (!_requestCache.IsAvailable) return null; // no thread-safety here because it'll run in only 1 thread (request) at a time - var batch = (ICollection)httpContext.Items[key]; + var batch = (ICollection)_requestCache.Get(key); if (batch == null && create) - httpContext.Items[key] = batch = new List(); + { + batch = new List(); + _requestCache.Set(key, batch); + } + return batch; } diff --git a/src/Umbraco.Web/Cache/DistributedCacheBinder.cs b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinder.cs similarity index 98% rename from src/Umbraco.Web/Cache/DistributedCacheBinder.cs rename to src/Umbraco.Infrastructure/Cache/DistributedCacheBinder.cs index e56d2bfe88..92ed7de881 100644 --- a/src/Umbraco.Web/Cache/DistributedCacheBinder.cs +++ b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinder.cs @@ -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 { diff --git a/src/Umbraco.Web/Cache/DistributedCacheBinderComposer.cs b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinderComposer.cs similarity index 100% rename from src/Umbraco.Web/Cache/DistributedCacheBinderComposer.cs rename to src/Umbraco.Infrastructure/Cache/DistributedCacheBinderComposer.cs diff --git a/src/Umbraco.Web/Cache/DistributedCacheBinder_Handlers.cs b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinder_Handlers.cs similarity index 99% rename from src/Umbraco.Web/Cache/DistributedCacheBinder_Handlers.cs rename to src/Umbraco.Infrastructure/Cache/DistributedCacheBinder_Handlers.cs index 0fbd3a2e6b..c0200933ab 100644 --- a/src/Umbraco.Web/Cache/DistributedCacheBinder_Handlers.cs +++ b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinder_Handlers.cs @@ -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 { @@ -154,6 +152,7 @@ namespace Umbraco.Web.Cache private void PublicAccessService_Saved(IPublicAccessService sender, SaveEventArgs e) { + _distributedCache.RefreshPublicAccess(); } diff --git a/src/Umbraco.Web/Cache/DistributedCacheExtensions.cs b/src/Umbraco.Infrastructure/Cache/DistributedCacheExtensions.cs similarity index 98% rename from src/Umbraco.Web/Cache/DistributedCacheExtensions.cs rename to src/Umbraco.Infrastructure/Cache/DistributedCacheExtensions.cs index 1c3b6a1dcc..7cfac1b9a0 100644 --- a/src/Umbraco.Web/Cache/DistributedCacheExtensions.cs +++ b/src/Umbraco.Infrastructure/Cache/DistributedCacheExtensions.cs @@ -1,8 +1,5 @@ using System.Linq; -using NPoco.Expressions; -using Umbraco.Core.Cache; using Umbraco.Core.Models; -using Umbraco.Core.Serialization; using Umbraco.Core.Services.Changes; namespace Umbraco.Web.Cache @@ -10,7 +7,7 @@ namespace Umbraco.Web.Cache /// /// Extension methods for . /// - internal static class DistributedCacheExtensions + public static class DistributedCacheExtensions { #region PublicAccessCache diff --git a/src/Umbraco.Web/Compose/DatabaseServerRegistrarAndMessengerComponent.cs b/src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs similarity index 91% rename from src/Umbraco.Web/Compose/DatabaseServerRegistrarAndMessengerComponent.cs rename to src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs index 1fa455ed8a..2a24e6f318 100644 --- a/src/Umbraco.Web/Compose/DatabaseServerRegistrarAndMessengerComponent.cs +++ b/src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs @@ -4,6 +4,7 @@ using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; +using Umbraco.Core.Request; using Umbraco.Core.Services; using Umbraco.Core.Services.Changes; using Umbraco.Core.Sync; @@ -82,7 +83,7 @@ namespace Umbraco.Web.Compose { private object _locker = new object(); private readonly DatabaseServerRegistrar _registrar; - private readonly BatchedDatabaseServerMessenger _messenger; + private readonly IBatchedDatabaseServerMessenger _messenger; private readonly IRuntimeState _runtime; private readonly ILogger _logger; private readonly IServerRegistrationService _registrationService; @@ -91,13 +92,23 @@ namespace Umbraco.Web.Compose private bool _started; private IBackgroundTask[] _tasks; private IndexRebuilder _indexRebuilder; + private readonly IRequestAccessor _requestAccessor; - public DatabaseServerRegistrarAndMessengerComponent(IRuntimeState runtime, IServerRegistrar serverRegistrar, IServerMessenger serverMessenger, IServerRegistrationService registrationService, ILogger logger, IHostingEnvironment hostingEnvironment, IndexRebuilder indexRebuilder) + public DatabaseServerRegistrarAndMessengerComponent( + IRuntimeState runtime, + IServerRegistrar serverRegistrar, + IServerMessenger serverMessenger, + IServerRegistrationService registrationService, + ILogger logger, + IHostingEnvironment hostingEnvironment, + IndexRebuilder indexRebuilder, + IRequestAccessor requestAccessor) { _runtime = runtime; _logger = logger; _registrationService = registrationService; _indexRebuilder = indexRebuilder; + _requestAccessor = requestAccessor; // create task runner for DatabaseServerRegistrar _registrar = serverRegistrar as DatabaseServerRegistrar; @@ -108,7 +119,7 @@ namespace Umbraco.Web.Compose } // create task runner for BatchedDatabaseServerMessenger - _messenger = serverMessenger as BatchedDatabaseServerMessenger; + _messenger = serverMessenger as IBatchedDatabaseServerMessenger; if (_messenger != null) { _processTaskRunner = new BackgroundTaskRunner("ServerInstProcess", @@ -120,7 +131,7 @@ namespace Umbraco.Web.Compose { //We will start the whole process when a successful request is made if (_registrar != null || _messenger != null) - UmbracoModule.RouteAttempt += RegisterBackgroundTasksOnce; + _requestAccessor.RouteAttempt += RegisterBackgroundTasksOnce; // must come last, as it references some _variables _messenger?.Startup(); @@ -137,7 +148,7 @@ namespace Umbraco.Web.Compose /// /// We require this because: /// - ApplicationContext.UmbracoApplicationUrl is initialized by UmbracoModule in BeginRequest - /// - RegisterServer is called on UmbracoModule.RouteAttempt which is triggered in ProcessRequest + /// - RegisterServer is called on _requestAccessor.RouteAttempt which is triggered in ProcessRequest /// we are safe, UmbracoApplicationUrl has been initialized /// private void RegisterBackgroundTasksOnce(object sender, RoutableAttemptEventArgs e) @@ -146,7 +157,7 @@ namespace Umbraco.Web.Compose { case EnsureRoutableOutcome.IsRoutable: case EnsureRoutableOutcome.NotDocumentRequest: - UmbracoModule.RouteAttempt -= RegisterBackgroundTasksOnce; + _requestAccessor.RouteAttempt -= RegisterBackgroundTasksOnce; RegisterBackgroundTasks(); break; } @@ -196,11 +207,11 @@ namespace Umbraco.Web.Compose private class InstructionProcessTask : RecurringTaskBase { - private readonly DatabaseServerMessenger _messenger; + private readonly IDatabaseServerMessenger _messenger; private readonly ILogger _logger; public InstructionProcessTask(IBackgroundTaskRunner runner, int delayMilliseconds, int periodMilliseconds, - DatabaseServerMessenger messenger, ILogger logger) + IDatabaseServerMessenger messenger, ILogger logger) : base(runner, delayMilliseconds, periodMilliseconds) { _messenger = messenger; diff --git a/src/Umbraco.Infrastructure/Compose/ManifestWatcherComponent.cs b/src/Umbraco.Infrastructure/Compose/ManifestWatcherComponent.cs index 334183a48c..d4e22bbfde 100644 --- a/src/Umbraco.Infrastructure/Compose/ManifestWatcherComponent.cs +++ b/src/Umbraco.Infrastructure/Compose/ManifestWatcherComponent.cs @@ -4,6 +4,7 @@ using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Manifest; +using Umbraco.Net; namespace Umbraco.Core.Compose { @@ -12,18 +13,18 @@ namespace Umbraco.Core.Compose private readonly IRuntimeState _runtimeState; private readonly ILogger _logger; private readonly IIOHelper _ioHelper; - private readonly IHostingEnvironment _hostingEnvironment; + private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; // if configured and in debug mode, a ManifestWatcher watches App_Plugins folders for // package.manifest chances and restarts the application on any change private ManifestWatcher _mw; - public ManifestWatcherComponent(IRuntimeState runtimeState, ILogger logger, IIOHelper ioHelper, IHostingEnvironment hostingEnvironment) + public ManifestWatcherComponent(IRuntimeState runtimeState, ILogger logger, IIOHelper ioHelper, IUmbracoApplicationLifetime umbracoApplicationLifetime) { _runtimeState = runtimeState; _logger = logger; _ioHelper = ioHelper; - _hostingEnvironment = hostingEnvironment; + _umbracoApplicationLifetime = umbracoApplicationLifetime; } public void Initialize() @@ -36,7 +37,7 @@ namespace Umbraco.Core.Compose var appPlugins = _ioHelper.MapPath("~/App_Plugins/"); if (Directory.Exists(appPlugins) == false) return; - _mw = new ManifestWatcher(_logger, _hostingEnvironment); + _mw = new ManifestWatcher(_logger, _umbracoApplicationLifetime); _mw.Start(Directory.GetDirectories(appPlugins)); } diff --git a/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs b/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs index 41fc097ff3..b39e5c03e9 100644 --- a/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs +++ b/src/Umbraco.Infrastructure/Compose/NotificationsComponent.cs @@ -148,13 +148,12 @@ namespace Umbraco.Web.Compose /// public sealed class Notifier { - private readonly ICurrentUserAccessor _currentUserAccessor; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly IRuntimeState _runtimeState; private readonly INotificationService _notificationService; private readonly IUserService _userService; private readonly ILocalizedTextService _textService; private readonly IGlobalSettings _globalSettings; - private readonly IContentSection _contentConfig; private readonly ILogger _logger; /// @@ -167,21 +166,20 @@ namespace Umbraco.Web.Compose /// /// /// - public Notifier(ICurrentUserAccessor currentUserAccessor, IRuntimeState runtimeState, INotificationService notificationService, IUserService userService, ILocalizedTextService textService, IGlobalSettings globalSettings, IContentSection contentConfig, ILogger logger) + public Notifier(IUmbracoContextAccessor umbracoContextAccessor, IRuntimeState runtimeState, INotificationService notificationService, IUserService userService, ILocalizedTextService textService, IGlobalSettings globalSettings, ILogger logger) { - _currentUserAccessor = currentUserAccessor; + _umbracoContextAccessor = umbracoContextAccessor; _runtimeState = runtimeState; _notificationService = notificationService; _userService = userService; _textService = textService; _globalSettings = globalSettings; - _contentConfig = contentConfig; _logger = logger; } public void Notify(IAction action, params IContent[] entities) { - var user = _currentUserAccessor.TryGetCurrentUser(); + var user = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser; //if there is no current user, then use the admin if (user == null) diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs index 7169b93cb4..5c931a225b 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs @@ -1,4 +1,6 @@ -using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Configuration; +using Umbraco.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; namespace Umbraco.Core.Composing.CompositionExtensions { diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs index 5318c47a40..9a23255cc4 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs @@ -48,6 +48,8 @@ namespace Umbraco.Core.Composing.CompositionExtensions composition.RegisterUnique(); composition.RegisterUnique(); composition.RegisterUnique(); + composition.RegisterUnique(); + composition.RegisterUnique(); return composition; } diff --git a/src/Umbraco.Web/Editors/UserEditorAuthorizationHelper.cs b/src/Umbraco.Infrastructure/Editors/UserEditorAuthorizationHelper.cs similarity index 99% rename from src/Umbraco.Web/Editors/UserEditorAuthorizationHelper.cs rename to src/Umbraco.Infrastructure/Editors/UserEditorAuthorizationHelper.cs index 320580aaf9..63b5cc90dc 100644 --- a/src/Umbraco.Web/Editors/UserEditorAuthorizationHelper.cs +++ b/src/Umbraco.Infrastructure/Editors/UserEditorAuthorizationHelper.cs @@ -8,7 +8,7 @@ using Umbraco.Core.Services; namespace Umbraco.Web.Editors { - internal class UserEditorAuthorizationHelper + public class UserEditorAuthorizationHelper { private readonly IContentService _contentService; private readonly IMediaService _mediaService; diff --git a/src/Umbraco.Examine/BaseValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/BaseValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/BaseValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/BaseValueSetBuilder.cs diff --git a/src/Umbraco.Examine/ContentIndexPopulator.cs b/src/Umbraco.Infrastructure/Examine/ContentIndexPopulator.cs similarity index 100% rename from src/Umbraco.Examine/ContentIndexPopulator.cs rename to src/Umbraco.Infrastructure/Examine/ContentIndexPopulator.cs diff --git a/src/Umbraco.Examine/ContentValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/ContentValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/ContentValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/ContentValueSetBuilder.cs diff --git a/src/Umbraco.Examine/ContentValueSetValidator.cs b/src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs similarity index 100% rename from src/Umbraco.Examine/ContentValueSetValidator.cs rename to src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs diff --git a/src/Umbraco.Web/ExamineExtensions.cs b/src/Umbraco.Infrastructure/Examine/ExamineExtensions.cs similarity index 100% rename from src/Umbraco.Web/ExamineExtensions.cs rename to src/Umbraco.Infrastructure/Examine/ExamineExtensions.cs diff --git a/src/Umbraco.Examine/GenericIndexDiagnostics.cs b/src/Umbraco.Infrastructure/Examine/GenericIndexDiagnostics.cs similarity index 100% rename from src/Umbraco.Examine/GenericIndexDiagnostics.cs rename to src/Umbraco.Infrastructure/Examine/GenericIndexDiagnostics.cs diff --git a/src/Umbraco.Examine/IBackOfficeExamineSearcher.cs b/src/Umbraco.Infrastructure/Examine/IBackOfficeExamineSearcher.cs similarity index 100% rename from src/Umbraco.Examine/IBackOfficeExamineSearcher.cs rename to src/Umbraco.Infrastructure/Examine/IBackOfficeExamineSearcher.cs diff --git a/src/Umbraco.Examine/IContentValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/IContentValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/IContentValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/IContentValueSetBuilder.cs diff --git a/src/Umbraco.Examine/IContentValueSetValidator.cs b/src/Umbraco.Infrastructure/Examine/IContentValueSetValidator.cs similarity index 100% rename from src/Umbraco.Examine/IContentValueSetValidator.cs rename to src/Umbraco.Infrastructure/Examine/IContentValueSetValidator.cs diff --git a/src/Umbraco.Examine/IIndexCreator.cs b/src/Umbraco.Infrastructure/Examine/IIndexCreator.cs similarity index 100% rename from src/Umbraco.Examine/IIndexCreator.cs rename to src/Umbraco.Infrastructure/Examine/IIndexCreator.cs diff --git a/src/Umbraco.Examine/IIndexDiagnostics.cs b/src/Umbraco.Infrastructure/Examine/IIndexDiagnostics.cs similarity index 100% rename from src/Umbraco.Examine/IIndexDiagnostics.cs rename to src/Umbraco.Infrastructure/Examine/IIndexDiagnostics.cs diff --git a/src/Umbraco.Examine/IIndexDiagnosticsFactory.cs b/src/Umbraco.Infrastructure/Examine/IIndexDiagnosticsFactory.cs similarity index 100% rename from src/Umbraco.Examine/IIndexDiagnosticsFactory.cs rename to src/Umbraco.Infrastructure/Examine/IIndexDiagnosticsFactory.cs diff --git a/src/Umbraco.Examine/IIndexPopulator.cs b/src/Umbraco.Infrastructure/Examine/IIndexPopulator.cs similarity index 100% rename from src/Umbraco.Examine/IIndexPopulator.cs rename to src/Umbraco.Infrastructure/Examine/IIndexPopulator.cs diff --git a/src/Umbraco.Examine/IPublishedContentValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/IPublishedContentValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/IPublishedContentValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/IPublishedContentValueSetBuilder.cs diff --git a/src/Umbraco.Examine/IUmbracoContentIndex.cs b/src/Umbraco.Infrastructure/Examine/IUmbracoContentIndex.cs similarity index 100% rename from src/Umbraco.Examine/IUmbracoContentIndex.cs rename to src/Umbraco.Infrastructure/Examine/IUmbracoContentIndex.cs diff --git a/src/Umbraco.Examine/IUmbracoIndex.cs b/src/Umbraco.Infrastructure/Examine/IUmbracoIndex.cs similarity index 100% rename from src/Umbraco.Examine/IUmbracoIndex.cs rename to src/Umbraco.Infrastructure/Examine/IUmbracoIndex.cs diff --git a/src/Umbraco.Examine/IUmbracoIndexConfig.cs b/src/Umbraco.Infrastructure/Examine/IUmbracoIndexConfig.cs similarity index 100% rename from src/Umbraco.Examine/IUmbracoIndexConfig.cs rename to src/Umbraco.Infrastructure/Examine/IUmbracoIndexConfig.cs diff --git a/src/Umbraco.Examine/IUmbracoIndexesCreator.cs b/src/Umbraco.Infrastructure/Examine/IUmbracoIndexesCreator.cs similarity index 100% rename from src/Umbraco.Examine/IUmbracoIndexesCreator.cs rename to src/Umbraco.Infrastructure/Examine/IUmbracoIndexesCreator.cs diff --git a/src/Umbraco.Examine/IUmbracoMemberIndex.cs b/src/Umbraco.Infrastructure/Examine/IUmbracoMemberIndex.cs similarity index 100% rename from src/Umbraco.Examine/IUmbracoMemberIndex.cs rename to src/Umbraco.Infrastructure/Examine/IUmbracoMemberIndex.cs diff --git a/src/Umbraco.Examine/IUmbracoTreeSearcherFields.cs b/src/Umbraco.Infrastructure/Examine/IUmbracoTreeSearcherFields.cs similarity index 100% rename from src/Umbraco.Examine/IUmbracoTreeSearcherFields.cs rename to src/Umbraco.Infrastructure/Examine/IUmbracoTreeSearcherFields.cs diff --git a/src/Umbraco.Examine/IValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/IValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/IValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/IValueSetBuilder.cs diff --git a/src/Umbraco.Examine/IndexDiagnosticsFactory.cs b/src/Umbraco.Infrastructure/Examine/IndexDiagnosticsFactory.cs similarity index 100% rename from src/Umbraco.Examine/IndexDiagnosticsFactory.cs rename to src/Umbraco.Infrastructure/Examine/IndexDiagnosticsFactory.cs diff --git a/src/Umbraco.Examine/IndexPopulator.cs b/src/Umbraco.Infrastructure/Examine/IndexPopulator.cs similarity index 100% rename from src/Umbraco.Examine/IndexPopulator.cs rename to src/Umbraco.Infrastructure/Examine/IndexPopulator.cs diff --git a/src/Umbraco.Examine/IndexRebuilder.cs b/src/Umbraco.Infrastructure/Examine/IndexRebuilder.cs similarity index 100% rename from src/Umbraco.Examine/IndexRebuilder.cs rename to src/Umbraco.Infrastructure/Examine/IndexRebuilder.cs diff --git a/src/Umbraco.Examine/IndexRebuildingEventArgs.cs b/src/Umbraco.Infrastructure/Examine/IndexRebuildingEventArgs.cs similarity index 100% rename from src/Umbraco.Examine/IndexRebuildingEventArgs.cs rename to src/Umbraco.Infrastructure/Examine/IndexRebuildingEventArgs.cs diff --git a/src/Umbraco.Examine/IndexTypes.cs b/src/Umbraco.Infrastructure/Examine/IndexTypes.cs similarity index 100% rename from src/Umbraco.Examine/IndexTypes.cs rename to src/Umbraco.Infrastructure/Examine/IndexTypes.cs diff --git a/src/Umbraco.Examine/MediaIndexPopulator.cs b/src/Umbraco.Infrastructure/Examine/MediaIndexPopulator.cs similarity index 100% rename from src/Umbraco.Examine/MediaIndexPopulator.cs rename to src/Umbraco.Infrastructure/Examine/MediaIndexPopulator.cs diff --git a/src/Umbraco.Examine/MediaValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/MediaValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/MediaValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/MediaValueSetBuilder.cs diff --git a/src/Umbraco.Examine/MemberIndexPopulator.cs b/src/Umbraco.Infrastructure/Examine/MemberIndexPopulator.cs similarity index 100% rename from src/Umbraco.Examine/MemberIndexPopulator.cs rename to src/Umbraco.Infrastructure/Examine/MemberIndexPopulator.cs diff --git a/src/Umbraco.Examine/MemberValueSetBuilder.cs b/src/Umbraco.Infrastructure/Examine/MemberValueSetBuilder.cs similarity index 100% rename from src/Umbraco.Examine/MemberValueSetBuilder.cs rename to src/Umbraco.Infrastructure/Examine/MemberValueSetBuilder.cs diff --git a/src/Umbraco.Examine/MemberValueSetValidator.cs b/src/Umbraco.Infrastructure/Examine/MemberValueSetValidator.cs similarity index 100% rename from src/Umbraco.Examine/MemberValueSetValidator.cs rename to src/Umbraco.Infrastructure/Examine/MemberValueSetValidator.cs diff --git a/src/Umbraco.Examine/PublishedContentIndexPopulator.cs b/src/Umbraco.Infrastructure/Examine/PublishedContentIndexPopulator.cs similarity index 100% rename from src/Umbraco.Examine/PublishedContentIndexPopulator.cs rename to src/Umbraco.Infrastructure/Examine/PublishedContentIndexPopulator.cs diff --git a/src/Umbraco.Examine/UmbracoExamineExtensions.cs b/src/Umbraco.Infrastructure/Examine/UmbracoExamineExtensions.cs similarity index 100% rename from src/Umbraco.Examine/UmbracoExamineExtensions.cs rename to src/Umbraco.Infrastructure/Examine/UmbracoExamineExtensions.cs diff --git a/src/Umbraco.Examine/UmbracoExamineFieldNames.cs b/src/Umbraco.Infrastructure/Examine/UmbracoExamineFieldNames.cs similarity index 100% rename from src/Umbraco.Examine/UmbracoExamineFieldNames.cs rename to src/Umbraco.Infrastructure/Examine/UmbracoExamineFieldNames.cs diff --git a/src/Umbraco.Examine/UmbracoFieldDefinitionCollection.cs b/src/Umbraco.Infrastructure/Examine/UmbracoFieldDefinitionCollection.cs similarity index 100% rename from src/Umbraco.Examine/UmbracoFieldDefinitionCollection.cs rename to src/Umbraco.Infrastructure/Examine/UmbracoFieldDefinitionCollection.cs diff --git a/src/Umbraco.Examine/UmbracoIndexConfig.cs b/src/Umbraco.Infrastructure/Examine/UmbracoIndexConfig.cs similarity index 100% rename from src/Umbraco.Examine/UmbracoIndexConfig.cs rename to src/Umbraco.Infrastructure/Examine/UmbracoIndexConfig.cs diff --git a/src/Umbraco.Examine/ValueSetValidator.cs b/src/Umbraco.Infrastructure/Examine/ValueSetValidator.cs similarity index 100% rename from src/Umbraco.Examine/ValueSetValidator.cs rename to src/Umbraco.Infrastructure/Examine/ValueSetValidator.cs diff --git a/src/Umbraco.Web/IPublishedContentQuery.cs b/src/Umbraco.Infrastructure/IPublishedContentQuery.cs similarity index 95% rename from src/Umbraco.Web/IPublishedContentQuery.cs rename to src/Umbraco.Infrastructure/IPublishedContentQuery.cs index 7066475dc9..c5f49c3e0b 100644 --- a/src/Umbraco.Web/IPublishedContentQuery.cs +++ b/src/Umbraco.Infrastructure/IPublishedContentQuery.cs @@ -8,19 +8,23 @@ using Umbraco.Core.Xml; namespace Umbraco.Web { - using Examine = global::Examine; - /// /// Query methods used for accessing strongly typed content in templates /// public interface IPublishedContentQuery { + + + IPublishedContent Content(int id); IPublishedContent Content(Guid id); IPublishedContent Content(Udi id); + IPublishedContent Content(object id); IPublishedContent ContentSingleAtXPath(string xpath, params XPathVariable[] vars); IEnumerable Content(IEnumerable ids); IEnumerable Content(IEnumerable ids); + + IEnumerable Content(IEnumerable ids); IEnumerable ContentAtXPath(string xpath, params XPathVariable[] vars); IEnumerable ContentAtXPath(XPathExpression xpath, params XPathVariable[] vars); IEnumerable ContentAtRoot(); @@ -28,7 +32,10 @@ namespace Umbraco.Web IPublishedContent Media(int id); IPublishedContent Media(Guid id); IPublishedContent Media(Udi id); + + IPublishedContent Media(object id); IEnumerable Media(IEnumerable ids); + IEnumerable Media(IEnumerable ids); IEnumerable Media(IEnumerable ids); IEnumerable MediaAtRoot(); diff --git a/src/Umbraco.Web/Install/InstallHelper.cs b/src/Umbraco.Infrastructure/Intall/InstallHelper.cs similarity index 61% rename from src/Umbraco.Web/Install/InstallHelper.cs rename to src/Umbraco.Infrastructure/Intall/InstallHelper.cs index 54d1475ec6..a5b4f71d8e 100644 --- a/src/Umbraco.Web/Install/InstallHelper.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallHelper.cs @@ -2,14 +2,17 @@ using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Web; +using System.Threading.Tasks; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.Cookie; using Umbraco.Core.Logging; using Umbraco.Core.Migrations.Install; +using Umbraco.Core.Models; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Web.Composing; +using Umbraco.Core.Serialization; +using Umbraco.Core.Services; +using Umbraco.Net; using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install @@ -18,23 +21,38 @@ namespace Umbraco.Web.Install { private static HttpClient _httpClient; private readonly DatabaseBuilder _databaseBuilder; - private readonly HttpContextBase _httpContext; private readonly ILogger _logger; private readonly IGlobalSettings _globalSettings; private readonly IUmbracoVersion _umbracoVersion; private readonly IConnectionStrings _connectionStrings; + private readonly IInstallationService _installationService; + private readonly ICookieManager _cookieManager; + private readonly IUserAgentProvider _userAgentProvider; + private readonly IUmbracoDatabaseFactory _umbracoDatabaseFactory; + private readonly IJsonSerializer _jsonSerializer; private InstallationType? _installationType; - public InstallHelper(IUmbracoContextAccessor umbracoContextAccessor, - DatabaseBuilder databaseBuilder, - ILogger logger, IGlobalSettings globalSettings, IUmbracoVersion umbracoVersion, IConnectionStrings connectionStrings) + public InstallHelper(DatabaseBuilder databaseBuilder, + ILogger logger, + IGlobalSettings globalSettings, + IUmbracoVersion umbracoVersion, + IConnectionStrings connectionStrings, + IInstallationService installationService, + ICookieManager cookieManager, + IUserAgentProvider userAgentProvider, + IUmbracoDatabaseFactory umbracoDatabaseFactory, + IJsonSerializer jsonSerializer) { - _httpContext = umbracoContextAccessor.UmbracoContext.HttpContext; _logger = logger; _globalSettings = globalSettings; _umbracoVersion = umbracoVersion; _databaseBuilder = databaseBuilder; _connectionStrings = connectionStrings ?? throw new ArgumentNullException(nameof(connectionStrings)); + _installationService = installationService; + _cookieManager = cookieManager; + _userAgentProvider = userAgentProvider; + _umbracoDatabaseFactory = umbracoDatabaseFactory; + _jsonSerializer = jsonSerializer; } public InstallationType GetInstallationType() @@ -42,16 +60,16 @@ namespace Umbraco.Web.Install return _installationType ?? (_installationType = IsBrandNewInstall ? InstallationType.NewInstall : InstallationType.Upgrade).Value; } - internal void InstallStatus(bool isCompleted, string errorMsg) + public async Task InstallStatus(bool isCompleted, string errorMsg) { try { - var userAgent = _httpContext.Request.UserAgent; + var userAgent = _userAgentProvider.GetUserAgent(); // Check for current install Id var installId = Guid.NewGuid(); - var installCookie = _httpContext.Request.GetCookieValue(Constants.Web.InstallerCookieName); + var installCookie = _cookieManager.GetCookieValue(Constants.Web.InstallerCookieName); if (string.IsNullOrEmpty(installCookie) == false) { if (Guid.TryParse(installCookie, out installId)) @@ -60,29 +78,29 @@ namespace Umbraco.Web.Install if (installId == Guid.Empty) installId = Guid.NewGuid(); } + else + { + installId = Guid.NewGuid(); // Guid.TryParse will have reset installId to Guid.Empty + } } - _httpContext.Response.Cookies.Set(new HttpCookie(Constants.Web.InstallerCookieName, "1")); + + _cookieManager.SetCookieValue(Constants.Web.InstallerCookieName, installId.ToString()); var dbProvider = string.Empty; if (IsBrandNewInstall == false) { // we don't have DatabaseProvider anymore... doing it differently //dbProvider = ApplicationContext.Current.DatabaseContext.DatabaseProvider.ToString(); - dbProvider = GetDbProviderString(Current.SqlContext); + dbProvider = _umbracoDatabaseFactory.SqlContext.SqlSyntax.DbProvider; } - var check = new org.umbraco.update.CheckForUpgrade(); - check.Install(installId, - IsBrandNewInstall == false, - isCompleted, - DateTime.Now, - _umbracoVersion.Current.Major, - _umbracoVersion.Current.Minor, - _umbracoVersion.Current.Build, - _umbracoVersion.Comment, - errorMsg, - userAgent, - dbProvider); + var installLog = new InstallLog(installId: installId, isUpgrade: IsBrandNewInstall == false, + installCompleted: isCompleted, timestamp: DateTime.Now, versionMajor: _umbracoVersion.Current.Major, + versionMinor: _umbracoVersion.Current.Minor, versionPatch: _umbracoVersion.Current.Build, + versionComment: _umbracoVersion.Comment, error: errorMsg, userAgent: userAgent, + dbProvider: dbProvider); + + await _installationService.LogInstall(installLog); } catch (Exception ex) { @@ -90,23 +108,6 @@ namespace Umbraco.Web.Install } } - internal static string GetDbProviderString(ISqlContext sqlContext) - { - var dbProvider = string.Empty; - - // we don't have DatabaseProvider anymore... - //dbProvider = ApplicationContext.Current.DatabaseContext.DatabaseProvider.ToString(); - // - // doing it differently - var syntax = sqlContext.SqlSyntax; - if (syntax is SqlCeSyntaxProvider) - dbProvider = "SqlServerCE"; - else if (syntax is SqlServerSyntaxProvider) - dbProvider = (syntax as SqlServerSyntaxProvider).ServerVersion.IsAzure ? "SqlAzure" : "SqlServer"; - - return dbProvider; - } - /// /// Checks if this is a brand new install meaning that there is no configured version and there is no configured database connection /// @@ -134,7 +135,7 @@ namespace Umbraco.Web.Install } } - internal IEnumerable GetStarterKits() + public IEnumerable GetStarterKits() { if (_httpClient == null) _httpClient = new HttpClient(); @@ -147,7 +148,10 @@ namespace Umbraco.Web.Install using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri)) { var response = _httpClient.SendAsync(request).Result; - packages = response.Content.ReadAsAsync>().Result.ToList(); + + + var json = response.Content.ReadAsStringAsync().Result; + packages = _jsonSerializer.Deserialize>(json).ToList(); } } catch (AggregateException ex) diff --git a/src/Umbraco.Web/Install/InstallSteps/ConfigureMachineKey.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/ConfigureMachineKey.cs similarity index 85% rename from src/Umbraco.Web/Install/InstallSteps/ConfigureMachineKey.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/ConfigureMachineKey.cs index 164c142e0c..fb8201600c 100644 --- a/src/Umbraco.Web/Install/InstallSteps/ConfigureMachineKey.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/ConfigureMachineKey.cs @@ -1,7 +1,7 @@ using System.Linq; using System.Threading.Tasks; -using System.Web.Configuration; using System.Xml.Linq; +using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Security; using Umbraco.Web.Install.Models; @@ -12,13 +12,15 @@ namespace Umbraco.Web.Install.InstallSteps "ConfigureMachineKey", "machinekey", 2, "Updating some security settings...", PerformsAppRestart = true)] - internal class ConfigureMachineKey : InstallSetupStep + public class ConfigureMachineKey : InstallSetupStep { private readonly IIOHelper _ioHelper; + private readonly IMachineKeyConfig _machineKeyConfig; - public ConfigureMachineKey(IIOHelper ioHelper) + public ConfigureMachineKey(IIOHelper ioHelper, IMachineKeyConfig machineKeyConfig) { _ioHelper = ioHelper; + _machineKeyConfig = machineKeyConfig; } public override string View => HasMachineKey() == false ? base.View : ""; @@ -27,10 +29,9 @@ namespace Umbraco.Web.Install.InstallSteps /// Don't display the view or execute if a machine key already exists /// /// - private static bool HasMachineKey() + private bool HasMachineKey() { - var section = (MachineKeySection) WebConfigurationManager.GetSection("system.web/machineKey"); - return section.ElementInformation.Source != null; + return _machineKeyConfig.HasMachineKey; } /// diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseConfigureStep.cs similarity index 98% rename from src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseConfigureStep.cs index dbf664bc93..3a978cc47a 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseConfigureStep.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseConfigureStep.cs @@ -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 + public class DatabaseConfigureStep : InstallSetupStep { private readonly DatabaseBuilder _databaseBuilder; private readonly ILogger _logger; diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseInstallStep.cs similarity index 79% rename from src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseInstallStep.cs index 843b5ff887..a7b3dcc218 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseInstallStep.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseInstallStep.cs @@ -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 + public class DatabaseInstallStep : InstallSetupStep { 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 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(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 { diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseUpgradeStep.cs similarity index 97% rename from src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseUpgradeStep.cs index 603fbd726c..3cd3c1ca56 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/DatabaseUpgradeStep.cs @@ -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 + public class DatabaseUpgradeStep : InstallSetupStep { 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(null); diff --git a/src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/SetUmbracoVersionStep.cs similarity index 70% rename from src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/SetUmbracoVersionStep.cs index 63247f5f0b..17043f18a5 100644 --- a/src/Umbraco.Web/Install/InstallSteps/SetUmbracoVersionStep.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/SetUmbracoVersionStep.cs @@ -1,44 +1,31 @@ using System.Threading.Tasks; -using System.Web; using Umbraco.Core; using Umbraco.Core.Configuration; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Services; -using Umbraco.Web.Cache; -using Umbraco.Web.Composing; using Umbraco.Web.Install.Models; -using Umbraco.Web.Security; - namespace Umbraco.Web.Install.InstallSteps { [InstallSetupStep(InstallationType.NewInstall | InstallationType.Upgrade, - "UmbracoVersion", 50, "Installation is complete!, get ready to be redirected to your new CMS.", + "UmbracoVersion", 50, "Installation is complete! Get ready to be redirected to your new CMS.", PerformsAppRestart = true)] - internal class SetUmbracoVersionStep : InstallSetupStep + public class SetUmbracoVersionStep : InstallSetupStep { - private readonly HttpContextBase _httpContext; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly InstallHelper _installHelper; private readonly IGlobalSettings _globalSettings; - private readonly IUserService _userService; private readonly IUmbracoVersion _umbracoVersion; - private readonly IIOHelper _ioHelper; - public SetUmbracoVersionStep(HttpContextBase httpContext, InstallHelper installHelper, IGlobalSettings globalSettings, IUserService userService, IUmbracoVersion umbracoVersion, IIOHelper ioHelper) + public SetUmbracoVersionStep(IUmbracoContextAccessor umbracoContextAccessor, InstallHelper installHelper, IGlobalSettings globalSettings, IUmbracoVersion umbracoVersion) { - _httpContext = httpContext; + _umbracoContextAccessor = umbracoContextAccessor; _installHelper = installHelper; _globalSettings = globalSettings; - _userService = userService; _umbracoVersion = umbracoVersion; - _ioHelper = ioHelper; } public override Task ExecuteAsync(object model) { - var security = new WebSecurity(_httpContext, _userService, _globalSettings, _ioHelper); - + var security = _umbracoContextAccessor.GetRequiredUmbracoContext().Security; if (security.IsAuthenticated() == false && _globalSettings.ConfigurationStatus.IsNullOrWhiteSpace()) { security.PerformLogin(-1); diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/StarterKitDownloadStep.cs similarity index 93% rename from src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/StarterKitDownloadStep.cs index 624f5897c7..d8986cacb7 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/StarterKitDownloadStep.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; -using System.Web; using Umbraco.Core.Services; using Umbraco.Core.Configuration; using Umbraco.Core.Models.Packaging; -using Umbraco.Web.Composing; +using Umbraco.Net; using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps @@ -20,14 +18,16 @@ namespace Umbraco.Web.Install.InstallSteps private readonly InstallHelper _installHelper; private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly IUmbracoVersion _umbracoVersion; + private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; private readonly IContentService _contentService; private readonly IPackagingService _packageService; - public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IUmbracoContextAccessor umbracoContextAccessor, IUmbracoVersion umbracoVersion) + public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IUmbracoContextAccessor umbracoContextAccessor, IUmbracoVersion umbracoVersion, IUmbracoApplicationLifetime umbracoApplicationLifetime) { _installHelper = installHelper; _umbracoContextAccessor = umbracoContextAccessor; _umbracoVersion = umbracoVersion; + _umbracoApplicationLifetime = umbracoApplicationLifetime; _contentService = contentService; _packageService = packageService; } @@ -54,7 +54,7 @@ namespace Umbraco.Web.Install.InstallSteps var (packageFile, packageId) = await DownloadPackageFilesAsync(starterKitId.Value); - UmbracoApplication.Restart(); + _umbracoApplicationLifetime.Restart(); return new InstallSetupResult(new Dictionary { diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs b/src/Umbraco.Infrastructure/Intall/InstallSteps/StarterKitInstallStep.cs similarity index 84% rename from src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs rename to src/Umbraco.Infrastructure/Intall/InstallSteps/StarterKitInstallStep.cs index 539b261cf3..cc269408f4 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitInstallStep.cs +++ b/src/Umbraco.Infrastructure/Intall/InstallSteps/StarterKitInstallStep.cs @@ -2,9 +2,8 @@ using System.IO; using System.Linq; using System.Threading.Tasks; -using System.Web; using Umbraco.Core.Services; -using Umbraco.Web.Composing; +using Umbraco.Net; using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install.InstallSteps @@ -14,13 +13,13 @@ namespace Umbraco.Web.Install.InstallSteps PerformsAppRestart = true)] internal class StarterKitInstallStep : InstallSetupStep { - private readonly HttpContextBase _httContext; + private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly IPackagingService _packagingService; - public StarterKitInstallStep(HttpContextBase httContext, IUmbracoContextAccessor umbracoContextAccessor, IPackagingService packagingService) + public StarterKitInstallStep(IUmbracoApplicationLifetime umbracoApplicationLifetime, IUmbracoContextAccessor umbracoContextAccessor, IPackagingService packagingService) { - _httContext = httContext; + _umbracoApplicationLifetime = umbracoApplicationLifetime; _umbracoContextAccessor = umbracoContextAccessor; _packagingService = packagingService; } @@ -34,7 +33,9 @@ namespace Umbraco.Web.Install.InstallSteps InstallBusinessLogic(packageId); - UmbracoApplication.Restart(_httContext); + _umbracoApplicationLifetime.Restart(); + + return Task.FromResult(null); } diff --git a/src/Umbraco.Web/Macros/MacroTagParser.cs b/src/Umbraco.Infrastructure/Macros/MacroTagParser.cs similarity index 96% rename from src/Umbraco.Web/Macros/MacroTagParser.cs rename to src/Umbraco.Infrastructure/Macros/MacroTagParser.cs index 7dea3674b0..2cbd84e20a 100644 --- a/src/Umbraco.Web/Macros/MacroTagParser.cs +++ b/src/Umbraco.Infrastructure/Macros/MacroTagParser.cs @@ -10,7 +10,7 @@ namespace Umbraco.Web.Macros /// /// Parses the macro syntax in a string and renders out it's contents /// - internal class MacroTagParser + public class MacroTagParser { private static readonly Regex MacroRteContent = new Regex(@"()", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Singleline); @@ -35,7 +35,7 @@ namespace Umbraco.Web.Macros /// {/div} /// /// - internal static string FormatRichTextPersistedDataForEditor(string persistedContent, IDictionary htmlAttributes) + public static string FormatRichTextPersistedDataForEditor(string persistedContent, IDictionary htmlAttributes) { return MacroPersistedFormat.Replace(persistedContent, match => { @@ -92,7 +92,7 @@ namespace Umbraco.Web.Macros /// since this is exactly how we need to persist it to the db. /// /// - internal static string FormatRichTextContentForPersistence(string rteContent) + public static string FormatRichTextContentForPersistence(string rteContent) { if (string.IsNullOrEmpty(rteContent)) { @@ -145,7 +145,7 @@ namespace Umbraco.Web.Macros /// This method simply parses the macro contents, it does not create a string or result, /// this is up to the developer calling this method to implement this with the callbacks. /// - internal static void ParseMacros( + public static void ParseMacros( string text, Action textFoundCallback, Action> macroFoundCallback ) diff --git a/src/Umbraco.Infrastructure/Media/Exif/ExifBitConverter.cs b/src/Umbraco.Infrastructure/Media/Exif/ExifBitConverter.cs index 86bd12c15e..1dcae62acd 100644 --- a/src/Umbraco.Infrastructure/Media/Exif/ExifBitConverter.cs +++ b/src/Umbraco.Infrastructure/Media/Exif/ExifBitConverter.cs @@ -12,7 +12,7 @@ namespace Umbraco.Web.Media.Exif public ExifBitConverter(ByteOrder from, ByteOrder to) : base(from, to) { - ; + } #endregion diff --git a/src/Umbraco.Infrastructure/Media/Exif/ExifExtendedProperty.cs b/src/Umbraco.Infrastructure/Media/Exif/ExifExtendedProperty.cs index 63c1ce3365..8889a13e1d 100644 --- a/src/Umbraco.Infrastructure/Media/Exif/ExifExtendedProperty.cs +++ b/src/Umbraco.Infrastructure/Media/Exif/ExifExtendedProperty.cs @@ -28,7 +28,7 @@ namespace Umbraco.Web.Media.Exif public ExifEnumProperty(ExifTag tag, T value) : this(tag, value, false) { - ; + } public override ExifInterOperability Interoperability @@ -210,13 +210,13 @@ namespace Umbraco.Web.Media.Exif public ExifPointSubjectArea(ExifTag tag, ushort[] value) : base(tag, value) { - ; + } public ExifPointSubjectArea(ExifTag tag, ushort x, ushort y) - : base(tag, new ushort[] { x, y }) + : base(tag, new ushort[] {x, y}) { - ; + } } @@ -239,13 +239,13 @@ namespace Umbraco.Web.Media.Exif public ExifCircularSubjectArea(ExifTag tag, ushort[] value) : base(tag, value) { - ; + } public ExifCircularSubjectArea(ExifTag tag, ushort x, ushort y, ushort d) : base(tag, new ushort[] { x, y, d }) { - ; + } } @@ -269,13 +269,13 @@ namespace Umbraco.Web.Media.Exif public ExifRectangularSubjectArea(ExifTag tag, ushort[] value) : base(tag, value) { - ; + } public ExifRectangularSubjectArea(ExifTag tag, ushort x, ushort y, ushort w, ushort h) : base(tag, new ushort[] { x, y, w, h }) { - ; + } } @@ -303,13 +303,13 @@ namespace Umbraco.Web.Media.Exif public GPSLatitudeLongitude(ExifTag tag, MathEx.UFraction32[] value) : base(tag, value) { - ; + } public GPSLatitudeLongitude(ExifTag tag, float d, float m, float s) : base(tag, new MathEx.UFraction32[] { new MathEx.UFraction32(d), new MathEx.UFraction32(m), new MathEx.UFraction32(s) }) { - ; + } } @@ -331,13 +331,13 @@ namespace Umbraco.Web.Media.Exif public GPSTimeStamp(ExifTag tag, MathEx.UFraction32[] value) : base(tag, value) { - ; + } public GPSTimeStamp(ExifTag tag, float h, float m, float s) : base(tag, new MathEx.UFraction32[] { new MathEx.UFraction32(h), new MathEx.UFraction32(m), new MathEx.UFraction32(s) }) { - ; + } } diff --git a/src/Umbraco.Infrastructure/Media/Exif/JFIFExtendedProperty.cs b/src/Umbraco.Infrastructure/Media/Exif/JFIFExtendedProperty.cs index 94b255f4d1..24b3ac74be 100644 --- a/src/Umbraco.Infrastructure/Media/Exif/JFIFExtendedProperty.cs +++ b/src/Umbraco.Infrastructure/Media/Exif/JFIFExtendedProperty.cs @@ -19,7 +19,7 @@ namespace Umbraco.Web.Media.Exif public JFIFVersion(ExifTag tag, ushort value) : base(tag, value) { - ; + } public override string ToString() diff --git a/src/Umbraco.Infrastructure/Media/Exif/JPEGSection.cs b/src/Umbraco.Infrastructure/Media/Exif/JPEGSection.cs index a1bc420fe4..78565d2bfa 100644 --- a/src/Umbraco.Infrastructure/Media/Exif/JPEGSection.cs +++ b/src/Umbraco.Infrastructure/Media/Exif/JPEGSection.cs @@ -45,7 +45,7 @@ public JPEGSection(JPEGMarker marker) : this(marker, new byte[0], new byte[0]) { - ; + } #endregion diff --git a/src/Umbraco.Infrastructure/Media/Exif/MathEx.cs b/src/Umbraco.Infrastructure/Media/Exif/MathEx.cs index 735358c40a..94cbccfbda 100644 --- a/src/Umbraco.Infrastructure/Media/Exif/MathEx.cs +++ b/src/Umbraco.Infrastructure/Media/Exif/MathEx.cs @@ -403,37 +403,37 @@ namespace Umbraco.Web.Media.Exif public Fraction32(int numerator, int denominator) : this(numerator, denominator, 0) { - ; + } public Fraction32(int numerator) : this(numerator, (int)1) { - ; + } public Fraction32(Fraction32 f) : this(f.Numerator, f.Denominator, f.Error) { - ; + } public Fraction32(float value) : this((double)value) { - ; + } public Fraction32(double value) : this(FromDouble(value)) { - ; + } public Fraction32(string s) : this(FromString(s)) { - ; + } #endregion @@ -1033,37 +1033,37 @@ namespace Umbraco.Web.Media.Exif public UFraction32(uint numerator, uint denominator) : this(numerator, denominator, 0) { - ; + } public UFraction32(uint numerator) : this(numerator, (uint)1) { - ; + } public UFraction32(UFraction32 f) : this(f.Numerator, f.Denominator, f.Error) { - ; + } public UFraction32(float value) : this((double)value) { - ; + } public UFraction32(double value) : this(FromDouble(value)) { - ; + } public UFraction32(string s) : this(FromString(s)) { - ; + } #endregion diff --git a/src/Umbraco.Infrastructure/Migrations/PostMigrations/ClearCsrfCookies.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/ClearCsrfCookies.cs new file mode 100644 index 0000000000..4f176c797f --- /dev/null +++ b/src/Umbraco.Infrastructure/Migrations/PostMigrations/ClearCsrfCookies.cs @@ -0,0 +1,25 @@ +using Umbraco.Core; +using Umbraco.Core.Cookie; +using Umbraco.Core.Migrations; + +namespace Umbraco.Web.Migrations.PostMigrations +{ + /// + /// Clears Csrf tokens. + /// + public class ClearCsrfCookies : IMigration + { + private readonly ICookieManager _cookieManager; + + public ClearCsrfCookies(ICookieManager cookieManager) + { + _cookieManager = cookieManager; + } + + public void Migrate() + { + _cookieManager.ExpireCookie(Constants.Web.AngularCookieName); + _cookieManager.ExpireCookie(Constants.Web.CsrfValidationCookieName); + } + } +} diff --git a/src/Umbraco.Infrastructure/Migrations/PostMigrations/NoopPublishedSnapshotRebuilder.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/NoopPublishedSnapshotRebuilder.cs new file mode 100644 index 0000000000..cf53f161a4 --- /dev/null +++ b/src/Umbraco.Infrastructure/Migrations/PostMigrations/NoopPublishedSnapshotRebuilder.cs @@ -0,0 +1,12 @@ +namespace Umbraco.Core.Migrations.PostMigrations +{ + /// + /// Implements in Umbraco.Core (doing nothing). + /// + public class NoopPublishedSnapshotRebuilder : IPublishedSnapshotRebuilder + { + /// + public void Rebuild() + { } + } +} diff --git a/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs index acc943b297..764e46af5d 100644 --- a/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs +++ b/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs @@ -1,12 +1,31 @@ -namespace Umbraco.Core.Migrations.PostMigrations +using Umbraco.Core.Migrations.PostMigrations; +using Umbraco.Web.Cache; +using Umbraco.Web.PublishedCache; + +namespace Umbraco.Web.Migrations.PostMigrations { /// - /// Implements in Umbraco.Core (doing nothing). + /// Implements in Umbraco.Web (rebuilding). /// public class PublishedSnapshotRebuilder : IPublishedSnapshotRebuilder { + private readonly IPublishedSnapshotService _publishedSnapshotService; + private readonly DistributedCache _distributedCache; + + /// + /// Initializes a new instance of the class. + /// + public PublishedSnapshotRebuilder(IPublishedSnapshotService publishedSnapshotService, DistributedCache distributedCache) + { + _publishedSnapshotService = publishedSnapshotService; + _distributedCache = distributedCache; + } + /// public void Rebuild() - { } + { + _publishedSnapshotService.Rebuild(); + _distributedCache.RefreshAllPublishedSnapshot(); + } } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs index 06a7f9aeb6..4ab5d386b0 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs @@ -36,7 +36,7 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0 if (string.IsNullOrEmpty(dataType.Configuration)) { config.Format = "YYYY-MM-DD"; - }; + } } catch (Exception ex) { diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs index 58ec0e30c2..bc3df6f584 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs @@ -18,11 +18,12 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_0_0 AddColumn("macroSource", out var sqls2); //populate the new columns with legacy data - Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = '', macroType = {(int)MacroTypes.Unknown}").Do(); - Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroXSLT, macroType = {(int)MacroTypes.Unknown} WHERE macroXSLT != '' AND macroXSLT IS NOT NULL").Do(); - Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroScriptAssembly, macroType = {(int)MacroTypes.Unknown} WHERE macroScriptAssembly != '' AND macroScriptAssembly IS NOT NULL").Do(); - Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroScriptType, macroType = {(int)MacroTypes.Unknown} WHERE macroScriptType != '' AND macroScriptType IS NOT NULL").Do(); - Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroPython, macroType = {(int)MacroTypes.PartialView} WHERE macroPython != '' AND macroPython IS NOT NULL").Do(); + //when the macro type is PartialView, it corresponds to 7, else it is 4 for Unknown + Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = '', macroType = 4").Do(); + Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroXSLT, macroType = 4 WHERE macroXSLT != '' AND macroXSLT IS NOT NULL").Do(); + Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroScriptAssembly, macroType = 4 WHERE macroScriptAssembly != '' AND macroScriptAssembly IS NOT NULL").Do(); + Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroScriptType, macroType = 4 WHERE macroScriptType != '' AND macroScriptType IS NOT NULL").Do(); + Execute.Sql($"UPDATE {Constants.DatabaseSchema.Tables.Macro} SET macroSource = macroPython, macroType = 7 WHERE macroPython != '' AND macroPython IS NOT NULL").Do(); //now apply constraints (NOT NULL) to new table foreach (var sql in sqls1) Execute.Sql(sql).Do(); diff --git a/src/Umbraco.Web/Models/ContentEditing/UserInvite.cs b/src/Umbraco.Infrastructure/Models/ContentEditing/UserInvite.cs similarity index 97% rename from src/Umbraco.Web/Models/ContentEditing/UserInvite.cs rename to src/Umbraco.Infrastructure/Models/ContentEditing/UserInvite.cs index 3adf10c467..f1c6cf6c04 100644 --- a/src/Umbraco.Web/Models/ContentEditing/UserInvite.cs +++ b/src/Umbraco.Infrastructure/Models/ContentEditing/UserInvite.cs @@ -2,8 +2,8 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.Serialization; +using Umbraco.Composing; using Umbraco.Core; -using Umbraco.Web.Composing; namespace Umbraco.Web.Models.ContentEditing { diff --git a/src/Umbraco.Web/Models/ContentTypeImportModel.cs b/src/Umbraco.Infrastructure/Models/ContentTypeImportModel.cs similarity index 100% rename from src/Umbraco.Web/Models/ContentTypeImportModel.cs rename to src/Umbraco.Infrastructure/Models/ContentTypeImportModel.cs diff --git a/src/Umbraco.Infrastructure/Models/DataType.cs b/src/Umbraco.Infrastructure/Models/DataType.cs index c237f6381c..299795f865 100644 --- a/src/Umbraco.Infrastructure/Models/DataType.cs +++ b/src/Umbraco.Infrastructure/Models/DataType.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Runtime.Serialization; using Newtonsoft.Json; using Umbraco.Core.Models.Entities; diff --git a/src/Umbraco.Web/Models/ImageProcessorImageUrlGenerator.cs b/src/Umbraco.Infrastructure/Models/ImageProcessorImageUrlGenerator.cs similarity index 98% rename from src/Umbraco.Web/Models/ImageProcessorImageUrlGenerator.cs rename to src/Umbraco.Infrastructure/Models/ImageProcessorImageUrlGenerator.cs index e471e9aa4a..f88309d7e3 100644 --- a/src/Umbraco.Web/Models/ImageProcessorImageUrlGenerator.cs +++ b/src/Umbraco.Infrastructure/Models/ImageProcessorImageUrlGenerator.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Models; namespace Umbraco.Web.Models { - internal class ImageProcessorImageUrlGenerator : IImageUrlGenerator + public class ImageProcessorImageUrlGenerator : IImageUrlGenerator { public string GetImageUrl(ImageUrlGenerationOptions options) { diff --git a/src/Umbraco.Web/Models/LocalPackageInstallModel.cs b/src/Umbraco.Infrastructure/Models/LocalPackageInstallModel.cs similarity index 100% rename from src/Umbraco.Web/Models/LocalPackageInstallModel.cs rename to src/Umbraco.Infrastructure/Models/LocalPackageInstallModel.cs diff --git a/src/Umbraco.Infrastructure/Models/Macro.cs b/src/Umbraco.Infrastructure/Models/Macro.cs index 95e3477212..083c288e09 100644 --- a/src/Umbraco.Infrastructure/Models/Macro.cs +++ b/src/Umbraco.Infrastructure/Models/Macro.cs @@ -40,7 +40,7 @@ namespace Umbraco.Core.Models /// /// /// - public Macro(IShortStringHelper shortStringHelper, int id, Guid key, bool useInEditor, int cacheDuration, string @alias, string name, bool cacheByPage, bool cacheByMember, bool dontRender, string macroSource, MacroTypes macroType) + public Macro(IShortStringHelper shortStringHelper, int id, Guid key, bool useInEditor, int cacheDuration, string @alias, string name, bool cacheByPage, bool cacheByMember, bool dontRender, string macroSource) : this(shortStringHelper) { Id = id; @@ -53,7 +53,6 @@ namespace Umbraco.Core.Models CacheByMember = cacheByMember; DontRender = dontRender; MacroSource = macroSource; - MacroType = macroType; } /// @@ -69,7 +68,6 @@ namespace Umbraco.Core.Models /// public Macro(IShortStringHelper shortStringHelper, string @alias, string name, string macroSource, - MacroTypes macroType, bool cacheByPage = false, bool cacheByMember = false, bool dontRender = true, @@ -85,7 +83,6 @@ namespace Umbraco.Core.Models CacheByMember = cacheByMember; DontRender = dontRender; MacroSource = macroSource; - MacroType = macroType; } private string _alias; @@ -96,7 +93,6 @@ namespace Umbraco.Core.Models private bool _cacheByMember; private bool _dontRender; private string _macroSource; - private MacroTypes _macroType = MacroTypes.Unknown; private MacroPropertyCollection _properties; private List _addedProperties; private List _removedProperties; @@ -247,16 +243,6 @@ namespace Umbraco.Core.Models set => SetPropertyValueAndDetectChanges(value, ref _macroSource, nameof(MacroSource)); } - /// - /// Gets or set the path to the Partial View to render - /// - [DataMember] - public MacroTypes MacroType - { - get => _macroType; - set => SetPropertyValueAndDetectChanges(value, ref _macroType, nameof(MacroType)); - } - /// /// Gets or sets a list of Macro Properties /// diff --git a/src/Umbraco.Web/Models/Mapping/CommonMapper.cs b/src/Umbraco.Infrastructure/Models/Mapping/CommonMapper.cs similarity index 66% rename from src/Umbraco.Web/Models/Mapping/CommonMapper.cs rename to src/Umbraco.Infrastructure/Models/Mapping/CommonMapper.cs index 7bf4a94b1c..2d7ee84675 100644 --- a/src/Umbraco.Web/Models/Mapping/CommonMapper.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/CommonMapper.cs @@ -1,8 +1,6 @@ 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; @@ -11,27 +9,27 @@ 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 { - internal class CommonMapper + public class CommonMapper { private readonly IUserService _userService; private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; - private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly ContentAppFactoryCollection _contentAppDefinitions; private readonly ILocalizedTextService _localizedTextService; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; public CommonMapper(IUserService userService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, ContentAppFactoryCollection contentAppDefinitions, ILocalizedTextService localizedTextService) { _userService = userService; _contentTypeBaseServiceProvider = contentTypeBaseServiceProvider; - _umbracoContextAccessor = umbracoContextAccessor; _contentAppDefinitions = contentAppDefinitions; _localizedTextService = localizedTextService; + _umbracoContextAccessor = umbracoContextAccessor; } public UserProfile GetOwner(IContentBase source, MapperContext context) @@ -48,10 +46,9 @@ namespace Umbraco.Web.Models.Mapping public ContentTypeBasic GetContentType(IContentBase source, MapperContext context) { - // TODO: We can resolve the UmbracoContext from the IValueResolver options! - // OMG - if (HttpContext.Current != null && Composing.Current.UmbracoContext != null && Composing.Current.UmbracoContext.Security.CurrentUser != null - && Composing.Current.UmbracoContext.Security.CurrentUser.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings))) + + var user = _umbracoContextAccessor.UmbracoContext?.Security?.CurrentUser; + if (user?.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings)) ?? false) { var contentType = _contentTypeBaseServiceProvider.GetContentTypeOf(source); var contentTypeBasic = context.Map(contentType); @@ -62,25 +59,6 @@ namespace Umbraco.Web.Models.Mapping return null; } - public string GetTreeNodeUrl(IContentBase source) - where TController : ContentTreeControllerBase - { - var umbracoContext = _umbracoContextAccessor.UmbracoContext; - if (umbracoContext == null) return null; - - var urlHelper = new UrlHelper(umbracoContext.HttpContext.Request.RequestContext); - return urlHelper.GetUmbracoApiService(controller => controller.GetTreeNode(source.Key.ToString("N"), null)); - } - - public string GetMemberTreeNodeUrl(IContentBase source) - { - var umbracoContext = _umbracoContextAccessor.UmbracoContext; - if (umbracoContext == null) return null; - - var urlHelper = new UrlHelper(umbracoContext.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/ContentTypeMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs similarity index 99% rename from src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs rename to src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs index de64b15a0f..f7a2d6376b 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs @@ -18,7 +18,7 @@ namespace Umbraco.Web.Models.Mapping /// /// Defines mappings for content/media/members type mappings /// - internal class ContentTypeMapDefinition : IMapDefinition + public class ContentTypeMapDefinition : IMapDefinition { private readonly PropertyEditorCollection _propertyEditors; private readonly IDataTypeService _dataTypeService; @@ -591,7 +591,7 @@ namespace Umbraco.Web.Models.Mapping return aliases.OrderBy(x => x); } - internal static Udi MapContentTypeUdi(IContentTypeComposition source) + public static Udi MapContentTypeUdi(IContentTypeComposition source) { if (source == null) return null; diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/DataTypeMapDefinition.cs similarity index 98% rename from src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs rename to src/Umbraco.Infrastructure/Models/Mapping/DataTypeMapDefinition.cs index 0446c397bc..d57809c844 100644 --- a/src/Umbraco.Web/Models/Mapping/DataTypeMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/DataTypeMapDefinition.cs @@ -7,12 +7,11 @@ using Umbraco.Core.Logging; using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; -using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping { - internal class DataTypeMapDefinition : IMapDefinition + public class DataTypeMapDefinition : IMapDefinition { private readonly PropertyEditorCollection _propertyEditors; private readonly ILogger _logger; @@ -142,7 +141,7 @@ namespace Umbraco.Web.Models.Mapping // an empty fields list, which made no sense since there would be nothing to map to - and besides, // a datatype without an editor alias is a serious issue - v8 wants an editor here - if (string.IsNullOrWhiteSpace(dataType.EditorAlias) || !Current.PropertyEditors.TryGet(dataType.EditorAlias, out var editor)) + if (string.IsNullOrWhiteSpace(dataType.EditorAlias) || !_propertyEditors.TryGet(dataType.EditorAlias, out var editor)) throw new InvalidOperationException($"Could not find a property editor with alias \"{dataType.EditorAlias}\"."); var configurationEditor = editor.GetConfigurationEditor(); 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/Models/Mapping/MemberTabsAndPropertiesMapper.cs b/src/Umbraco.Infrastructure/Models/Mapping/MemberTabsAndPropertiesMapper.cs similarity index 93% rename from src/Umbraco.Web/Models/Mapping/MemberTabsAndPropertiesMapper.cs rename to src/Umbraco.Infrastructure/Models/Mapping/MemberTabsAndPropertiesMapper.cs index 7dc3d55087..2cb226bec2 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberTabsAndPropertiesMapper.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/MemberTabsAndPropertiesMapper.cs @@ -3,12 +3,12 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core; using Umbraco.Core.Mapping; -using Umbraco.Web.Composing; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Core.Dictionary; using Umbraco.Core.Configuration; +using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.Models.Mapping { @@ -20,7 +20,7 @@ namespace Umbraco.Web.Models.Mapping /// This also ensures that the IsLocked out property is readonly when the member is not locked out - this is because /// an admin cannot actually set isLockedOut = true, they can only unlock. /// - internal class MemberTabsAndPropertiesMapper : TabsAndPropertiesMapper + public class MemberTabsAndPropertiesMapper : TabsAndPropertiesMapper { private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly ILocalizedTextService _localizedTextService; @@ -28,8 +28,17 @@ namespace Umbraco.Web.Models.Mapping private readonly IMemberService _memberService; private readonly IMemberGroupService _memberGroupService; private readonly IMemberPasswordConfiguration _memberPasswordConfiguration; + private readonly PropertyEditorCollection _propertyEditorCollection; - public MemberTabsAndPropertiesMapper(ICultureDictionary cultureDictionary, IUmbracoContextAccessor umbracoContextAccessor, ILocalizedTextService localizedTextService, IMemberTypeService memberTypeService, IMemberService memberService, IMemberGroupService memberGroupService, IMemberPasswordConfiguration memberPasswordConfiguration, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) + public MemberTabsAndPropertiesMapper(ICultureDictionary cultureDictionary, + IUmbracoContextAccessor umbracoContextAccessor, + ILocalizedTextService localizedTextService, + IMemberTypeService memberTypeService, + IMemberService memberService, + IMemberGroupService memberGroupService, + IMemberPasswordConfiguration memberPasswordConfiguration, + IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, + PropertyEditorCollection propertyEditorCollection) : base(cultureDictionary, localizedTextService, contentTypeBaseServiceProvider) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); @@ -38,6 +47,7 @@ namespace Umbraco.Web.Models.Mapping _memberService = memberService ?? throw new ArgumentNullException(nameof(memberService)); _memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService)); _memberPasswordConfiguration = memberPasswordConfiguration; + _propertyEditorCollection = propertyEditorCollection; } /// @@ -108,7 +118,7 @@ namespace Umbraco.Web.Models.Mapping Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}doctype", Label = _localizedTextService.Localize("content/membertype"), Value = _localizedTextService.UmbracoDictionaryTranslate(CultureDictionary, member.ContentType.Name), - View = Current.PropertyEditors[Constants.PropertyEditors.Aliases.Label].GetValueEditor().View + View = _propertyEditorCollection[Constants.PropertyEditors.Aliases.Label].GetValueEditor().View }, GetLoginProperty(_memberTypeService, member, _localizedTextService), new ContentPropertyDisplay diff --git a/src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs b/src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs similarity index 99% rename from src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs rename to src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs index 000e37f31f..5cdc9c5fa4 100644 --- a/src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs @@ -7,7 +7,6 @@ using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Core.Strings; -using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping diff --git a/src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/RedirectUrlMapDefinition.cs similarity index 52% rename from src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs rename to src/Umbraco.Infrastructure/Models/Mapping/RedirectUrlMapDefinition.cs index e773fcfee5..08c89b34f8 100644 --- a/src/Umbraco.Web/Models/Mapping/RedirectUrlMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/RedirectUrlMapDefinition.cs @@ -1,20 +1,19 @@ using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Routing; namespace Umbraco.Web.Models.Mapping { - internal class RedirectUrlMapDefinition : IMapDefinition + public class RedirectUrlMapDefinition : IMapDefinition { - private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public RedirectUrlMapDefinition(IUmbracoContextAccessor umbracoContextAccessor) + public RedirectUrlMapDefinition(IPublishedUrlProvider publishedUrlProvider) { - _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } - private UmbracoContext UmbracoContext => _umbracoContextAccessor.UmbracoContext; - public void DefineMaps(UmbracoMapper mapper) { mapper.Define((source, context) => new ContentRedirectUrl(), Map); @@ -26,8 +25,8 @@ namespace Umbraco.Web.Models.Mapping target.ContentId = source.ContentId; target.CreateDateUtc = source.CreateDateUtc; target.Culture = source.Culture; - target.DestinationUrl = source.ContentId > 0 ? UmbracoContext?.UrlProvider?.GetUrl(source.ContentId, culture: source.Culture) : "#"; - target.OriginalUrl = UmbracoContext?.UrlProvider?.GetUrlFromRoute(source.ContentId, source.Url, source.Culture); + target.DestinationUrl = source.ContentId > 0 ? _publishedUrlProvider?.GetUrl(source.ContentId, culture: source.Culture) : "#"; + target.OriginalUrl = _publishedUrlProvider?.GetUrlFromRoute(source.ContentId, source.Url, source.Culture); target.RedirectId = source.Key; } } diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs b/src/Umbraco.Infrastructure/Models/Mapping/TabsAndPropertiesMapper.cs similarity index 97% rename from src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs rename to src/Umbraco.Infrastructure/Models/Mapping/TabsAndPropertiesMapper.cs index ea062de9eb..d9c76b5ebc 100644 --- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesMapper.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/TabsAndPropertiesMapper.cs @@ -6,12 +6,11 @@ using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.Composing; using Umbraco.Core.Dictionary; namespace Umbraco.Web.Models.Mapping { - internal abstract class TabsAndPropertiesMapper + public abstract class TabsAndPropertiesMapper { protected ICultureDictionary CultureDictionary { get; } protected ILocalizedTextService LocalizedTextService { get; } @@ -115,7 +114,7 @@ namespace Umbraco.Web.Models.Mapping /// /// Creates the tabs collection with properties assigned for display models /// - internal class TabsAndPropertiesMapper : TabsAndPropertiesMapper + public class TabsAndPropertiesMapper : TabsAndPropertiesMapper where TSource : IContentBase { private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; diff --git a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/UserMapDefinition.cs similarity index 99% rename from src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs rename to src/Umbraco.Infrastructure/Models/Mapping/UserMapDefinition.cs index 556b15d72b..19a78bcbe4 100644 --- a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Models/Mapping/UserMapDefinition.cs @@ -4,7 +4,6 @@ using System.Globalization; using System.Linq; using Umbraco.Core; using Umbraco.Core.Cache; -using Umbraco.Web.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Mapping; @@ -20,7 +19,7 @@ using Umbraco.Web.Services; namespace Umbraco.Web.Models.Mapping { - internal class UserMapDefinition : IMapDefinition + public class UserMapDefinition : IMapDefinition { private readonly ISectionService _sectionService; private readonly IEntityService _entityService; diff --git a/src/Umbraco.Infrastructure/Models/MediaExtensions.cs b/src/Umbraco.Infrastructure/Models/MediaExtensions.cs index 08612d2810..41bcfdbc88 100644 --- a/src/Umbraco.Infrastructure/Models/MediaExtensions.cs +++ b/src/Umbraco.Infrastructure/Models/MediaExtensions.cs @@ -1,7 +1,5 @@ using System.Linq; -using Umbraco.Core.Composing; using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Logging; using Umbraco.Core.PropertyEditors; namespace Umbraco.Core.Models @@ -11,17 +9,15 @@ namespace Umbraco.Core.Models /// /// Gets the url of a media item. /// - public static string GetUrl(this IMedia media, string propertyAlias, ILogger logger, PropertyEditorCollection propertyEditors) + public static string GetUrl(this IMedia media, string propertyAlias, MediaUrlGeneratorCollection mediaUrlGenerators) { if (!media.Properties.TryGetValue(propertyAlias, out var property)) return string.Empty; - if (propertyEditors.TryGet(property.PropertyType.PropertyEditorAlias, out var editor) - && editor is IDataEditorWithMediaPath dataEditor) - { - // TODO: would need to be adjusted to variations, when media become variants - var value = property.GetValue(); - return dataEditor.GetMediaPath(value); + // TODO: would need to be adjusted to variations, when media become variants + if (mediaUrlGenerators.TryGetMediaPath(property.PropertyType.PropertyEditorAlias, property.GetValue(), out var mediaUrl)) + { + return mediaUrl; } // Without knowing what it is, just adding a string here might not be very nice @@ -31,10 +27,10 @@ namespace Umbraco.Core.Models /// /// Gets the urls of a media item. /// - public static string[] GetUrls(this IMedia media, IContentSection contentSection, ILogger logger, PropertyEditorCollection propertyEditors) + public static string[] GetUrls(this IMedia media, IContentSection contentSection, MediaUrlGeneratorCollection mediaUrlGenerators) { return contentSection.ImageAutoFillProperties - .Select(field => media.GetUrl(field.Alias, logger, propertyEditors)) + .Select(field => media.GetUrl(field.Alias, mediaUrlGenerators)) .Where(link => string.IsNullOrWhiteSpace(link) == false) .ToArray(); } diff --git a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs index 1699365dfd..6b1aa96e69 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs @@ -1133,7 +1133,6 @@ namespace Umbraco.Core.Packaging { var macroName = macroElement.Element("name").Value; var macroAlias = macroElement.Element("alias").Value; - var macroType = Enum.Parse(macroElement.Element("macroType").Value); var macroSource = macroElement.Element("macroSource").Value; //Following xml elements are treated as nullable properties @@ -1169,7 +1168,7 @@ namespace Umbraco.Core.Packaging } var existingMacro = _macroService.GetByAlias(macroAlias) as Macro; - var macro = existingMacro ?? new Macro(_shortStringHelper, macroAlias, macroName, macroSource, macroType, + var macro = existingMacro ?? new Macro(_shortStringHelper, macroAlias, macroName, macroSource, cacheByPage, cacheByMember, dontRender, useInEditor, cacheDuration); var properties = macroElement.Element("properties"); diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs index 4ae859ba80..13f9d3ee5c 100644 --- a/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs @@ -185,7 +185,7 @@ namespace Umbraco.Core.Persistence.Factories /// /// Builds a dto from an IMedia item. /// - public static MediaDto BuildDto(PropertyEditorCollection propertyEditors, IMedia entity) + public static MediaDto BuildDto(MediaUrlGeneratorCollection mediaUrlGenerators, IMedia entity) { var contentDto = BuildContentDto(entity, Constants.ObjectTypes.Media); @@ -193,7 +193,7 @@ namespace Umbraco.Core.Persistence.Factories { NodeId = entity.Id, ContentDto = contentDto, - MediaVersionDto = BuildMediaVersionDto(propertyEditors, entity, contentDto) + MediaVersionDto = BuildMediaVersionDto(mediaUrlGenerators, entity, contentDto) }; return dto; @@ -287,7 +287,7 @@ namespace Umbraco.Core.Persistence.Factories return dto; } - private static MediaVersionDto BuildMediaVersionDto(PropertyEditorCollection propertyEditors, IMedia entity, ContentDto contentDto) + private static MediaVersionDto BuildMediaVersionDto(MediaUrlGeneratorCollection mediaUrlGenerators, IMedia entity, ContentDto contentDto) { // try to get a path from the string being stored for media // TODO: only considering umbracoFile @@ -295,11 +295,9 @@ namespace Umbraco.Core.Persistence.Factories string path = null; if (entity.Properties.TryGetValue(Constants.Conventions.Media.File, out var property) - && propertyEditors.TryGet(property.PropertyType.PropertyEditorAlias, out var editor) - && editor is IDataEditorWithMediaPath dataEditor) + && mediaUrlGenerators.TryGetMediaPath(property.PropertyType.PropertyEditorAlias, property.GetValue(), out var mediaPath)) { - var value = property.GetValue(); - path = dataEditor.GetMediaPath(value); + path = mediaPath; } var dto = new MediaVersionDto diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs index 04609b2821..fa991d6679 100644 --- a/src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs @@ -1,25 +1,24 @@ using System; -using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.PropertyEditors; -using Umbraco.Core.Services; -using Umbraco.Core.Strings; - namespace Umbraco.Core.Persistence.Factories { internal static class DataTypeFactory { - public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors, ILogger logger, IIOHelper ioHelper, IDataTypeService dataTypeService, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper) + public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors, ILogger logger) { + // Check we have an editor for the data type. if (!editors.TryGet(dto.EditorAlias, out var editor)) { - logger.Warn(typeof(DataType), "Could not find an editor with alias {EditorAlias}, treating as Label." - +" The site may fail to boot and / or load data types and run.", dto.EditorAlias); - //convert to label - editor = new LabelPropertyEditor(logger, ioHelper,dataTypeService , localizedTextService, localizationService, shortStringHelper); + logger.Warn(typeof(DataType), "Could not find an editor with alias {EditorAlias}, treating as Label. " + + "The site may fail to boot and/or load data types and run.", dto.EditorAlias); + + // Create as special type, which downstream can be handled by converting to a LabelPropertyEditor to make clear + // the situation to the user. + editor = new MissingPropertyEditor(); } var dataType = new DataType(editor); diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/MacroFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/MacroFactory.cs index 25cde62c75..5d0cbc9c34 100644 --- a/src/Umbraco.Infrastructure/Persistence/Factories/MacroFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/MacroFactory.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Persistence.Factories { public static IMacro BuildEntity(IShortStringHelper shortStringHelper, MacroDto dto) { - var model = new Macro(shortStringHelper, dto.Id, dto.UniqueId, dto.UseInEditor, dto.RefreshRate, dto.Alias, dto.Name, dto.CacheByPage, dto.CachePersonalized, dto.DontRender, dto.MacroSource, (MacroTypes)dto.MacroType); + var model = new Macro(shortStringHelper, dto.Id, dto.UniqueId, dto.UseInEditor, dto.RefreshRate, dto.Alias, dto.Name, dto.CacheByPage, dto.CachePersonalized, dto.DontRender, dto.MacroSource); try { @@ -45,7 +45,7 @@ namespace Umbraco.Core.Persistence.Factories RefreshRate = entity.CacheDuration, UseInEditor = entity.UseInEditor, MacroPropertyDtos = BuildPropertyDtos(entity), - MacroType = (int)entity.MacroType + MacroType = 7 //PartialView }; if (entity.HasIdentity) diff --git a/src/Umbraco.Infrastructure/Persistence/Mappers/MacroMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MacroMapper.cs index 6a0d803052..f6f7de8347 100644 --- a/src/Umbraco.Infrastructure/Persistence/Mappers/MacroMapper.cs +++ b/src/Umbraco.Infrastructure/Persistence/Mappers/MacroMapper.cs @@ -19,7 +19,6 @@ namespace Umbraco.Core.Persistence.Mappers DefineMap(nameof(Macro.Alias), nameof(MacroDto.Alias)); DefineMap(nameof(Macro.CacheByPage), nameof(MacroDto.CacheByPage)); DefineMap(nameof(Macro.CacheByMember), nameof(MacroDto.CachePersonalized)); - DefineMap(nameof(Macro.MacroType), nameof(MacroDto.MacroType)); DefineMap(nameof(Macro.DontRender), nameof(MacroDto.DontRender)); DefineMap(nameof(Macro.Name), nameof(MacroDto.Name)); DefineMap(nameof(Macro.CacheDuration), nameof(MacroDto.RefreshRate)); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepositoryBase.cs index 254e04d2d5..4020244733 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepositoryBase.cs @@ -27,6 +27,13 @@ namespace Umbraco.Core.Persistence.Repositories /// bool HasContainerInPath(string contentPath); + /// + /// Gets a value indicating whether there is a list view content item in the path. + /// + /// + /// + bool HasContainerInPath(params int[] ids); + /// /// Returns true or false depending on whether content nodes have been created based on the provided content type id. /// diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs index b716a121be..16b9d852fd 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs @@ -1312,14 +1312,16 @@ WHERE cmsContentType." + aliasColumn + @" LIKE @pattern", return test; } - /// - /// Given the path of a content item, this will return true if the content item exists underneath a list view content item - /// - /// - /// + /// public bool HasContainerInPath(string contentPath) { - var ids = contentPath.Split(',').Select(int.Parse); + var ids = contentPath.Split(',').Select(int.Parse).ToArray(); + return HasContainerInPath(ids); + } + + /// + public bool HasContainerInPath(params int[] ids) + { var sql = new Sql($@"SELECT COUNT(*) FROM cmsContentType INNER JOIN {Constants.DatabaseSchema.Tables.Content} ON cmsContentType.nodeId={Constants.DatabaseSchema.Tables.Content}.contentTypeId WHERE {Constants.DatabaseSchema.Tables.Content}.nodeId IN (@ids) AND cmsContentType.isContainer=@isContainer", new { ids, isContainer = true }); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs index 1f0d944c7e..42a89384d7 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs @@ -7,7 +7,6 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Events; using Umbraco.Core.Exceptions; -using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; @@ -17,7 +16,6 @@ using Umbraco.Core.Persistence.Querying; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Scoping; using Umbraco.Core.Services; -using Umbraco.Core.Strings; using static Umbraco.Core.Persistence.SqlExtensionsStatics; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -28,22 +26,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class DataTypeRepository : NPocoRepositoryBase, IDataTypeRepository { private readonly Lazy _editors; - private readonly IIOHelper _ioHelper; - private readonly Lazy _dataTypeService; - private readonly ILocalizedTextService _localizedTextService; - private readonly ILocalizationService _localizationService; - private readonly IShortStringHelper _shortStringHelper; - // TODO: https://github.com/umbraco/Umbraco-CMS/issues/4237 - get rid of Lazy injection and fix circular dependencies - public DataTypeRepository(IScopeAccessor scopeAccessor, AppCaches cache, Lazy editors, ILogger logger, IIOHelper ioHelper, Lazy dataTypeService, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper) + public DataTypeRepository(IScopeAccessor scopeAccessor, AppCaches cache, Lazy editors, ILogger logger) : base(scopeAccessor, cache, logger) { _editors = editors; - _ioHelper = ioHelper; - _dataTypeService = dataTypeService; - _localizedTextService = localizedTextService; - _localizationService = localizationService; - _shortStringHelper = shortStringHelper; } #region Overrides of RepositoryBase @@ -67,7 +54,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } var dtos = Database.Fetch(dataTypeSql); - return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger,_ioHelper, _dataTypeService.Value, _localizedTextService, _localizationService, _shortStringHelper)).ToArray(); + return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger)).ToArray(); } protected override IEnumerable PerformGetByQuery(IQuery query) @@ -78,7 +65,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var dtos = Database.Fetch(sql); - return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger, _ioHelper, _dataTypeService.Value, _localizedTextService, _localizationService, _shortStringHelper)).ToArray(); + return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger)).ToArray(); } #endregion diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs index 6e5dcc6b76..ef5a41b21d 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs @@ -158,7 +158,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement protected override void PersistUpdatedItem(IMacro entity) { entity.UpdatingEntity(); -; var dto = MacroFactory.BuildDto(entity); Database.Update(dto); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs index b0afc3b5f8..11f8c4d696 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs @@ -25,6 +25,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly IMediaTypeRepository _mediaTypeRepository; private readonly ITagRepository _tagRepository; + private readonly MediaUrlGeneratorCollection _mediaUrlGenerators; private readonly MediaByGuidReadRepository _mediaByGuidReadRepository; public MediaRepository( @@ -37,12 +38,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository, Lazy propertyEditorCollection, + MediaUrlGeneratorCollection mediaUrlGenerators, DataValueReferenceFactoryCollection dataValueReferenceFactories, IDataTypeService dataTypeService) : base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection, dataValueReferenceFactories, dataTypeService) { _mediaTypeRepository = mediaTypeRepository ?? throw new ArgumentNullException(nameof(mediaTypeRepository)); _tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository)); + _mediaUrlGenerators = mediaUrlGenerators; _mediaByGuidReadRepository = new MediaByGuidReadRepository(this, scopeAccessor, cache, logger); } @@ -239,7 +242,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement entity.SanitizeEntityPropertiesForXmlStorage(); // create the dto - var dto = ContentBaseFactory.BuildDto(PropertyEditors, entity); + var dto = ContentBaseFactory.BuildDto(_mediaUrlGenerators, entity); // derive path and level from parent var parent = GetParentNodeDto(entity.ParentId); @@ -330,7 +333,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } // create the dto - var dto = ContentBaseFactory.BuildDto(PropertyEditors, entity); + var dto = ContentBaseFactory.BuildDto(_mediaUrlGenerators, entity); // update the node dto var nodeDto = dto.ContentDto.NodeDto; diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs index 3db94b026e..c02329aac4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs @@ -219,7 +219,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement //Save updated entity to db template.UpdateDate = DateTime.Now; - ; var dto = TemplateFactory.BuildDto(template, NodeObjectTypeId, templateDto.PrimaryKey); Database.Update(dto.NodeDto); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs index f35e820042..c8de108db8 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs @@ -543,6 +543,16 @@ ORDER BY colName"; } } + // If userlogin or the email has changed then need to reset security stamp + if (changedCols.Contains("userLogin") || changedCols.Contains("userEmail")) + { + userDto.EmailConfirmedDate = null; + userDto.SecurityStampToken = entity.SecurityStamp = Guid.NewGuid().ToString(); + + changedCols.Add("emailConfirmedDate"); + changedCols.Add("securityStampToken"); + } + //only update the changed cols if (changedCols.Count > 0) { diff --git a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs index 7ae001bf24..58f9a4b68a 100644 --- a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs +++ b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs @@ -77,12 +77,13 @@ namespace Umbraco.Core.Persistence.SqlSyntax string ConvertIntegerToOrderableString { get; } string ConvertDateToOrderableString { get; } string ConvertDecimalToOrderableString { get; } - + /// /// Returns the default isolation level for the database /// IsolationLevel DefaultIsolationLevel { get; } + string DbProvider { get; } IEnumerable GetTablesInSchema(IDatabase db); IEnumerable GetColumnsInSchema(IDatabase db); diff --git a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs index a478c88412..8d3a41e5bf 100644 --- a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs +++ b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs @@ -175,6 +175,8 @@ namespace Umbraco.Core.Persistence.SqlSyntax return items.Select(x => new Tuple(x.TableName, x.ColumnName, x.Name, x.Definition)); } + public override string DbProvider => ServerVersion.IsAzure ? "SqlAzure" : "SqlServer"; + public override IEnumerable GetTablesInSchema(IDatabase db) { var items = db.Fetch("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT SCHEMA_NAME())"); diff --git a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs index b2e03df96e..3df97c0b4f 100644 --- a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs @@ -202,6 +202,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax } public abstract IsolationLevel DefaultIsolationLevel { get; } + public abstract string DbProvider { get; } public virtual IEnumerable GetTablesInSchema(IDatabase db) { diff --git a/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs b/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs index 51dfe6c5c4..2737dcfef1 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs @@ -11,37 +11,51 @@ namespace Umbraco.Core.PropertyEditors : base(items) { } + // TODO: We could further reduce circular dependencies with PropertyEditorCollection by not having IDataValueReference implemented + // by property editors and instead just use the already built in IDataValueReferenceFactory and/or refactor that into a more normal collection + public IEnumerable GetAllReferences(IPropertyCollection properties, PropertyEditorCollection propertyEditors) { - var trackedRelations = new List(); + var trackedRelations = new HashSet(); foreach (var p in properties) { if (!propertyEditors.TryGet(p.PropertyType.PropertyEditorAlias, out var editor)) continue; - //TODO: Support variants/segments! This is not required for this initial prototype which is why there is a check here - if (!p.PropertyType.VariesByNothing()) continue; - var val = p.GetValue(); // get the invariant value + //TODO: We will need to change this once we support tracking via variants/segments + // for now, we are tracking values from ALL variants - var valueEditor = editor.GetValueEditor(); - if (valueEditor is IDataValueReference reference) + foreach(var propertyVal in p.Values) { - var refs = reference.GetReferences(val); - trackedRelations.AddRange(refs); + var val = propertyVal.EditedValue; + + var valueEditor = editor.GetValueEditor(); + if (valueEditor is IDataValueReference reference) + { + var refs = reference.GetReferences(val); + foreach(var r in refs) + trackedRelations.Add(r); } - // Loop over collection that may be add to existing property editors - // implementation of GetReferences in IDataValueReference. - // Allows developers to add support for references by a - // package /property editor that did not implement IDataValueReference themselves - foreach (var item in this) - { - // Check if this value reference is for this datatype/editor - // Then call it's GetReferences method - to see if the value stored - // in the dataeditor/property has referecnes to media/content items - if (item.IsForEditor(editor)) - trackedRelations.AddRange(item.GetDataValueReference().GetReferences(val)); + // Loop over collection that may be add to existing property editors + // implementation of GetReferences in IDataValueReference. + // Allows developers to add support for references by a + // package /property editor that did not implement IDataValueReference themselves + foreach (var item in this) + { + // Check if this value reference is for this datatype/editor + // Then call it's GetReferences method - to see if the value stored + // in the dataeditor/property has referecnes to media/content items + if (item.IsForEditor(editor)) + { + foreach(var r in item.GetDataValueReference().GetReferences(val)) + trackedRelations.Add(r); + } + + } } + + } return trackedRelations; diff --git a/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs index 715d4b0d36..8c820c497c 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/FileUploadPropertyEditor.cs @@ -19,7 +19,7 @@ namespace Umbraco.Web.PropertyEditors "fileupload", Group = Constants.PropertyEditors.Groups.Media, Icon = "icon-download-alt")] - public class FileUploadPropertyEditor : DataEditor, IDataEditorWithMediaPath + public class FileUploadPropertyEditor : DataEditor, IMediaUrlGenerator { private readonly IMediaFileSystem _mediaFileSystem; private readonly IContentSection _contentSection; @@ -52,7 +52,16 @@ namespace Umbraco.Web.PropertyEditors return editor; } - public string GetMediaPath(object value) => value?.ToString(); + public bool TryGetMediaPath(string alias, object value, out string mediaPath) + { + if (alias == Alias) + { + mediaPath = value?.ToString(); + return true; + } + mediaPath = null; + return false; + } /// /// Gets a value indicating whether a property is an upload field. diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/GridPropertyEditor.cs similarity index 88% rename from src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs rename to src/Umbraco.Infrastructure/PropertyEditors/GridPropertyEditor.cs index 7ab2ed2a36..72e0843240 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/GridPropertyEditor.cs @@ -1,10 +1,8 @@ -using Newtonsoft.Json; -using System; +using System; using System.Collections.Generic; using System.Linq; +using Newtonsoft.Json; using Umbraco.Core; -using Umbraco.Core.Composing; -using Umbraco.Web.Composing; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -30,12 +28,7 @@ namespace Umbraco.Web.PropertyEditors public class GridPropertyEditor : DataEditor { private readonly IUmbracoContextAccessor _umbracoContextAccessor; - private readonly IDataTypeService _dataTypeService; - private readonly ILocalizationService _localizationService; private readonly IIOHelper _ioHelper; - private readonly ILogger _logger; - private readonly IMediaService _mediaService; - private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; private readonly HtmlImageSourceParser _imageSourceParser; private readonly RichTextEditorPastedImages _pastedImages; private readonly HtmlLocalLinkParser _localLinkParser; @@ -43,8 +36,6 @@ namespace Umbraco.Web.PropertyEditors public GridPropertyEditor( ILogger logger, - IMediaService mediaService, - IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, IDataTypeService dataTypeService, ILocalizationService localizationService, @@ -58,12 +49,7 @@ namespace Umbraco.Web.PropertyEditors : base(logger, dataTypeService, localizationService, localizedTextService, shortStringHelper) { _umbracoContextAccessor = umbracoContextAccessor; - _dataTypeService = dataTypeService; - _localizationService = localizationService; _ioHelper = ioHelper; - _logger = logger; - _mediaService = mediaService; - _contentTypeBaseServiceProvider = contentTypeBaseServiceProvider; _imageSourceParser = imageSourceParser; _pastedImages = pastedImages; _localLinkParser = localLinkParser; @@ -76,7 +62,7 @@ namespace Umbraco.Web.PropertyEditors /// Overridden to ensure that the value is validated /// /// - protected override IDataValueEditor CreateValueEditor() => new GridPropertyValueEditor(Attribute, _mediaService, _contentTypeBaseServiceProvider, _umbracoContextAccessor, _logger, DataTypeService, LocalizationService, LocalizedTextService, _imageSourceParser, _pastedImages, _localLinkParser, ShortStringHelper, _imageUrlGenerator); + protected override IDataValueEditor CreateValueEditor() => new GridPropertyValueEditor(Attribute, _umbracoContextAccessor, DataTypeService, LocalizationService, LocalizedTextService, _imageSourceParser, _pastedImages, _localLinkParser, ShortStringHelper, _imageUrlGenerator); protected override IConfigurationEditor CreateConfigurationEditor() => new GridConfigurationEditor(_ioHelper); @@ -91,10 +77,7 @@ namespace Umbraco.Web.PropertyEditors public GridPropertyValueEditor( DataEditorAttribute attribute, - IMediaService mediaService, - IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, - ILogger logger, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyIndexValueFactory.cs b/src/Umbraco.Infrastructure/PropertyEditors/GridPropertyIndexValueFactory.cs similarity index 97% rename from src/Umbraco.Web/PropertyEditors/GridPropertyIndexValueFactory.cs rename to src/Umbraco.Infrastructure/PropertyEditors/GridPropertyIndexValueFactory.cs index 00afcf19cc..195764fbbf 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyIndexValueFactory.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/GridPropertyIndexValueFactory.cs @@ -1,18 +1,17 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core; +using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Xml; using Umbraco.Examine; namespace Umbraco.Web.PropertyEditors { - using System.Collections.Generic; - using System.Linq; - using Umbraco.Core.Models; - /// /// Parses the grid value into indexable values /// diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs index 66a1ae68ef..045a0fb3d2 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs @@ -26,7 +26,7 @@ namespace Umbraco.Web.PropertyEditors HideLabel = false, Group = Constants.PropertyEditors.Groups.Media, Icon = "icon-crop")] - public class ImageCropperPropertyEditor : DataEditor, IDataEditorWithMediaPath + public class ImageCropperPropertyEditor : DataEditor, IMediaUrlGenerator { private readonly IMediaFileSystem _mediaFileSystem; private readonly IContentSection _contentSettings; @@ -53,7 +53,16 @@ namespace Umbraco.Web.PropertyEditors _autoFillProperties = new UploadAutoFillProperties(_mediaFileSystem, logger, _contentSettings); } - public string GetMediaPath(object value) => GetFileSrcFromPropertyValue(value, out _, false); + public bool TryGetMediaPath(string alias, object value, out string mediaPath) + { + if (alias == Alias) + { + mediaPath = GetFileSrcFromPropertyValue(value, out _, false); + return true; + } + mediaPath = null; + return false; + } /// /// Creates the corresponding property value editor. diff --git a/src/Umbraco.Infrastructure/PropertyEditors/MissingPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MissingPropertyEditor.cs new file mode 100644 index 0000000000..902aab7cc7 --- /dev/null +++ b/src/Umbraco.Infrastructure/PropertyEditors/MissingPropertyEditor.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace Umbraco.Core.PropertyEditors +{ + /// + /// Represents a temporary representation of an editor for cases where a data type is created but not editor is available. + /// + public class MissingPropertyEditor : IDataEditor + { + public string Alias => "Umbraco.Missing"; + + public EditorType Type => EditorType.Nothing; + + public string Name => "Missing property editor"; + + public string Icon => string.Empty; + + public string Group => string.Empty; + + public bool IsDeprecated => false; + + public IDictionary DefaultConfiguration => throw new NotImplementedException(); + + public IPropertyIndexValueFactory PropertyIndexValueFactory => throw new NotImplementedException(); + + public IConfigurationEditor GetConfigurationEditor() + { + return new ConfigurationEditor(); + } + + public IDataValueEditor GetValueEditor() + { + throw new NotImplementedException(); + } + + public IDataValueEditor GetValueEditor(object configuration) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs similarity index 79% rename from src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs rename to src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs index 1501abc071..1be4067763 100644 --- a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerPropertyEditor.cs @@ -1,12 +1,12 @@ using System; using Umbraco.Core; -using Umbraco.Web.Composing; using Umbraco.Core.IO; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Logging; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.PublishedCache; +using Umbraco.Web.Routing; namespace Umbraco.Web.PropertyEditors { @@ -23,17 +23,21 @@ namespace Umbraco.Web.PropertyEditors private readonly Lazy _entityService; private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; private readonly IIOHelper _ioHelper; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public MultiUrlPickerPropertyEditor(ILogger logger, Lazy entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IIOHelper ioHelper, IShortStringHelper shortStringHelper) + public MultiUrlPickerPropertyEditor(ILogger logger, Lazy entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IIOHelper ioHelper, IShortStringHelper shortStringHelper, IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider) : base(logger, dataTypeService, localizationService, localizedTextService, shortStringHelper, EditorType.PropertyValue) { _entityService = entityService ?? throw new ArgumentNullException(nameof(entityService)); _publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor)); _ioHelper = ioHelper; + _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } protected override IConfigurationEditor CreateConfigurationEditor() => new MultiUrlPickerConfigurationEditor(_ioHelper); - protected override IDataValueEditor CreateValueEditor() => new MultiUrlPickerValueEditor(_entityService.Value, _publishedSnapshotAccessor, Logger, DataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, Attribute); + protected override IDataValueEditor CreateValueEditor() => new MultiUrlPickerValueEditor(_entityService.Value, _publishedSnapshotAccessor, Logger, DataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, Attribute, _umbracoContextAccessor, _publishedUrlProvider); } } diff --git a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerValueEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs similarity index 92% rename from src/Umbraco.Web/PropertyEditors/MultiUrlPickerValueEditor.cs rename to src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs index ab0f927f47..f3d2255b6b 100644 --- a/src/Umbraco.Web/PropertyEditors/MultiUrlPickerValueEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs @@ -11,9 +11,10 @@ using Umbraco.Core.Models.Entities; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Core.Strings; -using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.PublishedCache; +using Umbraco.Core; +using Umbraco.Web.Routing; namespace Umbraco.Web.PropertyEditors { @@ -21,14 +22,18 @@ namespace Umbraco.Web.PropertyEditors { private readonly IEntityService _entityService; private readonly ILogger _logger; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; - public MultiUrlPickerValueEditor(IEntityService entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, ILogger logger, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IShortStringHelper shortStringHelper, DataEditorAttribute attribute) + public MultiUrlPickerValueEditor(IEntityService entityService, IPublishedSnapshotAccessor publishedSnapshotAccessor, ILogger logger, IDataTypeService dataTypeService, ILocalizationService localizationService, ILocalizedTextService localizedTextService, IShortStringHelper shortStringHelper, DataEditorAttribute attribute, IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider) : base(dataTypeService, localizationService, localizedTextService, shortStringHelper, attribute) { _entityService = entityService ?? throw new ArgumentNullException(nameof(entityService)); _publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); + _publishedUrlProvider = publishedUrlProvider; } public override object ToEditor(IProperty property, string culture = null, string segment = null) @@ -84,7 +89,7 @@ namespace Umbraco.Web.PropertyEditors icon = documentEntity.ContentTypeIcon; published = culture == null ? documentEntity.Published : documentEntity.PublishedCultures.Contains(culture); udi = new GuidUdi(Constants.UdiEntityType.Document, documentEntity.Key); - url = _publishedSnapshotAccessor.PublishedSnapshot.Content.GetById(entity.Key)?.Url() ?? "#"; + url = _publishedSnapshotAccessor.PublishedSnapshot.Content.GetById(entity.Key)?.Url(_publishedUrlProvider) ?? "#"; trashed = documentEntity.Trashed; } else if(entity is IContentEntitySlim contentEntity) @@ -92,7 +97,7 @@ namespace Umbraco.Web.PropertyEditors icon = contentEntity.ContentTypeIcon; published = !contentEntity.Trashed; udi = new GuidUdi(Constants.UdiEntityType.Media, contentEntity.Key); - url = _publishedSnapshotAccessor.PublishedSnapshot.Media.GetById(entity.Key)?.Url() ?? "#"; + url = _publishedSnapshotAccessor.PublishedSnapshot.Media.GetById(entity.Key)?.Url(_publishedUrlProvider) ?? "#"; trashed = contentEntity.Trashed; } else @@ -160,7 +165,7 @@ namespace Umbraco.Web.PropertyEditors } [DataContract] - internal class LinkDto + public class LinkDto { [DataMember(Name = "name")] public string Name { get; set; } diff --git a/src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs similarity index 99% rename from src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs rename to src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs index f55e792189..70490af1a3 100644 --- a/src/Umbraco.Web/PropertyEditors/NestedContentPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs @@ -6,7 +6,6 @@ using System.Text.RegularExpressions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core; -using Umbraco.Web.Composing; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -316,14 +315,14 @@ namespace Umbraco.Web.PropertyEditors ? $"'{row.PropType.Name}' cannot be null" : row.PropType.MandatoryMessage; validationResults.Add(new ValidationResult($"Item {(row.RowIndex + 1)}: {message}", new[] { row.PropKey })); - } + } else if (row.JsonRowValue[row.PropKey].ToString().IsNullOrWhiteSpace() || (row.JsonRowValue[row.PropKey].Type == JTokenType.Array && !row.JsonRowValue[row.PropKey].HasValues)) { var message = string.IsNullOrWhiteSpace(row.PropType.MandatoryMessage) ? $"'{row.PropType.Name}' cannot be empty" : row.PropType.MandatoryMessage; validationResults.Add(new ValidationResult($"Item {(row.RowIndex + 1)}: {message}", new[] { row.PropKey })); - } + } } // Check regex diff --git a/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs b/src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs similarity index 93% rename from src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs rename to src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs index 4b956bbe5b..eee45a636c 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs @@ -1,7 +1,7 @@ -using HtmlAgilityPack; -using System; +using System; using System.Collections.Generic; using System.IO; +using HtmlAgilityPack; using Umbraco.Core; using Umbraco.Core.Exceptions; using Umbraco.Core.IO; @@ -9,6 +9,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Core.Strings; +using Umbraco.Web.Routing; using Umbraco.Web.Templates; namespace Umbraco.Web.PropertyEditors @@ -22,10 +23,11 @@ namespace Umbraco.Web.PropertyEditors private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; private readonly IMediaFileSystem _mediaFileSystem; private readonly IShortStringHelper _shortStringHelper; + private readonly IPublishedUrlProvider _publishedUrlProvider; const string TemporaryImageDataAttribute = "data-tmpimg"; - public RichTextEditorPastedImages(IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, IIOHelper ioHelper, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper) + public RichTextEditorPastedImages(IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, IIOHelper ioHelper, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper, IPublishedUrlProvider publishedUrlProvider) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); @@ -34,6 +36,7 @@ namespace Umbraco.Web.PropertyEditors _contentTypeBaseServiceProvider = contentTypeBaseServiceProvider ?? throw new ArgumentNullException(nameof(contentTypeBaseServiceProvider)); _mediaFileSystem = mediaFileSystem; _shortStringHelper = shortStringHelper; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -43,7 +46,7 @@ namespace Umbraco.Web.PropertyEditors /// /// /// - internal string FindAndPersistPastedTempImages(string html, Guid mediaParentFolder, int userId, IImageUrlGenerator imageUrlGenerator) + public string FindAndPersistPastedTempImages(string html, Guid mediaParentFolder, int userId, IImageUrlGenerator imageUrlGenerator) { // Find all img's that has data-tmpimg attribute // Use HTML Agility Pack - https://html-agility-pack.net @@ -108,7 +111,7 @@ namespace Umbraco.Web.PropertyEditors if (mediaTyped == null) throw new PanicException($"Could not find media by id {udi.Guid} or there was no UmbracoContext available."); - var location = mediaTyped.Url(); + var location = mediaTyped.Url(_publishedUrlProvider); // Find the width & height attributes as we need to set the imageprocessor QueryString var width = img.GetAttributeValue("width", int.MinValue); diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/RichTextPropertyEditor.cs similarity index 98% rename from src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs rename to src/Umbraco.Infrastructure/PropertyEditors/RichTextPropertyEditor.cs index da3342a682..dea9a5f002 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/RichTextPropertyEditor.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using Umbraco.Core; -using Umbraco.Web.Composing; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -40,8 +39,6 @@ namespace Umbraco.Web.PropertyEditors /// public RichTextPropertyEditor( ILogger logger, - IMediaService mediaService, - IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, IDataTypeService dataTypeService, ILocalizationService localizationService, diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs similarity index 100% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ImageCropperValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ImageCropperValueConverter.cs index 64e4312b3f..0043eeed72 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ImageCropperValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/ImageCropperValueConverter.cs @@ -48,7 +48,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters value = new ImageCropperValue { Src = sourceString }; } - value.ApplyConfiguration(propertyType.DataType.ConfigurationAs()); + value?.ApplyConfiguration(propertyType.DataType.ConfigurationAs()); return value; } diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs index 4608b5c5da..4fdc13baa9 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs @@ -1,12 +1,23 @@ using System; +using HeyRed.MarkdownSharp; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Strings; +using Umbraco.Web.Templates; namespace Umbraco.Core.PropertyEditors.ValueConverters { [DefaultPropertyValueConverter] public class MarkdownEditorValueConverter : PropertyValueConverterBase { + private readonly HtmlLocalLinkParser _localLinkParser; + private readonly HtmlUrlParser _urlParser; + + public MarkdownEditorValueConverter(HtmlLocalLinkParser localLinkParser, HtmlUrlParser urlParser) + { + _localLinkParser = localLinkParser; + _urlParser = urlParser; + } + public override bool IsConverter(IPublishedPropertyType propertyType) => Constants.PropertyEditors.Aliases.MarkdownEditor.Equals(propertyType.EditorAlias); @@ -15,20 +26,26 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters // PropertyCacheLevel.Content is ok here because that converter does not parse {locallink} nor executes macros public override PropertyCacheLevel GetPropertyCacheLevel(IPublishedPropertyType propertyType) - => PropertyCacheLevel.Element; + => PropertyCacheLevel.Snapshot; public override object ConvertSourceToIntermediate(IPublishedElement owner, IPublishedPropertyType propertyType, object source, bool preview) { - // in xml a string is: string - // in the database a string is: string - // default value is: null - return source; + if (source == null) return null; + var sourceString = source.ToString(); + + // ensures string is parsed for {localLink} and urls are resolved correctly + sourceString = _localLinkParser.EnsureInternalLinks(sourceString, preview); + sourceString = _urlParser.EnsureUrls(sourceString); + + return sourceString; } public override object ConvertIntermediateToObject(IPublishedElement owner, IPublishedPropertyType propertyType, PropertyCacheLevel referenceCacheLevel, object inter, bool preview) { + // convert markup to HTML for frontend rendering. // source should come from ConvertSource and be a string (or null) already - return new HtmlEncodedString(inter == null ? string.Empty : (string) inter); + var mark = new Markdown(); + return new HtmlEncodedString(inter == null ? string.Empty : mark.Transform((string)inter)); } public override object ConvertIntermediateToXPath(IPublishedElement owner, IPublishedPropertyType propertyType, PropertyCacheLevel referenceCacheLevel, object inter, bool preview) diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs similarity index 100% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs similarity index 90% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs index cd69fd9de6..19cca866df 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs @@ -2,9 +2,7 @@ using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; -using Umbraco.Web.Composing; using Umbraco.Web.PublishedCache; -using Umbraco.Web.Security; namespace Umbraco.Web.PropertyEditors.ValueConverters { @@ -12,10 +10,12 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters public class MemberPickerValueConverter : PropertyValueConverterBase { private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; - public MemberPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor) + public MemberPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IUmbracoContextAccessor umbracoContextAccessor) { _publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor)); + _umbracoContextAccessor = umbracoContextAccessor; } public override bool IsConverter(IPublishedPropertyType propertyType) @@ -45,7 +45,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters if (source == null) return null; - if (Current.UmbracoContext != null) + if (_umbracoContextAccessor.UmbracoContext != null) { IPublishedContent member; if (source is int id) diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs similarity index 96% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs index 46ebbd0abb..e35205b704 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiNodeTreePickerValueConverter.cs @@ -3,13 +3,10 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Umbraco.Core; -using Umbraco.Core.Cache; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Core.PropertyEditors.ValueConverters; -using Umbraco.Core.Services; -using Umbraco.Web.Composing; using Umbraco.Web.PublishedCache; namespace Umbraco.Web.PropertyEditors.ValueConverters @@ -22,6 +19,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters public class MultiNodeTreePickerValueConverter : PropertyValueConverterBase { private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; private static readonly List PropertiesToExclude = new List { @@ -29,9 +27,10 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters Constants.Conventions.Content.Redirect.ToLower(CultureInfo.InvariantCulture) }; - public MultiNodeTreePickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor) + public MultiNodeTreePickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IUmbracoContextAccessor umbracoContextAccessor) { _publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor)); + _umbracoContextAccessor = umbracoContextAccessor; } public override bool IsConverter(IPublishedPropertyType propertyType) @@ -70,7 +69,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters } // TODO: Inject an UmbracoHelper and create a GetUmbracoHelper method based on either injected or singleton - if (Current.UmbracoContext != null) + if (_umbracoContextAccessor.UmbracoContext != null) { if (propertyType.EditorAlias.Equals(Constants.PropertyEditors.Aliases.MultiNodeTreePicker)) { diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs similarity index 82% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs index 2ceac6cfa8..72beb0106a 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MultiUrlPickerValueConverter.cs @@ -1,5 +1,3 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -7,8 +5,10 @@ using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Serialization; using Umbraco.Web.Models; using Umbraco.Web.PublishedCache; +using Umbraco.Web.Routing; namespace Umbraco.Web.PropertyEditors.ValueConverters { @@ -16,11 +16,17 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters { private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; private readonly IProfilingLogger _proflog; + private readonly IJsonSerializer _jsonSerializer; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public MultiUrlPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IProfilingLogger proflog) + public MultiUrlPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IProfilingLogger proflog, IJsonSerializer jsonSerializer, IUmbracoContextAccessor umbracoContextAccessor, IPublishedUrlProvider publishedUrlProvider) { _publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor)); _proflog = proflog ?? throw new ArgumentNullException(nameof(proflog)); + _jsonSerializer = jsonSerializer; + _umbracoContextAccessor = umbracoContextAccessor; + _publishedUrlProvider = publishedUrlProvider; } public override bool IsConverter(IPublishedPropertyType propertyType) => Constants.PropertyEditors.Aliases.MultiUrlPicker.Equals(propertyType.EditorAlias); @@ -48,7 +54,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters } var links = new List(); - var dtos = JsonConvert.DeserializeObject>(inter.ToString()); + var dtos = _jsonSerializer.Deserialize>(inter.ToString()); foreach (var dto in dtos) { @@ -69,7 +75,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters { continue; } - url = content.Url(); + url = content.Url(_publishedUrlProvider); } links.Add( diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs similarity index 100% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentManyValueConverter.cs diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs similarity index 100% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentSingleValueConverter.cs diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs similarity index 100% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/NestedContentValueConverterBase.cs diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs similarity index 96% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs index 67031faaa0..a55f73980b 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs @@ -1,18 +1,13 @@ -using System.Text; -using Umbraco.Core; -using Umbraco.Core.Macros; -using Umbraco.Core.PropertyEditors; -using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.PropertyEditors.ValueConverters; -using Umbraco.Web.Templates; -using System.Linq; +using System.Linq; +using System.Text; using HtmlAgilityPack; -using Umbraco.Core.Cache; -using Umbraco.Core.Services; -using Umbraco.Web.Composing; -using Umbraco.Web.Macros; -using System.Web; +using Umbraco.Core; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.PropertyEditors.ValueConverters; using Umbraco.Core.Strings; +using Umbraco.Web.Macros; +using Umbraco.Web.Templates; namespace Umbraco.Web.PropertyEditors.ValueConverters { @@ -66,7 +61,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters macroAlias, umbracoContext.PublishedRequest?.PublishedContent, //needs to be explicitly casted to Dictionary - macroAttributes.ConvertTo(x => (string)x, x => x)).GetAsText())); + macroAttributes.ConvertTo(x => (string)x, x => x)).Text)); return sb.ToString(); } diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/TextStringValueConverter.cs similarity index 98% rename from src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs rename to src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/TextStringValueConverter.cs index 939a658407..93d670601e 100644 --- a/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/TextStringValueConverter.cs @@ -3,7 +3,6 @@ using System.Linq; using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; -using Umbraco.Web.Composing; using Umbraco.Web.Templates; namespace Umbraco.Web.PropertyEditors.ValueConverters diff --git a/src/Umbraco.Web/PublishedContentQuery.cs b/src/Umbraco.Infrastructure/PublishedContentQuery.cs similarity index 58% rename from src/Umbraco.Web/PublishedContentQuery.cs rename to src/Umbraco.Infrastructure/PublishedContentQuery.cs index f35cea085d..e995850a1f 100644 --- a/src/Umbraco.Web/PublishedContentQuery.cs +++ b/src/Umbraco.Infrastructure/PublishedContentQuery.cs @@ -14,35 +14,85 @@ using Umbraco.Web.PublishedCache; namespace Umbraco.Web { /// - /// A class used to query for published content, media items + /// A class used to query for published content, media items /// public class PublishedContentQuery : IPublishedContentQuery { + private readonly IExamineManager _examineManager; private readonly IPublishedSnapshot _publishedSnapshot; private readonly IVariationContextAccessor _variationContextAccessor; - private readonly IExamineManager _examineManager; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public PublishedContentQuery(IPublishedSnapshot publishedSnapshot, IVariationContextAccessor variationContextAccessor, IExamineManager examineManager) + public PublishedContentQuery(IPublishedSnapshot publishedSnapshot, + IVariationContextAccessor variationContextAccessor, IExamineManager examineManager) { _publishedSnapshot = publishedSnapshot ?? throw new ArgumentNullException(nameof(publishedSnapshot)); - _variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); + _variationContextAccessor = variationContextAccessor ?? + throw new ArgumentNullException(nameof(variationContextAccessor)); _examineManager = examineManager ?? throw new ArgumentNullException(nameof(examineManager)); } + #region Convert Helpers + + private static bool ConvertIdObjectToInt(object id, out int intId) + { + switch (id) + { + case string s: + return int.TryParse(s, out intId); + + case int i: + intId = i; + return true; + + default: + intId = default; + return false; + } + } + + private static bool ConvertIdObjectToGuid(object id, out Guid guidId) + { + switch (id) + { + case string s: + return Guid.TryParse(s, out guidId); + + case Guid g: + guidId = g; + return true; + + default: + guidId = default; + return false; + } + } + private static bool ConvertIdObjectToUdi(object id, out Udi guidId) + { + switch (id) + { + case string s: + return UdiParser.TryParse(s, out guidId); + + case Udi u: + guidId = u; + return true; + + default: + guidId = default; + return false; + } + } + + #endregion + #region Content - public IPublishedContent Content(int id) - { - return ItemById(id, _publishedSnapshot.Content); - } + public IPublishedContent Content(int id) => ItemById(id, _publishedSnapshot.Content); - public IPublishedContent Content(Guid id) - { - return ItemById(id, _publishedSnapshot.Content); - } + public IPublishedContent Content(Guid id) => ItemById(id, _publishedSnapshot.Content); public IPublishedContent Content(Udi id) { @@ -50,49 +100,45 @@ namespace Umbraco.Web return ItemById(udi.Guid, _publishedSnapshot.Content); } - public IPublishedContent ContentSingleAtXPath(string xpath, params XPathVariable[] vars) + public IPublishedContent Content(object id) { - return ItemByXPath(xpath, vars, _publishedSnapshot.Content); + if (ConvertIdObjectToInt(id, out var intId)) + return Content(intId); + if (ConvertIdObjectToGuid(id, out var guidId)) + return Content(guidId); + if (ConvertIdObjectToUdi(id, out var udiId)) + return Content(udiId); + return null; } - public IEnumerable Content(IEnumerable ids) - { - return ItemsByIds(_publishedSnapshot.Content, ids); - } + public IPublishedContent ContentSingleAtXPath(string xpath, params XPathVariable[] vars) => + ItemByXPath(xpath, vars, _publishedSnapshot.Content); - public IEnumerable Content(IEnumerable ids) - { - return ItemsByIds(_publishedSnapshot.Content, ids); - } + public IEnumerable Content(IEnumerable ids) => + ItemsByIds(_publishedSnapshot.Content, ids); - public IEnumerable ContentAtXPath(string xpath, params XPathVariable[] vars) - { - return ItemsByXPath(xpath, vars, _publishedSnapshot.Content); - } + public IEnumerable Content(IEnumerable ids) => + ItemsByIds(_publishedSnapshot.Content, ids); - public IEnumerable ContentAtXPath(XPathExpression xpath, params XPathVariable[] vars) + public IEnumerable Content(IEnumerable ids) { - return ItemsByXPath(xpath, vars, _publishedSnapshot.Content); + return ids.Select(Content).WhereNotNull(); } + public IEnumerable ContentAtXPath(string xpath, params XPathVariable[] vars) => + ItemsByXPath(xpath, vars, _publishedSnapshot.Content); - public IEnumerable ContentAtRoot() - { - return ItemsAtRoot(_publishedSnapshot.Content); - } + public IEnumerable ContentAtXPath(XPathExpression xpath, params XPathVariable[] vars) => + ItemsByXPath(xpath, vars, _publishedSnapshot.Content); + + public IEnumerable ContentAtRoot() => ItemsAtRoot(_publishedSnapshot.Content); #endregion #region Media - public IPublishedContent Media(int id) - { - return ItemById(id, _publishedSnapshot.Media); - } + public IPublishedContent Media(int id) => ItemById(id, _publishedSnapshot.Media); - public IPublishedContent Media(Guid id) - { - return ItemById(id, _publishedSnapshot.Media); - } + public IPublishedContent Media(Guid id) => ItemById(id, _publishedSnapshot.Media); public IPublishedContent Media(Udi id) { @@ -100,21 +146,26 @@ namespace Umbraco.Web return ItemById(udi.Guid, _publishedSnapshot.Media); } - public IEnumerable Media(IEnumerable ids) + public IPublishedContent Media(object id) { - return ItemsByIds(_publishedSnapshot.Media, ids); + if (ConvertIdObjectToInt(id, out var intId)) + return Media(intId); + if (ConvertIdObjectToGuid(id, out var guidId)) + return Media(guidId); + if (ConvertIdObjectToUdi(id, out var udiId)) + return Media(udiId); + return null; } - public IEnumerable Media(IEnumerable ids) + public IEnumerable Media(IEnumerable ids) => ItemsByIds(_publishedSnapshot.Media, ids); + public IEnumerable Media(IEnumerable ids) { - return ItemsByIds(_publishedSnapshot.Media, ids); + return ids.Select(Media).WhereNotNull(); } - public IEnumerable MediaAtRoot() - { - return ItemsAtRoot(_publishedSnapshot.Media); - } + public IEnumerable Media(IEnumerable ids) => ItemsByIds(_publishedSnapshot.Media, ids); + public IEnumerable MediaAtRoot() => ItemsAtRoot(_publishedSnapshot.Media); #endregion @@ -155,44 +206,45 @@ namespace Umbraco.Web return ids.Select(eachId => ItemById(eachId, cache)).WhereNotNull(); } - private static IEnumerable ItemsByXPath(string xpath, XPathVariable[] vars, IPublishedCache cache) + private static IEnumerable ItemsByXPath(string xpath, XPathVariable[] vars, + IPublishedCache cache) { var doc = cache.GetByXPath(xpath, vars); return doc; } - private static IEnumerable ItemsByXPath(XPathExpression xpath, XPathVariable[] vars, IPublishedCache cache) + private static IEnumerable ItemsByXPath(XPathExpression xpath, XPathVariable[] vars, + IPublishedCache cache) { var doc = cache.GetByXPath(xpath, vars); return doc; } - private static IEnumerable ItemsAtRoot(IPublishedCache cache) - { - return cache.GetAtRoot(); - } + private static IEnumerable ItemsAtRoot(IPublishedCache cache) => cache.GetAtRoot(); #endregion #region Search /// - public IEnumerable Search(string term, string culture = "*", string indexName = Constants.UmbracoIndexes.ExternalIndexName) - { - return Search(term, 0, 0, out _, culture, indexName); - } + public IEnumerable Search(string term, string culture = "*", + string indexName = Constants.UmbracoIndexes.ExternalIndexName) => + Search(term, 0, 0, out _, culture, indexName); /// - public IEnumerable Search(string term, int skip, int take, out long totalRecords, string culture = "*", string indexName = Constants.UmbracoIndexes.ExternalIndexName) + public IEnumerable Search(string term, int skip, int take, out long totalRecords, + string culture = "*", string indexName = Constants.UmbracoIndexes.ExternalIndexName) { if (skip < 0) { - throw new ArgumentOutOfRangeException(nameof(skip), skip, "The value must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(skip), skip, + "The value must be greater than or equal to zero."); } if (take < 0) { - throw new ArgumentOutOfRangeException(nameof(take), take, "The value must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(take), take, + "The value must be greater than or equal to zero."); } if (string.IsNullOrEmpty(indexName)) @@ -202,7 +254,8 @@ namespace Umbraco.Web if (!_examineManager.TryGetIndex(indexName, out var index) || !(index is IUmbracoIndex umbIndex)) { - throw new InvalidOperationException($"No index found by name {indexName} or is not of type {typeof(IUmbracoIndex)}"); + throw new InvalidOperationException( + $"No index found by name {indexName} or is not of type {typeof(IUmbracoIndex)}"); } var query = umbIndex.GetSearcher().CreateQuery(IndexTypes.Content); @@ -216,13 +269,16 @@ namespace Umbraco.Web else if (string.IsNullOrWhiteSpace(culture)) { // Only search invariant - queryExecutor = query.Field(UmbracoExamineFieldNames.VariesByCultureFieldName, "n") // Must not vary by culture + queryExecutor = query + .Field(UmbracoExamineFieldNames.VariesByCultureFieldName, "n") // Must not vary by culture .And().ManagedQuery(term); } else { // Only search the specified culture - var fields = umbIndex.GetCultureAndInvariantFields(culture).ToArray(); // Get all index fields suffixed with the culture name supplied + var fields = + umbIndex.GetCultureAndInvariantFields(culture) + .ToArray(); // Get all index fields suffixed with the culture name supplied queryExecutor = query.ManagedQuery(term, fields); } @@ -232,26 +288,28 @@ namespace Umbraco.Web totalRecords = results.TotalItemCount; - return new CultureContextualSearchResults(results.Skip(skip).ToPublishedSearchResults(_publishedSnapshot.Content), _variationContextAccessor, culture); + return new CultureContextualSearchResults( + results.Skip(skip).ToPublishedSearchResults(_publishedSnapshot.Content), _variationContextAccessor, + culture); } /// - public IEnumerable Search(IQueryExecutor query) - { - return Search(query, 0, 0, out _); - } + public IEnumerable Search(IQueryExecutor query) => Search(query, 0, 0, out _); /// - public IEnumerable Search(IQueryExecutor query, int skip, int take, out long totalRecords) + public IEnumerable Search(IQueryExecutor query, int skip, int take, + out long totalRecords) { if (skip < 0) { - throw new ArgumentOutOfRangeException(nameof(skip), skip, "The value must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(skip), skip, + "The value must be greater than or equal to zero."); } if (take < 0) { - throw new ArgumentOutOfRangeException(nameof(take), take, "The value must be greater than or equal to zero."); + throw new ArgumentOutOfRangeException(nameof(take), take, + "The value must be greater than or equal to zero."); } var results = skip == 0 && take == 0 @@ -264,15 +322,17 @@ namespace Umbraco.Web } /// - /// This is used to contextualize the values in the search results when enumerating over them so that the correct culture values are used + /// This is used to contextualize the values in the search results when enumerating over them so that the correct + /// culture values are used /// private class CultureContextualSearchResults : IEnumerable { - private readonly IEnumerable _wrapped; - private readonly IVariationContextAccessor _variationContextAccessor; private readonly string _culture; + private readonly IVariationContextAccessor _variationContextAccessor; + private readonly IEnumerable _wrapped; - public CultureContextualSearchResults(IEnumerable wrapped, IVariationContextAccessor variationContextAccessor, string culture) + public CultureContextualSearchResults(IEnumerable wrapped, + IVariationContextAccessor variationContextAccessor, string culture) { _wrapped = wrapped; _variationContextAccessor = variationContextAccessor; @@ -287,24 +347,23 @@ namespace Umbraco.Web _variationContextAccessor.VariationContext = new VariationContext(_culture); //now the IPublishedContent returned will be contextualized to the culture specified and will be reset when the enumerator is disposed - return new CultureContextualSearchResultsEnumerator(_wrapped.GetEnumerator(), _variationContextAccessor, originalContext); + return new CultureContextualSearchResultsEnumerator(_wrapped.GetEnumerator(), _variationContextAccessor, + originalContext); } - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); /// - /// Resets the variation context when this is disposed + /// Resets the variation context when this is disposed /// private class CultureContextualSearchResultsEnumerator : IEnumerator { - private readonly IEnumerator _wrapped; - private readonly IVariationContextAccessor _variationContextAccessor; private readonly VariationContext _originalContext; + private readonly IVariationContextAccessor _variationContextAccessor; + private readonly IEnumerator _wrapped; - public CultureContextualSearchResultsEnumerator(IEnumerator wrapped, IVariationContextAccessor variationContextAccessor, VariationContext originalContext) + public CultureContextualSearchResultsEnumerator(IEnumerator wrapped, + IVariationContextAccessor variationContextAccessor, VariationContext originalContext) { _wrapped = wrapped; _variationContextAccessor = variationContextAccessor; @@ -318,10 +377,7 @@ namespace Umbraco.Web _variationContextAccessor.VariationContext = _originalContext; } - public bool MoveNext() - { - return _wrapped.MoveNext(); - } + public bool MoveNext() => _wrapped.MoveNext(); public void Reset() { diff --git a/src/Umbraco.Web/Routing/ContentFinderByConfigured404.cs b/src/Umbraco.Infrastructure/Routing/ContentFinderByConfigured404.cs similarity index 98% rename from src/Umbraco.Web/Routing/ContentFinderByConfigured404.cs rename to src/Umbraco.Infrastructure/Routing/ContentFinderByConfigured404.cs index 7dc8203d40..f8e21982e0 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByConfigured404.cs +++ b/src/Umbraco.Infrastructure/Routing/ContentFinderByConfigured404.cs @@ -32,7 +32,7 @@ namespace Umbraco.Web.Routing /// /// The PublishedRequest. /// A value indicating whether an Umbraco document was found and assigned. - public bool TryFindContent(PublishedRequest frequest) + public bool TryFindContent(IPublishedRequest frequest) { _logger.Debug("Looking for a page to handle 404."); diff --git a/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs b/src/Umbraco.Infrastructure/Routing/NotFoundHandlerHelper.cs similarity index 99% rename from src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs rename to src/Umbraco.Infrastructure/Routing/NotFoundHandlerHelper.cs index 38ecb09b2b..335e1f868a 100644 --- a/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs +++ b/src/Umbraco.Infrastructure/Routing/NotFoundHandlerHelper.cs @@ -1,13 +1,13 @@ using System; using System.Globalization; using System.Linq; +using Umbraco.Composing; using Umbraco.Core; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Core.Xml; -using Umbraco.Web.Composing; namespace Umbraco.Web.Routing { diff --git a/src/Umbraco.Web/Routing/RedirectTrackingComponent.cs b/src/Umbraco.Infrastructure/Routing/RedirectTrackingComponent.cs similarity index 93% rename from src/Umbraco.Web/Routing/RedirectTrackingComponent.cs rename to src/Umbraco.Infrastructure/Routing/RedirectTrackingComponent.cs index dffb956b1a..0eae54bf7d 100644 --- a/src/Umbraco.Web/Routing/RedirectTrackingComponent.cs +++ b/src/Umbraco.Infrastructure/Routing/RedirectTrackingComponent.cs @@ -6,6 +6,7 @@ using Umbraco.Core.Composing; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Events; using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; using Umbraco.Web.PublishedCache; @@ -26,12 +27,14 @@ namespace Umbraco.Web.Routing private readonly IUmbracoSettingsSection _umbracoSettings; private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; private readonly IRedirectUrlService _redirectUrlService; + private readonly IVariationContextAccessor _variationContextAccessor; - public RedirectTrackingComponent(IUmbracoSettingsSection umbracoSettings, IPublishedSnapshotAccessor publishedSnapshotAccessor, IRedirectUrlService redirectUrlService) + public RedirectTrackingComponent(IUmbracoSettingsSection umbracoSettings, IPublishedSnapshotAccessor publishedSnapshotAccessor, IRedirectUrlService redirectUrlService, IVariationContextAccessor variationContextAccessor) { _umbracoSettings = umbracoSettings; _publishedSnapshotAccessor = publishedSnapshotAccessor; _redirectUrlService = redirectUrlService; + _variationContextAccessor = variationContextAccessor; } public void Initialize() @@ -99,12 +102,12 @@ namespace Umbraco.Web.Routing { var contentCache = _publishedSnapshotAccessor.PublishedSnapshot.Content; var entityContent = contentCache.GetById(entity.Id); - if (entityContent == null) return; + if (entityContent == null) return; - // get the default affected cultures by going up the tree until we find the first culture variant entity (default to no cultures) + // get the default affected cultures by going up the tree until we find the first culture variant entity (default to no cultures) var defaultCultures = entityContent.AncestorsOrSelf()?.FirstOrDefault(a => a.Cultures.Any())?.Cultures.Keys.ToArray() ?? new[] { (string)null }; - foreach (var x in entityContent.DescendantsOrSelf()) + foreach (var x in entityContent.DescendantsOrSelf(_variationContextAccessor)) { // if this entity defines specific cultures, use those instead of the default ones var cultures = x.Cultures.Any() ? x.Cultures.Keys : defaultCultures; diff --git a/src/Umbraco.Web/Routing/RedirectTrackingComposer.cs b/src/Umbraco.Infrastructure/Routing/RedirectTrackingComposer.cs similarity index 100% rename from src/Umbraco.Web/Routing/RedirectTrackingComposer.cs rename to src/Umbraco.Infrastructure/Routing/RedirectTrackingComposer.cs diff --git a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs index 109f307c98..6ea873cab5 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs @@ -4,6 +4,7 @@ using Umbraco.Core.Composing; using Umbraco.Core.Composing.CompositionExtensions; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Dashboards; using Umbraco.Core.Hosting; using Umbraco.Core.Dictionary; using Umbraco.Core.Logging; @@ -18,8 +19,17 @@ using Umbraco.Core.PropertyEditors.Validators; using Umbraco.Core.Scoping; using Umbraco.Core.Serialization; using Umbraco.Core.Services; +using Umbraco.Core.Services.Implement; using Umbraco.Core.Strings; using Umbraco.Core.Sync; +using Umbraco.Web.Models.PublishedContent; +using Umbraco.Web.PublishedCache; +using Umbraco.Web; +using Umbraco.Web.Migrations.PostMigrations; +using Umbraco.Web.Install; +using Umbraco.Web.Trees; +using Umbraco.Web.PropertyEditors; +using Umbraco.Web.Services; using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidator; using Umbraco.Infrastructure.Migrations.Custom; @@ -52,6 +62,8 @@ namespace Umbraco.Core.Runtime composition.RegisterUnique(f => f.GetInstance()); composition.RegisterUnique(); + composition.RegisterUnique(); + composition.RegisterUnique(); // register database builder // *not* a singleton, don't want to keep it around @@ -75,6 +87,11 @@ namespace Umbraco.Core.Runtime // properties and parameters derive from data editors composition.DataEditors() .Add(() => composition.TypeLoader.GetDataEditors()); + + composition.MediaUrlGenerators() + .Add() + .Add(); + composition.RegisterUnique(); composition.RegisterUnique(); @@ -134,11 +151,27 @@ namespace Umbraco.Core.Runtime // by default, register a noop factory composition.RegisterUnique(); - // by default, register a noop rebuilder + // by default composition.RegisterUnique(); composition.SetCultureDictionaryFactory(); composition.Register(f => f.GetInstance().CreateDictionary(), Lifetime.Singleton); + composition.RegisterUnique(); + + // register the published snapshot accessor - the "current" published snapshot is in the umbraco context + composition.RegisterUnique(); + + composition.RegisterUnique(); + + composition.RegisterUnique(); + + // register core CMS dashboards and 3rd party types - will be ordered by weight attribute & merged with package.manifest dashboards + composition.Dashboards() + .Add(composition.TypeLoader.GetTypes()); + + // will be injected in controllers when needed to invoke rest endpoints on Our + composition.RegisterUnique(); + composition.RegisterUnique(); } } } diff --git a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs b/src/Umbraco.Infrastructure/Scheduling/ScheduledPublishing.cs similarity index 91% rename from src/Umbraco.Web/Scheduling/ScheduledPublishing.cs rename to src/Umbraco.Infrastructure/Scheduling/ScheduledPublishing.cs index 2e79e40d7a..b074704033 100644 --- a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs +++ b/src/Umbraco.Infrastructure/Scheduling/ScheduledPublishing.cs @@ -7,21 +7,23 @@ using Umbraco.Core.Sync; namespace Umbraco.Web.Scheduling { - internal class ScheduledPublishing : RecurringTaskBase + public class ScheduledPublishing : RecurringTaskBase { private readonly IRuntimeState _runtime; private readonly IContentService _contentService; private readonly IUmbracoContextFactory _umbracoContextFactory; private readonly ILogger _logger; + private readonly IServerMessenger _serverMessenger; public ScheduledPublishing(IBackgroundTaskRunner runner, int delayMilliseconds, int periodMilliseconds, - IRuntimeState runtime, IContentService contentService, IUmbracoContextFactory umbracoContextFactory, ILogger logger) + IRuntimeState runtime, IContentService contentService, IUmbracoContextFactory umbracoContextFactory, ILogger logger, IServerMessenger serverMessenger) : base(runner, delayMilliseconds, periodMilliseconds) { _runtime = runtime; _contentService = contentService; _umbracoContextFactory = umbracoContextFactory; _logger = logger; + _serverMessenger = serverMessenger; } public override bool PerformRun() @@ -76,7 +78,7 @@ namespace Umbraco.Web.Scheduling finally { // if running on a temp context, we have to flush the messenger - if (contextReference.IsRoot && Composing.Current.ServerMessenger is BatchedDatabaseServerMessenger m) + if (contextReference.IsRoot && _serverMessenger is IBatchedDatabaseServerMessenger m) m.FlushBatch(); } } diff --git a/src/Umbraco.Web/Scheduling/SchedulerComponent.cs b/src/Umbraco.Infrastructure/Scheduling/SchedulerComponent.cs similarity index 94% rename from src/Umbraco.Web/Scheduling/SchedulerComponent.cs rename to src/Umbraco.Infrastructure/Scheduling/SchedulerComponent.cs index ca6f0729eb..6e5d0ee81e 100644 --- a/src/Umbraco.Web/Scheduling/SchedulerComponent.cs +++ b/src/Umbraco.Infrastructure/Scheduling/SchedulerComponent.cs @@ -9,11 +9,12 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Logging; +using Umbraco.Core.Request; using Umbraco.Core.Scoping; using Umbraco.Core.Services; +using Umbraco.Core.Sync; using Umbraco.Web.HealthCheck; using Umbraco.Web.Routing; -using Current = Umbraco.Web.Composing.Current; namespace Umbraco.Web.Scheduling { @@ -36,6 +37,8 @@ namespace Umbraco.Web.Scheduling private readonly IHealthChecks _healthChecksConfig; private readonly IUmbracoSettingsSection _umbracoSettingsSection; private readonly IIOHelper _ioHelper; + private readonly IServerMessenger _serverMessenger; + private readonly IRequestAccessor _requestAccessor; private BackgroundTaskRunner _keepAliveRunner; private BackgroundTaskRunner _publishingRunner; @@ -53,7 +56,7 @@ namespace Umbraco.Web.Scheduling HealthCheckCollection healthChecks, HealthCheckNotificationMethodCollection notifications, IScopeProvider scopeProvider, IUmbracoContextFactory umbracoContextFactory, IProfilingLogger logger, IHostingEnvironment hostingEnvironment, IHealthChecks healthChecksConfig, - IUmbracoSettingsSection umbracoSettingsSection, IIOHelper ioHelper) + IUmbracoSettingsSection umbracoSettingsSection, IIOHelper ioHelper, IServerMessenger serverMessenger, IRequestAccessor requestAccessor) { _runtime = runtime; _contentService = contentService; @@ -68,6 +71,8 @@ namespace Umbraco.Web.Scheduling _healthChecksConfig = healthChecksConfig ?? throw new ArgumentNullException(nameof(healthChecksConfig)); _umbracoSettingsSection = umbracoSettingsSection ?? throw new ArgumentNullException(nameof(umbracoSettingsSection)); _ioHelper = ioHelper; + _serverMessenger = serverMessenger; + _requestAccessor = requestAccessor; } public void Initialize() @@ -81,7 +86,7 @@ namespace Umbraco.Web.Scheduling _healthCheckRunner = new BackgroundTaskRunner("HealthCheckNotifier", _logger, _hostingEnvironment); // we will start the whole process when a successful request is made - UmbracoModule.RouteAttempt += RegisterBackgroundTasksOnce; + _requestAccessor.RouteAttempt += RegisterBackgroundTasksOnce; } public void Terminate() @@ -95,7 +100,7 @@ namespace Umbraco.Web.Scheduling { case EnsureRoutableOutcome.IsRoutable: case EnsureRoutableOutcome.NotDocumentRequest: - UmbracoModule.RouteAttempt -= RegisterBackgroundTasksOnce; + _requestAccessor.RouteAttempt -= RegisterBackgroundTasksOnce; RegisterBackgroundTasks(); break; } @@ -140,7 +145,7 @@ namespace Umbraco.Web.Scheduling { // scheduled publishing/unpublishing // install on all, will only run on non-replica servers - var task = new ScheduledPublishing(_publishingRunner, DefaultDelayMilliseconds, OneMinuteMilliseconds, _runtime, _contentService, _umbracoContextFactory, _logger); + var task = new ScheduledPublishing(_publishingRunner, DefaultDelayMilliseconds, OneMinuteMilliseconds, _runtime, _contentService, _umbracoContextFactory, _logger, _serverMessenger); _publishingRunner.TryAdd(task); return task; } diff --git a/src/Umbraco.Web/Scheduling/SchedulerComposer.cs b/src/Umbraco.Infrastructure/Scheduling/SchedulerComposer.cs similarity index 100% rename from src/Umbraco.Web/Scheduling/SchedulerComposer.cs rename to src/Umbraco.Infrastructure/Scheduling/SchedulerComposer.cs diff --git a/src/Umbraco.Web/Search/BackgroundIndexRebuilder.cs b/src/Umbraco.Infrastructure/Search/BackgroundIndexRebuilder.cs similarity index 100% rename from src/Umbraco.Web/Search/BackgroundIndexRebuilder.cs rename to src/Umbraco.Infrastructure/Search/BackgroundIndexRebuilder.cs diff --git a/src/Umbraco.Web/Search/ExamineComponent.cs b/src/Umbraco.Infrastructure/Search/ExamineComponent.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineComponent.cs rename to src/Umbraco.Infrastructure/Search/ExamineComponent.cs diff --git a/src/Umbraco.Web/Search/ExamineComposer.cs b/src/Umbraco.Infrastructure/Search/ExamineComposer.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineComposer.cs rename to src/Umbraco.Infrastructure/Search/ExamineComposer.cs diff --git a/src/Umbraco.Web/Search/ExamineFinalComponent.cs b/src/Umbraco.Infrastructure/Search/ExamineFinalComponent.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineFinalComponent.cs rename to src/Umbraco.Infrastructure/Search/ExamineFinalComponent.cs diff --git a/src/Umbraco.Web/Search/ExamineFinalComposer.cs b/src/Umbraco.Infrastructure/Search/ExamineFinalComposer.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineFinalComposer.cs rename to src/Umbraco.Infrastructure/Search/ExamineFinalComposer.cs diff --git a/src/Umbraco.Web/Search/ExamineIndexModel.cs b/src/Umbraco.Infrastructure/Search/ExamineIndexModel.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineIndexModel.cs rename to src/Umbraco.Infrastructure/Search/ExamineIndexModel.cs diff --git a/src/Umbraco.Web/Search/ExamineSearcherModel.cs b/src/Umbraco.Infrastructure/Search/ExamineSearcherModel.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineSearcherModel.cs rename to src/Umbraco.Infrastructure/Search/ExamineSearcherModel.cs diff --git a/src/Umbraco.Web/Search/ExamineUserComponent.cs b/src/Umbraco.Infrastructure/Search/ExamineUserComponent.cs similarity index 100% rename from src/Umbraco.Web/Search/ExamineUserComponent.cs rename to src/Umbraco.Infrastructure/Search/ExamineUserComponent.cs diff --git a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs b/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs similarity index 92% rename from src/Umbraco.Web/Search/UmbracoTreeSearcher.cs rename to src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs index 0f52384409..11b91ffc90 100644 --- a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs +++ b/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Examine; using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Routing; using Umbraco.Web.Trees; namespace Umbraco.Web.Search @@ -20,26 +21,28 @@ namespace Umbraco.Web.Search /// public class UmbracoTreeSearcher { - private readonly UmbracoContext _umbracoContext; private readonly ILocalizationService _languageService; private readonly IEntityService _entityService; private readonly UmbracoMapper _mapper; private readonly ISqlContext _sqlContext; private readonly IBackOfficeExamineSearcher _backOfficeExamineSearcher; + private readonly IPublishedUrlProvider _publishedUrlProvider; - public UmbracoTreeSearcher(UmbracoContext umbracoContext, + public UmbracoTreeSearcher( ILocalizationService languageService, IEntityService entityService, UmbracoMapper mapper, - ISqlContext sqlContext, IBackOfficeExamineSearcher backOfficeExamineSearcher) + ISqlContext sqlContext, + IBackOfficeExamineSearcher backOfficeExamineSearcher, + IPublishedUrlProvider publishedUrlProvider) { - _umbracoContext = umbracoContext; _languageService = languageService; _entityService = entityService; _mapper = mapper; _sqlContext = sqlContext; _backOfficeExamineSearcher = backOfficeExamineSearcher; + _publishedUrlProvider = publishedUrlProvider; } /// @@ -157,11 +160,11 @@ namespace Umbraco.Web.Search //if it varies by culture, return the default language URL if (result.Values.TryGetValue(UmbracoExamineFieldNames.VariesByCultureFieldName, out var varies) && varies == "y") { - entity.AdditionalData["Url"] = _umbracoContext.Url(intId.Result, defaultLang); + entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId.Result, culture: defaultLang); } else { - entity.AdditionalData["Url"] = _umbracoContext.Url(intId.Result); + entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId.Result); } } diff --git a/src/Umbraco.Web/Search/UmbracoTreeSearcherFields.cs b/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcherFields.cs similarity index 100% rename from src/Umbraco.Web/Search/UmbracoTreeSearcherFields.cs rename to src/Umbraco.Infrastructure/Search/UmbracoTreeSearcherFields.cs diff --git a/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs index 50f12ba73e..7e39894aa3 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs @@ -318,6 +318,15 @@ namespace Umbraco.Core.Services.Implement } } + public bool HasContainerInPath(params int[] ids) + { + using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + { + // can use same repo for both content and media + return Repository.HasContainerInPath(ids); + } + } + public IEnumerable GetDescendants(int id, bool andSelf) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) diff --git a/src/Umbraco.Infrastructure/Services/Implement/DataTypeService.cs b/src/Umbraco.Infrastructure/Services/Implement/DataTypeService.cs index f9d0256568..08bed264ae 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/DataTypeService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/DataTypeService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Events; using Umbraco.Core.Exceptions; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Dtos; @@ -10,6 +11,7 @@ using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Scoping; +using Umbraco.Core.Strings; namespace Umbraco.Core.Services.Implement { @@ -23,10 +25,15 @@ namespace Umbraco.Core.Services.Implement private readonly IContentTypeRepository _contentTypeRepository; private readonly IAuditRepository _auditRepository; private readonly IEntityRepository _entityRepository; + private readonly IIOHelper _ioHelper; + private readonly ILocalizedTextService _localizedTextService; + private readonly ILocalizationService _localizationService; + private readonly IShortStringHelper _shortStringHelper; public DataTypeService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeRepository dataTypeRepository, IDataTypeContainerRepository dataTypeContainerRepository, - IAuditRepository auditRepository, IEntityRepository entityRepository, IContentTypeRepository contentTypeRepository) + IAuditRepository auditRepository, IEntityRepository entityRepository, IContentTypeRepository contentTypeRepository, + IIOHelper ioHelper, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper) : base(provider, logger, eventMessagesFactory) { _dataTypeRepository = dataTypeRepository; @@ -34,6 +41,10 @@ namespace Umbraco.Core.Services.Implement _auditRepository = auditRepository; _entityRepository = entityRepository; _contentTypeRepository = contentTypeRepository; + _ioHelper = ioHelper; + _localizedTextService = localizedTextService; + _localizationService = localizationService; + _shortStringHelper = shortStringHelper; } #region Containers @@ -227,7 +238,9 @@ namespace Umbraco.Core.Services.Implement { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { - return _dataTypeRepository.Get(Query().Where(x => x.Name == name)).FirstOrDefault(); + var dataType = _dataTypeRepository.Get(Query().Where(x => x.Name == name)).FirstOrDefault(); + ConvertMissingEditorOfDataTypeToLabel(dataType); + return dataType; } } @@ -240,7 +253,9 @@ namespace Umbraco.Core.Services.Implement { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { - return _dataTypeRepository.Get(id); + var dataType = _dataTypeRepository.Get(id); + ConvertMissingEditorOfDataTypeToLabel(dataType); + return dataType; } } @@ -254,7 +269,9 @@ namespace Umbraco.Core.Services.Implement using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { var query = Query().Where(x => x.Key == id); - return _dataTypeRepository.Get(query).FirstOrDefault(); + var dataType = _dataTypeRepository.Get(query).FirstOrDefault(); + ConvertMissingEditorOfDataTypeToLabel(dataType); + return dataType; } } @@ -268,7 +285,9 @@ namespace Umbraco.Core.Services.Implement using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { var query = Query().Where(x => x.EditorAlias == propertyEditorAlias); - return _dataTypeRepository.Get(query); + var dataType = _dataTypeRepository.Get(query); + ConvertMissingEditorsOfDataTypesToLabels(dataType); + return dataType; } } @@ -281,7 +300,31 @@ namespace Umbraco.Core.Services.Implement { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { - return _dataTypeRepository.GetMany(ids); + var dataTypes = _dataTypeRepository.GetMany(ids); + ConvertMissingEditorsOfDataTypesToLabels(dataTypes); + return dataTypes; + } + } + + private void ConvertMissingEditorOfDataTypeToLabel(IDataType dataType) + { + if (dataType == null) + { + return; + } + + ConvertMissingEditorsOfDataTypesToLabels(new[] { dataType }); + } + + private void ConvertMissingEditorsOfDataTypesToLabels(IEnumerable dataTypes) + { + // Any data types that don't have an associated editor are created of a specific type. + // We convert them to labels to make clear to the user why the data type cannot be used. + var dataTypesWithMissingEditors = dataTypes + .Where(x => x.Editor is MissingPropertyEditor); + foreach (var dataType in dataTypesWithMissingEditors) + { + dataType.Editor = new LabelPropertyEditor(Logger, _ioHelper, this, _localizedTextService, _localizationService, _shortStringHelper); } } diff --git a/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs b/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs index e8fea4c0e1..d69297eb57 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs @@ -415,7 +415,6 @@ namespace Umbraco.Core.Services.Implement var xml = new XElement("macro"); xml.Add(new XElement("name", macro.Name)); xml.Add(new XElement("alias", macro.Alias)); - xml.Add(new XElement("macroType", macro.MacroType)); xml.Add(new XElement("macroSource", macro.MacroSource)); xml.Add(new XElement("useInEditor", macro.UseInEditor.ToString())); xml.Add(new XElement("dontRender", macro.DontRender.ToString())); diff --git a/src/Umbraco.Infrastructure/Services/Implement/IInstallationService.cs b/src/Umbraco.Infrastructure/Services/Implement/IInstallationService.cs new file mode 100644 index 0000000000..334088f8ae --- /dev/null +++ b/src/Umbraco.Infrastructure/Services/Implement/IInstallationService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Services +{ + public interface IInstallationService + { + Task LogInstall(InstallLog installLog); + } +} diff --git a/src/Umbraco.Infrastructure/Services/Implement/Implement/InstallationService.cs b/src/Umbraco.Infrastructure/Services/Implement/Implement/InstallationService.cs new file mode 100644 index 0000000000..a1f74e0862 --- /dev/null +++ b/src/Umbraco.Infrastructure/Services/Implement/Implement/InstallationService.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Repositories; + +namespace Umbraco.Core.Services.Implement +{ + public class InstallationService : IInstallationService + { + private readonly IInstallationRepository _installationRepository; + + public InstallationService(IInstallationRepository installationRepository) + { + _installationRepository = installationRepository; + } + + public async Task LogInstall(InstallLog installLog) + { + await _installationRepository.SaveInstallLogAsync(installLog); + } + } +} diff --git a/src/Umbraco.Web/Suspendable.cs b/src/Umbraco.Infrastructure/Suspendable.cs similarity index 88% rename from src/Umbraco.Web/Suspendable.cs rename to src/Umbraco.Infrastructure/Suspendable.cs index a1d79d3619..7287d1c364 100644 --- a/src/Umbraco.Web/Suspendable.cs +++ b/src/Umbraco.Infrastructure/Suspendable.cs @@ -1,6 +1,6 @@ -using Umbraco.Core; +using Umbraco.Composing; +using Umbraco.Core.Cache; using Umbraco.Core.Logging; -using Umbraco.Web.Composing; using Umbraco.Examine; using Umbraco.Web.Cache; using Umbraco.Web.Search; @@ -34,7 +34,7 @@ namespace Umbraco.Web _suspended = true; } - public static void ResumeDocumentCache() + public static void ResumeDocumentCache(CacheRefresherCollection cacheRefresherCollection) { _suspended = false; @@ -43,7 +43,7 @@ namespace Umbraco.Web if (_tried == false) return; _tried = false; - var pageRefresher = Current.CacheRefreshers[ContentCacheRefresher.UniqueId]; + var pageRefresher = cacheRefresherCollection[ContentCacheRefresher.UniqueId]; pageRefresher.RefreshAll(); } } @@ -70,7 +70,7 @@ namespace Umbraco.Web _suspended = true; } - public static void ResumeIndexers(IndexRebuilder indexRebuilder, ILogger logger) + public static void ResumeIndexers(IndexRebuilder indexRebuilder, ILogger logger, BackgroundIndexRebuilder backgroundIndexRebuilder) { _suspended = false; @@ -79,7 +79,7 @@ namespace Umbraco.Web if (_tried == false) return; _tried = false; - Current.Factory.GetInstance().RebuildIndexes(false); + backgroundIndexRebuilder.RebuildIndexes(false); } } diff --git a/src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs b/src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs index 948304e4e4..5a46a37d43 100644 --- a/src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs +++ b/src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs @@ -26,7 +26,7 @@ namespace Umbraco.Core.Sync // but only processes instructions coming from remote servers, // thus ensuring that instructions run only once // - public class DatabaseServerMessenger : ServerMessengerBase + public class DatabaseServerMessenger : ServerMessengerBase, IDatabaseServerMessenger { private readonly IRuntimeState _runtime; private readonly ManualResetEvent _syncIdle; @@ -126,10 +126,6 @@ namespace Umbraco.Core.Sync const int weight = 10; - //TODO Why do we have interface if we expect to be exact type!!!? - // if (!(_runtime is RuntimeState runtime)) - // throw new NotSupportedException($"Unsupported IRuntimeState implementation {_runtime.GetType().FullName}, expecting {typeof(RuntimeState).FullName}."); - var registered = _runtime.MainDom.Register( () => { diff --git a/src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs b/src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs index 3b47cabbaf..b65254b181 100644 --- a/src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs +++ b/src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs @@ -4,7 +4,6 @@ using System.Linq; using Newtonsoft.Json; using Umbraco.Composing; using Umbraco.Core.Cache; -using Umbraco.Core.Composing; using Umbraco.Core.Logging; namespace Umbraco.Core.Sync diff --git a/src/Umbraco.Web/TagQuery.cs b/src/Umbraco.Infrastructure/TagQuery.cs similarity index 100% rename from src/Umbraco.Web/TagQuery.cs rename to src/Umbraco.Infrastructure/TagQuery.cs diff --git a/src/Umbraco.Web/Trees/TreeNode.cs b/src/Umbraco.Infrastructure/Trees/TreeNode.cs similarity index 97% rename from src/Umbraco.Web/Trees/TreeNode.cs rename to src/Umbraco.Infrastructure/Trees/TreeNode.cs index 7661387b3d..cc130b1b97 100644 --- a/src/Umbraco.Web/Trees/TreeNode.cs +++ b/src/Umbraco.Infrastructure/Trees/TreeNode.cs @@ -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 /// The parent id for the current node /// /// - 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)); diff --git a/src/Umbraco.Web/Models/Trees/TreeNodeCollection.cs b/src/Umbraco.Infrastructure/Trees/TreeNodeCollection.cs similarity index 100% rename from src/Umbraco.Web/Models/Trees/TreeNodeCollection.cs rename to src/Umbraco.Infrastructure/Trees/TreeNodeCollection.cs diff --git a/src/Umbraco.Web/Models/Trees/TreeNodeExtensions.cs b/src/Umbraco.Infrastructure/Trees/TreeNodeExtensions.cs similarity index 100% rename from src/Umbraco.Web/Models/Trees/TreeNodeExtensions.cs rename to src/Umbraco.Infrastructure/Trees/TreeNodeExtensions.cs diff --git a/src/Umbraco.Web/Models/Trees/TreeRootNode.cs b/src/Umbraco.Infrastructure/Trees/TreeRootNode.cs similarity index 100% rename from src/Umbraco.Web/Models/Trees/TreeRootNode.cs rename to src/Umbraco.Infrastructure/Trees/TreeRootNode.cs diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index b3b291a286..1db36a9c09 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -2,10 +2,11 @@ netstandard2.0 - 7.3 + 8 + @@ -27,6 +28,7 @@ + @@ -46,10 +48,6 @@ - - - - <_Parameter1>Umbraco.Tests @@ -63,4 +61,8 @@ + + + + diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs index 1fdb64c62a..75affe09e7 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs @@ -1,4 +1,4 @@ -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.ModelsBuilder.Embedded.BackOffice diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs index 15ca2cca24..1e96e64df8 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using Umbraco.Core.Configuration; using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; -using Umbraco.ModelsBuilder.Embedded.Configuration; using Umbraco.Web.Editors; using Umbraco.Web.Models.ContentEditing; diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs index 25ddc838e8..6e22313474 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs @@ -1,5 +1,6 @@ using System.Text; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Configuration; +using Umbraco.Core.Configuration; namespace Umbraco.ModelsBuilder.Embedded.BackOffice { diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs index 9dc1ea6c20..fcd42908e7 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs @@ -1,4 +1,4 @@ -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.ModelsBuilder.Embedded.BackOffice diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs index 8d0a98eeab..2e249eed4d 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs @@ -1,4 +1,4 @@ -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.ModelsBuilder.Embedded.BackOffice diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs index 1d9de265e9..17b694de56 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs @@ -3,9 +3,10 @@ using System.Net; using System.Net.Http; using System.Runtime.Serialization; using System.Web.Hosting; +using Umbraco.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Core.Exceptions; using Umbraco.ModelsBuilder.Embedded.Building; -using Umbraco.ModelsBuilder.Embedded.Configuration; using Umbraco.Web.Editors; using Umbraco.Web.WebApi.Filters; diff --git a/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs b/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs index ffd56d4312..f64e5ed1ce 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core; +using Umbraco.Core.Configuration; namespace Umbraco.ModelsBuilder.Embedded.Building { @@ -18,6 +19,8 @@ namespace Umbraco.ModelsBuilder.Embedded.Building internal abstract class Builder { + + private readonly IList _typeModels; protected Dictionary ModelsMap { get; } = new Dictionary(); @@ -209,7 +212,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Building // use configured else fallback to default return string.IsNullOrWhiteSpace(Config.ModelsNamespace) - ? ModelsBuilderConfig.DefaultModelsNamespace + ? Constants.ModelsBuilder.DefaultModelsNamespace : Config.ModelsNamespace; } diff --git a/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs b/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs index 8a3bc5a5b5..192f049930 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs @@ -1,6 +1,6 @@ using System.IO; using System.Text; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; namespace Umbraco.ModelsBuilder.Embedded.Building { diff --git a/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs b/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs index d1190a0374..4c796f3c7b 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; namespace Umbraco.ModelsBuilder.Embedded.Building { diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs index d856cae1e7..769cca7317 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs @@ -4,13 +4,14 @@ using System.Reflection; using System.Web; using System.Web.Mvc; using System.Web.Routing; +using Umbraco.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Core.Composing; using Umbraco.Core.IO; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; using Umbraco.Core.Strings; using Umbraco.ModelsBuilder.Embedded.BackOffice; -using Umbraco.ModelsBuilder.Embedded.Configuration; using Umbraco.Web; using Umbraco.Web.JavaScript; using Umbraco.Web.Mvc; diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs index bb8a3f7e18..2914fe1b12 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs @@ -1,12 +1,11 @@ using System.Linq; using System.Reflection; +using Umbraco.Core.Configuration; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Composing; using Umbraco.Core.Models.PublishedContent; using Umbraco.ModelsBuilder.Embedded.Building; -using Umbraco.ModelsBuilder.Embedded.Configuration; -using Umbraco.Web; namespace Umbraco.ModelsBuilder.Embedded.Compose { @@ -20,16 +19,12 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose { var isLegacyModelsBuilderInstalled = IsLegacyModelsBuilderInstalled(); - - composition.Configs.Add(() => new ModelsBuilderConfig(composition.IOHelper)); - if (isLegacyModelsBuilderInstalled) { ComposeForLegacyModelsBuilder(composition); return; } - composition.Components().Append(); composition.Register(Lifetime.Singleton); composition.RegisterUnique(); diff --git a/src/Umbraco.ModelsBuilder.Embedded/ConfigsExtensions.cs b/src/Umbraco.ModelsBuilder.Embedded/ConfigsExtensions.cs index d634547a49..d625c754c5 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/ConfigsExtensions.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/ConfigsExtensions.cs @@ -1,5 +1,4 @@ using Umbraco.Core.Configuration; -using Umbraco.ModelsBuilder.Embedded.Configuration; namespace Umbraco.ModelsBuilder.Embedded { diff --git a/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs b/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs index d4b4636563..61d39cd373 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs @@ -1,10 +1,10 @@ using System; using System.Threading; -using System.Web.Hosting; +using Umbraco.Core.Configuration; +using Umbraco.Configuration; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.ModelsBuilder.Embedded.Building; -using Umbraco.ModelsBuilder.Embedded.Configuration; using Umbraco.Web.Cache; namespace Umbraco.ModelsBuilder.Embedded diff --git a/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs b/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs index a692f633a5..5b498fd5f3 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs @@ -1,7 +1,7 @@ using System; using System.IO; using System.Text; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; namespace Umbraco.ModelsBuilder.Embedded { diff --git a/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs b/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs index 5425c31c77..0e93030438 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs @@ -1,5 +1,5 @@ using System.IO; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Core.Configuration; using Umbraco.Web.Cache; namespace Umbraco.ModelsBuilder.Embedded diff --git a/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs b/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs index fe28817cba..bef2fa8414 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs @@ -11,12 +11,12 @@ using System.Threading; using System.Web; using System.Web.Compilation; using System.Web.WebPages.Razor; +using Umbraco.Core.Configuration; using Umbraco.Core; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.ModelsBuilder.Embedded.Building; -using Umbraco.ModelsBuilder.Embedded.Configuration; using File = System.IO.File; namespace Umbraco.ModelsBuilder.Embedded diff --git a/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj b/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj index 0ed95c3283..a03862326d 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj +++ b/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj @@ -12,7 +12,7 @@ v4.7.2 512 true - 7.3 + 8 true @@ -59,10 +59,6 @@ - - - - @@ -101,18 +97,14 @@ - + {29aa69d9-b597-4395-8d42-43b1263c240a} - Umbraco.Abstractions + Umbraco.Core {3ae7bf57-966b-45a5-910a-954d7c554441} Umbraco.Infrastructure - - {9b95eef7-63fe-4432-8c63-166be9c1a929} - Umbraco.Web.BackOffice - {651e1350-91b6-44b7-bd60-7207006d7003} Umbraco.Web @@ -123,6 +115,5 @@ 5.2.7 - \ No newline at end of file diff --git a/src/Umbraco.Persistance.SqlCe/SqlCeSyntaxProvider.cs b/src/Umbraco.Persistance.SqlCe/SqlCeSyntaxProvider.cs index 2ed0fb878c..7abcc60c86 100644 --- a/src/Umbraco.Persistance.SqlCe/SqlCeSyntaxProvider.cs +++ b/src/Umbraco.Persistance.SqlCe/SqlCeSyntaxProvider.cs @@ -55,6 +55,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax } public override System.Data.IsolationLevel DefaultIsolationLevel => System.Data.IsolationLevel.RepeatableRead; + public override string DbProvider => "SqlServerCE"; public override string FormatColumnRename(string tableName, string oldName, string newName) { diff --git a/src/Umbraco.Persistance.SqlCe/Umbraco.Persistance.SqlCe.csproj b/src/Umbraco.Persistance.SqlCe/Umbraco.Persistance.SqlCe.csproj index ae40051129..3174d4a7e2 100644 --- a/src/Umbraco.Persistance.SqlCe/Umbraco.Persistance.SqlCe.csproj +++ b/src/Umbraco.Persistance.SqlCe/Umbraco.Persistance.SqlCe.csproj @@ -2,6 +2,7 @@ net472 + 8 diff --git a/src/Umbraco.PublishedCache.NuCache/DataSource/BTree.cs b/src/Umbraco.PublishedCache.NuCache/DataSource/BTree.cs index 910c0ca737..ad7cc72eec 100644 --- a/src/Umbraco.PublishedCache.NuCache/DataSource/BTree.cs +++ b/src/Umbraco.PublishedCache.NuCache/DataSource/BTree.cs @@ -1,12 +1,13 @@ using System.Configuration; using CSharpTest.Net.Collections; using CSharpTest.Net.Serialization; +using Umbraco.Core.Configuration; namespace Umbraco.Web.PublishedCache.NuCache.DataSource { internal class BTree { - public static BPlusTree GetTree(string filepath, bool exists) + public static BPlusTree GetTree(string filepath, bool exists, INuCacheSettings settings) { var keySerializer = new PrimitiveSerializer(); var valueSerializer = new ContentNodeKitSerializer(); @@ -19,7 +20,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource CachePolicy = CachePolicy.None, // default is 4096, min 2^9 = 512, max 2^16 = 64K - FileBlockSize = GetBlockSize(), + FileBlockSize = GetBlockSize(settings), // other options? }; @@ -32,11 +33,11 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource return tree; } - private static int GetBlockSize() + private static int GetBlockSize(INuCacheSettings settings) { var blockSize = 4096; - var appSetting = ConfigurationManager.AppSettings["Umbraco.Web.PublishedCache.NuCache.BTree.BlockSize"]; + var appSetting = settings.BTreeBlockSize; if (appSetting == null) return blockSize; diff --git a/src/Umbraco.PublishedCache.NuCache/PublishedSnapshotService.cs b/src/Umbraco.PublishedCache.NuCache/PublishedSnapshotService.cs index 5d99aa6aaa..74295b7182 100644 --- a/src/Umbraco.PublishedCache.NuCache/PublishedSnapshotService.cs +++ b/src/Umbraco.PublishedCache.NuCache/PublishedSnapshotService.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Hosting; using Umbraco.Core.Install; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; @@ -26,6 +27,7 @@ using Umbraco.Core.Services.Changes; using Umbraco.Core.Services.Implement; using Umbraco.Core.Strings; using Umbraco.Web.Cache; +using Umbraco.Web.Install; using Umbraco.Web.PublishedCache.NuCache.DataSource; using Umbraco.Web.Routing; using File = System.IO.File; @@ -50,7 +52,8 @@ namespace Umbraco.Web.PublishedCache.NuCache private readonly ITypeFinder _typeFinder; private readonly IHostingEnvironment _hostingEnvironment; private readonly IShortStringHelper _shortStringHelper; - private readonly IFilePermissionHelper _filePermissionHelper; + private readonly IIOHelper _ioHelper; + private readonly INuCacheSettings _config; // volatile because we read it with no lock private volatile bool _isReady; @@ -88,7 +91,8 @@ namespace Umbraco.Web.PublishedCache.NuCache ITypeFinder typeFinder, IHostingEnvironment hostingEnvironment, IShortStringHelper shortStringHelper, - IFilePermissionHelper filePermissionHelper) + IIOHelper ioHelper, + INuCacheSettings config) : base(publishedSnapshotAccessor, variationContextAccessor) { //if (Interlocked.Increment(ref _singletonCheck) > 1) @@ -108,7 +112,8 @@ namespace Umbraco.Web.PublishedCache.NuCache _typeFinder = typeFinder; _hostingEnvironment = hostingEnvironment; _shortStringHelper = shortStringHelper; - _filePermissionHelper = filePermissionHelper; + _ioHelper = ioHelper; + _config = config; // we need an Xml serializer here so that the member cache can support XPath, // for members this is done by navigating the serialized-to-xml member @@ -195,8 +200,8 @@ namespace Umbraco.Web.PublishedCache.NuCache _localMediaDbExists = File.Exists(localMediaDbPath); // if both local databases exist then GetTree will open them, else new databases will be created - _localContentDb = BTree.GetTree(localContentDbPath, _localContentDbExists); - _localMediaDb = BTree.GetTree(localMediaDbPath, _localMediaDbExists); + _localContentDb = BTree.GetTree(localContentDbPath, _localContentDbExists, _config); + _localMediaDb = BTree.GetTree(localMediaDbPath, _localMediaDbExists, _config); _logger.Info("Registered with MainDom, localContentDbExists? {LocalContentDbExists}, localMediaDbExists? {LocalMediaDbExists}", _localContentDbExists, _localMediaDbExists); } @@ -362,7 +367,7 @@ namespace Umbraco.Web.PublishedCache.NuCache public override bool EnsureEnvironment(out IEnumerable errors) { // must have app_data and be able to write files into it - var ok = _filePermissionHelper.TryCreateDirectory(GetLocalFilesPath()); + var ok = _ioHelper.TryCreateDirectory(GetLocalFilesPath()); errors = ok ? Enumerable.Empty() : new[] { "NuCache local files." }; return ok; } @@ -1307,7 +1312,7 @@ namespace Umbraco.Web.PublishedCache.NuCache var member = args.Entity; // refresh the edited data - OnRepositoryRefreshed(db, member, true); + OnRepositoryRefreshed(db, member, false); } private void OnRepositoryRefreshed(IUmbracoDatabase db, IContentBase content, bool published) diff --git a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj index 4c369ec2fa..75eeca268b 100644 --- a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj +++ b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj @@ -3,6 +3,7 @@ netstandard2.0 Umbraco.Infrastructure.PublishedCache + 8 @@ -11,7 +12,7 @@ - + diff --git a/src/Umbraco.TestData/Umbraco.TestData.csproj b/src/Umbraco.TestData/Umbraco.TestData.csproj index a79a417b33..963b598f26 100644 --- a/src/Umbraco.TestData/Umbraco.TestData.csproj +++ b/src/Umbraco.TestData/Umbraco.TestData.csproj @@ -12,6 +12,7 @@ v4.7.2 512 true + 8 true @@ -49,9 +50,9 @@ - + {29aa69d9-b597-4395-8d42-43b1263c240a} - Umbraco.Abstractions + Umbraco.Core {3ae7bf57-966b-45a5-910a-954d7c554441} diff --git a/src/Umbraco.TestData/UmbracoTestDataController.cs b/src/Umbraco.TestData/UmbracoTestDataController.cs index 522d4f6a40..09f9177982 100644 --- a/src/Umbraco.TestData/UmbracoTestDataController.cs +++ b/src/Umbraco.TestData/UmbracoTestDataController.cs @@ -33,8 +33,8 @@ namespace Umbraco.TestData private readonly PropertyEditorCollection _propertyEditors; private readonly IShortStringHelper _shortStringHelper; - public UmbracoTestDataController(IScopeProvider scopeProvider, PropertyEditorCollection propertyEditors, IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper, IShortStringHelper shortStringHelper) - : base(umbracoContextAccessor, databaseFactory, services, appCaches, logger, profilingLogger, umbracoHelper) + public UmbracoTestDataController(IScopeProvider scopeProvider, PropertyEditorCollection propertyEditors, IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, IShortStringHelper shortStringHelper) + : base(umbracoContextAccessor, databaseFactory, services, appCaches, logger, profilingLogger) { _scopeProvider = scopeProvider; _propertyEditors = propertyEditors; @@ -223,7 +223,7 @@ namespace Umbraco.TestData { var content = Services.ContentService.Create(faker.Commerce.ProductName(), currParent, docType.Alias); content.SetValue("review", faker.Rant.Review()); - content.SetValue("desc", string.Join(", ", Enumerable.Range(0, 5).Select(x => faker.Commerce.ProductAdjective()))); ; + content.SetValue("desc", string.Join(", ", Enumerable.Range(0, 5).Select(x => faker.Commerce.ProductAdjective()))); content.SetValue("media", imageIds[random.Next(0, imageIds.Count - 1)]); Services.ContentService.Save(content); diff --git a/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj b/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj index be120eea08..7566d8ab85 100644 --- a/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj +++ b/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj @@ -12,6 +12,7 @@ 512 true true + 8 AnyCPU @@ -66,9 +67,9 @@ - + {29aa69d9-b597-4395-8d42-43b1263c240a} - Umbraco.Abstractions + Umbraco.Core {3ae7bf57-966b-45a5-910a-954d7c554441} diff --git a/src/Umbraco.Tests/Cache/DeepCloneAppCacheTests.cs b/src/Umbraco.Tests/Cache/DeepCloneAppCacheTests.cs index 77200be86e..3a504ad4e2 100644 --- a/src/Umbraco.Tests/Cache/DeepCloneAppCacheTests.cs +++ b/src/Umbraco.Tests/Cache/DeepCloneAppCacheTests.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Linq; using System.Reflection; using System.Web; using Moq; @@ -20,14 +21,17 @@ namespace Umbraco.Tests.Cache public class DeepCloneAppCacheTests : RuntimeAppCacheTests { private DeepCloneAppCache _provider; + private ObjectCacheAppCache _memberCache; - protected override int GetTotalItemCount => HttpRuntime.Cache.Count; + protected override int GetTotalItemCount => _memberCache.MemoryCache.Count(); public override void Setup() { base.Setup(); var typeFinder = new TypeFinder(Mock.Of()); - _provider = new DeepCloneAppCache(new WebCachingAppCache(HttpRuntime.Cache, typeFinder)); + _memberCache = new ObjectCacheAppCache(typeFinder); + + _provider = new DeepCloneAppCache(_memberCache); } internal override IAppCache AppCache => _provider; diff --git a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs index 5fe13f01aa..5fb4b19168 100644 --- a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs +++ b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Serialization; using Umbraco.Core.Services; +using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; using Umbraco.Tests.Testing.Objects.Accessors; using Umbraco.Web; @@ -41,7 +42,7 @@ namespace Umbraco.Tests.Cache // we should really refactor events entirely - in the meantime, let it be an UmbracoTestBase ;( //var testObjects = new TestObjects(null); //var serviceContext = testObjects.GetServiceContextMock(); - var serviceContext = Current.Services; + var serviceContext = ServiceContext; var definitions = new IEventDefinition[] { @@ -149,21 +150,23 @@ namespace Umbraco.Tests.Cache var definitions = new IEventDefinition[] { // works because that event definition maps to an empty handler - new EventDefinition>(null, Current.Services.ContentTypeService, new SaveEventArgs(Enumerable.Empty()), "Saved"), + new EventDefinition>(null, ServiceContext.ContentTypeService, new SaveEventArgs(Enumerable.Empty()), "Saved"), }; + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); + var umbracoContextFactory = new UmbracoContextFactory( new TestUmbracoContextAccessor(), Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), TestObjects.GetGlobalSettings(), - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - IOHelper); + IOHelper, + UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); // just assert it does not throw var refreshers = new DistributedCacheBinder(null, umbracoContextFactory, null); diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs index a18733869d..b096235708 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs @@ -23,7 +23,7 @@ namespace Umbraco.Tests.Cache.PublishedCache public class PublishContentCacheTests : BaseWebTest { private FakeHttpContextFactory _httpContextFactory; - private UmbracoContext _umbracoContext; + private IUmbracoContext _umbracoContext; private IPublishedContentCache _cache; private XmlDocument _xml; @@ -74,16 +74,17 @@ namespace Umbraco.Tests.Cache.PublishedCache var publishedSnapshotService = new Mock(); publishedSnapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(publishedShapshot); + var httpContext = _httpContextFactory.HttpContext; + var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext); _umbracoContext = new UmbracoContext( - _httpContextFactory.HttpContext, + httpContextAccessor, publishedSnapshotService.Object, - new WebSecurity(_httpContextFactory.HttpContext, Mock.Of(), globalSettings, IOHelper), - umbracoSettings, - Enumerable.Empty(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, Mock.Of(), globalSettings, IOHelper), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); _cache = _umbracoContext.Content; } diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs index 6be417e484..81214ccdb2 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs @@ -99,7 +99,7 @@ namespace Umbraco.Tests.Cache.PublishedCache //var publishedMedia = PublishedMediaTests.GetNode(mRoot.Id, GetUmbracoContext("/test", 1234)); var umbracoContext = GetUmbracoContext("/test"); - var cache = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null, HostingEnvironment), Current.Services.MediaService, Current.Services.UserService, new DictionaryAppCache(), ContentTypesCache, Factory.GetInstance(), Factory.GetInstance(), VariationContextAccessor); + var cache = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null, HostingEnvironment), ServiceContext.MediaService, ServiceContext.UserService, new DictionaryAppCache(), ContentTypesCache, Factory.GetInstance(), Factory.GetInstance(), VariationContextAccessor); var publishedMedia = cache.GetById(mRoot.Id); Assert.IsNotNull(publishedMedia); diff --git a/src/Umbraco.Tests/Cache/WebCachingAppCacheTests.cs b/src/Umbraco.Tests/Cache/WebCachingAppCacheTests.cs deleted file mode 100644 index 02986e2f78..0000000000 --- a/src/Umbraco.Tests/Cache/WebCachingAppCacheTests.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Diagnostics; -using System.Web; -using Moq; -using NUnit.Framework; -using Umbraco.Core.Cache; -using Umbraco.Core.Composing; -using Umbraco.Core.Logging; -using Umbraco.Web.Cache; - -namespace Umbraco.Tests.Cache -{ - [TestFixture] - public class WebCachingAppCacheTests : RuntimeAppCacheTests - { - private WebCachingAppCache _appCache; - - protected override int GetTotalItemCount => HttpRuntime.Cache.Count; - - public override void Setup() - { - base.Setup(); - var typeFinder = new TypeFinder(Mock.Of()); - _appCache = new WebCachingAppCache(HttpRuntime.Cache, typeFinder); - } - - internal override IAppCache AppCache => _appCache; - - internal override IAppPolicyCache AppPolicyCache => _appCache; - - [Test] - public void DoesNotCacheExceptions() - { - string value; - Assert.Throws(() => { value = (string)_appCache.Get("key", () => GetValue(1)); }); - Assert.Throws(() => { value = (string)_appCache.Get("key", () => GetValue(2)); }); - - // does not throw - value = (string)_appCache.Get("key", () => GetValue(3)); - Assert.AreEqual("succ3", value); - - // cache - value = (string)_appCache.Get("key", () => GetValue(4)); - Assert.AreEqual("succ3", value); - } - - private static string GetValue(int i) - { - Debug.Print("get" + i); - if (i < 3) - throw new Exception("fail"); - return "succ" + i; - } - } -} diff --git a/src/Umbraco.Tests/Composing/CollectionBuildersTests.cs b/src/Umbraco.Tests/Composing/CollectionBuildersTests.cs index 575bd869ba..2d977e89c7 100644 --- a/src/Umbraco.Tests/Composing/CollectionBuildersTests.cs +++ b/src/Umbraco.Tests/Composing/CollectionBuildersTests.cs @@ -357,7 +357,7 @@ namespace Umbraco.Tests.Composing var col2 = factory.GetInstance(); AssertCollection(col2, typeof(Resolved1), typeof(Resolved2)); - AssertSameCollection(col1, col2); + AssertSameCollection(factory, col1, col2); } } @@ -416,11 +416,11 @@ namespace Umbraco.Tests.Composing { col1A = factory.GetInstance(); col1B = factory.GetInstance(); - } - AssertCollection(col1A, typeof(Resolved1), typeof(Resolved2)); - AssertCollection(col1B, typeof(Resolved1), typeof(Resolved2)); - AssertSameCollection(col1A, col1B); + AssertCollection(col1A, typeof(Resolved1), typeof(Resolved2)); + AssertCollection(col1B, typeof(Resolved1), typeof(Resolved2)); + AssertSameCollection(factory, col1A, col1B); + } TestCollection col2; @@ -455,7 +455,7 @@ namespace Umbraco.Tests.Composing Assert.IsInstanceOf(expected[i], colA[i]); } - private static void AssertSameCollection(IEnumerable col1, IEnumerable col2) + private static void AssertSameCollection(IFactory factory, IEnumerable col1, IEnumerable col2) { Assert.AreSame(col1, col2); @@ -463,8 +463,19 @@ namespace Umbraco.Tests.Composing var col2A = col2.ToArray(); Assert.AreEqual(col1A.Length, col2A.Length); + + // Ensure each item in each collection is the same but also + // resolve each item from the factory to ensure it's also the same since + // it should have the same lifespan. for (var i = 0; i < col1A.Length; i++) + { Assert.AreSame(col1A[i], col2A[i]); + + var itemA = factory.GetInstance(col1A[i].GetType()); + var itemB = factory.GetInstance(col2A[i].GetType()); + + Assert.AreSame(itemA, itemB); + } } private static void AssertNotSameCollection(IEnumerable col1, IEnumerable col2) @@ -475,8 +486,11 @@ namespace Umbraco.Tests.Composing var col2A = col2.ToArray(); Assert.AreEqual(col1A.Length, col2A.Length); + for (var i = 0; i < col1A.Length; i++) + { Assert.AreNotSame(col1A[i], col2A[i]); + } } #endregion diff --git a/src/Umbraco.Tests/Composing/TypeLoaderTests.cs b/src/Umbraco.Tests/Composing/TypeLoaderTests.cs index 21ce6aa8f8..6658c689e1 100644 --- a/src/Umbraco.Tests/Composing/TypeLoaderTests.cs +++ b/src/Umbraco.Tests/Composing/TypeLoaderTests.cs @@ -196,7 +196,7 @@ AnotherContentFinder [Test] public void Create_Cached_Plugin_File() { - var types = new[] { typeof(TypeLoader), typeof(TypeLoaderTests), typeof(UmbracoContext) }; + var types = new[] { typeof(TypeLoader), typeof(TypeLoaderTests), typeof(IUmbracoContext) }; var typeList1 = new TypeLoader.TypeList(typeof(object), null); foreach (var type in types) typeList1.Add(type); @@ -275,7 +275,7 @@ AnotherContentFinder public void GetDataEditors() { var types = _typeLoader.GetDataEditors(); - Assert.AreEqual(38, types.Count()); + Assert.AreEqual(39, types.Count()); } /// diff --git a/src/Umbraco.Tests/Issues/U9560.cs b/src/Umbraco.Tests/Issues/U9560.cs index 92d5045819..c750201b0c 100644 --- a/src/Umbraco.Tests/Issues/U9560.cs +++ b/src/Umbraco.Tests/Issues/U9560.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Issues contentType.Name = "test"; var propertyType = new PropertyType(ShortStringHelper, "test", ValueStorageType.Ntext, "prop") { Name = "Prop", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }; contentType.PropertyTypeCollection.Add(propertyType); - Current.Services.ContentTypeService.Save(contentType); + ServiceContext.ContentTypeService.Save(contentType); var aliasName = string.Empty; diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMediaCache.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMediaCache.cs index 03c6ddba47..1f68f905c7 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMediaCache.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMediaCache.cs @@ -545,7 +545,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache // was library.GetMedia which had its own cache, but MediaService *also* caches // so, library.GetMedia is gone and now we directly work with MediaService // (code below copied from what library was doing) - var media = Current.Services.MediaService.GetById(parentId); + var media = _mediaService.GetById(parentId); if (media == null) { return Enumerable.Empty(); diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/UmbracoContextCache.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/UmbracoContextCache.cs index 5d48e9eae3..e967a1ea12 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/UmbracoContextCache.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/UmbracoContextCache.cs @@ -6,8 +6,8 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache { static class UmbracoContextCache { - static readonly ConditionalWeakTable> Caches - = new ConditionalWeakTable>(); + static readonly ConditionalWeakTable> Caches + = new ConditionalWeakTable>(); public static ConcurrentDictionary Current { diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs index 4d6f57f490..b1ee6a7c4d 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs @@ -439,11 +439,6 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache return (IPublishedContent) appCache.Get(key, () => (new XmlPublishedContent(node, isPreviewing, appCache, contentTypeCache, variationContextAccessor)).CreateModel(Current.PublishedModelFactory)); } - public static void ClearRequest() - { - Current.AppCaches.RequestCache.ClearByKey(CacheKeyPrefix); - } - private const string CacheKeyPrefix = "CONTENTCACHE_XMLPUBLISHEDCONTENT_"; } } diff --git a/src/Umbraco.Tests/Logging/LogviewerTests.cs b/src/Umbraco.Tests/Logging/LogviewerTests.cs index 6e0e82827c..87cc19a2c6 100644 --- a/src/Umbraco.Tests/Logging/LogviewerTests.cs +++ b/src/Umbraco.Tests/Logging/LogviewerTests.cs @@ -164,7 +164,7 @@ namespace Umbraco.Tests.Logging //Query @Level='Warning' BUT we pass in array of LogLevels for Debug & Info (Expect to get 0 results) string[] logLevelMismatch = { "Debug", "Information" }; - var filterLevelQuery = _logViewer.GetLogs(_logTimePeriod, pageNumber: 1, filterExpression: "@Level='Warning'", logLevels: logLevelMismatch); ; + var filterLevelQuery = _logViewer.GetLogs(_logTimePeriod, pageNumber: 1, filterExpression: "@Level='Warning'", logLevels: logLevelMismatch); Assert.AreEqual(0, filterLevelQuery.TotalItems); } diff --git a/src/Umbraco.Tests/Macros/MacroTests.cs b/src/Umbraco.Tests/Macros/MacroTests.cs index 2b2a8051e7..66adfc4a97 100644 --- a/src/Umbraco.Tests/Macros/MacroTests.cs +++ b/src/Umbraco.Tests/Macros/MacroTests.cs @@ -25,15 +25,13 @@ namespace Umbraco.Tests.Macros new IsolatedCaches(type => new ObjectCacheAppCache(typeFinder))); } - [TestCase("PartialView", true)] - [TestCase("Unknown", false)] - public void Macro_Is_File_Based(string macroTypeString, bool expectedNonNull) + [TestCase("anything", true)] + [TestCase("", false)] + public void Macro_Is_File_Based(string macroSource, bool expectedNonNull) { - var macroType = Enum.Parse(macroTypeString); var model = new MacroModel { - MacroType = macroType, - MacroSource = "anything" + MacroSource = macroSource }; var filename = MacroRenderer.GetMacroFileName(model); if (expectedNonNull) diff --git a/src/Umbraco.Tests/Misc/UriUtilityTests.cs b/src/Umbraco.Tests/Misc/UriUtilityTests.cs index 33a4b45249..0d0f6db61e 100644 --- a/src/Umbraco.Tests/Misc/UriUtilityTests.cs +++ b/src/Umbraco.Tests/Misc/UriUtilityTests.cs @@ -12,6 +12,8 @@ namespace Umbraco.Tests.Misc [TestFixture] public class UriUtilityTests { + + public UriUtility UriUtility { get; } = TestHelper.UriUtility; [TearDown] public void TearDown() { diff --git a/src/Umbraco.Tests/Models/MacroTests.cs b/src/Umbraco.Tests/Models/MacroTests.cs index b14092955f..9ebe57a847 100644 --- a/src/Umbraco.Tests/Models/MacroTests.cs +++ b/src/Umbraco.Tests/Models/MacroTests.cs @@ -13,7 +13,7 @@ namespace Umbraco.Tests.Models [Test] public void Can_Deep_Clone() { - var macro = new Macro(TestHelper.ShortStringHelper, 1, Guid.NewGuid(), true, 3, "test", "Test", false, true, true, "~/script.cshtml", MacroTypes.PartialView); + var macro = new Macro(TestHelper.ShortStringHelper, 1, Guid.NewGuid(), true, 3, "test", "Test", false, true, true, "~/script.cshtml"); macro.Properties.Add(new MacroProperty(6, Guid.NewGuid(), "rewq", "REWQ", 1, "asdfasdf")); var clone = (Macro)macro.DeepClone(); diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index b982b78c23..5c6d5c6947 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -252,8 +252,8 @@ namespace Umbraco.Tests.Models.Mapping } Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count() - 1); - Assert.IsTrue(invariantContent.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties"))); - Assert.AreEqual(2, invariantContent.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); + Assert.IsTrue(invariantContent.Tabs.Any(x => x.Label == ServiceContext.TextService.Localize("general/properties"))); + Assert.AreEqual(2, invariantContent.Tabs.Where(x => x.Label == ServiceContext.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); } #region Assertions @@ -348,7 +348,7 @@ namespace Umbraco.Tests.Models.Mapping Assert.AreEqual(p.PropertyType.ValidationRegExp, pDto.ValidationRegExp); Assert.AreEqual(p.PropertyType.Description, pDto.Description); Assert.AreEqual(p.PropertyType.Name, pDto.Label); - Assert.AreEqual(Current.Services.DataTypeService.GetDataType(p.PropertyType.DataTypeId), pDto.DataType); + Assert.AreEqual(ServiceContext.DataTypeService.GetDataType(p.PropertyType.DataTypeId), pDto.DataType); Assert.AreEqual(Current.PropertyEditors[p.PropertyType.PropertyEditorAlias], pDto.PropertyEditor); } diff --git a/src/Umbraco.Tests/ModelsBuilder/BuilderTests.cs b/src/Umbraco.Tests/ModelsBuilder/BuilderTests.cs index 56d9d46e7d..b3f644ae43 100644 --- a/src/Umbraco.Tests/ModelsBuilder/BuilderTests.cs +++ b/src/Umbraco.Tests/ModelsBuilder/BuilderTests.cs @@ -4,10 +4,10 @@ using System.Linq; using System.Text; using Moq; using NUnit.Framework; +using Umbraco.Core.Configuration; using Umbraco.Core.Models.PublishedContent; using Umbraco.ModelsBuilder.Embedded; using Umbraco.ModelsBuilder.Embedded.Building; -using Umbraco.ModelsBuilder.Embedded.Configuration; namespace Umbraco.Tests.ModelsBuilder { diff --git a/src/Umbraco.Tests/ModelsBuilder/ConfigTests.cs b/src/Umbraco.Tests/ModelsBuilder/ConfigTests.cs index ff49bb3f97..4a9e8704ec 100644 --- a/src/Umbraco.Tests/ModelsBuilder/ConfigTests.cs +++ b/src/Umbraco.Tests/ModelsBuilder/ConfigTests.cs @@ -1,6 +1,7 @@ using System.Configuration; using NUnit.Framework; -using Umbraco.ModelsBuilder.Embedded.Configuration; +using Umbraco.Configuration; +using Umbraco.Core; using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.ModelsBuilder @@ -26,7 +27,7 @@ namespace Umbraco.Tests.ModelsBuilder public void DefaultModelsNamespace() { var config = new ModelsBuilderConfig(TestHelper.IOHelper); - Assert.AreEqual(ModelsBuilderConfig.DefaultModelsNamespace, config.ModelsNamespace); + Assert.AreEqual(Constants.ModelsBuilder.DefaultModelsNamespace, config.ModelsNamespace); } [TestCase("c:/path/to/root", "~/dir/models", false, "c:\\path\\to\\root\\dir\\models")] diff --git a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs index fc45f0ba3f..30bf5be17b 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs @@ -50,7 +50,7 @@ namespace Umbraco.Tests.Persistence.Repositories TemplateRepository tr; var ctRepository = CreateRepository(scopeAccessor, out contentTypeRepository, out tr); var editors = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); - dtdRepository = new DataTypeRepository(scopeAccessor, appCaches, new Lazy(() => editors), Logger, IOHelper, new Lazy(() => DataTypeService), LocalizedTextService, LocalizationService, ShortStringHelper); + dtdRepository = new DataTypeRepository(scopeAccessor, appCaches, new Lazy(() => editors), Logger); return ctRepository; } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs index 4b9d0436ec..facfb9c012 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs @@ -37,7 +37,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); - var macro = new Macro(ShortStringHelper, "test1", "Test", "~/views/macropartials/test.cshtml", MacroTypes.PartialView); + var macro = new Macro(ShortStringHelper, "test1", "Test", "~/views/macropartials/test.cshtml"); ; Assert.Throws(() => repository.Save(macro)); @@ -168,7 +168,7 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); // Act - var macro = new Macro(ShortStringHelper, "test", "Test", "~/views/macropartials/test.cshtml", MacroTypes.PartialView); + var macro = new Macro(ShortStringHelper, "test", "Test", "~/views/macropartials/test.cshtml"); macro.Properties.Add(new MacroProperty("test", "Test", 0, "test")); repository.Save(macro); @@ -289,7 +289,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); - var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml", MacroTypes.PartialView); + var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml"); macro.Properties.Add(new MacroProperty("blah1", "New1", 4, "test.editor")); repository.Save(macro); @@ -314,7 +314,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); - var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml", MacroTypes.PartialView); + var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml"); macro.Properties.Add(new MacroProperty("blah1", "New1", 4, "test.editor")); repository.Save(macro); @@ -338,7 +338,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); - var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml", MacroTypes.PartialView); + var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml"); var prop1 = new MacroProperty("blah1", "New1", 4, "test.editor"); var prop2 = new MacroProperty("blah2", "New2", 3, "test.editor"); @@ -424,9 +424,9 @@ namespace Umbraco.Tests.Persistence.Repositories { var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); - repository.Save(new Macro(ShortStringHelper, "test1", "Test1", "~/views/macropartials/test1.cshtml", MacroTypes.PartialView)); - repository.Save(new Macro(ShortStringHelper, "test2", "Test2", "~/views/macropartials/test2.cshtml", MacroTypes.PartialView)); - repository.Save(new Macro(ShortStringHelper, "test3", "Tet3", "~/views/macropartials/test3.cshtml", MacroTypes.PartialView)); + repository.Save(new Macro(ShortStringHelper, "test1", "Test1", "~/views/macropartials/test1.cshtml")); + repository.Save(new Macro(ShortStringHelper, "test2", "Test2", "~/views/macropartials/test2.cshtml")); + repository.Save(new Macro(ShortStringHelper, "test3", "Tet3", "~/views/macropartials/test3.cshtml")); scope.Complete(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index ca24b051d0..efabddb2cd 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -44,8 +44,9 @@ namespace Umbraco.Tests.Persistence.Repositories var entityRepository = new EntityRepository(scopeAccessor); var relationRepository = new RelationRepository(scopeAccessor, Logger, relationTypeRepository, entityRepository); var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty()))); + var mediaUrlGenerators = new MediaUrlGeneratorCollection(Enumerable.Empty()); var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty()); - var repository = new MediaRepository(scopeAccessor, appCaches, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService); + var repository = new MediaRepository(scopeAccessor, appCaches, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, mediaUrlGenerators, dataValueReferences, DataTypeService); return repository; } diff --git a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs index 70c946dabe..d4341cd128 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs @@ -981,8 +981,9 @@ namespace Umbraco.Tests.Persistence.Repositories var entityRepository = new EntityRepository(accessor); var relationRepository = new RelationRepository(accessor, Logger, relationTypeRepository, entityRepository); var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty()))); + var mediaUrlGenerators = new MediaUrlGeneratorCollection(Enumerable.Empty()); var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty()); - var repository = new MediaRepository(accessor, AppCaches.Disabled, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService); + var repository = new MediaRepository(accessor, AppCaches.Disabled, Logger, mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, mediaUrlGenerators, dataValueReferences, DataTypeService); return repository; } } diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 909c6098fb..201b84f29a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -36,8 +36,9 @@ namespace Umbraco.Tests.Persistence.Repositories var entityRepository = new EntityRepository(accessor); var relationRepository = new RelationRepository(accessor, Logger, relationTypeRepository, entityRepository); var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty()))); + var mediaUrlGenerators = new MediaUrlGeneratorCollection(Enumerable.Empty()); var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty()); - var repository = new MediaRepository(accessor, AppCaches, Mock.Of(), mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService); + var repository = new MediaRepository(accessor, AppCaches, Mock.Of(), mediaTypeRepository, tagRepository, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, mediaUrlGenerators, dataValueReferences, DataTypeService); return repository; } @@ -422,6 +423,35 @@ namespace Umbraco.Tests.Persistence.Repositories } } + [Test] + public void Can_Invalidate_SecurityStamp_On_Username_Change() + { + // Arrange + var provider = TestObjects.GetScopeProvider(Logger); + using (var scope = provider.CreateScope()) + { + var repository = CreateRepository(provider); + var userGroupRepository = CreateUserGroupRepository(provider); + + var user = CreateAndCommitUserWithGroup(repository, userGroupRepository); + var originalSecurityStamp = user.SecurityStamp; + + // Ensure when user generated a security stamp is present + Assert.That(user.SecurityStamp, Is.Not.Null); + Assert.That(user.SecurityStamp, Is.Not.Empty); + + // Update username + user.Username = user.Username + "UPDATED"; + repository.Save(user); + + // Get the user + var updatedUser = repository.Get(user.Id); + + // Ensure the Security Stamp is invalidated & no longer the same + Assert.AreNotEqual(originalSecurityStamp, updatedUser.SecurityStamp); + } + } + private void AssertPropertyValues(IUser updatedItem, IUser originalUser) { Assert.That(updatedItem.Id, Is.EqualTo(originalUser.Id)); diff --git a/src/Umbraco.Tests/PropertyEditors/DataValueReferenceFactoryCollectionTests.cs b/src/Umbraco.Tests/PropertyEditors/DataValueReferenceFactoryCollectionTests.cs new file mode 100644 index 0000000000..24ac9cdbf4 --- /dev/null +++ b/src/Umbraco.Tests/PropertyEditors/DataValueReferenceFactoryCollectionTests.cs @@ -0,0 +1,255 @@ +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; +using Umbraco.Core.Strings; +using Umbraco.Tests.TestHelpers; +using Umbraco.Web.PropertyEditors; +using static Umbraco.Core.Models.Property; + +namespace Umbraco.Tests.PropertyEditors +{ + [TestFixture] + public class DataValueReferenceFactoryCollectionTests + { + IDataTypeService DataTypeService { get; } = Mock.Of(); + private IIOHelper IOHelper { get; } = TestHelper.IOHelper; + ILocalizedTextService LocalizedTextService { get; } = Mock.Of(); + ILocalizationService LocalizationService { get; } = Mock.Of(); + IShortStringHelper ShortStringHelper { get; } = Mock.Of(); + + [Test] + public void GetAllReferences_All_Variants_With_IDataValueReferenceFactory() + { + var collection = new DataValueReferenceFactoryCollection(new TestDataValueReferenceFactory().Yield()); + + + // label does not implement IDataValueReference + var labelEditor = new LabelPropertyEditor( + Mock.Of(), + IOHelper, + DataTypeService, + LocalizedTextService, + LocalizationService, + ShortStringHelper + ); + var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(labelEditor.Yield())); + var trackedUdi1 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi2 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi3 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi4 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var property = new Property(new PropertyType(ShortStringHelper, new DataType(labelEditor)) + { + Variations = ContentVariation.CultureAndSegment + }) + { + Values = new List + { + // Ignored (no culture) + new PropertyValue + { + EditedValue = trackedUdi1 + }, + new PropertyValue + { + Culture = "en-US", + EditedValue = trackedUdi2 + }, + new PropertyValue + { + Culture = "en-US", + Segment = "A", + EditedValue = trackedUdi3 + }, + // Ignored (no culture) + new PropertyValue + { + Segment = "A", + EditedValue = trackedUdi4 + }, + // duplicate + new PropertyValue + { + Culture = "en-US", + Segment = "B", + EditedValue = trackedUdi3 + } + } + }; + var properties = new PropertyCollection + { + property + }; + var result = collection.GetAllReferences(properties, propertyEditors); + + Assert.AreEqual(2, result.Count()); + Assert.AreEqual(trackedUdi2, result.ElementAt(0).Udi.ToString()); + Assert.AreEqual(trackedUdi3, result.ElementAt(1).Udi.ToString()); + } + + [Test] + public void GetAllReferences_All_Variants_With_IDataValueReference_Editor() + { + var collection = new DataValueReferenceFactoryCollection(Enumerable.Empty()); + + // mediaPicker does implement IDataValueReference + var mediaPicker = new MediaPickerPropertyEditor( + Mock.Of(), + DataTypeService, + LocalizationService, + IOHelper, + ShortStringHelper, + LocalizedTextService + ); + var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(mediaPicker.Yield())); + var trackedUdi1 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi2 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi3 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi4 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var property = new Property(new PropertyType(ShortStringHelper, new DataType(mediaPicker)) + { + Variations = ContentVariation.CultureAndSegment + }) + { + Values = new List + { + // Ignored (no culture) + new PropertyValue + { + EditedValue = trackedUdi1 + }, + new PropertyValue + { + Culture = "en-US", + EditedValue = trackedUdi2 + }, + new PropertyValue + { + Culture = "en-US", + Segment = "A", + EditedValue = trackedUdi3 + }, + // Ignored (no culture) + new PropertyValue + { + Segment = "A", + EditedValue = trackedUdi4 + }, + // duplicate + new PropertyValue + { + Culture = "en-US", + Segment = "B", + EditedValue = trackedUdi3 + } + } + }; + var properties = new PropertyCollection + { + property + }; + var result = collection.GetAllReferences(properties, propertyEditors); + + Assert.AreEqual(2, result.Count()); + Assert.AreEqual(trackedUdi2, result.ElementAt(0).Udi.ToString()); + Assert.AreEqual(trackedUdi3, result.ElementAt(1).Udi.ToString()); + } + + [Test] + public void GetAllReferences_Invariant_With_IDataValueReference_Editor() + { + var collection = new DataValueReferenceFactoryCollection(Enumerable.Empty()); + + // mediaPicker does implement IDataValueReference + var mediaPicker = new MediaPickerPropertyEditor( + Mock.Of(), + DataTypeService, + LocalizationService, + IOHelper, + ShortStringHelper, + LocalizedTextService + ); + var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(mediaPicker.Yield())); + var trackedUdi1 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi2 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi3 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var trackedUdi4 = Udi.Create(Constants.UdiEntityType.Media, Guid.NewGuid()).ToString(); + var property = new Property(new PropertyType(ShortStringHelper, new DataType(mediaPicker)) + { + Variations = ContentVariation.Nothing | ContentVariation.Segment + }) + { + Values = new List + { + new PropertyValue + { + EditedValue = trackedUdi1 + }, + // Ignored (has culture) + new PropertyValue + { + Culture = "en-US", + EditedValue = trackedUdi2 + }, + // Ignored (has culture) + new PropertyValue + { + Culture = "en-US", + Segment = "A", + EditedValue = trackedUdi3 + }, + new PropertyValue + { + Segment = "A", + EditedValue = trackedUdi4 + }, + // duplicate + new PropertyValue + { + Segment = "B", + EditedValue = trackedUdi4 + } + } + }; + var properties = new PropertyCollection + { + property + }; + var result = collection.GetAllReferences(properties, propertyEditors); + + Assert.AreEqual(2, result.Count()); + Assert.AreEqual(trackedUdi1, result.ElementAt(0).Udi.ToString()); + Assert.AreEqual(trackedUdi4, result.ElementAt(1).Udi.ToString()); + } + + private class TestDataValueReferenceFactory : IDataValueReferenceFactory + { + public IDataValueReference GetDataValueReference() => new TestMediaDataValueReference(); + + public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias == Constants.PropertyEditors.Aliases.Label; + + private class TestMediaDataValueReference : IDataValueReference + { + public IEnumerable GetReferences(object value) + { + // This is the same as the media picker, it will just try to parse the value directly as a UDI + + var asString = value is string str ? str : value?.ToString(); + + if (string.IsNullOrEmpty(asString)) yield break; + + if (UdiParser.TryParse(asString, out var udi)) + yield return new UmbracoEntityReference(udi); + } + } + } + } +} diff --git a/src/Umbraco.Tests/Published/ModelTypeTests.cs b/src/Umbraco.Tests/Published/ModelTypeTests.cs index 1dab67b351..f698c20fa2 100644 --- a/src/Umbraco.Tests/Published/ModelTypeTests.cs +++ b/src/Umbraco.Tests/Published/ModelTypeTests.cs @@ -53,7 +53,7 @@ namespace Umbraco.Tests.Published // there's an "*" there because the arrays are not true SZArray - but that changes when we map Assert.AreEqual("{alias1}[*]", ModelType.For("alias1").MakeArrayType().FullName); // note the inner assembly qualified name - Assert.AreEqual("System.Collections.Generic.IEnumerable`1[[{alias1}[*], Umbraco.Abstractions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null]]", typeof(IEnumerable<>).MakeGenericType(ModelType.For("alias1").MakeArrayType()).FullName); + Assert.AreEqual("System.Collections.Generic.IEnumerable`1[[{alias1}[*], Umbraco.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null]]", typeof(IEnumerable<>).MakeGenericType(ModelType.For("alias1").MakeArrayType()).FullName); } [Test] diff --git a/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs b/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs index 42e446c4d3..de12fcf7aa 100644 --- a/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs +++ b/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Events; using Umbraco.Core.Hosting; using Umbraco.Core.Install; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; @@ -143,8 +144,8 @@ namespace Umbraco.Tests.PublishedContent _source = new TestDataSource(kits); var typeFinder = new TypeFinder(Mock.Of()); + var settings = Mock.Of(); - var filePermissionHelper = Mock.Of(); // at last, create the complete NuCache snapshot service! var options = new PublishedSnapshotServiceOptions { IgnoreLocalDb = true }; @@ -169,7 +170,8 @@ namespace Umbraco.Tests.PublishedContent typeFinder, hostingEnvironment, new MockShortStringHelper(), - filePermissionHelper); + TestHelper.IOHelper, + settings); // invariant is the current default _variationAccesor.VariationContext = new VariationContext(); @@ -971,7 +973,7 @@ namespace Umbraco.Tests.PublishedContent documents = snapshot.Content.GetById(2).Children(_variationAccesor).ToArray(); AssertDocuments(documents, "N9", "N8", "N7"); - + } [Test] diff --git a/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs b/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs index 08e68ce652..08da25ba9a 100644 --- a/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs +++ b/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs @@ -185,8 +185,7 @@ namespace Umbraco.Tests.PublishedContent _variationAccesor = new TestVariationContextAccessor(); var typeFinder = new TypeFinder(Mock.Of()); - - var filePermissionHelper = Mock.Of(); + var settings = Mock.Of(); // at last, create the complete NuCache snapshot service! var options = new PublishedSnapshotServiceOptions { IgnoreLocalDb = true }; @@ -211,7 +210,8 @@ namespace Umbraco.Tests.PublishedContent typeFinder, TestHelper.GetHostingEnvironment(), new MockShortStringHelper(), - filePermissionHelper); + TestHelper.IOHelper, + settings); // invariant is the current default _variationAccesor.VariationContext = new VariationContext(); diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs index d35cc941da..91e662d46b 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs @@ -12,6 +12,7 @@ using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.Testing; using Umbraco.Web; using PublishedContentExtensions = Umbraco.Web.PublishedContentExtensions; @@ -78,7 +79,7 @@ namespace Umbraco.Tests.PublishedContent public void To_DataTable() { var doc = GetContent(true, 1); - var dt = doc.ChildrenAsTable(Current.Services); + var dt = doc.ChildrenAsTable(ServiceContext); Assert.AreEqual(11, dt.Columns.Count); Assert.AreEqual(3, dt.Rows.Count); @@ -101,7 +102,7 @@ namespace Umbraco.Tests.PublishedContent var c = (SolidPublishedContent)doc.Children.ElementAt(0); c.ContentType = new PublishedContentType(22, "DontMatch", PublishedItemType.Content, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing); - var dt = doc.ChildrenAsTable(Current.Services, "Child"); + var dt = doc.ChildrenAsTable(ServiceContext, "Child"); Assert.AreEqual(11, dt.Columns.Count); Assert.AreEqual(2, dt.Rows.Count); @@ -117,7 +118,7 @@ namespace Umbraco.Tests.PublishedContent public void To_DataTable_No_Rows() { var doc = GetContent(false, 1); - var dt = doc.ChildrenAsTable(Current.Services); + var dt = doc.ChildrenAsTable(ServiceContext); //will return an empty data table Assert.AreEqual(0, dt.Columns.Count); Assert.AreEqual(0, dt.Rows.Count); diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentExtensionTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentExtensionTests.cs index fa1e5c6288..3cff4d4e9d 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentExtensionTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentExtensionTests.cs @@ -13,7 +13,7 @@ namespace Umbraco.Tests.PublishedContent [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerFixture)] public class PublishedContentExtensionTests : PublishedContentTestBase { - private UmbracoContext _ctx; + private IUmbracoContext _ctx; private string _xmlContent = ""; private bool _createContentTypes = true; private Dictionary _contentTypes; @@ -74,7 +74,7 @@ namespace Umbraco.Tests.PublishedContent _ctx = GetUmbracoContext("/", 1, null, true); if (_createContentTypes) { - var contentTypeService = Current.Services.ContentTypeService; + var contentTypeService = ServiceContext.ContentTypeService; var baseType = new ContentType(ShortStringHelper, -1) { Alias = "base", Name = "Base" }; const string contentTypeAlias = "inherited"; var inheritedType = new ContentType(ShortStringHelper, baseType, contentTypeAlias) { Alias = contentTypeAlias, Name = "Inherited" }; diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs index c38ca1b460..1806493cdd 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs @@ -56,7 +56,7 @@ namespace Umbraco.Tests.PublishedContent .ToList()); } - private UmbracoContext GetUmbracoContext() + private IUmbracoContext GetUmbracoContext() { RouteData routeData = null; @@ -68,16 +68,17 @@ namespace Umbraco.Tests.PublishedContent var globalSettings = TestObjects.GetGlobalSettings(); var httpContext = GetHttpContextFactory("http://umbraco.local/", routeData).HttpContext; + + var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext); var umbracoContext = new UmbracoContext( - httpContext, + httpContextAccessor, publishedSnapshotService.Object, - new WebSecurity(httpContext, Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), - Enumerable.Empty(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, ServiceContext.UserService, globalSettings, IOHelper), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); return umbracoContext; } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index ee62bbe06f..d99fc90813 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -15,6 +15,7 @@ using Umbraco.Core.Strings; using Umbraco.Web; using Umbraco.Web.Templates; using Umbraco.Web.Models; +using Umbraco.Web.Routing; namespace Umbraco.Tests.PublishedContent { @@ -43,16 +44,15 @@ namespace Umbraco.Tests.PublishedContent var converters = Factory.GetInstance(); var umbracoContextAccessor = Mock.Of(); + var publishedUrlProvider = Mock.Of(); var logger = Mock.Of(); - var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor); - var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, Mock.Of(), Mock.Of(), Mock.Of(), ShortStringHelper); - var localLinkParser = new HtmlLocalLinkParser(umbracoContextAccessor); + var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider); + var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, Mock.Of(), Mock.Of(), Mock.Of(), ShortStringHelper, publishedUrlProvider); + var localLinkParser = new HtmlLocalLinkParser(umbracoContextAccessor, publishedUrlProvider); var dataTypeService = new TestObjects.TestDataTypeService( new DataType(new RichTextPropertyEditor( Mock.Of(), - Mock.Of(), - Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs index 9a0527af2c..e852c22828 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs @@ -23,6 +23,7 @@ using Umbraco.Web.Models.PublishedContent; using Umbraco.Web.PropertyEditors; using Umbraco.Web.Templates; using Umbraco.Web.Models; +using Umbraco.Web.Routing; using Current = Umbraco.Web.Composing.Current; namespace Umbraco.Tests.PublishedContent @@ -49,15 +50,16 @@ namespace Umbraco.Tests.PublishedContent var mediaFileService = Mock.Of(); var contentTypeBaseServiceProvider = Mock.Of(); var umbracoContextAccessor = Mock.Of(); - var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor); - var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, mediaService, contentTypeBaseServiceProvider, mediaFileService, ShortStringHelper); - var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor); + var publishedUrlProvider = Mock.Of(); + var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider); + var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, mediaService, contentTypeBaseServiceProvider, mediaFileService, ShortStringHelper, publishedUrlProvider); + var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor, publishedUrlProvider); var localizationService = Mock.Of(); var dataTypeService = new TestObjects.TestDataTypeService( new DataType(new VoidEditor(logger, Mock.Of(), localizationService, LocalizedTextService, ShortStringHelper)) { Id = 1 }, new DataType(new TrueFalsePropertyEditor(logger, Mock.Of(), localizationService, IOHelper, ShortStringHelper, LocalizedTextService)) { Id = 1001 }, - new DataType(new RichTextPropertyEditor(logger, mediaService, contentTypeBaseServiceProvider, umbracoContextAccessor, Mock.Of(), localizationService, imageSourceParser, linkParser, pastedImages, ShortStringHelper, IOHelper, LocalizedTextService, Mock.Of())) { Id = 1002 }, + new DataType(new RichTextPropertyEditor(logger,umbracoContextAccessor, Mock.Of(), localizationService, imageSourceParser, linkParser, pastedImages, ShortStringHelper, IOHelper, LocalizedTextService, Mock.Of())) { Id = 1002 }, new DataType(new IntegerPropertyEditor(logger, Mock.Of(), localizationService, ShortStringHelper, LocalizedTextService)) { Id = 1003 }, new DataType(new TextboxPropertyEditor(logger, Mock.Of(), localizationService, IOHelper, ShortStringHelper, LocalizedTextService)) { Id = 1004 }, new DataType(new MediaPickerPropertyEditor(logger, Mock.Of(), localizationService, IOHelper, ShortStringHelper, LocalizedTextService)) { Id = 1005 }); diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index 94e85dd011..89b8de8085 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -68,7 +68,7 @@ namespace Umbraco.Tests.PublishedContent /// /// /// - internal IPublishedContent GetNode(int id, UmbracoContext umbracoContext) + internal IPublishedContent GetNode(int id, IUmbracoContext umbracoContext) { var cache = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null, HostingEnvironment), ServiceContext.MediaService, ServiceContext.UserService, new DictionaryAppCache(), ContentTypesCache, diff --git a/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs index f8f7ddae75..70cc26eaf8 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs @@ -39,21 +39,6 @@ namespace Umbraco.Tests.PublishedContent Assert.IsFalse(result); } - - [Test] - public void ConfigureRequest_Sets_UmbracoPage_When_Published_Content_Assigned() - { - var umbracoContext = GetUmbracoContext("/test"); - var publishedRouter = CreatePublishedRouter(); - var request = publishedRouter.CreateRequest(umbracoContext); - var content = GetPublishedContentMock(); - request.Culture = new CultureInfo("en-AU"); - request.PublishedContent = content.Object; - publishedRouter.ConfigureRequest(request); - - Assert.IsNotNull(request.LegacyContentHashTable); - } - private Mock GetPublishedContentMock() { var pc = new Mock(); diff --git a/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs index 8d0a544c06..c9d11055ac 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByAliasTests.cs @@ -48,7 +48,8 @@ namespace Umbraco.Tests.Routing var umbracoContext = GetUmbracoContext(urlAsString); var publishedRouter = CreatePublishedRouter(); var frequest = publishedRouter.CreateRequest(umbracoContext); - var lookup = new ContentFinderByUrlAlias(Logger); + var lookup = + new ContentFinderByUrlAlias(Logger, Mock.Of(), VariationContextAccessor); var result = lookup.TryFindContent(frequest); diff --git a/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs index 60ed41593d..1a08153b4f 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByAliasWithDomainsTests.cs @@ -20,10 +20,16 @@ namespace Umbraco.Tests.Routing var properties = new[] { - new PublishedPropertyType("umbracoUrlAlias", Constants.DataTypes.Textbox, false, ContentVariation.Nothing, - new PropertyValueConverterCollection(Enumerable.Empty()), - Mock.Of(), - Mock.Of()), + new PublishedPropertyType( + propertyTypeAlias:"umbracoUrlAlias", + dataTypeId: Constants.DataTypes.Textbox, + isUserProperty:false, + variations: ContentVariation.Nothing, + propertyValueConverters:new PropertyValueConverterCollection(Enumerable.Empty()), + contentType:Mock.Of(), + publishedModelFactory:Mock.Of(), + factory:Mock.Of() + ) }; _publishedContentType = new PublishedContentType(0, "Doc", PublishedItemType.Content, Enumerable.Empty(), properties, ContentVariation.Nothing); } @@ -57,7 +63,7 @@ namespace Umbraco.Tests.Routing if (expectedNode > 0) Assert.AreEqual(expectedCulture, request.Culture.Name); - var finder = new ContentFinderByUrlAlias(Logger); + var finder = new ContentFinderByUrlAlias(Logger, Mock.Of(), VariationContextAccessor); var result = finder.TryFindContent(request); if (expectedNode > 0) diff --git a/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs index 72848753e5..227a7c26e3 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Composing; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Request; using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; @@ -18,7 +18,7 @@ namespace Umbraco.Tests.Routing var umbracoContext = GetUmbracoContext(urlAsString); var publishedRouter = CreatePublishedRouter(); var frequest = publishedRouter.CreateRequest(umbracoContext); - var lookup = new ContentFinderByIdPath(Factory.GetInstance().WebRouting, Logger); + var lookup = new ContentFinderByIdPath(Factory.GetInstance().WebRouting, Logger, Factory.GetInstance()); var result = lookup.TryFindContent(frequest); diff --git a/src/Umbraco.Tests/Routing/ContentFinderByPageIdQueryTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByPageIdQueryTests.cs index c1abb5a3a5..d18353eb87 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByPageIdQueryTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByPageIdQueryTests.cs @@ -1,6 +1,8 @@ using Moq; using NUnit.Framework; +using Umbraco.Core.Request; using Umbraco.Tests.TestHelpers; +using Umbraco.Web; using Umbraco.Web.Routing; namespace Umbraco.Tests.Routing @@ -16,15 +18,13 @@ namespace Umbraco.Tests.Routing public void Lookup_By_Page_Id(string urlAsString, int nodeMatch) { var umbracoContext = GetUmbracoContext(urlAsString); + var httpContext = GetHttpContextFactory(urlAsString).HttpContext; var publishedRouter = CreatePublishedRouter(); var frequest = publishedRouter.CreateRequest(umbracoContext); - var lookup = new ContentFinderByPageIdQuery(); + var mockRequestAccessor = new Mock(); + mockRequestAccessor.Setup(x => x.GetRequestValue("umbPageID")).Returns(httpContext.Request.QueryString["umbPageID"]); - //we need to manually stub the return output of HttpContext.Request["umbPageId"] - var requestMock = Mock.Get(umbracoContext.HttpContext.Request); - - requestMock.Setup(x => x["umbPageID"]) - .Returns(umbracoContext.HttpContext.Request.QueryString["umbPageID"]); + var lookup = new ContentFinderByPageIdQuery(mockRequestAccessor.Object); var result = lookup.TryFindContent(frequest); diff --git a/src/Umbraco.Tests/Routing/ContentFinderByUrlAndTemplateTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByUrlAndTemplateTests.cs index f74c68777e..208ec20517 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByUrlAndTemplateTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByUrlAndTemplateTests.cs @@ -19,7 +19,7 @@ namespace Umbraco.Tests.Routing { var template = new Template(ShortStringHelper, alias, alias); template.Content = ""; // else saving throws with a dirty internal error - Current.Services.FileService.SaveTemplate(template); + ServiceContext.FileService.SaveTemplate(template); return template; } @@ -38,7 +38,7 @@ namespace Umbraco.Tests.Routing var umbracoContext = GetUmbracoContext(urlAsString, template1.Id, globalSettings:globalSettings.Object); var publishedRouter = CreatePublishedRouter(); var frequest = publishedRouter.CreateRequest(umbracoContext); - var lookup = new ContentFinderByUrlAndTemplate(Logger, ServiceContext.FileService); + var lookup = new ContentFinderByUrlAndTemplate(Logger, ServiceContext.FileService, TestObjects.GetUmbracoSettings(), ServiceContext.ContentTypeService); var result = lookup.TryFindContent(frequest); diff --git a/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs b/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs index d6bd61dc8a..b9d669902d 100644 --- a/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs +++ b/src/Umbraco.Tests/Routing/GetContentUrlsTests.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using Moq; @@ -6,8 +7,12 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Web.Composing; using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; +using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; +using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web; using Umbraco.Web.Routing; namespace Umbraco.Tests.Routing @@ -54,7 +59,9 @@ namespace Umbraco.Tests.Routing umbContext, GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService, VariationContextAccessor, - Logger).ToList(); + Logger, + UriUtility, + PublishedUrlProvider).ToList(); Assert.AreEqual(1, urls.Count); Assert.AreEqual("content/itemNotPublished", urls[0].Text); @@ -72,14 +79,27 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbContext = GetUmbracoContext("http://localhost:8000", - urlProviders: new []{ new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper()) }); + var umbContext = GetUmbracoContext("http://localhost:8000"); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), + umbracoContextAccessor, UriUtility); + var publishedUrlProvider = new UrlProvider( + umbracoContextAccessor, + TestHelper.WebRoutingSection, + new UrlProviderCollection(new []{urlProvider}), + new MediaUrlProviderCollection(Enumerable.Empty()), + Mock.Of() + ); + var publishedRouter = CreatePublishedRouter(Factory, contentFinders:new ContentFinderCollection(new[]{new ContentFinderByUrl(Logger) })); var urls = content.GetContentUrls(publishedRouter, umbContext, GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService, - VariationContextAccessor, Logger).ToList(); + VariationContextAccessor, + Logger, + UriUtility, + publishedUrlProvider).ToList(); Assert.AreEqual(1, urls.Count); Assert.AreEqual("/home/", urls[0].Text); @@ -104,14 +124,28 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbContext = GetUmbracoContext("http://localhost:8000", - urlProviders: new[] { new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper()) }); + + var umbContext = GetUmbracoContext("http://localhost:8000"); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = new UrlProvider( + umbracoContextAccessor, + TestHelper.WebRoutingSection, + new UrlProviderCollection(new []{urlProvider}), + new MediaUrlProviderCollection(Enumerable.Empty()), + Mock.Of() + ); + var publishedRouter = CreatePublishedRouter(Factory, contentFinders: new ContentFinderCollection(new[] { new ContentFinderByUrl(Logger) })); var urls = child.GetContentUrls(publishedRouter, umbContext, GetLangService("en-US", "fr-FR"), GetTextService(), ServiceContext.ContentService, - VariationContextAccessor, Logger).ToList(); + VariationContextAccessor, + Logger, + UriUtility, + publishedUrlProvider + ).ToList(); Assert.AreEqual(1, urls.Count); Assert.AreEqual("/home/sub1/", urls[0].Text); diff --git a/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs b/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs index 78ff71678d..fb61fcffe8 100644 --- a/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs +++ b/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs @@ -15,6 +15,8 @@ using Umbraco.Core.Services; using Umbraco.Tests.PublishedContent; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; +using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web; using Umbraco.Web.PropertyEditors; using Umbraco.Web.Routing; @@ -36,12 +38,12 @@ namespace Umbraco.Tests.Routing var dataTypeService = Mock.Of(); var umbracoSettingsSection = TestObjects.GetUmbracoSettings(); - var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(new IDataEditor[] + var propertyEditors = new MediaUrlGeneratorCollection(new IMediaUrlGenerator[] { new FileUploadPropertyEditor(logger, mediaFileSystemMock, contentSection, dataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, umbracoSettingsSection), new ImageCropperPropertyEditor(logger, mediaFileSystemMock, contentSection, dataTypeService, LocalizationService, IOHelper, ShortStringHelper, LocalizedTextService, umbracoSettingsSection), - })); - _mediaUrlProvider = new DefaultMediaUrlProvider(propertyEditors); + }); + _mediaUrlProvider = new DefaultMediaUrlProvider(propertyEditors, UriUtility); } public override void TearDown() @@ -56,10 +58,10 @@ namespace Umbraco.Tests.Routing { const string expected = "/media/rfeiw584/test.jpg"; - var umbracoContext = GetUmbracoContext("/", mediaUrlProviders: new[] { _mediaUrlProvider }); + var umbracoContext = GetUmbracoContext("/"); var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.UploadField, expected, null); - var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Auto); + var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Auto); Assert.AreEqual(expected, resolvedUrl); } @@ -75,10 +77,10 @@ namespace Umbraco.Tests.Routing Src = expected }); - var umbracoContext = GetUmbracoContext("/", mediaUrlProviders: new[] { _mediaUrlProvider }); + var umbracoContext = GetUmbracoContext("/"); var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.ImageCropper, imageCropperValue, configuration); - var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Auto); + var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Auto); Assert.AreEqual(expected, resolvedUrl); } @@ -89,10 +91,10 @@ namespace Umbraco.Tests.Routing const string mediaUrl = "/media/rfeiw584/test.jpg"; var expected = $"http://localhost{mediaUrl}"; - var umbracoContext = GetUmbracoContext("http://localhost", mediaUrlProviders: new[] { _mediaUrlProvider }); + var umbracoContext = GetUmbracoContext("http://localhost"); var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.UploadField, mediaUrl, null); - var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Absolute); + var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Absolute); Assert.AreEqual(expected, resolvedUrl); } @@ -102,10 +104,10 @@ namespace Umbraco.Tests.Routing { const string expected = "http://localhost/media/rfeiw584/test.jpg"; - var umbracoContext = GetUmbracoContext("http://localhost", mediaUrlProviders: new[] { _mediaUrlProvider }); + var umbracoContext = GetUmbracoContext("http://localhost"); var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.UploadField, expected, null); - var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Relative); + var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Relative); Assert.AreEqual(expected, resolvedUrl); } @@ -113,10 +115,10 @@ namespace Umbraco.Tests.Routing [Test] public void Get_Media_Url_Returns_Empty_String_When_PropertyType_Is_Not_Supported() { - var umbracoContext = GetUmbracoContext("/", mediaUrlProviders: new[] { _mediaUrlProvider }); + var umbracoContext = GetUmbracoContext("/"); var publishedContent = CreatePublishedContent(Constants.PropertyEditors.Aliases.Boolean, "0", null); - var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Absolute, propertyAlias: "test"); + var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Absolute, propertyAlias: "test"); Assert.AreEqual(string.Empty, resolvedUrl); } @@ -124,7 +126,7 @@ namespace Umbraco.Tests.Routing [Test] public void Get_Media_Url_Can_Resolve_Variant_Property_Url() { - var umbracoContext = GetUmbracoContext("http://localhost", mediaUrlProviders: new[] { _mediaUrlProvider }); + var umbracoContext = GetUmbracoContext("http://localhost"); var umbracoFilePropertyType = CreatePropertyType(Constants.PropertyEditors.Aliases.UploadField, null, ContentVariation.Culture); @@ -143,10 +145,21 @@ namespace Umbraco.Tests.Routing var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), new [] { umbracoFilePropertyType }, ContentVariation.Culture); var publishedContent = new SolidPublishedContent(contentType) {Properties = new[] {property}}; - var resolvedUrl = umbracoContext.UrlProvider.GetMediaUrl(publishedContent, UrlMode.Auto, "da"); + var resolvedUrl = GetPublishedUrlProvider(umbracoContext).GetMediaUrl(publishedContent, UrlMode.Auto, "da"); Assert.AreEqual(daMediaUrl, resolvedUrl); } + private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext) + { + return new UrlProvider( + new TestUmbracoContextAccessor(umbracoContext), + TestHelper.WebRoutingSection, + new UrlProviderCollection(Enumerable.Empty()), + new MediaUrlProviderCollection(new []{_mediaUrlProvider}), + Mock.Of() + ); + } + private static IPublishedContent CreatePublishedContent(string propertyEditorAlias, string propertyValue, object dataTypeConfiguration) { var umbracoFilePropertyType = CreatePropertyType(propertyEditorAlias, dataTypeConfiguration, ContentVariation.Nothing); diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index 4bcb08925d..48436d6690 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -2,10 +2,8 @@ using System.Linq; using System.Web.Mvc; using System.Web.Routing; -using System.Web.Security; using Moq; using NUnit.Framework; -using NUnit.Framework.Internal; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Logging; @@ -17,22 +15,17 @@ using Umbraco.Web.Models; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; using Umbraco.Core.Strings; -using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Dictionary; using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Tests.PublishedContent; using Umbraco.Tests.Testing; using Umbraco.Tests.Testing.Objects.Accessors; -using Umbraco.Web.PublishedCache; using Umbraco.Web.Runtime; -using Umbraco.Web.Security; using Current = Umbraco.Web.Composing.Current; -using Umbraco.Web.Security.Providers; using ILogger = Umbraco.Core.Logging.ILogger; namespace Umbraco.Tests.Routing @@ -56,8 +49,8 @@ namespace Umbraco.Tests.Routing public class TestRuntime : WebRuntime { - public TestRuntime(UmbracoApplicationBase umbracoApplication, Configs configs, IUmbracoVersion umbracoVersion, IIOHelper ioHelper, ILogger logger, IHostingEnvironment hostingEnvironment, IBackOfficeInfo backOfficeInfo) - : base(umbracoApplication, configs, umbracoVersion, ioHelper, Mock.Of(), Mock.Of(), hostingEnvironment, backOfficeInfo, TestHelper.DbProviderFactoryCreator, TestHelper.MainDom) + public TestRuntime(Configs configs, IUmbracoVersion umbracoVersion, IIOHelper ioHelper, ILogger logger, IHostingEnvironment hostingEnvironment, IBackOfficeInfo backOfficeInfo) + : base(configs, umbracoVersion, ioHelper, Mock.Of(), Mock.Of(), hostingEnvironment, backOfficeInfo, TestHelper.DbProviderFactoryCreator, TestHelper.MainDom) { } @@ -90,7 +83,7 @@ namespace Umbraco.Tests.Routing var name = "Template"; var template = new Template(ShortStringHelper, name, alias); template.Content = ""; // else saving throws with a dirty internal error - Current.Services.FileService.SaveTemplate(template); + ServiceContext.FileService.SaveTemplate(template); return template; } @@ -100,10 +93,12 @@ namespace Umbraco.Tests.Routing [Test] public void Umbraco_Route_Umbraco_Defined_Controller_Action() { + var url = "~/dummy-page"; var template = CreateTemplate("homePage"); var route = RouteTable.Routes["Umbraco_default"]; var routeData = new RouteData { Route = route }; - var umbracoContext = GetUmbracoContext("~/dummy-page", template.Id, routeData); + var umbracoContext = GetUmbracoContext(url, template.Id, routeData); + var httpContext = GetHttpContextFactory(url, routeData).HttpContext; var publishedRouter = CreatePublishedRouter(); var frequest = publishedRouter.CreateRequest(umbracoContext); frequest.PublishedContent = umbracoContext.Content.GetById(1174); @@ -112,7 +107,7 @@ namespace Umbraco.Tests.Routing var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var handler = new RenderRouteHandler(umbracoContext, new TestControllerFactory(umbracoContextAccessor, Mock.Of()), ShortStringHelper); - handler.GetHandlerForRoute(umbracoContext.HttpContext.Request.RequestContext, frequest); + handler.GetHandlerForRoute(httpContext.Request.RequestContext, frequest); Assert.AreEqual("RenderMvc", routeData.Values["controller"].ToString()); //the route action will still be the one we've asked for because our RenderActionInvoker is the thing that decides // if the action matches. @@ -136,10 +131,12 @@ namespace Umbraco.Tests.Routing // could exist in the database... yet creating templates should sanitize // aliases one way or another... + var url = "~/dummy-page"; var template = CreateTemplate(templateName); var route = RouteTable.Routes["Umbraco_default"]; - var routeData = new RouteData() {Route = route}; + var routeData = new RouteData() { Route = route }; var umbracoContext = GetUmbracoContext("~/dummy-page", template.Id, routeData, true); + var httpContext = GetHttpContextFactory(url, routeData).HttpContext; var publishedRouter = CreatePublishedRouter(); var frequest = publishedRouter.CreateRequest(umbracoContext); frequest.PublishedContent = umbracoContext.Content.GetById(1172); @@ -151,17 +148,15 @@ namespace Umbraco.Tests.Routing var handler = new RenderRouteHandler(umbracoContext, new TestControllerFactory(umbracoContextAccessor, Mock.Of(), context => { - var membershipHelper = new MembershipHelper( - umbracoContext.HttpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of()); - return new CustomDocumentController(Factory.GetInstance(), + + return new CustomDocumentController(Factory.GetInstance(), umbracoContextAccessor, Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance(), - new UmbracoHelper(Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), membershipHelper)); + Factory.GetInstance()); }), ShortStringHelper); - handler.GetHandlerForRoute(umbracoContext.HttpContext.Request.RequestContext, frequest); + handler.GetHandlerForRoute(httpContext.Request.RequestContext, frequest); Assert.AreEqual("CustomDocument", routeData.Values["controller"].ToString()); Assert.AreEqual( //global::umbraco.cms.helpers.Casing.SafeAlias(template.Alias), @@ -195,8 +190,8 @@ namespace Umbraco.Tests.Routing /// public class CustomDocumentController : RenderMvcController { - public CustomDocumentController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ServiceContext services, AppCaches appCaches, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper) - : base(globalSettings, umbracoContextAccessor, services, appCaches, profilingLogger, umbracoHelper) + public CustomDocumentController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ServiceContext services, AppCaches appCaches, IProfilingLogger profilingLogger) + : base(globalSettings, umbracoContextAccessor, services, appCaches, profilingLogger) { } diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs index d4c242a762..de7e6d52b6 100644 --- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs +++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs @@ -42,7 +42,9 @@ namespace Umbraco.Tests.Routing logger, null, // FIXME: PublishedRouter complexities... Mock.Of(), - new RoutableDocumentFilter(globalSettings, IOHelper) + new RoutableDocumentFilter(globalSettings, IOHelper), + UriUtility, + AppCaches.RequestCache ); runtime.Level = RuntimeLevel.Run; diff --git a/src/Umbraco.Tests/Routing/UrlProviderTests.cs b/src/Umbraco.Tests/Routing/UrlProviderTests.cs index 1cecf74c3f..481d03bce5 100644 --- a/src/Umbraco.Tests/Routing/UrlProviderTests.cs +++ b/src/Umbraco.Tests/Routing/UrlProviderTests.cs @@ -13,6 +13,8 @@ using Umbraco.Tests.LegacyXmlPublishedCache; using Umbraco.Tests.PublishedContent; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; +using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web; using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; @@ -22,6 +24,8 @@ namespace Umbraco.Tests.Routing [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerFixture)] public class UrlProviderTests : BaseWebTest { + private IUmbracoContextAccessor UmbracoContextAccessor { get; } = new TestUmbracoContextAccessor(); + protected override void Compose() { base.Compose(); @@ -46,11 +50,12 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[] - { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings: globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); var requestHandlerMock = Mock.Get(umbracoSettings.RequestHandler); requestHandlerMock.Setup(x => x.AddTrailingSlash).Returns(false);// (cached routes have none) @@ -67,14 +72,14 @@ namespace Umbraco.Tests.Routing foreach (var sample in samples) { - var result = umbracoContext.UrlProvider.GetUrl(sample.Key); + var result = publishedUrlProvider.GetUrl(sample.Key); Assert.AreEqual(sample.Value, result); } var randomSample = new KeyValuePair(1177, "/home/sub1/custom-sub-1"); for (int i = 0; i < 5; i++) { - var result = umbracoContext.UrlProvider.GetUrl(randomSample.Key); + var result = publishedUrlProvider.GetUrl(randomSample.Key); Assert.AreEqual(randomSample.Value, result); } @@ -93,6 +98,17 @@ namespace Umbraco.Tests.Routing Assert.AreEqual(0, cachedIds.Count); } + private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider) + { + return new UrlProvider( + new TestUmbracoContextAccessor(umbracoContext), + TestHelper.WebRoutingSection, + new UrlProviderCollection(new []{urlProvider}), + new MediaUrlProviderCollection(Enumerable.Empty()), + Mock.Of() + ); + } + // test hideTopLevelNodeFromPath false [TestCase(1046, "/home/")] [TestCase(1173, "/home/sub1/")] @@ -109,13 +125,14 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[] - { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings: globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); - var result = umbracoContext.UrlProvider.GetUrl(nodeId); + var result = publishedUrlProvider.GetUrl(nodeId); Assert.AreEqual(niceUrlMatch, result); } @@ -137,13 +154,14 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbracoContext = GetUmbracoContext("/test", 1111, urlProviders: new[] - { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings: globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); - var result = umbracoContext.UrlProvider.GetUrl(nodeId); + var result = publishedUrlProvider.GetUrl(nodeId); Assert.AreEqual(niceUrlMatch, result); } @@ -177,15 +195,17 @@ namespace Umbraco.Tests.Routing snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())) .Returns(snapshot); - var umbracoContext = GetUmbracoContext(currentUri, umbracoSettings: umbracoSettings, - urlProviders: new[] { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, + + var umbracoContext = GetUmbracoContext(currentUri, globalSettings: globalSettings.Object, snapshotService: snapshotService.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); //even though we are asking for a specific culture URL, there are no domains assigned so all that can be returned is a normal relative url. - var url = umbracoContext.UrlProvider.GetUrl(1234, culture: "fr-FR"); + var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR"); Assert.AreEqual("/home/test-fr/", url); } @@ -231,15 +251,17 @@ namespace Umbraco.Tests.Routing snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())) .Returns(snapshot); - var umbracoContext = GetUmbracoContext(currentUri, umbracoSettings: umbracoSettings, - urlProviders: new[] { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, + + var umbracoContext = GetUmbracoContext(currentUri, globalSettings: globalSettings.Object, snapshotService: snapshotService.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); - var url = umbracoContext.UrlProvider.GetUrl(1234, culture: "fr-FR"); + var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR"); Assert.AreEqual("/home/test-fr/", url); } @@ -285,15 +307,16 @@ namespace Umbraco.Tests.Routing snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())) .Returns(snapshot); - var umbracoContext = GetUmbracoContext(currentUri, umbracoSettings: umbracoSettings, - urlProviders: new[] { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, + var umbracoContext = GetUmbracoContext(currentUri, globalSettings: globalSettings.Object, snapshotService: snapshotService.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); - var url = umbracoContext.UrlProvider.GetUrl(1234, culture: "fr-FR"); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); + var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR"); //the current uri is not the culture specific domain we want, so the result is an absolute path to the culture specific domain Assert.AreEqual("http://example.fr/home/test-fr/", url); @@ -307,15 +330,17 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, umbracoSettings: umbracoSettings, urlProviders: new[] - { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings: globalSettings.Object); - Assert.AreEqual("/home/sub1/custom-sub-1/", umbracoContext.UrlProvider.GetUrl(1177)); + var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, globalSettings: globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); - umbracoContext.UrlProvider.Mode = UrlMode.Absolute; - Assert.AreEqual("http://example.com/home/sub1/custom-sub-1/", umbracoContext.UrlProvider.GetUrl(1177)); + Assert.AreEqual("/home/sub1/custom-sub-1/", publishedUrlProvider.GetUrl(1177)); + + publishedUrlProvider.Mode = UrlMode.Absolute; + Assert.AreEqual("http://example.com/home/sub1/custom-sub-1/", publishedUrlProvider.GetUrl(1177)); } [Test] @@ -326,18 +351,18 @@ namespace Umbraco.Tests.Routing var umbracoSettings = Current.Configs.Settings(); - var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, urlProviders: new[] - { - new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings: globalSettings.Object); + var urlProvider = new DefaultUrlProvider(umbracoSettings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), UmbracoContextAccessor, UriUtility); + var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, globalSettings: globalSettings.Object); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); //mock the Umbraco settings that we need - Assert.AreEqual("#", umbracoContext.UrlProvider.GetUrl(999999)); + Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999)); - umbracoContext.UrlProvider.Mode = UrlMode.Absolute; + publishedUrlProvider.Mode = UrlMode.Absolute; - Assert.AreEqual("#", umbracoContext.UrlProvider.GetUrl(999999)); + Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999)); } } } diff --git a/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs index 0a34fb8041..ab2883ac37 100644 --- a/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs @@ -4,13 +4,14 @@ using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; using Umbraco.Tests.LegacyXmlPublishedCache; using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web; using Umbraco.Web.Routing; namespace Umbraco.Tests.Routing @@ -18,6 +19,7 @@ namespace Umbraco.Tests.Routing [TestFixture] public class UrlsProviderWithDomainsTests : UrlRoutingTestBase { + private IUmbracoContextAccessor UmbracoContextAccessor { get; } = new TestUmbracoContextAccessor(); protected override void Compose() { base.Compose(); @@ -181,16 +183,17 @@ namespace Umbraco.Tests.Routing var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains1(); var currentUri = new Uri(currentUrl); var mode = absolute ? UrlMode.Absolute : UrlMode.Auto; - var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current: currentUri); + var result = publishedUrlProvider.GetUrl(nodeId, mode, current: currentUri); Assert.AreEqual(expected, result); } @@ -210,20 +213,21 @@ namespace Umbraco.Tests.Routing public void Get_Url_SimpleWithSchemeAndPath(int nodeId, string currentUrl, bool absolute, string expected) { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains2(); var currentUri = new Uri(currentUrl); var mode = absolute ? UrlMode.Absolute : UrlMode.Auto; - var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current : currentUri); + var result = publishedUrlProvider.GetUrl(nodeId, mode, current : currentUri); Assert.AreEqual(expected, result); } @@ -239,16 +243,17 @@ namespace Umbraco.Tests.Routing var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains3(); var currentUri = new Uri(currentUrl); var mode = absolute ? UrlMode.Absolute : UrlMode.Auto; - var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current : currentUri); + var result = publishedUrlProvider.GetUrl(nodeId, mode, current : currentUri); Assert.AreEqual(expected, result); } @@ -266,20 +271,21 @@ namespace Umbraco.Tests.Routing public void Get_Url_NestedDomains(int nodeId, string currentUrl, bool absolute, string expected) { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains4(); var currentUri = new Uri(currentUrl); var mode = absolute ? UrlMode.Absolute : UrlMode.Auto; - var result = umbracoContext.UrlProvider.GetUrl(nodeId, mode, current : currentUri); + var result = publishedUrlProvider.GetUrl(nodeId, mode, current : currentUri); Assert.AreEqual(expected, result); } @@ -287,29 +293,30 @@ namespace Umbraco.Tests.Routing public void Get_Url_DomainsAndCache() { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains4(); string ignore; - ignore = umbracoContext.UrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com")); - ignore = umbracoContext.UrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain2.com")); - ignore = umbracoContext.UrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain2.com")); - ignore = umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain2.com")); - ignore = umbracoContext.UrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain2.com")); + ignore = publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com")); + ignore = publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain2.com")); + ignore = publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain2.com")); + ignore = publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain2.com")); + ignore = publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain2.com")); var cache = umbracoContext.Content as PublishedContentCache; if (cache == null) throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported."); @@ -328,15 +335,15 @@ namespace Umbraco.Tests.Routing CheckRoute(cachedRoutes, cachedIds, 1002, "/1002"); // use the cache - Assert.AreEqual("/", umbracoContext.UrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("/en/", umbracoContext.UrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("/en/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("/fr/", umbracoContext.UrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("/fr/1001-2-1/", umbracoContext.UrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("/1001-3/", umbracoContext.UrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("/1002/", umbracoContext.UrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/", publishedUrlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/en/", publishedUrlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/fr/", publishedUrlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/fr/1001-2-1/", publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/1001-3/", publishedUrlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com"))); + Assert.AreEqual("/1002/", publishedUrlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com"))); - Assert.AreEqual("http://domain1.com/fr/1001-2-1/", umbracoContext.UrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain2.com"))); + Assert.AreEqual("http://domain1.com/fr/1001-2-1/", publishedUrlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain2.com"))); } private static void CheckRoute(IDictionary routes, IDictionary ids, int id, string route) @@ -350,24 +357,25 @@ namespace Umbraco.Tests.Routing public void Get_Url_Relative_Or_Absolute() { var settings = SettingsForTests.GenerateMockUmbracoSettings(); - + var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains4(); - Assert.AreEqual("/en/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111)); - Assert.AreEqual("http://domain3.com/en/1003-1-1/", umbracoContext.UrlProvider.GetUrl(100311)); + Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111)); + Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311)); - umbracoContext.UrlProvider.Mode = UrlMode.Absolute; + publishedUrlProvider.Mode = UrlMode.Absolute; - Assert.AreEqual("http://domain1.com/en/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111)); - Assert.AreEqual("http://domain3.com/en/1003-1-1/", umbracoContext.UrlProvider.GetUrl(100311)); + Assert.AreEqual("http://domain1.com/en/1001-1-1/", publishedUrlProvider.GetUrl(100111)); + Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311)); } [Test] @@ -378,17 +386,18 @@ namespace Umbraco.Tests.Routing var globalSettings = Mock.Get(Factory.GetInstance()); //this will modify the IGlobalSettings instance stored in the container globalSettings.Setup(x => x.HideTopLevelNodeFromPath).Returns(false); // ignored w/domains - var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, umbracoSettings: settings, urlProviders: new[] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); + var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains5(); - var url = umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Absolute); + var url = publishedUrlProvider.GetUrl(100111, UrlMode.Absolute); Assert.AreEqual("http://domain1.com/en/1001-1-1/", url); - var result = umbracoContext.UrlProvider.GetOtherUrls(100111).ToArray(); + var result = publishedUrlProvider.GetOtherUrls(100111).ToArray(); foreach (var x in result) Console.WriteLine(x); @@ -396,5 +405,16 @@ namespace Umbraco.Tests.Routing Assert.AreEqual(result[0].Text, "http://domain1b.com/en/1001-1-1/"); Assert.AreEqual(result[1].Text, "http://domain1a.com/en/1001-1-1/"); } + + private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider) + { + return new UrlProvider( + new TestUmbracoContextAccessor(umbracoContext), + TestHelper.WebRoutingSection, + new UrlProviderCollection(new []{urlProvider}), + new MediaUrlProviderCollection(Enumerable.Empty()), + Mock.Of() + ); + } } } diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index 6587b2e4f6..ad6e7b5408 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -1,8 +1,8 @@ using System; +using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; @@ -10,6 +10,8 @@ using Umbraco.Tests.TestHelpers; using Umbraco.Web.Routing; using Umbraco.Core.Services; using Umbraco.Tests.LegacyXmlPublishedCache; +using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web; namespace Umbraco.Tests.Routing { @@ -41,11 +43,13 @@ namespace Umbraco.Tests.Routing const string url = "http://domain1.com/1001-1/1001-1-1"; // get the nice url for 100111 - var umbracoContext = GetUmbracoContext(url, 9999, umbracoSettings: settings, urlProviders: new [] - { - new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, new SiteDomainHelper()) - }, globalSettings:globalSettings.Object); - Assert.AreEqual("http://domain2.com/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111, UrlMode.Absolute)); + var umbracoContext = GetUmbracoContext(url, 9999, globalSettings:globalSettings.Object); + var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); + var urlProvider = new DefaultUrlProvider(settings.RequestHandler, Logger, globalSettings.Object, + new SiteDomainHelper(), umbracoContextAccessor, UriUtility); + var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); + + Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Absolute)); // check that the proper route has been cached var cache = umbracoContext.Content as PublishedContentCache; @@ -72,10 +76,15 @@ namespace Umbraco.Tests.Routing //Assert.AreEqual("1001/1001-1/1001-1-1", cachedRoutes[100111]); // yes // what's the nice url now? - Assert.AreEqual("http://domain2.com/1001-1-1/", umbracoContext.UrlProvider.GetUrl(100111)); // good + Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111)); // good //Assert.AreEqual("http://domain1.com/1001-1/1001-1-1", routingContext.NiceUrlProvider.GetNiceUrl(100111, true)); // bad } + private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, object urlProvider) + { + throw new NotImplementedException(); + } + void SetDomains1() { SetupDomainServiceMock(new[] @@ -86,6 +95,17 @@ namespace Umbraco.Tests.Routing } + private IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider) + { + return new UrlProvider( + new TestUmbracoContextAccessor(umbracoContext), + TestHelper.WebRoutingSection, + new UrlProviderCollection(new []{urlProvider}), + new MediaUrlProviderCollection(Enumerable.Empty()), + Mock.Of() + ); + } + protected override string GetXmlContent(int templateId) { return @" diff --git a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs index b0e0c1138b..6811f9f8de 100644 --- a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs +++ b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs @@ -193,10 +193,8 @@ namespace Umbraco.Tests.Runtimes Assert.AreEqual("test", content.Name); // need an UmbracoCOntext to access the cache - // FIXME: not exactly pretty, should not depend on HttpContext - var httpContext = Mock.Of(); var umbracoContextFactory = factory.GetInstance(); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(httpContext); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; // assert that there is no published document diff --git a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs index d8d90de593..783beafb2e 100644 --- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs @@ -84,9 +84,9 @@ namespace Umbraco.Tests.Scoping var mediaRepository = Mock.Of(); var memberRepository = Mock.Of(); var hostingEnvironment = TestHelper.GetHostingEnvironment(); - var filePermissionHelper = Mock.Of(); var typeFinder = new TypeFinder(Mock.Of()); + var settings = Mock.Of(); return new PublishedSnapshotService( options, @@ -108,27 +108,27 @@ namespace Umbraco.Tests.Scoping typeFinder, hostingEnvironment, new MockShortStringHelper(), - filePermissionHelper); + IOHelper, + settings); } - protected UmbracoContext GetUmbracoContextNu(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null) + protected IUmbracoContext GetUmbracoContextNu(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null) { // ensure we have a PublishedSnapshotService var service = PublishedSnapshotService as PublishedSnapshotService; var httpContext = GetHttpContextFactory(url, routeData).HttpContext; - + var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext); var globalSettings = TestObjects.GetGlobalSettings(); var umbracoContext = new UmbracoContext( - httpContext, + httpContextAccessor, service, - new WebSecurity(httpContext, Current.Services.UserService, globalSettings, IOHelper), - umbracoSettings ?? SettingsForTests.GetDefaultUmbracoSettings(), - urlProviders ?? Enumerable.Empty(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, ServiceContext.UserService, globalSettings, IOHelper), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); if (setSingleton) Umbraco.Web.Composing.Current.UmbracoContextAccessor.UmbracoContext = umbracoContext; @@ -148,7 +148,7 @@ namespace Umbraco.Tests.Scoping // create document type, document var contentType = new ContentType(ShortStringHelper, -1) { Alias = "CustomDocument", Name = "Custom Document" }; - Current.Services.ContentTypeService.Save(contentType); + ServiceContext.ContentTypeService.Save(contentType); var item = new Content("name", -1, contentType); // event handler @@ -166,7 +166,7 @@ namespace Umbraco.Tests.Scoping using (var scope = ScopeProvider.CreateScope()) { - Current.Services.ContentService.SaveAndPublish(item); + ServiceContext.ContentService.SaveAndPublish(item); scope.Complete(); } @@ -180,7 +180,7 @@ namespace Umbraco.Tests.Scoping using (var scope = ScopeProvider.CreateScope()) { item.Name = "changed"; - Current.Services.ContentService.SaveAndPublish(item); + ServiceContext.ContentService.SaveAndPublish(item); if (complete) scope.Complete(); diff --git a/src/Umbraco.Tests/Scoping/ScopedRepositoryTests.cs b/src/Umbraco.Tests/Scoping/ScopedRepositoryTests.cs index 7a0b2082b3..d1963a1d2e 100644 --- a/src/Umbraco.Tests/Scoping/ScopedRepositoryTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedRepositoryTests.cs @@ -60,7 +60,7 @@ namespace Umbraco.Tests.Scoping public void DefaultRepositoryCachePolicy(bool complete) { var scopeProvider = ScopeProvider; - var service = Current.Services.UserService; + var service = ServiceContext.UserService; var globalCache = Current.AppCaches.IsolatedCaches.GetOrCreate(typeof(IUser)); var user = (IUser)new User(TestObjects.GetGlobalSettings(), "name", "email", "username", "rawPassword"); @@ -137,7 +137,7 @@ namespace Umbraco.Tests.Scoping public void FullDataSetRepositoryCachePolicy(bool complete) { var scopeProvider = ScopeProvider; - var service = Current.Services.LocalizationService; + var service = ServiceContext.LocalizationService; var globalCache = Current.AppCaches.IsolatedCaches.GetOrCreate(typeof (ILanguage)); var lang = (ILanguage) new Language(TestObjects.GetGlobalSettings(), "fr-FR"); @@ -229,7 +229,7 @@ namespace Umbraco.Tests.Scoping public void SingleItemsOnlyRepositoryCachePolicy(bool complete) { var scopeProvider = ScopeProvider; - var service = Current.Services.LocalizationService; + var service = ServiceContext.LocalizationService; var globalCache = Current.AppCaches.IsolatedCaches.GetOrCreate(typeof (IDictionaryItem)); var lang = (ILanguage)new Language(TestObjects.GetGlobalSettings(), "fr-FR"); diff --git a/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs b/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs index 24b41d3322..3e62b52689 100644 --- a/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs @@ -89,7 +89,7 @@ namespace Umbraco.Tests.Scoping // create document type, document var contentType = new ContentType(ShortStringHelper, -1) { Alias = "CustomDocument", Name = "Custom Document" }; - Current.Services.ContentTypeService.Save(contentType); + ServiceContext.ContentTypeService.Save(contentType); var item = new Content("name", -1, contentType); // wire cache refresher @@ -126,9 +126,9 @@ namespace Umbraco.Tests.Scoping using (var scope = ScopeProvider.CreateScope()) { - Current.Services.ContentService.SaveAndPublish(item); // should create an xml clone + ServiceContext.ContentService.SaveAndPublish(item); // should create an xml clone item.Name = "changed"; - Current.Services.ContentService.SaveAndPublish(item); // should re-use the xml clone + ServiceContext.ContentService.SaveAndPublish(item); // should re-use the xml clone // this should never change Assert.AreEqual(beforeOuterXml, beforeXml.OuterXml); @@ -203,7 +203,7 @@ namespace Umbraco.Tests.Scoping // create document type var contentType = new ContentType(ShortStringHelper,-1) { Alias = "CustomDocument", Name = "Custom Document" }; - Current.Services.ContentTypeService.Save(contentType); + ServiceContext.ContentTypeService.Save(contentType); // wire cache refresher _distributedCacheBinder = new DistributedCacheBinder(new DistributedCache(Current.ServerMessenger, Current.CacheRefreshers), Mock.Of(), Mock.Of()); @@ -225,12 +225,12 @@ namespace Umbraco.Tests.Scoping using (var scope = ScopeProvider.CreateScope()) { - Current.Services.ContentService.SaveAndPublish(item); + ServiceContext.ContentService.SaveAndPublish(item); for (var i = 0; i < count; i++) { var temp = new Content("content_" + i, -1, contentType); - Current.Services.ContentService.SaveAndPublish(temp); + ServiceContext.ContentService.SaveAndPublish(temp); ids[i] = temp.Id; } diff --git a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs index 7ff0776ba8..16b8859bed 100644 --- a/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs +++ b/src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs @@ -7,8 +7,8 @@ using Microsoft.Owin; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Web.Composing; using Umbraco.Tests.TestHelpers; +using Umbraco.Web.Composing; using Umbraco.Tests.Testing; using Umbraco.Tests.Testing.Objects.Accessors; using Umbraco.Web; @@ -29,17 +29,20 @@ namespace Umbraco.Tests.Security //should force app ctx to show not-configured ConfigurationManager.AppSettings.Set(Constants.AppSettings.ConfigurationStatus, ""); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var globalSettings = TestObjects.GetGlobalSettings(); var umbracoContext = new UmbracoContext( - Mock.Of(), + httpContextAccessor, Mock.Of(), - new WebSecurity(Mock.Of(), Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), new List(), Enumerable.Empty(), globalSettings, - new TestVariationContextAccessor(), IOHelper); + new WebSecurity(httpContextAccessor, ServiceContext.UserService, globalSettings, IOHelper), globalSettings, + new TestVariationContextAccessor(), + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); var runtime = Mock.Of(x => x.Level == RuntimeLevel.Install); var mgr = new BackOfficeCookieManager( - Mock.Of(accessor => accessor.UmbracoContext == umbracoContext), runtime, TestObjects.GetGlobalSettings(), TestHelper.IOHelper); + Mock.Of(accessor => accessor.UmbracoContext == umbracoContext), runtime, TestObjects.GetGlobalSettings(), IOHelper, AppCaches.RequestCache); var result = mgr.ShouldAuthenticateRequest(Mock.Of(), new Uri("http://localhost/umbraco")); @@ -49,16 +52,20 @@ namespace Umbraco.Tests.Security [Test] public void ShouldAuthenticateRequest_When_Configured() { + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var globalSettings = TestObjects.GetGlobalSettings(); var umbCtx = new UmbracoContext( - Mock.Of(), + httpContextAccessor, Mock.Of(), - new WebSecurity(Mock.Of(), Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), new List(), Enumerable.Empty(), globalSettings, - new TestVariationContextAccessor(), IOHelper); + new WebSecurity(httpContextAccessor, ServiceContext.UserService, globalSettings, IOHelper), + globalSettings, + new TestVariationContextAccessor(), + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); var runtime = Mock.Of(x => x.Level == RuntimeLevel.Run); - var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), runtime, TestObjects.GetGlobalSettings(), TestHelper.IOHelper); + var mgr = new BackOfficeCookieManager(Mock.Of(accessor => accessor.UmbracoContext == umbCtx), runtime, TestObjects.GetGlobalSettings(), IOHelper, AppCaches.RequestCache); var request = new Mock(); request.Setup(owinRequest => owinRequest.Uri).Returns(new Uri("http://localhost/umbraco")); diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs index 8653aa3c58..1b6b632a10 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceVariantsTests.cs @@ -20,6 +20,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Core.Sync; using Umbraco.Tests.Strings; +using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.Testing; using Umbraco.Web.PublishedCache; @@ -56,9 +57,9 @@ namespace Umbraco.Tests.Services var mediaRepository = Mock.Of(); var memberRepository = Mock.Of(); var hostingEnvironment = Mock.Of(); - var filePermissionHelper = Mock.Of(); var typeFinder = new TypeFinder(Mock.Of()); + var settings = Mock.Of(); return new PublishedSnapshotService( options, @@ -80,7 +81,8 @@ namespace Umbraco.Tests.Services typeFinder, hostingEnvironment, new MockShortStringHelper(), - filePermissionHelper); + IOHelper, + settings); } public class LocalServerMessenger : ServerMessengerBase diff --git a/src/Umbraco.Tests/Services/EntityXmlSerializerTests.cs b/src/Umbraco.Tests/Services/EntityXmlSerializerTests.cs index cf1a974742..e10dd99482 100644 --- a/src/Umbraco.Tests/Services/EntityXmlSerializerTests.cs +++ b/src/Umbraco.Tests/Services/EntityXmlSerializerTests.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Services public void Can_Export_Macro() { // Arrange - var macro = new Macro(ShortStringHelper, "test1", "Test", "~/views/macropartials/test.cshtml", MacroTypes.PartialView); + var macro = new Macro(ShortStringHelper, "test1", "Test", "~/views/macropartials/test.cshtml"); ServiceContext.MacroService.Save(macro); // Act diff --git a/src/Umbraco.Tests/Services/MacroServiceTests.cs b/src/Umbraco.Tests/Services/MacroServiceTests.cs index 1d8642b402..ceecb72156 100644 --- a/src/Umbraco.Tests/Services/MacroServiceTests.cs +++ b/src/Umbraco.Tests/Services/MacroServiceTests.cs @@ -28,9 +28,9 @@ namespace Umbraco.Tests.Services { var repository = new MacroRepository((IScopeAccessor) provider, AppCaches.Disabled, Mock.Of(), ShortStringHelper); - repository.Save(new Macro(ShortStringHelper, "test1", "Test1", "~/views/macropartials/test1.cshtml", MacroTypes.PartialView)); - repository.Save(new Macro(ShortStringHelper, "test2", "Test2", "~/views/macropartials/test2.cshtml", MacroTypes.PartialView)); - repository.Save(new Macro(ShortStringHelper, "test3", "Tet3", "~/views/macropartials/test3.cshtml", MacroTypes.PartialView)); + repository.Save(new Macro(ShortStringHelper, "test1", "Test1", "~/views/macropartials/test1.cshtml")); + repository.Save(new Macro(ShortStringHelper, "test2", "Test2", "~/views/macropartials/test2.cshtml")); + repository.Save(new Macro(ShortStringHelper, "test3", "Tet3", "~/views/macropartials/test3.cshtml")); scope.Complete(); } } @@ -75,7 +75,7 @@ namespace Umbraco.Tests.Services var macroService = ServiceContext.MacroService; // Act - var macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + var macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); macroService.Save(macro); //assert @@ -100,7 +100,7 @@ namespace Umbraco.Tests.Services { // Arrange var macroService = ServiceContext.MacroService; - var macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + var macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); macroService.Save(macro); // Act @@ -119,7 +119,7 @@ namespace Umbraco.Tests.Services { // Arrange var macroService = ServiceContext.MacroService; - IMacro macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + IMacro macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); macroService.Save(macro); // Act @@ -143,7 +143,7 @@ namespace Umbraco.Tests.Services { // Arrange var macroService = ServiceContext.MacroService; - IMacro macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + IMacro macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); macro.Properties.Add(new MacroProperty("blah", "Blah", 0, "blah")); macroService.Save(macro); @@ -174,7 +174,7 @@ namespace Umbraco.Tests.Services { // Arrange var macroService = ServiceContext.MacroService; - IMacro macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + IMacro macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); macro.Properties.Add(new MacroProperty("blah1", "Blah1", 0, "blah1")); macro.Properties.Add(new MacroProperty("blah2", "Blah2", 1, "blah2")); macro.Properties.Add(new MacroProperty("blah3", "Blah3", 2, "blah3")); @@ -218,7 +218,7 @@ namespace Umbraco.Tests.Services public void Can_Add_And_Remove_Properties() { var macroService = ServiceContext.MacroService; - var macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + var macro = new Macro(ShortStringHelper, "test", "Test", "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); //adds some properties macro.Properties.Add(new MacroProperty("blah1", "Blah1", 0, "blah1")); @@ -253,7 +253,7 @@ namespace Umbraco.Tests.Services { // Arrange var macroService = ServiceContext.MacroService; - var macro = new Macro(ShortStringHelper, "test", string.Empty, "~/Views/MacroPartials/Test.cshtml", MacroTypes.PartialView, cacheDuration: 1234); + var macro = new Macro(ShortStringHelper, "test", string.Empty, "~/Views/MacroPartials/Test.cshtml", cacheDuration: 1234); // Act & Assert Assert.Throws(() => macroService.Save(macro)); diff --git a/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs b/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs index d39586890a..43d97523d2 100644 --- a/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs +++ b/src/Umbraco.Tests/Templates/HtmlImageSourceParserTests.cs @@ -13,6 +13,7 @@ using System.Linq; using Umbraco.Core.Models; using Umbraco.Core; using System.Diagnostics; +using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Templates { @@ -28,8 +29,7 @@ namespace Umbraco.Tests.Templates

"; - var umbracoContextAccessor = new TestUmbracoContextAccessor(); - var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor); + var imageSourceParser = new HtmlImageSourceParser(Mock.Of()); var result = imageSourceParser.FindUdisFromDataAttributes(input).ToList(); Assert.AreEqual(2, result.Count); @@ -40,8 +40,7 @@ namespace Umbraco.Tests.Templates [Test] public void Remove_Image_Sources() { - var umbracoContextAccessor = new TestUmbracoContextAccessor(); - var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor); + var imageSourceParser = new HtmlImageSourceParser(Mock.Of()); var result = imageSourceParser.RemoveImageSources(@"

@@ -69,21 +68,27 @@ namespace Umbraco.Tests.Templates var media = new Mock(); media.Setup(x => x.ContentType).Returns(mediaType); var mediaUrlProvider = new Mock(); - mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(UrlInfo.Url("/media/1001/my-image.jpg")); var umbracoContextAccessor = new TestUmbracoContextAccessor(); var umbracoContextFactory = TestUmbracoContextFactory.Create( - mediaUrlProvider: mediaUrlProvider.Object, umbracoContextAccessor: umbracoContextAccessor); - using (var reference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of())) + + var publishedUrlProvider = new UrlProvider(umbracoContextAccessor, + TestHelper.WebRoutingSection, + new UrlProviderCollection(Enumerable.Empty()), + new MediaUrlProviderCollection(new []{mediaUrlProvider.Object}), + Mock.Of() + ); + using (var reference = umbracoContextFactory.EnsureUmbracoContext()) { var mediaCache = Mock.Get(reference.UmbracoContext.Media); mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object); - var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor); + var imageSourceParser = new HtmlImageSourceParser(publishedUrlProvider); var result = imageSourceParser.EnsureImageSources(@"

diff --git a/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs b/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs index 17f0471252..f350a5d702 100644 --- a/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs +++ b/src/Umbraco.Tests/Templates/HtmlLocalLinkParserTests.cs @@ -6,6 +6,7 @@ using System.Web; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing.Objects; using Umbraco.Tests.Testing.Objects.Accessors; using Umbraco.Web; @@ -30,7 +31,7 @@ namespace Umbraco.Tests.Templates

"; var umbracoContextAccessor = new TestUmbracoContextAccessor(); - var parser = new HtmlLocalLinkParser(umbracoContextAccessor); + var parser = new HtmlLocalLinkParser(umbracoContextAccessor, Mock.Of()); var result = parser.FindUdisFromLocalLinks(input).ToList(); @@ -52,7 +53,7 @@ namespace Umbraco.Tests.Templates //setup a mock url provider which we'll use for testing var contentUrlProvider = new Mock(); contentUrlProvider - .Setup(x => x.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(x => x.GetUrl( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(UrlInfo.Url("/my-test-url")); var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing); var publishedContent = new Mock(); @@ -63,17 +64,21 @@ namespace Umbraco.Tests.Templates var media = new Mock(); media.Setup(x => x.ContentType).Returns(mediaType); var mediaUrlProvider = new Mock(); - mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + mediaUrlProvider.Setup(x => x.GetMediaUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(UrlInfo.Url("/media/1001/my-image.jpg")); var umbracoContextAccessor = new TestUmbracoContextAccessor(); var umbracoContextFactory = TestUmbracoContextFactory.Create( - urlProvider: contentUrlProvider.Object, - mediaUrlProvider: mediaUrlProvider.Object, umbracoContextAccessor: umbracoContextAccessor); - using (var reference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of())) + var publishedUrlProvider = new UrlProvider(umbracoContextAccessor, + TestHelper.WebRoutingSection, + new UrlProviderCollection(new []{contentUrlProvider.Object}), + new MediaUrlProviderCollection(new []{mediaUrlProvider.Object}), + Mock.Of() + ); + using (var reference = umbracoContextFactory.EnsureUmbracoContext()) { var contentCache = Mock.Get(reference.UmbracoContext.Content); contentCache.Setup(x => x.GetById(It.IsAny())).Returns(publishedContent.Object); @@ -83,7 +88,7 @@ namespace Umbraco.Tests.Templates mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object); mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object); - var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor); + var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor, publishedUrlProvider); var output = linkParser.EnsureInternalLinks(input); diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs index 3fa61e8961..b09620103b 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -10,14 +10,18 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Request; using Umbraco.Core.Services; +using Umbraco.Core.Services.Implement; using Umbraco.Core.Strings; using Umbraco.Tests.PublishedContent; using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web; using Umbraco.Web.Composing; using Umbraco.Web.Models.PublishedContent; using Umbraco.Web.Routing; +using Umbraco.Web.Security; namespace Umbraco.Tests.TestHelpers { @@ -28,6 +32,7 @@ namespace Umbraco.Tests.TestHelpers protected override void Compose() { base.Compose(); + base.Compose(); Composition.RegisterUnique(); Composition.RegisterUnique(); @@ -95,10 +100,16 @@ namespace Umbraco.Tests.TestHelpers contentFinders ?? new ContentFinderCollection(Enumerable.Empty()), new TestLastChanceFinder(), new TestVariationContextAccessor(), - container?.TryGetInstance() ?? ServiceContext.CreatePartial(), new ProfilingLogger(Mock.Of(), Mock.Of()), container?.TryGetInstance() ?? Current.Factory.GetInstance(), - Mock.Of()); + Mock.Of(), + Mock.Of(), + container?.GetInstance() ?? Current.Factory.GetInstance(), + container?.GetInstance()?? Current.Factory.GetInstance(), + container?.GetInstance()?? Current.Factory.GetInstance(), + container?.GetInstance() ?? Current.Factory.GetInstance(), + container?.GetInstance() ?? Current.Factory.GetInstance() + ); } } } diff --git a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivator.cs b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivator.cs index 6b67377202..d3cc51b38d 100644 --- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivator.cs +++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivator.cs @@ -7,16 +7,16 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting { public class TestControllerActivator : TestControllerActivatorBase { - private readonly Func _factory; + private readonly Func _factory; - public TestControllerActivator(Func factory) + public TestControllerActivator(Func factory) { _factory = factory; } - protected override ApiController CreateController(Type controllerType, HttpRequestMessage msg, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + protected override ApiController CreateController(Type controllerType, HttpRequestMessage msg, IUmbracoContextAccessor umbracoContextAccessor) { - return _factory(msg, umbracoContextAccessor, helper); + return _factory(msg, umbracoContextAccessor); } } } diff --git a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs index 841608cacb..35197e13e0 100644 --- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs +++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs @@ -102,7 +102,7 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting var backofficeIdentity = (UmbracoBackOfficeIdentity) owinContext.Authentication.User.Identity; - var webSecurity = new Mock(null, null, globalSettings, TestHelper.IOHelper); + var webSecurity = new Mock(); //mock CurrentUser var groups = new List(); @@ -137,35 +137,26 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting var umbracoContextAccessor = Umbraco.Web.Composing.Current.UmbracoContextAccessor; - var umbCtx = new UmbracoContext(httpContext, + var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext); + var umbCtx = new UmbracoContext(httpContextAccessor, publishedSnapshotService.Object, webSecurity.Object, - Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")), - Enumerable.Empty(), - Enumerable.Empty(), globalSettings, new TestVariationContextAccessor(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + new AspNetCookieManager(httpContextAccessor)); //replace it umbracoContextAccessor.UmbracoContext = umbCtx; var urlHelper = new Mock(); - urlHelper.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + urlHelper.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(UrlInfo.Url("/hello/world/1234")); - var membershipHelper = new MembershipHelper(umbCtx.HttpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), new MockShortStringHelper(), Mock.Of()); - - var umbHelper = new UmbracoHelper(Mock.Of(), - Mock.Of(), - Mock.Of(), - Mock.Of(), - Mock.Of(), - membershipHelper); - - return CreateController(controllerType, request, umbracoContextAccessor, umbHelper); + return CreateController(controllerType, request, umbracoContextAccessor); } - protected abstract ApiController CreateController(Type controllerType, HttpRequestMessage msg, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper); + protected abstract ApiController CreateController(Type controllerType, HttpRequestMessage msg, IUmbracoContextAccessor umbracoContextAccessor); } } diff --git a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestRunner.cs b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestRunner.cs index 9f9f933d72..34b649d3bb 100644 --- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestRunner.cs +++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestRunner.cs @@ -15,9 +15,9 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting { public class TestRunner { - private readonly Func _controllerFactory; + private readonly Func _controllerFactory; - public TestRunner(Func controllerFactory) + public TestRunner(Func controllerFactory) { _controllerFactory = controllerFactory; } diff --git a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestStartup.cs b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestStartup.cs index 0827a1f786..f038112b0b 100644 --- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestStartup.cs +++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestStartup.cs @@ -16,10 +16,10 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting ///
public class TestStartup { - private readonly Func _controllerFactory; + private readonly Func _controllerFactory; private readonly Action _initialize; - public TestStartup(Action initialize, Func controllerFactory) + public TestStartup(Action initialize, Func controllerFactory) { _controllerFactory = controllerFactory; _initialize = initialize; diff --git a/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs b/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs index 45f7042e31..cc14a7a023 100644 --- a/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs +++ b/src/Umbraco.Tests/TestHelpers/FakeHttpContextFactory.cs @@ -109,12 +109,13 @@ namespace Umbraco.Tests.TestHelpers requestContextMock.Setup(x => x.HttpContext).Returns(httpContextMock.Object); - if (routeData != null) + + if (routeData is null) { - requestContextMock.Setup(x => x.RouteData).Returns(routeData); + routeData = new RouteData(); } - + requestContextMock.Setup(x => x.RouteData).Returns(routeData); } } diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestLastChanceFinder.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestLastChanceFinder.cs index 6a43f6180d..48517f85dd 100644 --- a/src/Umbraco.Tests/TestHelpers/Stubs/TestLastChanceFinder.cs +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestLastChanceFinder.cs @@ -4,7 +4,7 @@ namespace Umbraco.Tests.TestHelpers.Stubs { internal class TestLastChanceFinder : IContentLastChanceFinder { - public bool TryFindContent(PublishedRequest frequest) + public bool TryFindContent(IPublishedRequest frequest) { return false; } diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index a5ab3efe82..41b97ac580 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Reflection; using System.Threading; +using System.Web; using Moq; using NUnit.Framework; using Umbraco.Core; @@ -31,6 +32,7 @@ using Umbraco.Net; using Umbraco.Tests.Testing.Objects.Accessors; using Umbraco.Web; using Umbraco.Web.Hosting; +using Umbraco.Web.Routing; using File = System.IO.File; namespace Umbraco.Tests.TestHelpers @@ -100,6 +102,10 @@ namespace Umbraco.Tests.TestHelpers public static IIOHelper IOHelper { get; } = new IOHelper(GetHostingEnvironment()); public static IMainDom MainDom { get; } = new MainDom(Mock.Of(), GetHostingEnvironment(), new MainDomSemaphoreLock(Mock.Of(), GetHostingEnvironment())); + public static UriUtility UriUtility { get; } = new UriUtility(GetHostingEnvironment()); + + public static IWebRoutingSection WebRoutingSection => SettingsForTests.GetDefaultUmbracoSettings().WebRouting; + /// /// Maps the given making it rooted on . must start with ~/ /// @@ -343,5 +349,31 @@ namespace Umbraco.Tests.TestHelpers { return new DictionaryAppCache(); } + + public static IHttpContextAccessor GetHttpContextAccessor(HttpContextBase httpContextBase = null) + { + if (httpContextBase is null) + { + var httpContextMock = new Mock(); + + httpContextMock.Setup(x => x.DisposeOnPipelineCompleted(It.IsAny())) + .Returns(Mock.Of()); + + httpContextBase = httpContextMock.Object; + } + + var mock = new Mock(); + + mock.Setup(x => x.HttpContext).Returns(httpContextBase); + + return mock.Object; + } + + public static IPublishedUrlProvider GetPublishedUrlProvider() + { + var mock = new Mock(); + + return mock.Object; + } } } diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs index 7230d1101e..5dabb7ed06 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -109,9 +109,8 @@ namespace Umbraco.Tests.TestHelpers /// /// An Umbraco context. /// This should be the minimum Umbraco context. - public UmbracoContext GetUmbracoContextMock(IUmbracoContextAccessor accessor = null) + public IUmbracoContext GetUmbracoContextMock(IUmbracoContextAccessor accessor = null) { - var httpContext = Mock.Of(); var publishedSnapshotMock = new Mock(); publishedSnapshotMock.Setup(x => x.Members).Returns(Mock.Of()); @@ -120,26 +119,25 @@ namespace Umbraco.Tests.TestHelpers publishedSnapshotServiceMock.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(publishedSnapshot); var publishedSnapshotService = publishedSnapshotServiceMock.Object; - var umbracoSettings = GetUmbracoSettings(); var globalSettings = GetGlobalSettings(); - var urlProviders = new UrlProviderCollection(Enumerable.Empty()); - var mediaUrlProviders = new MediaUrlProviderCollection(Enumerable.Empty()); if (accessor == null) accessor = new TestUmbracoContextAccessor(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); + var umbracoContextFactory = new UmbracoContextFactory( accessor, publishedSnapshotService, new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - umbracoSettings, globalSettings, - urlProviders, - mediaUrlProviders, Mock.Of(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - return umbracoContextFactory.EnsureUmbracoContext(httpContext).UmbracoContext; + return umbracoContextFactory.EnsureUmbracoContext().UmbracoContext; } public IUmbracoSettingsSection GetUmbracoSettings() @@ -337,5 +335,7 @@ namespace Umbraco.Tests.TestHelpers } #endregion + + } } diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 8e884a5937..e58d58783c 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -159,7 +159,7 @@ namespace Umbraco.Tests.TestHelpers var localizationService = GetLazyService(factory, c => new LocalizationService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c))); var userService = GetLazyService(factory, c => new UserService(scopeProvider, logger, eventMessagesFactory, runtimeState, GetRepo(c), GetRepo(c),globalSettings)); - var dataTypeService = GetLazyService(factory, c => new DataTypeService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); + var dataTypeService = GetLazyService(factory, c => new DataTypeService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), ioHelper, localizedTextService.Value, localizationService.Value, TestHelper.ShortStringHelper)); var propertyValidationService = new Lazy(() => new PropertyValidationService(propertyEditorCollection, dataTypeService.Value)); var contentService = GetLazyService(factory, c => new ContentService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), propertyValidationService)); var notificationService = GetLazyService(factory, c => new NotificationService(scopeProvider, userService.Value, contentService.Value, localizationService.Value, logger, ioHelper, GetRepo(c), globalSettings, umbracoSettings.Content)); diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 8d1f8c1f84..b02af84e09 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -31,6 +31,7 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence.Repositories; using Umbraco.Tests.LegacyXmlPublishedCache; using Umbraco.Tests.Testing.Objects.Accessors; +using Umbraco.Web.WebApi; namespace Umbraco.Tests.TestHelpers { @@ -53,8 +54,6 @@ namespace Umbraco.Tests.TestHelpers protected PublishedContentTypeCache ContentTypesCache { get; private set; } protected override ISqlSyntaxProvider SqlSyntax => GetSyntaxProvider(); - - protected ServiceContext ServiceContext => Current.Services; protected IVariationContextAccessor VariationContextAccessor => new TestVariationContextAccessor(); internal ScopeProvider ScopeProvider => Current.ScopeProvider as ScopeProvider; @@ -81,6 +80,9 @@ namespace Umbraco.Tests.TestHelpers .Clear() .Add(() => Composition.TypeLoader.GetDataEditors()); + Composition.WithCollectionBuilder() + .Add(Composition.TypeLoader.GetUmbracoApiControllers()); + Composition.RegisterUnique(f => { if (Options.Database == UmbracoTestOptions.Database.None) @@ -155,14 +157,7 @@ namespace Umbraco.Tests.TestHelpers return @"Datasource=|DataDirectory|UmbracoNPocoTests.sdf;Flush Interval=1;"; } - protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) - { - var factory = routeData != null - ? new FakeHttpContextFactory(url, routeData) - : new FakeHttpContextFactory(url); - return factory; - } /// /// Creates the SqlCe database if required @@ -357,7 +352,7 @@ namespace Umbraco.Tests.TestHelpers } } - protected UmbracoContext GetUmbracoContext(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null, IEnumerable mediaUrlProviders = null, IGlobalSettings globalSettings = null, IPublishedSnapshotService snapshotService = null) + protected IUmbracoContext GetUmbracoContext(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IGlobalSettings globalSettings = null, IPublishedSnapshotService snapshotService = null) { // ensure we have a PublishedCachesService var service = snapshotService ?? PublishedSnapshotService as XmlPublishedSnapshotService; @@ -376,18 +371,17 @@ namespace Umbraco.Tests.TestHelpers } var httpContext = GetHttpContextFactory(url, routeData).HttpContext; - + var httpContextAccessor = TestHelper.GetHttpContextAccessor(httpContext); var umbracoContext = new UmbracoContext( - httpContext, + httpContextAccessor, service, - new WebSecurity(httpContext, Factory.GetInstance(), + new WebSecurity(httpContextAccessor, Factory.GetInstance(), Factory.GetInstance(), IOHelper), - umbracoSettings ?? Factory.GetInstance(), - urlProviders ?? Enumerable.Empty(), - mediaUrlProviders ?? Enumerable.Empty(), globalSettings ?? Factory.GetInstance(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); if (setSingleton) Umbraco.Web.Composing.Current.UmbracoContextAccessor.UmbracoContext = umbracoContext; diff --git a/src/Umbraco.Tests/Testing/Objects/Accessors/NoHttpContextAccessor.cs b/src/Umbraco.Tests/Testing/Objects/Accessors/NoHttpContextAccessor.cs index 9b37389241..e34ff7bb45 100644 --- a/src/Umbraco.Tests/Testing/Objects/Accessors/NoHttpContextAccessor.cs +++ b/src/Umbraco.Tests/Testing/Objects/Accessors/NoHttpContextAccessor.cs @@ -5,6 +5,6 @@ namespace Umbraco.Tests.Testing.Objects.Accessors { public class NoHttpContextAccessor : IHttpContextAccessor { - public HttpContext HttpContext { get; set; } = null; + public HttpContextBase HttpContext { get; set; } = null; } } diff --git a/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs b/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs index 4f3b801af9..f9862701ea 100644 --- a/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs +++ b/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs @@ -4,13 +4,13 @@ namespace Umbraco.Tests.Testing.Objects.Accessors { public class TestUmbracoContextAccessor : IUmbracoContextAccessor { - public UmbracoContext UmbracoContext { get; set; } + public IUmbracoContext UmbracoContext { get; set; } public TestUmbracoContextAccessor() { } - public TestUmbracoContextAccessor(UmbracoContext umbracoContext) + public TestUmbracoContextAccessor(IUmbracoContext umbracoContext) { UmbracoContext = umbracoContext; } diff --git a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs index f28613735d..20b18fa728 100644 --- a/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs +++ b/src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs @@ -16,14 +16,15 @@ namespace Umbraco.Tests.Testing.Objects /// public class TestUmbracoContextFactory { - public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null, IUrlProvider urlProvider = null, - IMediaUrlProvider mediaUrlProvider = null, - IUmbracoContextAccessor umbracoContextAccessor = null) + public static IUmbracoContextFactory Create(IGlobalSettings globalSettings = null, + IUmbracoContextAccessor umbracoContextAccessor = null, + IHttpContextAccessor httpContextAccessor = null, + IPublishedUrlProvider publishedUrlProvider = null) { if (globalSettings == null) globalSettings = SettingsForTests.GenerateMockGlobalSettings(); - if (urlProvider == null) urlProvider = Mock.Of(); - if (mediaUrlProvider == null) mediaUrlProvider = Mock.Of(); if (umbracoContextAccessor == null) umbracoContextAccessor = new TestUmbracoContextAccessor(); + if (httpContextAccessor == null) httpContextAccessor = TestHelper.GetHttpContextAccessor(); + if (publishedUrlProvider == null) publishedUrlProvider = TestHelper.GetPublishedUrlProvider(); var contentCache = new Mock(); var mediaCache = new Mock(); @@ -33,17 +34,19 @@ namespace Umbraco.Tests.Testing.Objects var snapshotService = new Mock(); snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(snapshot.Object); + + var umbracoContextFactory = new UmbracoContextFactory( umbracoContextAccessor, snapshotService.Object, new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")), globalSettings, - new UrlProviderCollection(new[] { urlProvider }), - new MediaUrlProviderCollection(new[] { mediaUrlProvider }), Mock.Of(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); return umbracoContextFactory; } diff --git a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs index 6f807f62c5..439c9b17f2 100644 --- a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs +++ b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using System.Linq; +using System.Web; using System.Web.Security; using Moq; using NUnit.Framework; @@ -56,8 +57,6 @@ namespace Umbraco.Tests.Testing.TestingTests [Test] public void Can_Mock_Umbraco_Helper() { - var umbracoContext = TestObjects.GetUmbracoContextMock(); - // unless we can inject them in MembershipHelper, we need need this Composition.Register(_ => Mock.Of()); Composition.Register(_ => Mock.Of()); @@ -67,11 +66,9 @@ namespace Umbraco.Tests.Testing.TestingTests // ReSharper disable once UnusedVariable var helper = new UmbracoHelper(Mock.Of(), - Mock.Of(), Mock.Of(), Mock.Of(), - Mock.Of(), - new MembershipHelper(umbracoContext.HttpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of())); + Mock.Of()); Assert.Pass(); } @@ -80,12 +77,18 @@ namespace Umbraco.Tests.Testing.TestingTests { var umbracoContext = TestObjects.GetUmbracoContextMock(); + var urlProviderMock = new Mock(); - urlProviderMock.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + urlProviderMock.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(UrlInfo.Url("/hello/world/1234")); var urlProvider = urlProviderMock.Object; - var theUrlProvider = new UrlProvider(umbracoContext, new [] { urlProvider }, Enumerable.Empty(), umbracoContext.VariationContextAccessor); + var theUrlProvider = new UrlProvider( + new TestUmbracoContextAccessor(umbracoContext), + TestHelper.WebRoutingSection, + new UrlProviderCollection(new [] { urlProvider }), + new MediaUrlProviderCollection( Enumerable.Empty()) + , umbracoContext.VariationContextAccessor); var contentType = new PublishedContentType(666, "alias", PublishedItemType.Content, Enumerable.Empty(), Enumerable.Empty(), ContentVariation.Nothing); var publishedContent = Mock.Of(); @@ -97,17 +100,14 @@ namespace Umbraco.Tests.Testing.TestingTests [Test] public void Can_Mock_UmbracoApiController_Dependencies_With_Injected_UmbracoMapper() { - var umbracoContext = TestObjects.GetUmbracoContextMock(); - var logger = Mock.Of(); var memberService = Mock.Of(); var memberTypeService = Mock.Of(); var membershipProvider = new MembersMembershipProvider(memberService, memberTypeService, Mock.Of(), TestHelper.GetHostingEnvironment(), TestHelper.GetIpResolver()); - var membershipHelper = new MembershipHelper(umbracoContext.HttpContext, Mock.Of(), membershipProvider, Mock.Of(), memberService, memberTypeService, Mock.Of(), AppCaches.Disabled, logger, ShortStringHelper, Mock.Of()); - var umbracoHelper = new UmbracoHelper(Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), membershipHelper); + var membershipHelper = new MembershipHelper(Mock.Of(), Mock.Of(), membershipProvider, Mock.Of(), memberService, memberTypeService, Mock.Of(), AppCaches.Disabled, logger, ShortStringHelper, Mock.Of()); var umbracoMapper = new UmbracoMapper(new MapDefinitionCollection(new[] { Mock.Of() })); - var umbracoApiController = new FakeUmbracoApiController(Mock.Of(), Mock.Of(), Mock.Of(), ServiceContext.CreatePartial(), AppCaches.NoCache, logger, Mock.Of(), umbracoHelper, umbracoMapper); + var umbracoApiController = new FakeUmbracoApiController(Mock.Of(), Mock.Of(), Mock.Of(), ServiceContext.CreatePartial(), AppCaches.NoCache, logger, Mock.Of(), umbracoMapper, Mock.Of()); Assert.Pass(); } @@ -115,6 +115,7 @@ namespace Umbraco.Tests.Testing.TestingTests internal class FakeUmbracoApiController : UmbracoApiController { - public FakeUmbracoApiController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, UmbracoMapper umbracoMapper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, umbracoMapper) { } + public FakeUmbracoApiController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoMapper umbracoMapper, IPublishedUrlProvider publishedUrlProvider) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoMapper, publishedUrlProvider) { } } } diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index baf5bd40a6..de0db554f3 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -2,7 +2,10 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Linq; using System.Reflection; +using System.Web.Routing; +using System.Web.Security; using System.Xml.Linq; using Examine; using Moq; @@ -49,11 +52,16 @@ using Umbraco.Web.Templates; using Umbraco.Web.PropertyEditors; using Umbraco.Core.Dictionary; using Umbraco.Core.Models; -using Umbraco.Core.Models.Identity; +using Umbraco.Core.Request; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Net; +using Umbraco.Tests.LegacyXmlPublishedCache; +using Umbraco.Web.AspNet; +using Umbraco.Web.Install; using Umbraco.Web.Security; +using Umbraco.Web.Security.Providers; +using Umbraco.Web.Trees; using Current = Umbraco.Web.Composing.Current; namespace Umbraco.Tests.Testing { @@ -108,11 +116,14 @@ namespace Umbraco.Tests.Testing private TypeLoader _featureTypeLoader; #region Accessors + protected ServiceContext ServiceContext => Factory.GetInstance(); protected ILogger Logger => Factory.GetInstance(); protected IJsonSerializer JsonNetSerializer { get; } = new JsonNetSerializer(); protected IIOHelper IOHelper { get; private set; } + protected UriUtility UriUtility => new UriUtility(HostingEnvironment); + protected IPublishedUrlProvider PublishedUrlProvider => Factory.GetInstance(); protected IDataTypeService DataTypeService => Factory.GetInstance(); protected IPasswordHasher PasswordHasher => Factory.GetInstance(); protected Lazy PropertyEditorCollection => new Lazy(() => Factory.GetInstance()); @@ -127,7 +138,7 @@ namespace Umbraco.Tests.Testing protected virtual IProfilingLogger ProfilingLogger => Factory.GetInstance(); - protected IHostingEnvironment HostingEnvironment => Factory.GetInstance(); + protected IHostingEnvironment HostingEnvironment { get; } = new AspNetHostingEnvironment(SettingsForTests.GetDefaultHostingSettings()); protected IIpResolver IpResolver => Factory.GetInstance(); protected IBackOfficeInfo BackOfficeInfo => Factory.GetInstance(); protected AppCaches AppCaches => Factory.GetInstance(); @@ -137,6 +148,7 @@ namespace Umbraco.Tests.Testing protected IMapperCollection Mappers => Factory.GetInstance(); protected UmbracoMapper Mapper => Factory.GetInstance(); + protected IHttpContextAccessor HttpContextAccessor => Factory.GetInstance(); protected IRuntimeState RuntimeState => ComponentTests.MockRuntimeState(RuntimeLevel.Run); #endregion @@ -159,20 +171,18 @@ namespace Umbraco.Tests.Testing var proflogger = new ProfilingLogger(logger, profiler); IOHelper = TestHelper.IOHelper; - TypeFinder = new TypeFinder(logger); var appCaches = GetAppCaches(); var globalSettings = SettingsForTests.GetDefaultGlobalSettings(); - var hostingSettings = SettingsForTests.GetDefaultHostingSettings(); var settings = SettingsForTests.GetDefaultUmbracoSettings(); - IHostingEnvironment hostingEnvironment = new AspNetHostingEnvironment(hostingSettings); + IBackOfficeInfo backOfficeInfo = new AspNetBackOfficeInfo(globalSettings, IOHelper, settings, logger); IIpResolver ipResolver = new AspNetIpResolver(); UmbracoVersion = new UmbracoVersion(globalSettings); LocalizedTextService = new LocalizedTextService(new Dictionary>(), logger); - var typeLoader = GetTypeLoader(IOHelper, TypeFinder, appCaches.RuntimeCache, hostingEnvironment, proflogger, Options.TypeLoader); + var typeLoader = GetTypeLoader(IOHelper, TypeFinder, appCaches.RuntimeCache, HostingEnvironment, proflogger, Options.TypeLoader); var register = TestHelper.GetRegister(); @@ -183,6 +193,7 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(IOHelper); + Composition.RegisterUnique(UriUtility); Composition.RegisterUnique(UmbracoVersion); Composition.RegisterUnique(TypeFinder); Composition.RegisterUnique(LocalizedTextService); @@ -191,12 +202,23 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(profiler); Composition.RegisterUnique(proflogger); Composition.RegisterUnique(appCaches); - Composition.RegisterUnique(hostingEnvironment); + Composition.RegisterUnique(HostingEnvironment); Composition.RegisterUnique(backOfficeInfo); Composition.RegisterUnique(ipResolver); Composition.RegisterUnique(); - Composition.RegisterUnique(); Composition.RegisterUnique(TestHelper.ShortStringHelper); + Composition.RegisterUnique(); + Composition.RegisterUnique(); + + + var memberService = Mock.Of(); + var memberTypeService = Mock.Of(); + var membershipProvider = new MembersMembershipProvider(memberService, memberTypeService, Mock.Of(), TestHelper.GetHostingEnvironment(), TestHelper.GetIpResolver()); + var membershipHelper = new MembershipHelper(Mock.Of(), Mock.Of(), membershipProvider, Mock.Of(), memberService, memberTypeService, Mock.Of(), AppCaches.Disabled, logger, ShortStringHelper, Mock.Of()); + + Composition.RegisterUnique(membershipHelper); + + TestObjects = new TestObjects(register); @@ -296,6 +318,18 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(); Composition.RegisterUnique(); Composition.RegisterUnique(); + Composition.RegisterUnique(factory => + new UrlProvider( + factory.GetInstance(), + TestObjects.GetUmbracoSettings().WebRouting, + new UrlProviderCollection(Enumerable.Empty()), + new MediaUrlProviderCollection(Enumerable.Empty()), + factory.GetInstance() + + )); + + + } protected virtual void ComposeMisc() @@ -320,6 +354,9 @@ namespace Umbraco.Tests.Testing // manifest Composition.ManifestValueValidators(); Composition.ManifestFilters(); + Composition.MediaUrlGenerators() + .Add() + .Add(); } @@ -357,7 +394,7 @@ namespace Umbraco.Tests.Testing { return new TypeLoader(ioHelper, typeFinder, runtimeCache, new DirectoryInfo(hostingEnvironment.LocalTempPath), logger, false, new[] { - Assembly.Load("Umbraco.Abstractions"), + Assembly.Load("Umbraco.Core"), Assembly.Load("Umbraco.Web"), Assembly.Load("Umbraco.Tests"), Assembly.Load("Umbraco.Infrastructure") @@ -396,6 +433,8 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(); Composition.RegisterUnique(); + Composition.RegisterUnique(); + Composition.RegisterUnique(); // register filesystems Composition.RegisterUnique(factory => TestObjects.GetFileSystemsMock()); @@ -444,10 +483,22 @@ namespace Umbraco.Tests.Testing Composition.WithCollectionBuilder(); Composition.RegisterUnique(); Composition.RegisterUnique(); + + + Composition.RegisterUnique(TestHelper.GetHttpContextAccessor(GetHttpContextFactory("/").HttpContext)); } #endregion + protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) + { + var factory = routeData != null + ? new FakeHttpContextFactory(url, routeData) + : new FakeHttpContextFactory(url); + + return factory; + } + #region Initialize protected virtual void InitializeApplication(bool withApplication) @@ -494,7 +545,7 @@ namespace Umbraco.Tests.Testing Current.Reset(); // disposes the factory // reset all other static things that should not be static ;( - UriUtility.ResetAppDomainAppVirtualPath(); + UriUtility.ResetAppDomainAppVirtualPath(HostingEnvironment); SettingsForTests.Reset(); // FIXME: should it be optional? // clear static events diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 46baf94644..ef7b50856b 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -42,7 +42,7 @@ prompt 4 false - latest + 8 pdbonly @@ -151,6 +151,7 @@ + @@ -323,7 +324,6 @@ - @@ -559,22 +559,18 @@ - - {29aa69d9-b597-4395-8d42-43b1263c240a} - Umbraco.Abstractions - {fbe7c065-dac0-4025-a78b-63b24d3ab00b} Umbraco.Configuration + + {29aa69d9-b597-4395-8d42-43b1263c240a} + Umbraco.Core + {0fad7d2a-d7dd-45b1-91fd-488bb6cdacea} Umbraco.Examine.Lucene - - {f9b7fe05-0f93-4d0d-9c10-690b33ecbbd8} - Umbraco.Examine - {3ae7bf57-966b-45a5-910a-954d7c554441} Umbraco.Infrastructure diff --git a/src/Umbraco.Tests/Views/web.config b/src/Umbraco.Tests/Views/web.config new file mode 100644 index 0000000000..efd80424e5 --- /dev/null +++ b/src/Umbraco.Tests/Views/web.config @@ -0,0 +1,74 @@ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs index 7753b0495f..9ecedee056 100644 --- a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs @@ -34,6 +34,7 @@ using Umbraco.Web.Models.ContentEditing; using IUser = Umbraco.Core.Models.Membership.IUser; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; +using Umbraco.Web.Routing; namespace Umbraco.Tests.Web.Controllers { @@ -60,10 +61,10 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async System.Threading.Tasks.Task GetCurrentUser_Fips() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { //setup some mocks - var userServiceMock = Mock.Get(Current.Services.UserService); + var userServiceMock = Mock.Get(ServiceContext.UserService); userServiceMock.Setup(service => service.GetUserById(It.IsAny())) .Returns(() => null); @@ -86,10 +87,11 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance() + ); return usersController; } diff --git a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs index 75960a93cf..e3c2a89593 100644 --- a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs @@ -35,6 +35,7 @@ using Umbraco.Web.WebApi; using Umbraco.Web.Composing; using Task = System.Threading.Tasks.Task; using Umbraco.Core.Mapping; +using Umbraco.Web.Routing; namespace Umbraco.Tests.Web.Controllers { @@ -159,10 +160,10 @@ namespace Umbraco.Tests.Web.Controllers if (_contentTypeForMockedContent == null) { _contentTypeForMockedContent = GetMockedContentType(); - Mock.Get(Current.Services.ContentTypeService) + Mock.Get(ServiceContext.ContentTypeService) .Setup(x => x.Get(_contentTypeForMockedContent.Id)) .Returns(_contentTypeForMockedContent); - Mock.Get(Current.Services.ContentTypeService) + Mock.Get(ServiceContext.ContentTypeService) .As() .Setup(x => x.Get(_contentTypeForMockedContent.Id)) .Returns(_contentTypeForMockedContent); @@ -251,9 +252,9 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async Task PostSave_Validate_Existing_Content() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); + var contentServiceMock = Mock.Get(ServiceContext.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => null); //do not find it var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); @@ -268,9 +269,9 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, ShortStringHelper, - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance()); return controller; } @@ -291,7 +292,7 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async Task PostSave_Validate_At_Least_One_Variant_Flagged_For_Saving() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); var controller = new ContentController( @@ -304,9 +305,9 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, ShortStringHelper, - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance()); return controller; } @@ -332,9 +333,9 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async Task PostSave_Validate_Properties_Exist() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); + var contentServiceMock = Mock.Get(ServiceContext.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => GetMockedContent()); var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); @@ -348,9 +349,9 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, ShortStringHelper, - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance()); return controller; } @@ -379,9 +380,9 @@ namespace Umbraco.Tests.Web.Controllers { var content = GetMockedContent(); - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); + var contentServiceMock = Mock.Get(ServiceContext.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content); contentServiceMock.Setup(x => x.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success @@ -397,9 +398,9 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, ShortStringHelper, - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance()); return controller; } @@ -420,9 +421,9 @@ namespace Umbraco.Tests.Web.Controllers { var content = GetMockedContent(); - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); + var contentServiceMock = Mock.Get(ServiceContext.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content); contentServiceMock.Setup(x => x.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success @@ -438,9 +439,10 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, ShortStringHelper, - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance() + ); return controller; } @@ -467,9 +469,9 @@ namespace Umbraco.Tests.Web.Controllers { var content = GetMockedContent(); - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); + var contentServiceMock = Mock.Get(ServiceContext.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content); contentServiceMock.Setup(x => x.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success @@ -485,9 +487,10 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, ShortStringHelper, - Factory.GetInstance()); + Factory.GetInstance(), + Factory.GetInstance() + ); return controller; } diff --git a/src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs b/src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs index b0665bbfc1..23131b04e6 100644 --- a/src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs @@ -54,7 +54,7 @@ namespace Umbraco.Tests.Web.Controllers public class Plugin1Controller : PluginController { public Plugin1Controller(IUmbracoContextAccessor umbracoContextAccessor) - : base(umbracoContextAccessor, null, null, null, null, null, null) + : base(umbracoContextAccessor, null, null, null, null, null) { } } @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Web.Controllers public class Plugin2Controller : PluginController { public Plugin2Controller(IUmbracoContextAccessor umbracoContextAccessor) - : base(umbracoContextAccessor, null, null, null, null, null, null) + : base(umbracoContextAccessor, null, null, null, null, null) { } } @@ -72,7 +72,7 @@ namespace Umbraco.Tests.Web.Controllers public class Plugin3Controller : PluginController { public Plugin3Controller(IUmbracoContextAccessor umbracoContextAccessor) - : base(umbracoContextAccessor, null, null, null, null, null, null) + : base(umbracoContextAccessor, null, null, null, null, null) { } } @@ -80,7 +80,7 @@ namespace Umbraco.Tests.Web.Controllers public class Plugin4Controller : PluginController { public Plugin4Controller(IUmbracoContextAccessor umbracoContextAccessor) - : base(umbracoContextAccessor, null, null, null, null, null, null) + : base(umbracoContextAccessor, null, null, null, null, null) { } } diff --git a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs index 0dec6560b8..d914ef2c39 100644 --- a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs @@ -36,6 +36,7 @@ using Umbraco.Web.Models.ContentEditing; using IUser = Umbraco.Core.Models.Membership.IUser; using Umbraco.Core.Mapping; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Web.Routing; namespace Umbraco.Tests.Web.Controllers { @@ -61,9 +62,9 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async System.Threading.Tasks.Task Save_User() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { - var userServiceMock = Mock.Get(Current.Services.UserService); + var userServiceMock = Mock.Get(ServiceContext.UserService); userServiceMock.Setup(service => service.Save(It.IsAny(), It.IsAny())) .Callback((IUser u, bool raiseEvents) => @@ -85,13 +86,14 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, Factory.GetInstance(), ShortStringHelper, Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance() + Factory.GetInstance(), + Factory.GetInstance() + ); return usersController; } @@ -146,7 +148,7 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async System.Threading.Tasks.Task GetPagedUsers_Empty() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { var usersController = new UsersController( Factory.GetInstance(), @@ -156,14 +158,14 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, Factory.GetInstance(), ShortStringHelper, Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance() - ); + Factory.GetInstance(), + Factory.GetInstance() + ); return usersController; } @@ -179,10 +181,10 @@ namespace Umbraco.Tests.Web.Controllers [Test] public async System.Threading.Tasks.Task GetPagedUsers_10() { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { //setup some mocks - var userServiceMock = Mock.Get(Current.Services.UserService); + var userServiceMock = Mock.Get(ServiceContext.UserService); var users = MockedUser.CreateMulipleUsers(10); long outVal = 10; userServiceMock.Setup(service => service.GetAll( @@ -198,13 +200,13 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, Factory.GetInstance(), ShortStringHelper, Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance() + Factory.GetInstance(), + Factory.GetInstance() ); return usersController; } @@ -261,10 +263,10 @@ namespace Umbraco.Tests.Web.Controllers Action> verification, object routeDefaults = null, string url = null) { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper) + ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) { //setup some mocks - var userServiceMock = Mock.Get(Current.Services.UserService); + var userServiceMock = Mock.Get(ServiceContext.UserService); userServiceSetup(userServiceMock); var usersController = new UsersController( @@ -275,13 +277,13 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper, Factory.GetInstance(), ShortStringHelper, Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - Factory.GetInstance() + Factory.GetInstance(), + Factory.GetInstance() ); return usersController; } diff --git a/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs index 2daa8e9a98..bdd7c6eb93 100644 --- a/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs @@ -63,20 +63,21 @@ namespace Umbraco.Tests.Web.Mvc var globalSettings = TestObjects.GetGlobalSettings(); var attr = new RenderIndexActionSelectorAttribute(); var req = new RequestContext(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbCtx); @@ -94,20 +95,21 @@ namespace Umbraco.Tests.Web.Mvc var globalSettings = TestObjects.GetGlobalSettings(); var attr = new RenderIndexActionSelectorAttribute(); var req = new RequestContext(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbCtx); @@ -125,20 +127,21 @@ namespace Umbraco.Tests.Web.Mvc var globalSettings = TestObjects.GetGlobalSettings(); var attr = new RenderIndexActionSelectorAttribute(); var req = new RequestContext(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbCtx); @@ -156,20 +159,21 @@ namespace Umbraco.Tests.Web.Mvc var globalSettings = TestObjects.GetGlobalSettings(); var attr = new RenderIndexActionSelectorAttribute(); var req = new RequestContext(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - TestHelper.IOHelper); + TestHelper.IOHelper, + TestHelper.UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbCtx); diff --git a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs index c54192f869..73d447d3b2 100644 --- a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs @@ -1,13 +1,12 @@ using System; -using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.Security; using Moq; using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.Cache; -using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Dictionary; using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; @@ -18,7 +17,6 @@ using Umbraco.Tests.Testing.Objects.Accessors; using Umbraco.Web; using Umbraco.Web.Mvc; using Umbraco.Web.PublishedCache; -using Umbraco.Web.Routing; using Umbraco.Web.Security; using Umbraco.Web.Security.Providers; using Current = Umbraco.Web.Composing.Current; @@ -29,6 +27,7 @@ namespace Umbraco.Tests.Web.Mvc [UmbracoTest(WithApplication = true)] public class SurfaceControllerTests : UmbracoTestBase { + public override void SetUp() { base.SetUp(); @@ -39,25 +38,26 @@ namespace Umbraco.Tests.Web.Mvc public void Can_Construct_And_Get_Result() { var globalSettings = TestObjects.GetGlobalSettings(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - IOHelper); + IOHelper, + UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); - var ctrl = new TestSurfaceController(umbracoContextAccessor); + var ctrl = new TestSurfaceController(umbracoContextAccessor, Mock.Of()); var result = ctrl.Index(); @@ -68,25 +68,26 @@ namespace Umbraco.Tests.Web.Mvc public void Umbraco_Context_Not_Null() { var globalSettings = TestObjects.GetGlobalSettings(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - TestObjects.GetUmbracoSettings(), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - IOHelper); + IOHelper, + UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbCtx = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbCtx); - var ctrl = new TestSurfaceController(umbracoContextAccessor); + var ctrl = new TestSurfaceController(umbracoContextAccessor, Mock.Of()); Assert.IsNotNull(ctrl.UmbracoContext); } @@ -100,33 +101,28 @@ namespace Umbraco.Tests.Web.Mvc content.Setup(x => x.Id).Returns(2); var publishedSnapshotService = new Mock(); var globalSettings = TestObjects.GetGlobalSettings(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, publishedSnapshotService.Object, new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - Mock.Of(section => section.WebRouting == Mock.Of(routingSection => routingSection.UrlProviderMode == "Auto")), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - IOHelper); + IOHelper, + UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); - var helper = new UmbracoHelper( - content.Object, - Mock.Of(), - Mock.Of(), - Mock.Of(), - Mock.Of(query => query.Content(2) == content.Object), - new MembershipHelper(umbracoContext.HttpContext, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), AppCaches.Disabled, Mock.Of(), ShortStringHelper, Mock.Of())); + var publishedContentQuery = Mock.Of(query => query.Content(2) == content.Object); - var ctrl = new TestSurfaceController(umbracoContextAccessor, helper); + var ctrl = new TestSurfaceController(umbracoContextAccessor,publishedContentQuery); var result = ctrl.GetContent(2) as PublishedContentResult; Assert.IsNotNull(result); @@ -137,29 +133,29 @@ namespace Umbraco.Tests.Web.Mvc [Test] public void Mock_Current_Page() { - var webRoutingSettings = Mock.Of(section => section.UrlProviderMode == "Auto"); var globalSettings = TestObjects.GetGlobalSettings(); + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); var umbracoContextFactory = new UmbracoContextFactory( Current.UmbracoContextAccessor, Mock.Of(), new TestVariationContextAccessor(), new TestDefaultCultureAccessor(), - Mock.Of(section => section.WebRouting == webRoutingSettings), globalSettings, - new UrlProviderCollection(Enumerable.Empty()), - new MediaUrlProviderCollection(Enumerable.Empty()), Mock.Of(), - IOHelper); + IOHelper, + UriUtility, + httpContextAccessor, + new AspNetCookieManager(httpContextAccessor)); - var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(Mock.Of()); + var umbracoContextReference = umbracoContextFactory.EnsureUmbracoContext(); var umbracoContext = umbracoContextReference.UmbracoContext; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var content = Mock.Of(publishedContent => publishedContent.Id == 12345); - var contextBase = umbracoContext.HttpContext; + var publishedRouter = BaseWebTest.CreatePublishedRouter(TestObjects.GetUmbracoSettings().WebRouting); var frequest = publishedRouter.CreateRequest(umbracoContext, new Uri("http://localhost/test")); frequest.PublishedContent = content; @@ -172,8 +168,8 @@ namespace Umbraco.Tests.Web.Mvc var routeData = new RouteData(); routeData.DataTokens.Add(Core.Constants.Web.UmbracoRouteDefinitionDataToken, routeDefinition); - var ctrl = new TestSurfaceController(umbracoContextAccessor, new UmbracoHelper()); - ctrl.ControllerContext = new ControllerContext(contextBase, routeData, ctrl); + var ctrl = new TestSurfaceController(umbracoContextAccessor, Mock.Of()); + ctrl.ControllerContext = new ControllerContext(Mock.Of(), routeData, ctrl); var result = ctrl.GetContentFromCurrentPage() as PublishedContentResult; @@ -182,9 +178,12 @@ namespace Umbraco.Tests.Web.Mvc public class TestSurfaceController : SurfaceController { - public TestSurfaceController(IUmbracoContextAccessor umbracoContextAccessor, UmbracoHelper helper = null) - : base(umbracoContextAccessor, null, ServiceContext.CreatePartial(), AppCaches.Disabled, null, null, helper) + private readonly IPublishedContentQuery _publishedContentQuery; + + public TestSurfaceController(IUmbracoContextAccessor umbracoContextAccessor, IPublishedContentQuery publishedContentQuery) + : base(umbracoContextAccessor, null, ServiceContext.CreatePartial(), AppCaches.Disabled, null, null) { + _publishedContentQuery = publishedContentQuery; } public ActionResult Index() @@ -195,7 +194,7 @@ namespace Umbraco.Tests.Web.Mvc public ActionResult GetContent(int id) { - var content = Umbraco.Content(id); + var content = _publishedContentQuery.Content(id); return new PublishedContentResult(content); } diff --git a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index 942666c7b0..bc2b896b49 100644 --- a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -404,7 +404,7 @@ namespace Umbraco.Tests.Web.Mvc return context; } - protected UmbracoContext GetUmbracoContext(ILogger logger, IUmbracoSettingsSection umbracoSettings, string url, int templateId, RouteData routeData = null, bool setSingleton = false) + protected IUmbracoContext GetUmbracoContext(ILogger logger, IUmbracoSettingsSection umbracoSettings, string url, int templateId, RouteData routeData = null, bool setSingleton = false) { var svcCtx = GetServiceContext(); @@ -435,18 +435,18 @@ namespace Umbraco.Tests.Web.Mvc var http = GetHttpContextFactory(url, routeData).HttpContext; + var httpContextAccessor = TestHelper.GetHttpContextAccessor(http); var globalSettings = TestObjects.GetGlobalSettings(); var ctx = new UmbracoContext( - http, + httpContextAccessor, _service, - new WebSecurity(http, Current.Services.UserService, globalSettings, IOHelper), - TestObjects.GetUmbracoSettings(), - Enumerable.Empty(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, ServiceContext.UserService, globalSettings, IOHelper), globalSettings, new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); //if (setSingleton) //{ diff --git a/src/Umbraco.Tests/Web/UmbracoHelperTests.cs b/src/Umbraco.Tests/Web/UmbracoHelperTests.cs index ccb42e478a..b479961896 100644 --- a/src/Umbraco.Tests/Web/UmbracoHelperTests.cs +++ b/src/Umbraco.Tests/Web/UmbracoHelperTests.cs @@ -24,234 +24,6 @@ namespace Umbraco.Tests.Web Current.Reset(); } - - - // ------- Int32 conversion tests - [Test] - public static void Converting_Boxed_34_To_An_Int_Returns_34() - { - // Arrange - const int sample = 34; - - // Act - bool success = UmbracoHelper.ConvertIdObjectToInt( - sample, - out int result - ); - - // Assert - Assert.IsTrue(success); - Assert.That(result, Is.EqualTo(34)); - } - - [Test] - public static void Converting_String_54_To_An_Int_Returns_54() - { - // Arrange - const string sample = "54"; - - // Act - bool success = UmbracoHelper.ConvertIdObjectToInt( - sample, - out int result - ); - - // Assert - Assert.IsTrue(success); - Assert.That(result, Is.EqualTo(54)); - } - - [Test] - public static void Converting_Hello_To_An_Int_Returns_False() - { - // Arrange - const string sample = "Hello"; - - // Act - bool success = UmbracoHelper.ConvertIdObjectToInt( - sample, - out int result - ); - - // Assert - Assert.IsFalse(success); - Assert.That(result, Is.EqualTo(0)); - } - - [Test] - public static void Converting_Unsupported_Object_To_An_Int_Returns_False() - { - // Arrange - var clearlyWillNotConvertToInt = new StringBuilder(0); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToInt( - clearlyWillNotConvertToInt, - out int result - ); - - // Assert - Assert.IsFalse(success); - Assert.That(result, Is.EqualTo(0)); - } - - // ------- GUID conversion tests - [Test] - public static void Converting_Boxed_Guid_To_A_Guid_Returns_Original_Guid_Value() - { - // Arrange - Guid sample = Guid.NewGuid(); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToGuid( - sample, - out Guid result - ); - - // Assert - Assert.IsTrue(success); - Assert.That(result, Is.EqualTo(sample)); - } - - [Test] - public static void Converting_String_Guid_To_A_Guid_Returns_Original_Guid_Value() - { - // Arrange - Guid sample = Guid.NewGuid(); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToGuid( - sample.ToString(), - out Guid result - ); - - // Assert - Assert.IsTrue(success); - Assert.That(result, Is.EqualTo(sample)); - } - - [Test] - public static void Converting_Hello_To_A_Guid_Returns_False() - { - // Arrange - const string sample = "Hello"; - - // Act - bool success = UmbracoHelper.ConvertIdObjectToGuid( - sample, - out Guid result - ); - - // Assert - Assert.IsFalse(success); - Assert.That(result, Is.EqualTo(new Guid("00000000-0000-0000-0000-000000000000"))); - } - - [Test] - public static void Converting_Unsupported_Object_To_A_Guid_Returns_False() - { - // Arrange - var clearlyWillNotConvertToGuid = new StringBuilder(0); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToGuid( - clearlyWillNotConvertToGuid, - out Guid result - ); - - // Assert - Assert.IsFalse(success); - Assert.That(result, Is.EqualTo(new Guid("00000000-0000-0000-0000-000000000000"))); - } - - // ------- UDI Conversion Tests - /// - /// This requires PluginManager.Current to be initialised before running. - /// - [Test] - public static void Converting_Boxed_Udi_To_A_Udi_Returns_Original_Udi_Value() - { - // Arrange - UdiParser.ResetUdiTypes(); - Udi sample = new GuidUdi(Constants.UdiEntityType.AnyGuid, Guid.NewGuid()); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToUdi( - sample, - out Udi result - ); - - // Assert - Assert.IsTrue(success); - Assert.That(result, Is.EqualTo(sample)); - } - - /// - /// This requires PluginManager.Current to be initialised before running. - /// - [Test] - public void Converting_String_Udi_To_A_Udi_Returns_Original_Udi_Value() - { - // Arrange - SetUpDependencyContainer(); - UdiParser.ResetUdiTypes(); - Udi sample = new GuidUdi(Constants.UdiEntityType.AnyGuid, Guid.NewGuid()); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToUdi( - sample.ToString(), - out Udi result - ); - - // Assert - Assert.IsTrue(success, "Conversion of UDI failed."); - Assert.That(result, Is.EqualTo(sample)); - } - - /// - /// This requires PluginManager.Current to be initialised before running. - /// - [Test] - public void Converting_Hello_To_A_Udi_Returns_False() - { - // Arrange - SetUpDependencyContainer(); - UdiParser.ResetUdiTypes(); - const string sample = "Hello"; - - // Act - bool success = UmbracoHelper.ConvertIdObjectToUdi( - sample, - out Udi result - ); - - // Assert - Assert.IsFalse(success); - Assert.That(result, Is.Null); - } - - /// - /// This requires PluginManager.Current to be initialised before running. - /// - [Test] - public static void Converting_Unsupported_Object_To_A_Udi_Returns_False() - { - // Arrange - UdiParser.ResetUdiTypes(); - - var clearlyWillNotConvertToGuid = new StringBuilder(0); - - // Act - bool success = UmbracoHelper.ConvertIdObjectToUdi( - clearlyWillNotConvertToGuid, - out Udi result - ); - - // Assert - Assert.IsFalse(success); - Assert.That(result, Is.Null); - } - private void SetUpDependencyContainer() { // FIXME: bad in a unit test - but Udi has a static ctor that wants it?! diff --git a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs index cb125fa851..08cd84744b 100644 --- a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs +++ b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs @@ -7,6 +7,7 @@ using System.Web.Routing; using Moq; using NUnit.Framework; using Umbraco.Core.Services; +using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Tests.Testing; using Umbraco.Tests.Testing.Objects.Accessors; @@ -26,16 +27,17 @@ namespace Umbraco.Tests.Web [Test] public void RouteDataExtensions_GetUmbracoContext() { + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); + var umbCtx = new UmbracoContext( - Mock.Of(), + httpContextAccessor, Mock.Of(), - new WebSecurity(Mock.Of(), Current.Services.UserService, TestObjects.GetGlobalSettings(), IOHelper), - TestObjects.GetUmbracoSettings(), - new List(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, ServiceContext.UserService, TestObjects.GetGlobalSettings(), IOHelper), TestObjects.GetGlobalSettings(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); var r1 = new RouteData(); r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); @@ -46,16 +48,17 @@ namespace Umbraco.Tests.Web [Test] public void ControllerContextExtensions_GetUmbracoContext_From_RouteValues() { + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); + var umbCtx = new UmbracoContext( - Mock.Of(), + httpContextAccessor, Mock.Of(), - new WebSecurity(Mock.Of(), Current.Services.UserService, TestObjects.GetGlobalSettings(), IOHelper), - TestObjects.GetUmbracoSettings(), - new List(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, ServiceContext.UserService, TestObjects.GetGlobalSettings(), IOHelper), TestObjects.GetGlobalSettings(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); var r1 = new RouteData(); r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); @@ -76,16 +79,17 @@ namespace Umbraco.Tests.Web [Test] public void ControllerContextExtensions_GetUmbracoContext_From_Current() { + var httpContextAccessor = TestHelper.GetHttpContextAccessor(); + var umbCtx = new UmbracoContext( - Mock.Of(), + httpContextAccessor, Mock.Of(), - new WebSecurity(Mock.Of(), Current.Services.UserService, TestObjects.GetGlobalSettings(), IOHelper), - TestObjects.GetUmbracoSettings(), - new List(), - Enumerable.Empty(), + new WebSecurity(httpContextAccessor, ServiceContext.UserService, TestObjects.GetGlobalSettings(), IOHelper), TestObjects.GetGlobalSettings(), new TestVariationContextAccessor(), - IOHelper); + IOHelper, + UriUtility, + new AspNetCookieManager(httpContextAccessor)); var httpContext = Mock.Of(); diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreBackOfficeInfo.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreBackOfficeInfo.cs new file mode 100644 index 0000000000..ba12b64dfe --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreBackOfficeInfo.cs @@ -0,0 +1,16 @@ +using Umbraco.Core; +using Umbraco.Core.Configuration; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + public class AspNetCoreBackOfficeInfo : IBackOfficeInfo + { + public AspNetCoreBackOfficeInfo(IGlobalSettings globalSettings) + { + GetAbsoluteUrl = globalSettings.UmbracoPath; + } + + public string GetAbsoluteUrl { get; } + + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreHostingEnvironment.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreHostingEnvironment.cs new file mode 100644 index 0000000000..5cd2b590c8 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreHostingEnvironment.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Threading; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Hosting; +using Umbraco.Core; +using Umbraco.Core.Configuration; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + public class AspNetCoreHostingEnvironment : Umbraco.Core.Hosting.IHostingEnvironment + { + private readonly ConcurrentDictionary _registeredObjects = + new ConcurrentDictionary(); + + private readonly IHostingSettings _hostingSettings; + private readonly IWebHostEnvironment _webHostEnvironment; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly IHostApplicationLifetime _hostApplicationLifetime; + private string _localTempPath; + + public AspNetCoreHostingEnvironment(IHostingSettings hostingSettings, IWebHostEnvironment webHostEnvironment, IHttpContextAccessor httpContextAccessor, IHostApplicationLifetime hostHostApplicationLifetime) + { + _hostingSettings = hostingSettings ?? throw new ArgumentNullException(nameof(hostingSettings)); + _webHostEnvironment = webHostEnvironment; + _httpContextAccessor = httpContextAccessor; + _hostApplicationLifetime = hostHostApplicationLifetime; + + SiteName = webHostEnvironment.ApplicationName; + ApplicationId = AppDomain.CurrentDomain.Id.ToString(); + ApplicationPhysicalPath = webHostEnvironment.ContentRootPath; + + ApplicationVirtualPath = "/"; //TODO how to find this, This is a server thing, not application thing. + IISVersion = new Version(0, 0); // TODO not necessary IIS + IsDebugMode = _hostingSettings.DebugMode; + } + public bool IsHosted { get; } = true; + public string SiteName { get; } + public string ApplicationId { get; } + public string ApplicationPhysicalPath { get; } + + public string ApplicationVirtualPath { get; } + public bool IsDebugMode { get; } + + public Version IISVersion { get; } + public string LocalTempPath + { + get + { + if (_localTempPath != null) + return _localTempPath; + + switch (_hostingSettings.LocalTempStorageLocation) + { + case LocalTempStorage.AspNetTemp: + return _localTempPath = System.IO.Path.Combine(Path.GetTempPath(),ApplicationId, "UmbracoData"); + + case LocalTempStorage.EnvironmentTemp: + + // environment temp is unique, we need a folder per site + + // use a hash + // combine site name and application id + // site name is a Guid on Cloud + // application id is eg /LM/W3SVC/123456/ROOT + // the combination is unique on one server + // and, if a site moves from worker A to B and then back to A... + // hopefully it gets a new Guid or new application id? + + var hashString = SiteName + "::" + ApplicationId; + var hash = hashString.GenerateHash(); + var siteTemp = System.IO.Path.Combine(Environment.ExpandEnvironmentVariables("%temp%"), "UmbracoData", hash); + + return _localTempPath = siteTemp; + + //case LocalTempStorage.Default: + //case LocalTempStorage.Unknown: + default: + return _localTempPath = MapPath("~/App_Data/TEMP"); + } + } + } + + + public string MapPath(string path) => Path.Combine(_webHostEnvironment.WebRootPath, path); + + public string ToAbsolute(string virtualPath, string root) + { + if (Uri.TryCreate(virtualPath, UriKind.Absolute, out _)) + { + return virtualPath; + } + + var segment = new PathString(virtualPath.Substring(1)); + var applicationPath = _httpContextAccessor.HttpContext.Request.PathBase; + + return applicationPath.Add(segment).Value; + } + + public void RegisterObject(IRegisteredObject registeredObject) + { + var wrapped = new RegisteredObjectWrapper(registeredObject); + if (!_registeredObjects.TryAdd(registeredObject, wrapped)) + { + throw new InvalidOperationException("Could not register object"); + } + + var cancellationTokenRegistration = _hostApplicationLifetime.ApplicationStopping.Register(() => wrapped.Stop(true)); + wrapped.CancellationTokenRegistration = cancellationTokenRegistration; + } + + public void UnregisterObject(IRegisteredObject registeredObject) + { + if (_registeredObjects.TryGetValue(registeredObject, out var wrapped)) + { + wrapped.CancellationTokenRegistration.Unregister(); + } + } + + + private class RegisteredObjectWrapper + { + private readonly IRegisteredObject _inner; + + public RegisteredObjectWrapper(IRegisteredObject inner) + { + _inner = inner; + } + + public CancellationTokenRegistration CancellationTokenRegistration { get; set; } + + public void Stop(bool immediate) + { + _inner.Stop(immediate); + } + } + } + + +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreHttpContextAccessor.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreHttpContextAccessor.cs new file mode 100644 index 0000000000..696005f2fb --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreHttpContextAccessor.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Http; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + internal class AspNetCoreHttpContextAccessor //: IHttpContextAccessor + { + private readonly IHttpContextAccessor _httpContextAccessor; + + public AspNetCoreHttpContextAccessor(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public HttpContext HttpContext => _httpContextAccessor.HttpContext; + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreIpResolver.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreIpResolver.cs new file mode 100644 index 0000000000..8f231191f2 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreIpResolver.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Http; +using Umbraco.Net; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + internal class AspNetIpResolver : IIpResolver + { + private readonly IHttpContextAccessor _httpContextAccessor; + + public AspNetIpResolver(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public string GetCurrentRequestIpAddress() => _httpContextAccessor?.HttpContext?.Connection?.RemoteIpAddress?.ToString() ?? string.Empty; + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreMarchal.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreMarchal.cs new file mode 100644 index 0000000000..98e040d338 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreMarchal.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.InteropServices; +using Umbraco.Core.Diagnostics; + +namespace Umbraco.Web.BackOffice +{ + + public class AspNetCoreMarchal : IMarchal + { + // This thing is not available in net standard, but exists in both .Net 4 and .Net Core 3 + public IntPtr GetExceptionPointers() => Marshal.GetExceptionPointers(); + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreSessionIdResolver.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreSessionIdResolver.cs new file mode 100644 index 0000000000..5470516cf7 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreSessionIdResolver.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Http; +using Umbraco.Net; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + internal class AspNetCoreSessionIdResolver : ISessionIdResolver + { + private readonly IHttpContextAccessor _httpContextAccessor; + + public AspNetCoreSessionIdResolver(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public string SessionId => _httpContextAccessor?.HttpContext.Session?.Id; + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreUmbracoApplicationLifetime.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreUmbracoApplicationLifetime.cs new file mode 100644 index 0000000000..20cfef352d --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreUmbracoApplicationLifetime.cs @@ -0,0 +1,36 @@ +using System.Threading; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Hosting; +using Umbraco.Net; + +namespace Umbraco.Web.AspNet +{ + public class AspNetCoreUmbracoApplicationLifetime : IUmbracoApplicationLifetime + { + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly IHostApplicationLifetime _hostApplicationLifetime; + + public AspNetCoreUmbracoApplicationLifetime(IHttpContextAccessor httpContextAccessor, IHostApplicationLifetime hostApplicationLifetime) + { + _httpContextAccessor = httpContextAccessor; + _hostApplicationLifetime = hostApplicationLifetime; + } + + public bool IsRestarting { get; set; } + public void Restart() + { + IsRestarting = true; + + var httpContext = _httpContextAccessor.HttpContext; + if (httpContext != null) + { + // unload app domain - we must null out all identities otherwise we get serialization errors + // http://www.zpqrtbnk.net/posts/custom-iidentity-serialization-issue + httpContext.User = null; + } + + Thread.CurrentPrincipal = null; + _hostApplicationLifetime.StopApplication(); + } + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreUserAgentProvider.cs b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreUserAgentProvider.cs new file mode 100644 index 0000000000..f9c9884704 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/AspNetCoreUserAgentProvider.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Http; +using Umbraco.Net; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + public class AspNetCoreUserAgentProvider : IUserAgentProvider + { + private readonly IHttpContextAccessor _httpContextAccessor; + + public AspNetCoreUserAgentProvider(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public string GetUserAgent() + { + return _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString(); + } + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/UmbracoBackOfficeApplicationBuilderExtensions.cs b/src/Umbraco.Web.BackOffice/AspNetCore/UmbracoBackOfficeApplicationBuilderExtensions.cs new file mode 100644 index 0000000000..1f06a818d6 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/UmbracoBackOfficeApplicationBuilderExtensions.cs @@ -0,0 +1,18 @@ +using System; +using Microsoft.AspNetCore.Builder; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + public static class UmbracoBackOfficeApplicationBuilderExtensions + { + public static IApplicationBuilder UseUmbracoBackOffice(this IApplicationBuilder app) + { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + return app; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/AspNetCore/UmbracoBackOfficeServiceCollectionExtensions.cs b/src/Umbraco.Web.BackOffice/AspNetCore/UmbracoBackOfficeServiceCollectionExtensions.cs new file mode 100644 index 0000000000..2d12ad3093 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/AspNetCore/UmbracoBackOfficeServiceCollectionExtensions.cs @@ -0,0 +1,55 @@ +using System.Configuration; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Umbraco.Composing; +using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Logging.Serilog; +using Umbraco.Core.Runtime; + +namespace Umbraco.Web.BackOffice.AspNetCore +{ + public static class UmbracoBackOfficeServiceCollectionExtensions + { + public static IServiceCollection AddUmbracoBackOffice(this IServiceCollection services) + { + + + services.AddSingleton(); + + CreateCompositionRoot(services); + + return services; + } + + + private static void CreateCompositionRoot(IServiceCollection services) + { + var serviceProvider = services.BuildServiceProvider(); + + var httpContextAccessor = serviceProvider.GetService(); + var webHostEnvironment = serviceProvider.GetService(); + var hostApplicationLifetime = serviceProvider.GetService(); + + var configFactory = new ConfigsFactory(); + + var hostingSettings = configFactory.HostingSettings; + var coreDebug = configFactory.CoreDebug; + + var hostingEnvironment = new AspNetCoreHostingEnvironment(hostingSettings, webHostEnvironment, httpContextAccessor, hostApplicationLifetime); + var ioHelper = new IOHelper(hostingEnvironment); + var configs = configFactory.Create(ioHelper); + + var logger = SerilogLogger.CreateWithDefaultConfiguration(hostingEnvironment, new AspNetCoreSessionIdResolver(httpContextAccessor), () => services.BuildServiceProvider().GetService(), coreDebug, ioHelper, new AspNetCoreMarchal()); + var backOfficeInfo = new AspNetCoreBackOfficeInfo(configs.Global()); + var profiler = new LogProfiler(logger); + + Current.Initialize(logger, configs, ioHelper, hostingEnvironment, backOfficeInfo, profiler); + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Compose/BackOfficeComponent.cs b/src/Umbraco.Web.BackOffice/Compose/BackOfficeComponent.cs deleted file mode 100644 index 53dd8c2327..0000000000 --- a/src/Umbraco.Web.BackOffice/Compose/BackOfficeComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Umbraco.Core.Composing; - -namespace Umbraco.Web.Runtime -{ - public sealed class BackOfficeComponent : IComponent - { - public BackOfficeComponent() - { - - } - - public void Initialize() - { - - } - - public void Terminate() - { - - } - - } -} diff --git a/src/Umbraco.Web.BackOffice/Compose/BackOfficeComposer.cs b/src/Umbraco.Web.BackOffice/Compose/BackOfficeComposer.cs deleted file mode 100644 index 5ccb96ea71..0000000000 --- a/src/Umbraco.Web.BackOffice/Compose/BackOfficeComposer.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Umbraco.Core; -using Umbraco.Core.Composing; -using Umbraco.Core.Dashboards; -using Umbraco.Core.Runtime; -using Umbraco.Web.Services; - -namespace Umbraco.Web.Runtime -{ - // web's initial composer composes after core's, and before all core composers - [ComposeAfter(typeof(CoreInitialComposer))] - [ComposeBefore(typeof(ICoreComposer))] - public sealed class BackOfficeComposer : ComponentComposer - { - public override void Compose(Composition composition) - { - base.Compose(composition); - - composition.RegisterUnique(); - - // register core CMS dashboards and 3rd party types - will be ordered by weight attribute & merged with package.manifest dashboards - composition.Dashboards() - .Add(composition.TypeLoader.GetTypes()); - } - } -} - diff --git a/src/Umbraco.Web.BackOffice/CompositionExtensions.cs b/src/Umbraco.Web.BackOffice/CompositionExtensions.cs deleted file mode 100644 index eaf75bd7e5..0000000000 --- a/src/Umbraco.Web.BackOffice/CompositionExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Umbraco.Core.Composing; -using Umbraco.Web.Dashboards; - -// ReSharper disable once CheckNamespace -namespace Umbraco.Web -{ - /// - /// Provides extension methods to the class. - /// - public static class WebCompositionExtensions - { - #region Collection Builders - - /// - /// Gets the backoffice dashboards collection builder. - /// - /// The composition. - public static DashboardCollectionBuilder Dashboards(this Composition composition) - => composition.WithCollectionBuilder(); - - #endregion - - } -} diff --git a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj index 06939a3266..36238f1a6d 100644 --- a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj +++ b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj @@ -1,12 +1,19 @@  - netstandard2.0 + netcoreapp3.1 + Library + 8 - - + + + + + + + diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 1889e4b032..42a89c5d13 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1109,9 +1109,9 @@ "integrity": "sha512-kU/fHIGf2a4a3bH7E1tzALTHk+QfoUSCK9fEcMFisd6ZWvNDwPzXWAilItqOC3EDiAXPmGHaNc9/aXiD9xrAxQ==" }, "angular-aria": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.5.tgz", - "integrity": "sha512-X2dGRw+PK7hrV7/X1Ns4e5P3KC/OBFi1l7z//D/v7zbZObsAx48qBoX7unsck+s4+mnO+ikNNkHG5N49VfAyRw==" + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.9.tgz", + "integrity": "sha512-luI3Jemd1AbOQW0krdzfEG3fM0IFtLY0bSSqIDEx3POE0XjKIC1MkrO8Csyq9PPgueLphyAPofzUwZ8YeZ88SA==" }, "angular-chart.js": { "version": "1.1.1", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 508409b4ea..c150af79de 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -13,7 +13,7 @@ "ace-builds": "1.4.2", "angular": "1.7.9", "angular-animate": "1.7.5", - "angular-aria": "1.7.5", + "angular-aria": "1.7.9", "angular-chart.js": "^1.1.1", "angular-cookies": "1.7.5", "angular-dynamic-locale": "0.1.37", diff --git a/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg b/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg index 6c0515906f..75bf0d52af 100644 Binary files a/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg and b/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg differ diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsections.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsections.directive.js index b8ee797c82..a33796ab6d 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsections.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsections.directive.js @@ -133,6 +133,17 @@ function sectionsDirective($timeout, $window, navigationService, treeService, se } }; + scope.currentSectionInOverflow = function () { + if (scope.overflowingSections === 0) { + return false; + } + + var currentSection = scope.sections.filter(s => s.alias === scope.currentSection); + + return (scope.sections.indexOf(currentSection[0]) >= scope.maxSections); + + }; + loadSections(); } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbtour/umbtourstep.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbtour/umbtourstep.directive.js index 2dc0ebdf93..381ecc76c3 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbtour/umbtourstep.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbtour/umbtourstep.directive.js @@ -18,9 +18,9 @@ function link(scope, element, attrs, ctrl) { - scope.close = function() { - if(scope.onClose) { - scope.onClose(); + scope.close = function () { + if (scope.onClose) { + scope.onClose(); } } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 7429f60e0d..91b0ba8754 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -42,7 +42,7 @@ $scope.page.isNew = Object.toBoolean(newVal); //We fetch all ancestors of the node to generate the footer breadcrumb navigation - if (content.parentId && content.parentId !== -1) { + if (content.parentId && content.parentId !== -1 && content.parentId !== -20) { loadBreadcrumb(); if (!watchingCulture) { $scope.$watch('culture', @@ -287,6 +287,8 @@ $scope.page.showSaveButton = true; // add ellipsis to the save button if it opens the variant overlay $scope.page.saveButtonEllipsis = content.variants && content.variants.length > 1 ? "true" : "false"; + } else { + $scope.page.showSaveButton = false; } // create the pubish combo button diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js index 0ed1b12000..95b2a520d1 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js @@ -328,6 +328,9 @@ // invariant nodes scope.currentUrls = scope.node.urls; } + + // figure out if multiple cultures apply across the content urls + scope.currentUrlsHaveMultipleCultures = _.keys(_.groupBy(scope.currentUrls, url => url.culture)).length > 1; } // load audit trail and redirects when on the info tab diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js index d562b21d52..9a9d6d4a76 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js @@ -71,6 +71,7 @@ templateUrl: 'views/components/forms/umb-checkbox.html', controller: UmbCheckboxController, controllerAs: 'vm', + transclude: true, bindings: { model: "=", inputId: "@", diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js index 7ed84547f1..d79140f947 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js @@ -69,6 +69,7 @@ templateUrl: 'views/components/forms/umb-radiobutton.html', controller: UmbRadiobuttonController, controllerAs: 'vm', + transclude: true, bindings: { model: "=", inputId: "@", diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js index a33fd4be53..96ce8735eb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js @@ -99,13 +99,18 @@ Use this directive to render a ui component for selecting child items to a paren @param {string} parentName (binding): The parent name. @param {string} parentIcon (binding): The parent icon. @param {number} parentId (binding): The parent id. -@param {callback} onRemove (binding): Callback when the remove button is clicked on an item. +@param {callback} onRemove (binding): Callback when removing an item.

The callback returns:

  • child: The selected item.
  • $index: The selected item index.
-@param {callback} onAdd (binding): Callback when the add button is clicked. +@param {callback} onAdd (binding): Callback when adding an item. +

The callback returns:

+
    +
  • $event: The select event.
  • +
+@param {callback} onSort (binding): Callback when sorting an item.

The callback returns:

  • $event: The select event.
  • @@ -174,16 +179,15 @@ Use this directive to render a ui component for selecting child items to a paren eventBindings.push(scope.$watch('parentName', function(newValue, oldValue){ if (newValue === oldValue) { return; } - if ( oldValue === undefined || newValue === undefined) { return; } + if (oldValue === undefined || newValue === undefined) { return; } syncParentName(); - })); eventBindings.push(scope.$watch('parentIcon', function(newValue, oldValue){ if (newValue === oldValue) { return; } - if ( oldValue === undefined || newValue === undefined) { return; } + if (oldValue === undefined || newValue === undefined) { return; } syncParentIcon(); })); @@ -191,6 +195,7 @@ Use this directive to render a ui component for selecting child items to a paren // sortable options for allowed child content types scope.sortableOptions = { axis: "y", + cancel: ".unsortable", containment: "parent", distance: 10, opacity: 0.7, @@ -199,7 +204,7 @@ Use this directive to render a ui component for selecting child items to a paren zIndex: 6000, update: function (e, ui) { if(scope.onSort) { - scope.onSort(); + scope.onSort(); } } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js index 0369b4bd2e..149c2b5087 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js @@ -24,8 +24,7 @@ function valPropertyMsg(serverValidationManager, localizationService) { var hasError = false; //create properties on our custom scope so we can use it in our template - scope.errorMsg = ""; - + scope.errorMsg = ""; //the property form controller api var formCtrl = ctrl[0]; @@ -34,11 +33,15 @@ function valPropertyMsg(serverValidationManager, localizationService) { //the property controller api var umbPropCtrl = ctrl[2]; //the variants controller api - var umbVariantCtrl = ctrl[3]; + var umbVariantCtrl = ctrl[3]; var currentProperty = umbPropCtrl.property; scope.currentProperty = currentProperty; + var currentCulture = currentProperty.culture; + + // validation object won't exist when editor loads outside the content form (ie in settings section when modifying a content type) + var isMandatory = currentProperty.validation ? currentProperty.validation.mandatory : undefined; var labels = {}; localizationService.localize("errors_propertyHasErrors").then(function (data) { @@ -91,23 +94,25 @@ function valPropertyMsg(serverValidationManager, localizationService) { if (!watcher) { watcher = scope.$watch("currentProperty.value", function (newValue, oldValue) { - if (angular.equals(newValue, oldValue)) { return; } var errCount = 0; + for (var e in formCtrl.$error) { if (angular.isArray(formCtrl.$error[e])) { errCount++; } - } + } //we are explicitly checking for valServer errors here, since we shouldn't auto clear // based on other errors. We'll also check if there's no other validation errors apart from valPropertyMsg, if valPropertyMsg // is the only one, then we'll clear. - if (errCount === 0 || (errCount === 1 && angular.isArray(formCtrl.$error.valPropertyMsg)) || (formCtrl.$invalid && angular.isArray(formCtrl.$error.valServer))) { + if (errCount === 0 + || (errCount === 1 && angular.isArray(formCtrl.$error.valPropertyMsg)) + || (formCtrl.$invalid && angular.isArray(formCtrl.$error.valServer))) { scope.errorMsg = ""; formCtrl.$setValidity('valPropertyMsg', true); } else if (showValidation && scope.errorMsg === "") { @@ -136,6 +141,21 @@ function valPropertyMsg(serverValidationManager, localizationService) { } //if there are any errors in the current property form that are not valPropertyMsg else if (_.without(_.keys(formCtrl.$error), "valPropertyMsg").length > 0) { + + // errors exist, but if the property is NOT mandatory and has no value, the errors should be cleared + if (isMandatory !== undefined && isMandatory === false && !currentProperty.value) { + hasError = false; + showValidation = false; + scope.errorMsg = ""; + + // if there's no value, the controls can be reset, which clears the error state on formCtrl + for (let control of formCtrl.$getControls()) { + control.$setValidity(); + } + + return; + } + hasError = true; //update the validation message if we don't already have one assigned. if (showValidation && scope.errorMsg === "") { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 284a7db4d8..5bfe66b25f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -169,6 +169,7 @@ When building a custom infinite editor view you can use the same components as a let editorsKeyboardShorcuts = []; var editors = []; var isEnabled = true; + var lastElementInFocus = null; // events for backdrop @@ -261,6 +262,12 @@ When building a custom infinite editor view you can use the same components as a */ unbindKeyboardShortcuts(); + // if this is the first editor layer, save the currently focused element + // so we can re-apply focus to it once all the editor layers are closed + if (editors.length === 0) { + lastElementInFocus = document.activeElement; + } + // set flag so we know when the editor is open in "infinite mode" editor.infiniteMode = true; @@ -301,6 +308,10 @@ When building a custom infinite editor view you can use the same components as a $timeout(function() { // rebind keyboard shortcuts for the new editor in focus rebindKeyboardShortcuts(); + + if (editors.length === 0 && lastElementInFocus) { + lastElementInFocus.focus(); + } }, 0); } @@ -514,7 +525,7 @@ When building a custom infinite editor view you can use the same components as a function rollback(editor) { editor.view = "views/common/infiniteeditors/rollback/rollback.html"; - if (!editor.size) editor.size = "small"; + if (!editor.size) editor.size = "medium"; open(editor); } @@ -773,7 +784,7 @@ When building a custom infinite editor view you can use the same components as a * @methodOf umbraco.services.editorService * * @description - * Opens the user group picker in infinite editing, the submit callback returns the saved template + * Opens the template editor in infinite editing, the submit callback returns the saved template * @param {Object} editor rendering options * @param {String} editor.id The template id * @param {Callback} editor.submit Submits the editor diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less index 456601a7bd..ff4122b258 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less @@ -103,14 +103,21 @@ - +.umb-toggle.umb-toggle--disabled.umb-toggle--checked, .umb-toggle.umb-toggle--disabled { .umb-toggle__toggle { cursor: not-allowed; - border-color: @gray-5; + background-color: @gray-9; + border-color: @gray-9; + } + .umb-toggle__icon--left { + color: @gray-6; + } + .umb-toggle__icon--right { + color: @gray-6; } .umb-toggle__handler { - background-color: @gray-5; + background-color: @gray-10; } } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-child-selector.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-child-selector.less index da690663d0..937f746c56 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-child-selector.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-child-selector.less @@ -16,23 +16,24 @@ .umb-child-selector__child.-placeholder { border: 1px dashed @gray-8; background: none; - cursor: pointer; text-align: center; justify-content: center; - - color:@ui-action-type; + width: 100%; + color: @ui-action-type; + &:hover { - color:@ui-action-type-hover; - border-color:@ui-action-type-hover; - text-decoration:none; + color: @ui-action-type-hover; + border-color: @ui-action-type-hover; + text-decoration: none; } } .umb-child-selector__children-container { - margin-left: 30px; - .umb-child-selector__child { - cursor: move; - } + margin-left: 30px; + + .umb-child-selector__child.ui-sortable-handle { + cursor: move; + } } .umb-child-selector__child-description { @@ -65,5 +66,6 @@ } .umb-child-selector__child-remove { - cursor: pointer; + background: none; + border: none; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less index 76a4df0056..1c5c275642 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less @@ -3,15 +3,21 @@ .umb-form-check { display: flex; - flex-wrap: wrap; - align-items: center; position: relative; - padding: 0 0 0 26px !important; + padding-left: 0px; margin: 0; min-height: 22px; - line-height: 22px; cursor: pointer !important; + .umb-form-check__symbol { + margin-top: 1px; + margin-right: 10px; + } + .umb-form-check__info { + + } + + &.-small-text{ font-size: 13px; } @@ -22,7 +28,6 @@ &__text { position: relative; - top: 1px; user-select: none; } @@ -90,10 +95,6 @@ &__state { display: flex; height: 18px; - margin-top: 2px; - position: absolute; - top: 0; - left: 0; } &__check { @@ -101,6 +102,7 @@ position: relative; background: @white; border: 1px solid @inputBorder; + border-radius: @baseBorderRadius; width: @checkboxWidth; height: @checkboxHeight; @@ -160,5 +162,6 @@ &.umb-form-check--disabled { cursor: not-allowed !important; opacity: 0.5; + pointer-events: none; } } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-search.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-search.less index ac15b3dcf8..ec598c17eb 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-search.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-search.less @@ -4,20 +4,26 @@ .icon { position: absolute; - padding: 5px 8px; + width: 30px; + height: 30px; + display: flex; + justify-content: center; + align-items: center; + margin: 1px; + padding: 0; pointer-events: none; - top: 2px; color: @ui-action-discreet-type; transition: color .1s linear; } input { width: 0px; - padding-left:24px; + padding-left: 24px; margin-bottom: 0px; background-color: transparent; border-color: @ui-action-discreet-border; transition: background-color .1s linear, border-color .1s linear, color .1s linear, width .1s ease-in-out, padding-left .1s ease-in-out; + cursor: pointer; } &:focus-within, &:hover { @@ -34,6 +40,7 @@ background-color: white; color: @ui-action-discreet-border-hover; border-color: @ui-action-discreet-border-hover; + cursor: unset; } input:focus, &:focus-within input, &.--has-value input { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less index 4168ab3c39..716693c778 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less @@ -135,6 +135,8 @@ .umb-nested-content__header-bar:hover .umb-nested-content__icons, +.umb-nested-content__header-bar:focus .umb-nested-content__icons, +.umb-nested-content__header-bar:focus-within .umb-nested-content__icons, .umb-nested-content__item--active > .umb-nested-content__header-bar .umb-nested-content__icons { opacity: 1; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-node-preview.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-node-preview.less index f754a09368..939fd79826 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-node-preview.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-node-preview.less @@ -29,7 +29,8 @@ .umb-node-preview__icon { display: flex; width: 25px; - height: 25px; + min-height: 25px; + height: 100%; justify-content: center; align-items: center; font-size: 20px; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less index 3f0b981ac6..17c4bf1a55 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less @@ -61,6 +61,7 @@ opacity: 0; transition: opacity 120ms; } +.umb-property:focus-within .umb-property-actions__toggle, .umb-property:hover .umb-property-actions__toggle, .umb-property .umb-property-actions__toggle:focus { opacity: 1; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less index 08b1a1b5e1..9550acfb1b 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less @@ -1,6 +1,7 @@ .umb-property-file-upload { .umb-upload-button-big { + max-width: (@propertyEditorLimitedWidth - 40); display: block; padding: 20px; opacity: 1; diff --git a/src/Umbraco.Web.UI.Client/src/less/mixins.less b/src/Umbraco.Web.UI.Client/src/less/mixins.less index efc0178ca2..f5c499cbfc 100644 --- a/src/Umbraco.Web.UI.Client/src/less/mixins.less +++ b/src/Umbraco.Web.UI.Client/src/less/mixins.less @@ -418,7 +418,7 @@ // -------------------------------------------------- // Limit width of specific property editors .umb-property-editor--limit-width { - max-width: 800px; + max-width: @propertyEditorLimitedWidth; } // Horizontal dividers diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index c25941514e..764b73c593 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -722,6 +722,10 @@ // // File upload // -------------------------------------------------- +.umb-fileupload { + display: flex; +} + .umb-fileupload .preview { border-radius: 5px; border: 1px solid @gray-6; diff --git a/src/Umbraco.Web.UI.Client/src/less/rte.less b/src/Umbraco.Web.UI.Client/src/less/rte.less index d6d38f540a..0e43f428ae 100644 --- a/src/Umbraco.Web.UI.Client/src/less/rte.less +++ b/src/Umbraco.Web.UI.Client/src/less/rte.less @@ -164,4 +164,13 @@ .mce-fullscreen { position: absolute; + + .mce-in { + position: fixed; + top: 35px !important; + } + + umb-editor__overlay, .umb-editor { + position: fixed; + } } diff --git a/src/Umbraco.Web.UI.Client/src/less/sections.less b/src/Umbraco.Web.UI.Client/src/less/sections.less index 27b11b1c3b..1f19786b3c 100644 --- a/src/Umbraco.Web.UI.Client/src/less/sections.less +++ b/src/Umbraco.Web.UI.Client/src/less/sections.less @@ -55,7 +55,7 @@ ul.sections { transition: opacity .1s linear, box-shadow .1s; } - &.current a { + &.current > a { color: @ui-active; &::after { @@ -76,6 +76,13 @@ ul.sections { transition: opacity .1s linear; } + &.current { + i { + opacity: 1; + background: @ui-active; + } + } + &:hover i { opacity: 1; } diff --git a/src/Umbraco.Web.UI.Client/src/less/variables.less b/src/Umbraco.Web.UI.Client/src/less/variables.less index a906bc0eed..5c0e6f7729 100644 --- a/src/Umbraco.Web.UI.Client/src/less/variables.less +++ b/src/Umbraco.Web.UI.Client/src/less/variables.less @@ -244,6 +244,7 @@ @paddingSmall: 2px 10px; // 26px @paddingMini: 0 6px; // 22px +@propertyEditorLimitedWidth: 800px; // Disabled this to keep consistency throughout the backoffice UI. Untill a better solution is thought up, this will do. @baseBorderRadius: 3px; // 2px; diff --git a/src/Umbraco.Web.UI.Client/src/navigation.controller.js b/src/Umbraco.Web.UI.Client/src/navigation.controller.js index 194c45afe6..281be2d331 100644 --- a/src/Umbraco.Web.UI.Client/src/navigation.controller.js +++ b/src/Umbraco.Web.UI.Client/src/navigation.controller.js @@ -257,6 +257,7 @@ function NavigationController($scope, $rootScope, $location, $log, $q, $routePar evts.push(eventsService.on("app.ready", function (evt, data) { $scope.authenticated = true; ensureInit(); + ensureMainCulture(); })); // event for infinite editors @@ -279,8 +280,22 @@ function NavigationController($scope, $rootScope, $location, $log, $q, $routePar } })); - - + /** + * For multi language sites, this ensures that mculture is set to either the last selected language or the default one + */ + function ensureMainCulture() { + if ($location.search().mculture) { + return; + } + var language = lastLanguageOrDefault(); + if (!language) { + return; + } + // trigger a language selection in the next digest cycle + $timeout(function () { + $scope.selectLanguage(language); + }); + } /** * Based on the current state of the application, this configures the scope variables that control the main tree and language drop down @@ -385,28 +400,19 @@ function NavigationController($scope, $rootScope, $location, $log, $q, $routePar if ($scope.languages.length > 1) { //if there's already one set, check if it exists - var currCulture = null; + var language = null; var mainCulture = $location.search().mculture; if (mainCulture) { - currCulture = _.find($scope.languages, function (l) { + language = _.find($scope.languages, function (l) { return l.culture.toLowerCase() === mainCulture.toLowerCase(); }); } - if (!currCulture) { - // no culture in the request, let's look for one in the cookie that's set when changing language - var defaultCulture = $cookies.get("UMB_MCULTURE"); - if (!defaultCulture || !_.find($scope.languages, function (l) { - return l.culture.toLowerCase() === defaultCulture.toLowerCase(); - })) { - // no luck either, look for the default language - var defaultLang = _.find($scope.languages, function (l) { - return l.isDefault; - }); - if (defaultLang) { - defaultCulture = defaultLang.culture; - } + if (!language) { + language = lastLanguageOrDefault(); + + if (language) { + $location.search("mculture", language.culture); } - $location.search("mculture", defaultCulture ? defaultCulture : null); } } @@ -431,6 +437,25 @@ function NavigationController($scope, $rootScope, $location, $log, $q, $routePar }); }); } + + function lastLanguageOrDefault() { + if (!$scope.languages || $scope.languages.length <= 1) { + return null; + } + // see if we can find a culture in the cookie set when changing language + var lastCulture = $cookies.get("UMB_MCULTURE"); + var language = lastCulture ? _.find($scope.languages, function (l) { + return l.culture.toLowerCase() === lastCulture.toLowerCase(); + }) : null; + if (!language) { + // no luck, look for the default language + language = _.find($scope.languages, function (l) { + return l.isDefault; + }); + } + return language; + } + function nodeExpandedHandler(args) { //store the reference to the expanded node path if (args.node) { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js index b8581d28d0..9640f2eba2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js @@ -56,7 +56,8 @@ "validation_validateAsEmail", "validation_validateAsNumber", "validation_validateAsUrl", - "validation_enterCustomValidation" + "validation_enterCustomValidation", + "validation_fieldIsMandatory" ]; localizationService.localizeMany(labels) @@ -66,6 +67,7 @@ vm.labels.validateAsNumber = data[1]; vm.labels.validateAsUrl = data[2]; vm.labels.customValidation = data[3]; + vm.labels.fieldIsMandatory = data[4]; vm.validationTypes = [ { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html index 4474390199..77ee276e3e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html @@ -84,14 +84,15 @@
    - - + on-click="vm.toggleValidation()" + label-on="{{vm.labels.fieldIsMandatory}}" + label-off="{{vm.labels.fieldIsMandatory}}" + show-labels="true" + label-position="right" focus-when="{{vm.focusOnMandatoryField}}" + class="mb1"> -
  • +
  • diff --git a/src/Umbraco.Web.UI.Client/src/views/components/application/umb-tour.html b/src/Umbraco.Web.UI.Client/src/views/components/application/umb-tour.html index e358d75b9e..064dcf6945 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/application/umb-tour.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/application/umb-tour.html @@ -70,7 +70,7 @@
    - +

    Oh, we got lost!

    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step.html b/src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step.html index a2caff4ff2..9e161d6b4e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step.html @@ -1,8 +1,7 @@
    -
    -
    - +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umb-mini-search.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umb-mini-search.html index 20ce87f0eb..d4e75908bd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umb-mini-search.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umb-mini-search.html @@ -1,5 +1,5 @@ - + diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umbminisearch.component.js b/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umbminisearch.component.js index 994129708f..d7aee744e4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umbminisearch.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-search/umbminisearch.component.js @@ -10,7 +10,8 @@ bindings: { model: "=", onStartTyping: "&?", - onSearch: "&?" + onSearch: "&?", + onBlur: "&?" } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/users/umb-user-preview.html b/src/Umbraco.Web.UI.Client/src/views/components/users/umb-user-preview.html index 32aa5ed1a2..014297ae51 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/users/umb-user-preview.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/users/umb-user-preview.html @@ -1,12 +1,11 @@
    - +
    @@ -15,7 +14,6 @@
    - Remove -
    - -
    \ No newline at end of file + +
    + diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.create.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.create.controller.js index 64f601f8b7..1a1254fcf1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.create.controller.js @@ -22,10 +22,14 @@ function contentCreateController($scope, function initialize() { $scope.loading = true; $scope.allowedTypes = null; - $scope.countTypes = contentTypeResource.getCount; var getAllowedTypes = contentTypeResource.getAllowedTypes($scope.currentNode.id).then(function (data) { $scope.allowedTypes = iconHelper.formatContentTypeIcons(data); + if ($scope.allowedTypes.length === 0) { + contentTypeResource.getCount().then(function(count) { + $scope.countTypes = count; + }); + } }); var getCurrentUser = authResource.getCurrentUser().then(function (currentUser) { if (currentUser.allowedSections.indexOf("settings") > -1) { diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js b/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js index a35a404c24..cdabb05fd4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js @@ -220,7 +220,7 @@ function startupLatestEditsController($scope) { } angular.module("umbraco").controller("Umbraco.Dashboard.StartupLatestEditsController", startupLatestEditsController); -function MediaFolderBrowserDashboardController($rootScope, $scope, $location, contentTypeResource, userService) { +function MediaFolderBrowserDashboardController($scope, $routeParams, $location, contentTypeResource, userService) { var currentUser = {}; @@ -251,6 +251,8 @@ function MediaFolderBrowserDashboardController($rootScope, $scope, $location, co view: dt.view }; + // tell the list view to list content at root + $routeParams.id = -1; }); } else if (currentUser.startMediaIds.length > 0){ diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html index a7f7d45087..f1388753a0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html @@ -4,7 +4,7 @@ -

    Hours of Umbraco training videos are only a click away

    +

    Hours of Umbraco training videos are only a click away

    Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

    diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js index a5884c2355..a7ce67fc0b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js @@ -73,14 +73,14 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource, var content = $scope.content; - // we need to check wether an app is present in the current data, if not we will present the default app. + // we need to check whether an app is present in the current data, if not we will present the default app. var isAppPresent = false; // on first init, we dont have any apps. but if we are re-initializing, we do, but ... if ($scope.app) { // lets check if it still exists as part of our apps array. (if not we have made a change to our docType, even just a re-save of the docType it will turn into new Apps.) - _.forEach(content.apps, function(app) { + content.apps.forEach(app => { if (app === $scope.app) { isAppPresent = true; } @@ -88,7 +88,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource, // if we did reload our DocType, but still have the same app we will try to find it by the alias. if (isAppPresent === false) { - _.forEach(content.apps, function(app) { + content.apps.forEach(app => { if (app.alias === $scope.app.alias) { isAppPresent = true; app.active = true; @@ -182,24 +182,26 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource, formHelper.resetForm({ scope: $scope }); - contentEditingHelper.handleSuccessfulSave({ - scope: $scope, - savedContent: data, - rebindCallback: contentEditingHelper.reBindChangedProperties($scope.content, data) - }); - - editorState.set($scope.content); - - syncTreeNode($scope.content, data.path); - - init(); - - $scope.page.saveButtonState = "success"; - // close the editor if it's infinite mode + // submit function manages rebinding changes if(infiniteMode && $scope.model.submit) { $scope.model.mediaNode = $scope.content; $scope.model.submit($scope.model); + } else { + // if not infinite mode, rebind changed props etc + contentEditingHelper.handleSuccessfulSave({ + scope: $scope, + savedContent: data, + rebindCallback: contentEditingHelper.reBindChangedProperties($scope.content, data) + }); + + editorState.set($scope.content); + + syncTreeNode($scope.content, data.path); + + $scope.page.saveButtonState = "success"; + + init(); } }, function(err) { @@ -245,7 +247,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource, syncTreeNode($scope.content, data.path, true); } - if ($scope.content.parentId && $scope.content.parentId != -1) { + if ($scope.content.parentId && $scope.content.parentId !== -1 && $scope.content.parentId !== -21) { //We fetch all ancestors of the node to generate the footer breadcrump navigation entityResource.getAncestors(nodeId, "media") .then(function (anc) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js index 3c954b9316..139a2515b5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js @@ -276,6 +276,9 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time } $scope.reloadView = function (id, reloadActiveNode) { + if (!id) { + return; + } $scope.viewLoaded = false; $scope.folders = []; @@ -713,45 +716,12 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time } function initView() { - //default to root id if the id is undefined var id = $routeParams.id; if (id === undefined) { - id = -1; + // no ID found in route params - don't list anything as we don't know for sure where we are + return; } - getContentTypesCallback(id).then(function (listViewAllowedTypes) { - $scope.listViewAllowedTypes = listViewAllowedTypes; - - var blueprints = false; - _.each(listViewAllowedTypes, function (allowedType) { - if (_.isEmpty(allowedType.blueprints)) { - // this helps the view understand that there are no blueprints available - allowedType.blueprints = null; - } - else { - blueprints = true; - // turn the content type blueprints object into an array of sortable objects for the view - allowedType.blueprints = _.map(_.pairs(allowedType.blueprints || {}), function (pair) { - return { - id: pair[0], - name: pair[1] - }; - }); - } - }); - - if (listViewAllowedTypes.length === 1 && blueprints === false) { - $scope.createAllowedButtonSingle = true; - } - if (listViewAllowedTypes.length === 1 && blueprints === true) { - $scope.createAllowedButtonSingleWithBlueprints = true; - } - if (listViewAllowedTypes.length > 1) { - $scope.createAllowedButtonMultiWithBlueprints = true; - } - }); - - $scope.contentId = id; $scope.isTrashed = editorState.current ? editorState.current.trashed : id === "-20" || id === "-21"; @@ -765,6 +735,40 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time $scope.options.allowBulkMove || $scope.options.allowBulkDelete; + if ($scope.isTrashed === false) { + getContentTypesCallback(id).then(function (listViewAllowedTypes) { + $scope.listViewAllowedTypes = listViewAllowedTypes; + + var blueprints = false; + _.each(listViewAllowedTypes, function (allowedType) { + if (_.isEmpty(allowedType.blueprints)) { + // this helps the view understand that there are no blueprints available + allowedType.blueprints = null; + } + else { + blueprints = true; + // turn the content type blueprints object into an array of sortable objects for the view + allowedType.blueprints = _.map(_.pairs(allowedType.blueprints || {}), function (pair) { + return { + id: pair[0], + name: pair[1] + }; + }); + } + }); + + if (listViewAllowedTypes.length === 1 && blueprints === false) { + $scope.createAllowedButtonSingle = true; + } + if (listViewAllowedTypes.length === 1 && blueprints === true) { + $scope.createAllowedButtonSingleWithBlueprints = true; + } + if (listViewAllowedTypes.length > 1) { + $scope.createAllowedButtonMultiWithBlueprints = true; + } + }); + } + $scope.reloadView($scope.contentId); } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.controller.js index 8c6194d638..cde99d7b9e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.controller.js @@ -48,49 +48,45 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl // This is done by remapping the int/guid ids into a new array of items, where we create "Deleted item" placeholders // when there is no match for a selected id. This will ensure that the values being set on save, are the same as before. - medias = _.map(ids, - function (id) { - var found = _.find(medias, - function (m) { - // We could use coercion (two ='s) here .. but not sure if this works equally well in all browsers and - // it's prone to someone "fixing" it at some point without knowing the effects. Rather use toString() - // compares and be completely sure it works. - return m.udi.toString() === id.toString() || m.id.toString() === id.toString(); - }); - if (found) { - return found; - } else { - return { - name: vm.labels.deletedItem, - id: $scope.model.config.idType !== "udi" ? id : null, - udi: $scope.model.config.idType === "udi" ? id : null, - icon: "icon-picture", - thumbnail: null, - trashed: true - }; - } - }); + medias = ids.map(id => { + var found = medias.find(m => + // We could use coercion (two ='s) here .. but not sure if this works equally well in all browsers and + // it's prone to someone "fixing" it at some point without knowing the effects. Rather use toString() + // compares and be completely sure it works. + m.udi.toString() === id.toString() || m.id.toString() === id.toString()); + + if (found) { + return found; + } else { + return { + name: vm.labels.deletedItem, + id: $scope.model.config.idType !== "udi" ? id : null, + udi: $scope.model.config.idType === "udi" ? id : null, + icon: "icon-picture", + thumbnail: null, + trashed: true + }; + } + }); - _.each(medias, - function (media, i) { + medias.forEach(media => { + if (!media.extension && media.id && media.metaData) { + media.extension = mediaHelper.getFileExtension(media.metaData.MediaPath); + } - if (!media.extension && media.id && media.metaData) { - media.extension = mediaHelper.getFileExtension(media.metaData.MediaPath); - } + // if there is no thumbnail, try getting one if the media is not a placeholder item + if (!media.thumbnail && media.id && media.metaData) { + media.thumbnail = mediaHelper.resolveFileFromEntity(media, true); + } - // if there is no thumbnail, try getting one if the media is not a placeholder item - if (!media.thumbnail && media.id && media.metaData) { - media.thumbnail = mediaHelper.resolveFileFromEntity(media, true); - } + $scope.mediaItems.push(media); - $scope.mediaItems.push(media); - - if ($scope.model.config.idType === "udi") { - $scope.ids.push(media.udi); - } else { - $scope.ids.push(media.id); - } - }); + if ($scope.model.config.idType === "udi") { + $scope.ids.push(media.udi); + } else { + $scope.ids.push(media.id); + } + }); sync(); }); @@ -100,7 +96,7 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl function sync() { $scope.model.value = $scope.ids.join(); removeAllEntriesAction.isDisabled = $scope.ids.length === 0; - }; + } function setDirty() { angularHelper.getCurrentForm($scope).$setDirty(); @@ -111,18 +107,17 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl // reload. We only reload the images that is already picked but has been updated. // We have to get the entities from the server because the media // can be edited without being selected - _.each($scope.images, - function (image, i) { - if (updatedMediaNodes.indexOf(image.udi) !== -1) { - image.loading = true; - entityResource.getById(image.udi, "media") - .then(function (mediaEntity) { - angular.extend(image, mediaEntity); - image.thumbnail = mediaHelper.resolveFileFromEntity(image, true); - image.loading = false; - }); - } - }); + $scope.mediaItems.forEach(media => { + if (updatedMediaNodes.indexOf(media.udi) !== -1) { + media.loading = true; + entityResource.getById(media.udi, "Media") + .then(function (mediaEntity) { + angular.extend(media, mediaEntity); + media.thumbnail = mediaHelper.resolveFileFromEntity(media, true); + media.loading = false; + }); + } + }); } function init() { @@ -177,20 +172,20 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl // the media picker is using media entities so we get the // entity so we easily can format it for use in the media grid if (model && model.mediaNode) { - entityResource.getById(model.mediaNode.id, "media") + entityResource.getById(model.mediaNode.id, "Media") .then(function (mediaEntity) { // if an image is selecting more than once // we need to update all the media items - angular.forEach($scope.images, function (image) { - if (image.id === model.mediaNode.id) { - angular.extend(image, mediaEntity); - image.thumbnail = mediaHelper.resolveFileFromEntity(image, true); + $scope.mediaItems.forEach(media => { + if (media.id === model.mediaNode.id) { + angular.extend(media, mediaEntity); + media.thumbnail = mediaHelper.resolveFileFromEntity(media, true); } }); }); } }, - close: function (model) { + close: function () { editorService.close(); } }; @@ -210,7 +205,7 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl editorService.close(); - _.each(model.selection, function (media, i) { + model.selection.forEach(media => { // if there is no thumbnail, try getting one if the media is not a placeholder item if (!media.thumbnail && media.id && media.metaData) { media.thumbnail = mediaHelper.resolveFileFromEntity(media, true); @@ -280,16 +275,14 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl disabled: !multiPicker, items: "li:not(.add-wrapper)", cancel: ".unsortable", - update: function (e, ui) { + update: function () { setDirty(); $timeout(function() { // TODO: Instead of doing this with a timeout would be better to use a watch like we do in the // content picker. Then we don't have to worry about setting ids, render models, models, we just set one and let the // watch do all the rest. - $scope.ids = _.map($scope.mediaItems, - function (item) { - return $scope.model.config.idType === "udi" ? item.udi : item.id; - }); + $scope.ids = $scope.mediaItems.map(media => $scope.model.config.idType === "udi" ? media.udi : media.id); + sync(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html index b17906272d..c4dba4d373 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html @@ -36,16 +36,16 @@
    - -
  • -
  • diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.controller.js index 2e4313ec76..172f9b2249 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.controller.js @@ -147,7 +147,7 @@ function multiUrlPickerController($scope, angularHelper, localizationService, en _.each($scope.model.value, function (item){ // we must reload the "document" link URLs to match the current editor culture - if (item.udi.indexOf("/document/") > 0) { + if (item.udi && item.udi.indexOf("/document/") > 0) { item.url = null; entityResource.getUrlByUdi(item.udi).then(function (data) { item.url = data; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index 7de3a5b567..f2538c66c1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -221,6 +221,7 @@ if (vm.overlayMenu.availableItems.length === 1 && vm.overlayMenu.pasteItems.length === 0) { // only one scaffold type - no need to display the picker addNode(vm.scaffolds[0].contentTypeAlias); + vm.overlayMenu = null; return; } @@ -276,6 +277,9 @@ }; vm.getName = function (idx) { + if (!model.value || !model.value.length) { + return ""; + } var name = ""; @@ -325,6 +329,10 @@ }; vm.getIcon = function (idx) { + if (!model.value || !model.value.length) { + return ""; + } + var scaffold = getScaffold(model.value[idx].ncContentTypeAlias); return scaffold && scaffold.icon ? iconHelper.convertFromLegacyIcon(scaffold.icon) : "icon-folder"; } @@ -480,10 +488,12 @@ } // Enforce min items if we only have one scaffold type + var modelWasChanged = false; if (vm.nodes.length < vm.minItems && vm.scaffolds.length === 1) { for (var i = vm.nodes.length; i < model.config.minItems; i++) { addNode(vm.scaffolds[0].contentTypeAlias); } + modelWasChanged = true; } // If there is only one item, set it as current node @@ -495,6 +505,10 @@ vm.inited = true; + if (modelWasChanged) { + updateModel(); + } + updatePropertyActionStates(); checkAbilityToPasteContent(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js index a20289d076..f5f0f7f2a2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.controller.js @@ -56,7 +56,7 @@ return value.toFixed(stepDecimalPlaces); }, from: function (value) { - return value; + return Number(value); } }, "range": { diff --git a/src/Umbraco.Web.UI.Client/src/views/users/group.html b/src/Umbraco.Web.UI.Client/src/views/users/group.html index 0244819655..eae6dbd75c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/group.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/group.html @@ -40,13 +40,12 @@ on-remove="vm.removeSelectedItem($index, vm.userGroup.sections)"> - + @@ -61,14 +60,14 @@ on-remove="vm.clearStartNode('content')"> - + + @@ -85,14 +84,14 @@ on-remove="vm.clearStartNode('media')"> - + + @@ -127,13 +126,12 @@ on-edit="vm.setPermissionsForNode(node)"> - + @@ -155,13 +153,11 @@ on-remove="vm.removeSelectedItem($index, vm.userGroup.users)"> - + diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html b/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html index e0cf09da50..bb3efaede2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html @@ -75,13 +75,11 @@ on-remove="model.removeSelectedItem($index, model.user.userGroups)"> - + @@ -100,13 +98,12 @@ name="model.labels.noStartNodes"> - + @@ -125,13 +122,12 @@ name="model.labels.noStartNodes"> - + diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js index 935b1bdfb1..f3c28fdb9d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js @@ -14,7 +14,7 @@ vm.userStates = []; vm.selection = []; vm.newUser = {}; - vm.usersOptions = {filter:null}; + vm.usersOptions = {}; vm.userSortData = [ { label: "Name (A-Z)", key: "Name", direction: "Ascending" }, { label: "Name (Z-A)", key: "Name", direction: "Descending" }, @@ -112,6 +112,7 @@ vm.selectAll = selectAll; vm.areAllSelected = areAllSelected; vm.searchUsers = searchUsers; + vm.onBlurSearch = onBlurSearch; vm.getFilterName = getFilterName; vm.setUserStatesFilter = setUserStatesFilter; vm.setUserGroupFilter = setUserGroupFilter; @@ -150,10 +151,12 @@ function initViewOptions() { // Start with default view options. + vm.usersOptions.filter = ""; vm.usersOptions.orderBy = "Name"; vm.usersOptions.orderDirection = "Ascending"; // Update from querystring if available. + initViewOptionFromQueryString("filter"); initViewOptionFromQueryString("orderBy"); initViewOptionFromQueryString("orderDirection"); initViewOptionFromQueryString("pageNumber"); @@ -451,7 +454,8 @@ var search = _.debounce(function () { $scope.$apply(function () { - changePageNumber(1); + vm.usersOptions.pageNumber = 1; + getUsers(); }); }, 500); @@ -459,6 +463,10 @@ search(); } + function onBlurSearch() { + updateLocation("filter", vm.usersOptions.filter); + } + function getFilterName(array) { var name = vm.labels.all; var found = false; @@ -547,6 +555,7 @@ } function updateLocation(key, value) { + $location.search("filter", vm.usersOptions.filter);// update filter, but first when something else requests a url update. $location.search(key, value); } @@ -657,7 +666,8 @@ function usersOptionsAsQueryString() { var qs = "?orderBy=" + vm.usersOptions.orderBy + "&orderDirection=" + vm.usersOptions.orderDirection + - "&pageNumber=" + vm.usersOptions.pageNumber; + "&pageNumber=" + vm.usersOptions.pageNumber + + "&filter=" + vm.usersOptions.filter; qs += addUsersOptionsFilterCollectionToQueryString("userStates", vm.usersOptions.userStates); qs += addUsersOptionsFilterCollectionToQueryString("userGroups", vm.usersOptions.userGroups); diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html index 638e6376c3..bb53413060 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html @@ -28,7 +28,7 @@ - + diff --git a/src/Umbraco.Web.UI.NetCore/Program.cs b/src/Umbraco.Web.UI.NetCore/Program.cs new file mode 100644 index 0000000000..21eb1b6585 --- /dev/null +++ b/src/Umbraco.Web.UI.NetCore/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace Umbraco.Web.UI.BackOffice +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args) + .Build() + .Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} diff --git a/src/Umbraco.Web.UI.NetCore/Properties/launchSettings.json b/src/Umbraco.Web.UI.NetCore/Properties/launchSettings.json new file mode 100644 index 0000000000..b145249bb5 --- /dev/null +++ b/src/Umbraco.Web.UI.NetCore/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:36804", + "sslPort": 44354 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Umbraco.Web.UI.BackOffice": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Umbraco.Web.UI.NetCore/Startup.cs b/src/Umbraco.Web.UI.NetCore/Startup.cs new file mode 100644 index 0000000000..8e4da28917 --- /dev/null +++ b/src/Umbraco.Web.UI.NetCore/Startup.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Umbraco.Web.BackOffice.AspNetCore; +using Umbraco.Web.Website.AspNetCore; + + +namespace Umbraco.Web.UI.BackOffice +{ + public class Startup + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + services.AddUmbracoWebsite(); + services.AddUmbracoBackOffice(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseUmbracoWebsite(); + app.UseUmbracoBackOffice(); + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); + }); + } + } +} diff --git a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj new file mode 100644 index 0000000000..69d223bcc6 --- /dev/null +++ b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj @@ -0,0 +1,17 @@ + + + + netcoreapp3.1 + Umbraco.Web.UI.BackOffice + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI.NetCore/appsettings.Development.json b/src/Umbraco.Web.UI.NetCore/appsettings.Development.json new file mode 100644 index 0000000000..8983e0fc1c --- /dev/null +++ b/src/Umbraco.Web.UI.NetCore/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/src/Umbraco.Web.UI.NetCore/appsettings.json b/src/Umbraco.Web.UI.NetCore/appsettings.json new file mode 100644 index 0000000000..d9d9a9bff6 --- /dev/null +++ b/src/Umbraco.Web.UI.NetCore/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/src/Umbraco.Web.UI.NetCore/wwwroot/favicon.ico b/src/Umbraco.Web.UI.NetCore/wwwroot/favicon.ico new file mode 100644 index 0000000000..c0749ddf7f Binary files /dev/null and b/src/Umbraco.Web.UI.NetCore/wwwroot/favicon.ico differ diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 63212b2fd4..7b5c221a41 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -112,9 +112,9 @@ - + {29aa69d9-b597-4395-8d42-43b1263c240a} - Umbraco.Abstractions + Umbraco.Core {0fad7d2a-d7dd-45b1-91fd-488bb6cdacea} @@ -128,10 +128,6 @@ {f6de8da0-07cc-4ef2-8a59-2bc81dbb3830} Umbraco.PublishedCache.NuCache - - {9b95eef7-63fe-4432-8c63-166be9c1a929} - Umbraco.Web.BackOffice - {651e1350-91b6-44b7-bd60-7207006d7003} Umbraco.Web diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml index 74ec033f25..5f75f8d792 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml @@ -1,11 +1,12 @@ @using System.Web.Mvc.Html @using ClientDependency.Core.Mvc @using Umbraco.Web +@using Umbraco.Web.Composing @using Umbraco.Web.Controllers @inherits Umbraco.Web.Macros.PartialViewMacroPage @{ - var profileModel = Members.GetCurrentMemberProfileModel(); + var profileModel = Current.MembershipHelper.GetCurrentMemberProfileModel(); Html.EnableClientValidation(); Html.EnableUnobtrusiveJavaScript(); @@ -19,7 +20,7 @@ @*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@ @Html.RenderJsHere() -@if (Members.IsLoggedIn() && profileModel != null) +@if (Current.MembershipHelper.IsLoggedIn() && profileModel != null) { if (success) { diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml index 7962d17898..9462b3b638 100755 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml @@ -26,18 +26,18 @@
    @foreach (var mediaId in mediaIds.Split(',')) { - var media = Umbraco.Media(mediaId); + var media = Current.PublishedContentQuery.Media(mediaId); @* a single image *@ if (media.IsDocumentType("Image")) { - @Render(media); + @Render(media) } @* a folder with images under it *@ foreach (var image in media.Children(Current.VariationContextAccessor)) { - @Render(image); + @Render(image) } }
    diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml index 46c8de695c..ec41d45c0c 100755 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml @@ -1,4 +1,5 @@ @using Umbraco.Web +@using Umbraco.Web.Composing @inherits Umbraco.Web.Macros.PartialViewMacroPage @* @@ -18,7 +19,7 @@ @if (startNodeId != null) { @* Get the starting page *@ - var startNode = Umbraco.Content(startNodeId); + var startNode = Current.PublishedContentQuery.Content(startNodeId); var selection = startNode.Children.Where(x => x.IsVisible()).ToArray(); if (selection.Length > 0) diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml index 7a561cf94d..386bc824df 100755 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml @@ -1,4 +1,5 @@ @using Umbraco.Web +@using Umbraco.Web.Composing @inherits Umbraco.Web.Macros.PartialViewMacroPage @* @@ -18,7 +19,7 @@ @if (mediaId != null) { @* Get the media item associated with the id passed in *@ - var media = Umbraco.Media(mediaId); + var media = Current.PublishedContentQuery.Media(mediaId); var selection = media.Children.ToArray(); if (selection.Length > 0) diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/LoginStatus.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/LoginStatus.cshtml index 8eadbb342f..78b06151af 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/LoginStatus.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/LoginStatus.cshtml @@ -1,11 +1,12 @@ @using System.Web.Mvc.Html @using Umbraco.Web +@using Umbraco.Web.Composing @using Umbraco.Web.Models @using Umbraco.Web.Controllers @inherits Umbraco.Web.Macros.PartialViewMacroPage @{ - var loginStatusModel = Members.GetCurrentLoginStatus(); + var loginStatusModel = Current.MembershipHelper.GetCurrentLoginStatus(); var logoutModel = new PostRedirectModel(); @* diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml index 804e2307f0..81389f4a3d 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml @@ -1,6 +1,7 @@ @using System.Web.Mvc.Html @using ClientDependency.Core.Mvc @using Umbraco.Web +@using Umbraco.Web.Composing @using Umbraco.Web.Controllers @inherits Umbraco.Web.Macros.PartialViewMacroPage @@ -12,7 +13,7 @@ var registerModel = Members.CreateRegistrationModel("Custom Member"); *@ - var registerModel = Members.CreateRegistrationModel(); + var registerModel = Current.MembershipHelper.CreateRegistrationModel(); @* Configurable here: diff --git a/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml b/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml index e95057efe9..e41185d74b 100644 --- a/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml @@ -48,7 +48,7 @@ redirectUrl = Url.Action("AuthorizeUpgrade", "BackOffice") }); } - @Html.BareMinimumServerVariablesScript(Url, externalLoginUrl, Model.Features, Model.GlobalSettings, Model.UmbracoVersion, Model.UmbracoSettingsSection, Model.IOHelper, Model.TreeCollection) + @Html.BareMinimumServerVariablesScript(Url, externalLoginUrl, Model.Features, Model.GlobalSettings, Model.UmbracoVersion, Model.UmbracoSettingsSection, Model.IOHelper, Model.TreeCollection, Model.HttpContextAccessor, Model.HostingEnvironment, Model.RuntimeSettings)