From f0d1c38aa8dd8eeca652e1750d50b5e65a14b3cf Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 15:03:14 +0100 Subject: [PATCH 01/19] AB3791 - Moved scoping to infrastructure, implemented our own CallContext --- .../Scoping/IScopeContext.cs | 4 +- src/Umbraco.Core/Umbraco.Core.csproj | 7 --- .../Events/QueuingEventDispatcher.cs | 18 ++++---- .../Scoping/CallContext.cs | 41 +++++++++++++++++ .../Scoping/IScopeAccessor.cs | 0 .../Scoping/Scope.cs | 29 ++++++++---- .../Scoping/ScopeContext.cs | 0 .../Scoping/ScopeContextualBase.cs | 0 .../Scoping/ScopeProvider.cs | 45 ++++++++++--------- .../Scoping/ScopeReference.cs | 0 .../Umbraco.Infrastructure.csproj | 18 +++----- .../Components/ComponentTests.cs | 4 +- .../Scoping/ScopeEventDispatcherTests.cs | 2 +- src/Umbraco.Tests/Scoping/ScopeTests.cs | 9 ++-- src/Umbraco.Tests/TestHelpers/TestObjects.cs | 4 +- .../TestHelpers/TestWithDatabaseBase.cs | 1 - src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 2 + 17 files changed, 119 insertions(+), 65 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Events/QueuingEventDispatcher.cs (71%) create mode 100644 src/Umbraco.Infrastructure/Scoping/CallContext.cs rename src/{Umbraco.Core => Umbraco.Infrastructure}/Scoping/IScopeAccessor.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Scoping/Scope.cs (92%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Scoping/ScopeContext.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Scoping/ScopeContextualBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Scoping/ScopeProvider.cs (91%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Scoping/ScopeReference.cs (100%) diff --git a/src/Umbraco.Abstractions/Scoping/IScopeContext.cs b/src/Umbraco.Abstractions/Scoping/IScopeContext.cs index 0a267e67e2..719cc5f0ad 100644 --- a/src/Umbraco.Abstractions/Scoping/IScopeContext.cs +++ b/src/Umbraco.Abstractions/Scoping/IScopeContext.cs @@ -8,7 +8,7 @@ namespace Umbraco.Core.Scoping /// A scope context can enlist objects that will be attached to the scope, and available /// for the duration of the scope. In addition, it can enlist actions, that will run when the /// scope is exiting, and after the database transaction has been committed. - public interface IScopeContext + public interface IScopeContext : IInstanceIdentifiable { /// /// Enlists an action. @@ -46,5 +46,7 @@ namespace Umbraco.Core.Scoping /// The object unique identifier. /// The enlisted object, if any, else the default value. T GetEnlisted(string key); + + void ScopeExit(bool completed); } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 22b5230e54..7adc7fd0ee 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -155,7 +155,6 @@ - @@ -215,12 +214,6 @@ - - - - - - diff --git a/src/Umbraco.Core/Events/QueuingEventDispatcher.cs b/src/Umbraco.Infrastructure/Events/QueuingEventDispatcher.cs similarity index 71% rename from src/Umbraco.Core/Events/QueuingEventDispatcher.cs rename to src/Umbraco.Infrastructure/Events/QueuingEventDispatcher.cs index 88b527e753..6260aaa176 100644 --- a/src/Umbraco.Core/Events/QueuingEventDispatcher.cs +++ b/src/Umbraco.Infrastructure/Events/QueuingEventDispatcher.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Composing; +using Umbraco.Composing; +using Umbraco.Core.Composing; using Umbraco.Core.IO; namespace Umbraco.Core.Events @@ -7,11 +8,14 @@ namespace Umbraco.Core.Events /// An IEventDispatcher that queues events, and raise them when the scope /// exits and has been completed. /// - internal class QueuingEventDispatcher : QueuingEventDispatcherBase + public class QueuingEventDispatcher : QueuingEventDispatcherBase { - public QueuingEventDispatcher() + private readonly IMediaFileSystem _mediaFileSystem; + public QueuingEventDispatcher(IMediaFileSystem mediaFileSystem) : base(true) - { } + { + _mediaFileSystem = mediaFileSystem; + } protected override void ScopeExitCompleted() { @@ -28,13 +32,11 @@ namespace Umbraco.Core.Events // but then where should it be (without making things too complicated)? var delete = e.Args as IDeletingMediaFilesEventArgs; if (delete != null && delete.MediaFilesToDelete.Count > 0) - MediaFileSystem.DeleteMediaFiles(delete.MediaFilesToDelete); + _mediaFileSystem.DeleteMediaFiles(delete.MediaFilesToDelete); } } - private IMediaFileSystem _mediaFileSystem; - // TODO: inject - private IMediaFileSystem MediaFileSystem => _mediaFileSystem ?? (_mediaFileSystem = Current.MediaFileSystem); + } } diff --git a/src/Umbraco.Infrastructure/Scoping/CallContext.cs b/src/Umbraco.Infrastructure/Scoping/CallContext.cs new file mode 100644 index 0000000000..7b256434cd --- /dev/null +++ b/src/Umbraco.Infrastructure/Scoping/CallContext.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace Umbraco.Core.Scoping +{ + /// + /// Provides a way to set contextual data that flows with the call and + /// async context of a test or invocation. + /// + public static class CallContext + { + private static readonly ConcurrentDictionary _state = new ConcurrentDictionary(); + + /// + /// Stores a given object and associates it with the specified name. + /// + /// The name with which to associate the new item in the call context. + /// The object to store in the call context. + public static void SetData(string name, Guid? data) + { + _state[name + Thread.CurrentThread.ManagedThreadId] = data; + } + + + /// + /// Retrieves an object with the specified name from the . + /// + /// The name of the item in the call context. + /// The object in the call context associated with the specified name, or if not found. + public static Guid? GetData(string name) + { + return _state.TryGetValue(name + Thread.CurrentThread.ManagedThreadId, out var data) ? data : null; + } + + public static bool RemoveData(string name) + { + return _state.TryRemove(name+ Thread.CurrentThread.ManagedThreadId, out _); + } + } +} diff --git a/src/Umbraco.Core/Scoping/IScopeAccessor.cs b/src/Umbraco.Infrastructure/Scoping/IScopeAccessor.cs similarity index 100% rename from src/Umbraco.Core/Scoping/IScopeAccessor.cs rename to src/Umbraco.Infrastructure/Scoping/IScopeAccessor.cs diff --git a/src/Umbraco.Core/Scoping/Scope.cs b/src/Umbraco.Infrastructure/Scoping/Scope.cs similarity index 92% rename from src/Umbraco.Core/Scoping/Scope.cs rename to src/Umbraco.Infrastructure/Scoping/Scope.cs index 3eabfbca9b..8f7a0bf958 100644 --- a/src/Umbraco.Core/Scoping/Scope.cs +++ b/src/Umbraco.Infrastructure/Scoping/Scope.cs @@ -2,6 +2,7 @@ using System.Data; using Umbraco.Core.Cache; using Umbraco.Core.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -16,6 +17,8 @@ namespace Umbraco.Core.Scoping internal class Scope : IScope { private readonly ScopeProvider _scopeProvider; + private readonly ICoreDebug _coreDebug; + private readonly IMediaFileSystem _mediaFileSystem; private readonly ILogger _logger; private readonly ITypeFinder _typeFinder; @@ -36,7 +39,9 @@ namespace Umbraco.Core.Scoping // initializes a new scope private Scope(ScopeProvider scopeProvider, - ILogger logger, ITypeFinder typeFinder, FileSystems fileSystems, Scope parent, ScopeContext scopeContext, bool detachable, + ICoreDebug coreDebug, + IMediaFileSystem mediaFileSystem, + ILogger logger, ITypeFinder typeFinder, FileSystems fileSystems, Scope parent, IScopeContext scopeContext, bool detachable, IsolationLevel isolationLevel = IsolationLevel.Unspecified, RepositoryCacheMode repositoryCacheMode = RepositoryCacheMode.Unspecified, IEventDispatcher eventDispatcher = null, @@ -45,6 +50,8 @@ namespace Umbraco.Core.Scoping bool autoComplete = false) { _scopeProvider = scopeProvider; + _coreDebug = coreDebug; + _mediaFileSystem = mediaFileSystem; _logger = logger; _typeFinder = typeFinder; @@ -111,18 +118,22 @@ namespace Umbraco.Core.Scoping // initializes a new scope public Scope(ScopeProvider scopeProvider, - ILogger logger, ITypeFinder typeFinder, FileSystems fileSystems, bool detachable, ScopeContext scopeContext, + ICoreDebug coreDebug, + IMediaFileSystem mediaFileSystem, + ILogger logger, ITypeFinder typeFinder, FileSystems fileSystems, bool detachable, IScopeContext scopeContext, IsolationLevel isolationLevel = IsolationLevel.Unspecified, RepositoryCacheMode repositoryCacheMode = RepositoryCacheMode.Unspecified, IEventDispatcher eventDispatcher = null, bool? scopeFileSystems = null, bool callContext = false, bool autoComplete = false) - : this(scopeProvider, logger, typeFinder, fileSystems, null, scopeContext, detachable, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete) + : this(scopeProvider, coreDebug, mediaFileSystem, logger, typeFinder, fileSystems, null, scopeContext, detachable, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete) { } // initializes a new scope in a nested scopes chain, with its parent public Scope(ScopeProvider scopeProvider, + ICoreDebug coreDebug, + IMediaFileSystem mediaFileSystem, ILogger logger, ITypeFinder typeFinder, FileSystems fileSystems, Scope parent, IsolationLevel isolationLevel = IsolationLevel.Unspecified, RepositoryCacheMode repositoryCacheMode = RepositoryCacheMode.Unspecified, @@ -130,7 +141,7 @@ namespace Umbraco.Core.Scoping bool? scopeFileSystems = null, bool callContext = false, bool autoComplete = false) - : this(scopeProvider, logger, typeFinder, fileSystems, parent, null, false, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete) + : this(scopeProvider, coreDebug, mediaFileSystem, logger, typeFinder, fileSystems, parent, null, false, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete) { } public Guid InstanceId { get; } = Guid.NewGuid(); @@ -194,10 +205,10 @@ namespace Umbraco.Core.Scoping public Scope OrigScope { get; set; } // the original context (when attaching a detachable scope) - public ScopeContext OrigContext { get; set; } + public IScopeContext OrigContext { get; set; } // the context (for attaching & detaching only) - public ScopeContext Context { get; } + public IScopeContext Context { get; } public IsolationLevel IsolationLevel { @@ -289,7 +300,7 @@ namespace Umbraco.Core.Scoping { EnsureNotDisposed(); if (ParentScope != null) return ParentScope.Events; - return _eventDispatcher ?? (_eventDispatcher = new QueuingEventDispatcher()); + return _eventDispatcher ?? (_eventDispatcher = new QueuingEventDispatcher(_mediaFileSystem)); } } @@ -484,8 +495,8 @@ namespace Umbraco.Core.Scoping // caching config // true if Umbraco.CoreDebug.LogUncompletedScope appSetting is set to "true" - private static bool LogUncompletedScopes => (_logUncompletedScopes - ?? (_logUncompletedScopes = Current.Configs.CoreDebug().LogUncompletedScopes)).Value; + private bool LogUncompletedScopes => (_logUncompletedScopes + ?? (_logUncompletedScopes = _coreDebug.LogUncompletedScopes)).Value; /// public void ReadLock(params int[] lockIds) => Database.SqlContext.SqlSyntax.ReadLock(Database, lockIds); diff --git a/src/Umbraco.Core/Scoping/ScopeContext.cs b/src/Umbraco.Infrastructure/Scoping/ScopeContext.cs similarity index 100% rename from src/Umbraco.Core/Scoping/ScopeContext.cs rename to src/Umbraco.Infrastructure/Scoping/ScopeContext.cs diff --git a/src/Umbraco.Core/Scoping/ScopeContextualBase.cs b/src/Umbraco.Infrastructure/Scoping/ScopeContextualBase.cs similarity index 100% rename from src/Umbraco.Core/Scoping/ScopeContextualBase.cs rename to src/Umbraco.Infrastructure/Scoping/ScopeContextualBase.cs diff --git a/src/Umbraco.Core/Scoping/ScopeProvider.cs b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs similarity index 91% rename from src/Umbraco.Core/Scoping/ScopeProvider.cs rename to src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs index c8b5b05f59..ef3afb2dac 100644 --- a/src/Umbraco.Core/Scoping/ScopeProvider.cs +++ b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs @@ -1,13 +1,15 @@ using System; using System.Collections.Generic; using System.Data; -using System.Runtime.Remoting.Messaging; using Umbraco.Core.Cache; using Umbraco.Core.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; +using Current = Umbraco.Composing.Current; + #if DEBUG_SCOPES using System.Linq; using System.Text; @@ -24,15 +26,18 @@ namespace Umbraco.Core.Scoping private readonly ITypeFinder _typeFinder; private readonly IRequestCache _requestCache; private readonly FileSystems _fileSystems; + private readonly ICoreDebug _coreDebug; + private readonly IMediaFileSystem _mediaFileSystem; - public ScopeProvider(IUmbracoDatabaseFactory databaseFactory, FileSystems fileSystems, ILogger logger, ITypeFinder typeFinder, IRequestCache requestCache) + public ScopeProvider(IUmbracoDatabaseFactory databaseFactory, FileSystems fileSystems, ICoreDebug coreDebug, IMediaFileSystem mediaFileSystem, ILogger logger, ITypeFinder typeFinder, IRequestCache requestCache) { DatabaseFactory = databaseFactory; _fileSystems = fileSystems; + _coreDebug = coreDebug; + _mediaFileSystem = mediaFileSystem; _logger = logger; _typeFinder = typeFinder; _requestCache = requestCache; - // take control of the FileSystems _fileSystems.IsScoped = () => AmbientScope != null && AmbientScope.ScopedFileSystems; @@ -105,12 +110,12 @@ namespace Umbraco.Core.Scoping private static T GetCallContextObject(string key) where T : class { - var objectKey = CallContext.LogicalGetData(key).AsGuid(); - if (objectKey == Guid.Empty) return null; + var objectKey = CallContext.GetData(key); + if (objectKey is null) return null; lock (StaticCallContextObjectsLock) { - if (StaticCallContextObjects.TryGetValue(objectKey, out object callContextObject)) + if (StaticCallContextObjects.TryGetValue(objectKey.Value, out object callContextObject)) { #if DEBUG_SCOPES Current.Logger.Debug("Got " + typeof(T).Name + " Object " + objectKey.ToString("N").Substring(0, 8)); @@ -120,7 +125,7 @@ namespace Umbraco.Core.Scoping } // hard to inject into a static method :( - Current.Logger.Warn("Missed {TypeName} Object {ObjectKey}", typeof(T).Name, objectKey.ToString("N").Substring(0, 8)); + Current.Logger.Warn("Missed {TypeName} Object {ObjectKey}", typeof(T).Name, objectKey.Value.ToString("N").Substring(0, 8)); #if DEBUG_SCOPES //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); #endif @@ -136,7 +141,7 @@ namespace Umbraco.Core.Scoping if (key == ScopeItemKey) { // first, null-register the existing value - var ambientKey = CallContext.LogicalGetData(ScopeItemKey).AsGuid(); + var ambientKey = CallContext.GetData(ScopeItemKey).AsGuid(); object o = null; lock (StaticCallContextObjectsLock) { @@ -152,16 +157,16 @@ namespace Umbraco.Core.Scoping #endif if (value == null) { - var objectKey = CallContext.LogicalGetData(key).AsGuid(); - CallContext.FreeNamedDataSlot(key); - if (objectKey == default) return; + var objectKey = CallContext.GetData(key); + CallContext.RemoveData(key); + if (objectKey is null) return; lock (StaticCallContextObjectsLock) { #if DEBUG_SCOPES Current.Logger.Debug("Remove Object " + objectKey.ToString("N").Substring(0, 8)); //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); #endif - StaticCallContextObjects.Remove(objectKey); + StaticCallContextObjects.Remove(objectKey.Value); } } else @@ -178,7 +183,7 @@ namespace Umbraco.Core.Scoping #endif StaticCallContextObjects.Add(objectKey, value); } - CallContext.LogicalSetData(key, objectKey); + CallContext.SetData(key, objectKey); } } @@ -228,13 +233,13 @@ namespace Umbraco.Core.Scoping internal const string ContextItemKey = "Umbraco.Core.Scoping.ScopeContext"; - public ScopeContext AmbientContext + public IScopeContext AmbientContext { get { // try http context, fallback onto call context - var value = GetHttpContextObject(ContextItemKey, false); - return value ?? GetCallContextObject(ContextItemKey); + var value = GetHttpContextObject(ContextItemKey, false); + return value ?? GetCallContextObject(ContextItemKey); } set { @@ -285,7 +290,7 @@ namespace Umbraco.Core.Scoping #endregion - public void SetAmbient(Scope scope, ScopeContext context = null) + public void SetAmbient(Scope scope, IScopeContext context = null) { // clear all SetHttpContextObject(ScopeItemKey, null, false); @@ -319,7 +324,7 @@ namespace Umbraco.Core.Scoping IEventDispatcher eventDispatcher = null, bool? scopeFileSystems = null) { - return new Scope(this, _logger, _typeFinder, _fileSystems, true, null, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems); + return new Scope(this, _coreDebug, _mediaFileSystem, _logger, _typeFinder, _fileSystems, true, null, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems); } /// @@ -375,13 +380,13 @@ namespace Umbraco.Core.Scoping { var ambientContext = AmbientContext; var newContext = ambientContext == null ? new ScopeContext() : null; - var scope = new Scope(this, _logger, _typeFinder, _fileSystems, false, newContext, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete); + var scope = new Scope(this, _coreDebug, _mediaFileSystem, _logger, _typeFinder, _fileSystems, false, newContext, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete); // assign only if scope creation did not throw! SetAmbient(scope, newContext ?? ambientContext); return scope; } - var nested = new Scope(this, _logger, _typeFinder, _fileSystems, ambientScope, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete); + var nested = new Scope(this, _coreDebug, _mediaFileSystem, _logger, _typeFinder, _fileSystems, ambientScope, isolationLevel, repositoryCacheMode, eventDispatcher, scopeFileSystems, callContext, autoComplete); SetAmbient(nested, AmbientContext); return nested; } diff --git a/src/Umbraco.Core/Scoping/ScopeReference.cs b/src/Umbraco.Infrastructure/Scoping/ScopeReference.cs similarity index 100% rename from src/Umbraco.Core/Scoping/ScopeReference.cs rename to src/Umbraco.Infrastructure/Scoping/ScopeReference.cs diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index f3fe26ca76..8e9baebbf0 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -28,18 +28,7 @@ <_UnmanagedRegistrationCache Remove="obj\Umbraco.Infrastructure.csproj.UnmanagedRegistration.cache" /> - - - - - - - - - - - - + @@ -65,8 +54,11 @@ - + + + + diff --git a/src/Umbraco.Tests/Components/ComponentTests.cs b/src/Umbraco.Tests/Components/ComponentTests.cs index 880a1161fa..7166d17c3f 100644 --- a/src/Umbraco.Tests/Components/ComponentTests.cs +++ b/src/Umbraco.Tests/Components/ComponentTests.cs @@ -38,7 +38,9 @@ namespace Umbraco.Tests.Components var typeFinder = new TypeFinder(logger); var f = new UmbracoDatabaseFactory(logger, new Lazy(() => new MapperCollection(Enumerable.Empty())), TestHelper.GetConfigs(), TestHelper.DbProviderFactoryCreator, TestHelper.BulkSqlInsertProvider); var fs = new FileSystems(mock.Object, logger, TestHelper.IOHelper, SettingsForTests.GenerateMockGlobalSettings()); - var p = new ScopeProvider(f, fs, logger, typeFinder, NoAppCache.Instance); + var coreDebug = Mock.Of(); + var mediaFileSystem = Mock.Of(); + var p = new ScopeProvider(f, fs, coreDebug, mediaFileSystem, logger, typeFinder, NoAppCache.Instance); mock.Setup(x => x.GetInstance(typeof (ILogger))).Returns(logger); mock.Setup(x => x.GetInstance(typeof (IProfilingLogger))).Returns(new ProfilingLogger(Mock.Of(), Mock.Of())); diff --git a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs index 0824501059..56d8e320e1 100644 --- a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs @@ -337,7 +337,7 @@ namespace Umbraco.Tests.Scoping { var counter = 0; IScope ambientScope = null; - ScopeContext ambientContext = null; + IScopeContext ambientContext = null; Guid value = Guid.Empty; var scopeProvider = _testObjects.GetScopeProvider(Mock.Of()) as ScopeProvider; diff --git a/src/Umbraco.Tests/Scoping/ScopeTests.cs b/src/Umbraco.Tests/Scoping/ScopeTests.cs index b2a3b14800..d1f77d4ae0 100644 --- a/src/Umbraco.Tests/Scoping/ScopeTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeTests.cs @@ -8,7 +8,10 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; -using ScopeProviderStatic = Umbraco.Core.Scoping.ScopeProvider; +using CallContext = Umbraco.Core.Scoping.CallContext; + +//using CallContext = Umbraco.Core.Scoping.CallContext; + namespace Umbraco.Tests.Scoping { @@ -123,7 +126,7 @@ namespace Umbraco.Tests.Scoping Assert.AreSame(scope, ((Scope) nested).ParentScope); // it's moved over to call context - var callContextKey = CallContext.LogicalGetData(ScopeProviderStatic.ScopeItemKey).AsGuid(); + var callContextKey = CallContext.GetData(ScopeProvider.ScopeItemKey).AsGuid(); Assert.AreNotEqual(Guid.Empty, callContextKey); // only if Core.DEBUG_SCOPES are defined @@ -485,7 +488,7 @@ namespace Umbraco.Tests.Scoping bool? completed = null; IScope ambientScope = null; - ScopeContext ambientContext = null; + IScopeContext ambientContext = null; Assert.IsNull(scopeProvider.AmbientScope); using (var scope = scopeProvider.CreateScope()) diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index d5272f34b0..649c1e1f1e 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -248,7 +248,9 @@ namespace Umbraco.Tests.TestHelpers typeFinder = typeFinder ?? new TypeFinder(logger); fileSystems = fileSystems ?? new FileSystems(Current.Factory, logger, TestHelper.IOHelper, SettingsForTests.GenerateMockGlobalSettings()); - var scopeProvider = new ScopeProvider(databaseFactory, fileSystems, logger, typeFinder, NoAppCache.Instance); + var coreDebug = Current.Configs.CoreDebug(); + var mediaFileSystem = Mock.Of(); + var scopeProvider = new ScopeProvider(databaseFactory, fileSystems, coreDebug, mediaFileSystem, logger, typeFinder, NoAppCache.Instance); return scopeProvider; } diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 85ee03918c..ef8a0bc599 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -23,7 +23,6 @@ using Umbraco.Web.Security; using Umbraco.Web.Routing; using File = System.IO.File; using Umbraco.Core.Composing; -using Umbraco.Core.Hosting; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Scoping; using Umbraco.Tests.Testing; diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index c88fd353c1..8b6553ff80 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Reflection; +using System.Threading; using System.Xml.Linq; using Examine; using Moq; @@ -64,6 +65,7 @@ namespace Umbraco.Tests.Testing /// provides all the necessary environment, through DI. Yes, DI is bad in tests - unit tests. /// But it is OK in integration tests. /// + [Apartment(ApartmentState.STA)] public abstract class UmbracoTestBase { // this class From 9a6c976f6e03a2e65cf3e9f56bb121ddbb1c69c9 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 15:06:51 +0100 Subject: [PATCH 02/19] AB3791 - Moved scoping to infrastructure, implemented our own CallContext --- src/Umbraco.Core/Umbraco.Core.csproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 7adc7fd0ee..9321f1784c 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -647,11 +647,5 @@ Umbraco.Infrastructure - - - - - - \ No newline at end of file From 17a586ed0c4d9abc02f359e3a94ab443a19e6d09 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 15:11:56 +0100 Subject: [PATCH 03/19] AB4227 - Moved dtos and made some public to let then be known by the web project --- src/Umbraco.Core/Umbraco.Core.csproj | 51 ------------------- .../Persistence/Dtos/AccessDto.cs | 0 .../Persistence/Dtos/AccessRuleDto.cs | 0 .../Persistence/Dtos/AuditEntryDto.cs | 0 .../Persistence/Dtos/CacheInstructionDto.cs | 2 +- .../Persistence/Dtos/ConsentDto.cs | 0 .../Persistence/Dtos/ContentDto.cs | 2 +- .../Persistence/Dtos/ContentNuDto.cs | 2 +- .../Persistence/Dtos/ContentScheduleDto.cs | 0 .../Dtos/ContentType2ContentTypeDto.cs | 0 .../Dtos/ContentTypeAllowedContentTypeDto.cs | 0 .../Persistence/Dtos/ContentTypeDto.cs | 0 .../Dtos/ContentTypeTemplateDto.cs | 0 .../Dtos/ContentVersionCultureVariationDto.cs | 0 .../Persistence/Dtos/ContentVersionDto.cs | 2 +- .../Persistence/Dtos/DataTypeDto.cs | 0 .../Persistence/Dtos/DictionaryDto.cs | 0 .../Dtos/DocumentCultureVariationDto.cs | 0 .../Persistence/Dtos/DocumentDto.cs | 2 +- .../Dtos/DocumentPublishedReadOnlyDto.cs | 0 .../Persistence/Dtos/DocumentVersionDto.cs | 2 +- .../Persistence/Dtos/DomainDto.cs | 0 .../Persistence/Dtos/ExternalLoginDto.cs | 0 .../Persistence/Dtos/KeyValueDto.cs | 0 .../Persistence/Dtos/LanguageDto.cs | 0 .../Persistence/Dtos/LanguageTextDto.cs | 0 .../Persistence/Dtos/LockDto.cs | 0 .../Persistence/Dtos/LogDto.cs | 0 .../Persistence/Dtos/MacroDto.cs | 0 .../Persistence/Dtos/MacroPropertyDto.cs | 0 .../Persistence/Dtos/MediaDto.cs | 0 .../Persistence/Dtos/MediaVersionDto.cs | 0 .../Persistence/Dtos/Member2MemberGroupDto.cs | 0 .../Persistence/Dtos/MemberDto.cs | 0 .../Persistence/Dtos/MemberPropertyTypeDto.cs | 0 .../Persistence/Dtos/PropertyDataDto.cs | 0 .../Persistence/Dtos/PropertyTypeCommonDto.cs | 0 .../Persistence/Dtos/PropertyTypeDto.cs | 0 .../Persistence/Dtos/PropertyTypeGroupDto.cs | 0 .../Dtos/PropertyTypeGroupReadOnlyDto.cs | 0 .../Dtos/PropertyTypeReadOnlyDto.cs | 0 .../Persistence/Dtos/RedirectUrlDto.cs | 0 .../Persistence/Dtos/RelationDto.cs | 0 .../Persistence/Dtos/RelationTypeDto.cs | 0 .../Persistence/Dtos/ServerRegistrationDto.cs | 0 .../Persistence/Dtos/TagDto.cs | 0 .../Persistence/Dtos/TagRelationshipDto.cs | 0 .../Persistence/Dtos/TemplateDto.cs | 0 .../Persistence/Dtos/User2NodeNotifyDto.cs | 0 .../Persistence/Dtos/User2UserGroupDto.cs | 0 .../Dtos/UserGroup2NodePermissionDto.cs | 0 .../Persistence/Dtos/UserLoginDto.cs | 0 52 files changed, 6 insertions(+), 57 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/AccessDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/AccessRuleDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/AuditEntryDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/CacheInstructionDto.cs (96%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ConsentDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentDto.cs (97%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentNuDto.cs (97%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentScheduleDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentType2ContentTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentTypeTemplateDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentVersionCultureVariationDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ContentVersionDto.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DataTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DictionaryDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DocumentCultureVariationDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DocumentDto.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DocumentVersionDto.cs (95%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/DomainDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ExternalLoginDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/KeyValueDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/LanguageDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/LanguageTextDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/LockDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/LogDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/MacroDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/MacroPropertyDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/MediaDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/MediaVersionDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/Member2MemberGroupDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/MemberDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/MemberPropertyTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/PropertyDataDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/PropertyTypeCommonDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/PropertyTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/PropertyTypeGroupDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/PropertyTypeReadOnlyDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/RedirectUrlDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/RelationDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/RelationTypeDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/ServerRegistrationDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/TagDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/TagRelationshipDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/TemplateDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/User2NodeNotifyDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/User2UserGroupDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/UserGroup2NodePermissionDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Dtos/UserLoginDto.cs (100%) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9321f1784c..1340f40dbd 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -207,7 +207,6 @@ - @@ -274,14 +273,6 @@ - - - - - - - - @@ -312,48 +303,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Umbraco.Core/Persistence/Dtos/AccessDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/AccessDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/AccessRuleDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/AccessRuleDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/AuditEntryDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/AuditEntryDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/CacheInstructionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs similarity index 96% rename from src/Umbraco.Core/Persistence/Dtos/CacheInstructionDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs index 1fc5eb90a8..7c1af7b522 100644 --- a/src/Umbraco.Core/Persistence/Dtos/CacheInstructionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/CacheInstructionDto.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(Constants.DatabaseSchema.Tables.CacheInstruction)] [PrimaryKey("id")] [ExplicitColumns] - internal class CacheInstructionDto + public class CacheInstructionDto { [Column("id")] [NullSetting(NullSetting = NullSettings.NotNull)] diff --git a/src/Umbraco.Core/Persistence/Dtos/ConsentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ConsentDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs similarity index 97% rename from src/Umbraco.Core/Persistence/Dtos/ContentDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs index aae5d0d407..56d87ad296 100644 --- a/src/Umbraco.Core/Persistence/Dtos/ContentDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentDto.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(TableName)] [PrimaryKey("nodeId", AutoIncrement = false)] [ExplicitColumns] - internal class ContentDto + public class ContentDto { public const string TableName = Constants.DatabaseSchema.Tables.Content; diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentNuDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs similarity index 97% rename from src/Umbraco.Core/Persistence/Dtos/ContentNuDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs index c6269d5317..a611186021 100644 --- a/src/Umbraco.Core/Persistence/Dtos/ContentNuDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentNuDto.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(Constants.DatabaseSchema.Tables.NodeData)] [PrimaryKey("nodeId", AutoIncrement = false)] [ExplicitColumns] - internal class ContentNuDto + public class ContentNuDto { [Column("nodeId")] [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsContentNu", OnColumns = "nodeId, published")] diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentScheduleDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ContentScheduleDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentType2ContentTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentType2ContentTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ContentType2ContentTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentType2ContentTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeAllowedContentTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ContentTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentTypeTemplateDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeTemplateDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ContentTypeTemplateDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentTypeTemplateDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentVersionCultureVariationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ContentVersionCultureVariationDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ContentVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs similarity index 98% rename from src/Umbraco.Core/Persistence/Dtos/ContentVersionDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs index 3c2c3deda4..9b7a3ff001 100644 --- a/src/Umbraco.Core/Persistence/Dtos/ContentVersionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs @@ -8,7 +8,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(TableName)] [PrimaryKey("id")] [ExplicitColumns] - internal class ContentVersionDto + public class ContentVersionDto { public const string TableName = Constants.DatabaseSchema.Tables.ContentVersion; private int? _userId; diff --git a/src/Umbraco.Core/Persistence/Dtos/DataTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/DataTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DataTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/DictionaryDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DictionaryDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/DictionaryDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DictionaryDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/DocumentCultureVariationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentCultureVariationDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/DocumentCultureVariationDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DocumentCultureVariationDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/DocumentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs similarity index 98% rename from src/Umbraco.Core/Persistence/Dtos/DocumentDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs index abe13a0e23..7893d2583a 100644 --- a/src/Umbraco.Core/Persistence/Dtos/DocumentDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentDto.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(TableName)] [PrimaryKey("nodeId", AutoIncrement = false)] [ExplicitColumns] - internal class DocumentDto + public class DocumentDto { private const string TableName = Constants.DatabaseSchema.Tables.Document; diff --git a/src/Umbraco.Core/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/DocumentVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs similarity index 95% rename from src/Umbraco.Core/Persistence/Dtos/DocumentVersionDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs index 5697d188e9..23e784e5fb 100644 --- a/src/Umbraco.Core/Persistence/Dtos/DocumentVersionDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentVersionDto.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(TableName)] [PrimaryKey("id", AutoIncrement = false)] [ExplicitColumns] - internal class DocumentVersionDto + public class DocumentVersionDto { private const string TableName = Constants.DatabaseSchema.Tables.DocumentVersion; diff --git a/src/Umbraco.Core/Persistence/Dtos/DomainDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DomainDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/DomainDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/DomainDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ExternalLoginDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ExternalLoginDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/KeyValueDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/KeyValueDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/LanguageDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/LanguageDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/LanguageDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/LanguageTextDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LanguageTextDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/LanguageTextDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/LanguageTextDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/LockDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LockDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/LockDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/LockDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/LogDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/LogDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/MacroDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MacroDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/MacroDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/MacroDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/MacroPropertyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MacroPropertyDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/MacroPropertyDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/MacroPropertyDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/MediaDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MediaDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/MediaDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/MediaDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/MediaVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MediaVersionDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/MediaVersionDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/MediaVersionDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/Member2MemberGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/Member2MemberGroupDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/Member2MemberGroupDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/Member2MemberGroupDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/MemberDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/MemberDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/MemberPropertyTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberPropertyTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/MemberPropertyTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/MemberPropertyTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/PropertyDataDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyDataDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/PropertyDataDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/PropertyDataDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/PropertyTypeCommonDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeCommonDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/PropertyTypeCommonDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeCommonDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/PropertyTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/PropertyTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/PropertyTypeGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/PropertyTypeGroupDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeGroupReadOnlyDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/PropertyTypeReadOnlyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeReadOnlyDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/PropertyTypeReadOnlyDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/PropertyTypeReadOnlyDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/RedirectUrlDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RedirectUrlDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/RedirectUrlDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/RedirectUrlDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/RelationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/RelationDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/RelationTypeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationTypeDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/RelationTypeDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/RelationTypeDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/ServerRegistrationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/ServerRegistrationDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/TagDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TagDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/TagDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/TagDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/TagRelationshipDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TagRelationshipDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/TagRelationshipDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/TagRelationshipDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/TemplateDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/TemplateDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/TemplateDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/TemplateDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/User2NodeNotifyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/User2NodeNotifyDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/User2UserGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/User2UserGroupDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/User2UserGroupDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/User2UserGroupDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/UserGroup2NodePermissionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodePermissionDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/UserGroup2NodePermissionDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2NodePermissionDto.cs diff --git a/src/Umbraco.Core/Persistence/Dtos/UserLoginDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserLoginDto.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Dtos/UserLoginDto.cs rename to src/Umbraco.Infrastructure/Persistence/Dtos/UserLoginDto.cs From 7c1e81db0dac2ba9fe8d33c3b0d4f0fbcdd93dba Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 15:20:35 +0100 Subject: [PATCH 04/19] AB4227 - Moved persistence mappers --- src/Umbraco.Core/Umbraco.Core.csproj | 35 ++----------------- .../Persistence/Mappers/AccessMapper.cs | 0 .../Persistence/Mappers/AuditEntryMapper.cs | 0 .../Persistence/Mappers/AuditItemMapper.cs | 0 .../Persistence/Mappers/ConsentMapper.cs | 0 .../Persistence/Mappers/ContentMapper.cs | 0 .../Persistence/Mappers/ContentTypeMapper.cs | 0 .../Persistence/Mappers/DataTypeMapper.cs | 0 .../Persistence/Mappers/DictionaryMapper.cs | 0 .../Mappers/DictionaryTranslationMapper.cs | 0 .../Persistence/Mappers/DomainMapper.cs | 0 .../Mappers/ExternalLoginMapper.cs | 0 .../Persistence/Mappers/LanguageMapper.cs | 0 .../Persistence/Mappers/MacroMapper.cs | 0 .../Mappers/MapperCollectionBuilder.cs | 0 .../Persistence/Mappers/MediaMapper.cs | 0 .../Persistence/Mappers/MediaTypeMapper.cs | 0 .../Persistence/Mappers/MemberGroupMapper.cs | 0 .../Persistence/Mappers/MemberMapper.cs | 0 .../Persistence/Mappers/MemberTypeMapper.cs | 0 .../Mappers/PropertyGroupMapper.cs | 0 .../Persistence/Mappers/PropertyMapper.cs | 0 .../Persistence/Mappers/PropertyTypeMapper.cs | 0 .../Persistence/Mappers/RelationMapper.cs | 0 .../Persistence/Mappers/RelationTypeMapper.cs | 0 .../Mappers/ServerRegistrationMapper.cs | 0 .../Mappers/SimpleContentTypeMapper.cs | 0 .../Persistence/Mappers/TagMapper.cs | 0 .../Persistence/Mappers/TemplateMapper.cs | 0 .../Mappers/UmbracoEntityMapper.cs | 0 .../Persistence/Mappers/UserGroupMapper.cs | 0 .../Persistence/Mappers/UserMapper.cs | 0 .../Persistence/Mappers/UserSectionMapper.cs | 0 33 files changed, 3 insertions(+), 32 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/AccessMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/AuditEntryMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/AuditItemMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/ConsentMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/ContentMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/ContentTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/DataTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/DictionaryMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/DictionaryTranslationMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/DomainMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/ExternalLoginMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/LanguageMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MacroMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MapperCollectionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MediaMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MediaTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MemberGroupMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MemberMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/MemberTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/PropertyGroupMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/PropertyMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/PropertyTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/RelationMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/RelationTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/ServerRegistrationMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/SimpleContentTypeMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/TagMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/TemplateMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/UmbracoEntityMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/UserGroupMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/UserMapper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Mappers/UserSectionMapper.cs (100%) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 1340f40dbd..7b47f50a68 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -199,8 +199,6 @@ - - @@ -275,9 +273,6 @@ - - - @@ -325,33 +320,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -596,5 +564,8 @@ Umbraco.Infrastructure + + + \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/AccessMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/AccessMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/AccessMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/AccessMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/AuditEntryMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/AuditEntryMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/AuditEntryMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/AuditEntryMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/AuditItemMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/AuditItemMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/AuditItemMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/AuditItemMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/ConsentMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/ConsentMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/ConsentMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/ConsentMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/ContentMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/ContentMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/ContentTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/ContentTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/DataTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/DataTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/DictionaryMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/DictionaryMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/DictionaryTranslationMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/DictionaryTranslationMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/DomainMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/DomainMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/ExternalLoginMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/ExternalLoginMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/ExternalLoginMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/ExternalLoginMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/LanguageMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/LanguageMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MacroMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MacroMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MacroMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MacroMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MapperCollectionBuilder.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MapperCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MapperCollectionBuilder.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MapperCollectionBuilder.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MediaMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MediaMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MediaMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MediaMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MediaTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MediaTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MediaTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MediaTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MemberGroupMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MemberGroupMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MemberGroupMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MemberGroupMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MemberMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MemberMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/MemberTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MemberTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/MemberTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/MemberTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/PropertyGroupMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/PropertyGroupMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/PropertyMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/PropertyMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/PropertyMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/PropertyTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/PropertyTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/RelationMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/RelationMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/RelationTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/RelationTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/RelationTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/RelationTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/ServerRegistrationMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/ServerRegistrationMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/ServerRegistrationMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/ServerRegistrationMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/SimpleContentTypeMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/SimpleContentTypeMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/SimpleContentTypeMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/SimpleContentTypeMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/TagMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/TagMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/TagMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/TagMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/TemplateMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/TemplateMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/TemplateMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/TemplateMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/UmbracoEntityMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/UmbracoEntityMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/UmbracoEntityMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/UmbracoEntityMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/UserGroupMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/UserGroupMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/UserGroupMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/UserGroupMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/UserMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/UserMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/UserMapper.cs diff --git a/src/Umbraco.Core/Persistence/Mappers/UserSectionMapper.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/UserSectionMapper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Mappers/UserSectionMapper.cs rename to src/Umbraco.Infrastructure/Persistence/Mappers/UserSectionMapper.cs From 7a0e0f77829f81fffa156035e759779200254fcd Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 16:04:31 +0100 Subject: [PATCH 05/19] AB4227 - Moved Persistence.Factories --- .../Implement/DataTypeRepository.cs | 15 ++++++++--- src/Umbraco.Core/Umbraco.Core.csproj | 25 ------------------- .../Models/Membership/UserGroupExtensions.cs | 2 +- .../Persistence/Dtos/UserGroup2AppDto.cs | 2 +- .../Persistence/Dtos/UserGroupDto.cs | 2 +- .../Factories/AuditEntryFactory.cs | 0 .../Persistence/Factories/ConsentFactory.cs | 0 .../Factories/ContentBaseFactory.cs | 0 .../Factories/ContentTypeFactory.cs | 0 .../Persistence/Factories/DataTypeFactory.cs | 12 ++++----- .../Factories/DictionaryItemFactory.cs | 0 .../Factories/DictionaryTranslationFactory.cs | 0 .../Factories/ExternalLoginFactory.cs | 0 .../Persistence/Factories/LanguageFactory.cs | 0 .../Persistence/Factories/MacroFactory.cs | 0 .../Factories/MemberGroupFactory.cs | 0 .../Persistence/Factories/PropertyFactory.cs | 0 .../Factories/PropertyGroupFactory.cs | 0 .../Factories/PublicAccessEntryFactory.cs | 0 .../Persistence/Factories/RelationFactory.cs | 0 .../Factories/RelationTypeFactory.cs | 0 .../Factories/ServerRegistrationFactory.cs | 0 .../Persistence/Factories/TagFactory.cs | 0 .../Persistence/Factories/TemplateFactory.cs | 0 .../Persistence/Factories/UserFactory.cs | 0 .../Persistence/Factories/UserGroupFactory.cs | 0 .../Repositories/DocumentRepositoryTest.cs | 2 +- src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 1 + 28 files changed, 22 insertions(+), 39 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Models/Membership/UserGroupExtensions.cs (97%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/AuditEntryFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/ConsentFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/ContentBaseFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/ContentTypeFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/DataTypeFactory.cs (91%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/DictionaryItemFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/DictionaryTranslationFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/ExternalLoginFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/LanguageFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/MacroFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/MemberGroupFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/PropertyFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/PropertyGroupFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/PublicAccessEntryFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/RelationFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/RelationTypeFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/ServerRegistrationFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/TagFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/TemplateFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/UserFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Factories/UserGroupFactory.cs (100%) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs index 8e40251d6a..1f0d944c7e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs @@ -17,6 +17,7 @@ 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,13 +29,21 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { 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) + public DataTypeRepository(IScopeAccessor scopeAccessor, AppCaches cache, Lazy editors, ILogger logger, IIOHelper ioHelper, Lazy dataTypeService, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper) : base(scopeAccessor, cache, logger) { _editors = editors; _ioHelper = ioHelper; + _dataTypeService = dataTypeService; + _localizedTextService = localizedTextService; + _localizationService = localizationService; + _shortStringHelper = shortStringHelper; } #region Overrides of RepositoryBase @@ -58,7 +67,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } var dtos = Database.Fetch(dataTypeSql); - return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger,_ioHelper)).ToArray(); + return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger,_ioHelper, _dataTypeService.Value, _localizedTextService, _localizationService, _shortStringHelper)).ToArray(); } protected override IEnumerable PerformGetByQuery(IQuery query) @@ -69,7 +78,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var dtos = Database.Fetch(sql); - return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger, _ioHelper)).ToArray(); + return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger, _ioHelper, _dataTypeService.Value, _localizedTextService, _localizationService, _shortStringHelper)).ToArray(); } #endregion diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 7b47f50a68..588e0de045 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -194,7 +194,6 @@ - @@ -205,7 +204,6 @@ - @@ -271,8 +269,6 @@ - - @@ -301,24 +297,6 @@ - - - - - - - - - - - - - - - - - - @@ -564,8 +542,5 @@ Umbraco.Infrastructure - - - \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs b/src/Umbraco.Infrastructure/Models/Membership/UserGroupExtensions.cs similarity index 97% rename from src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs rename to src/Umbraco.Infrastructure/Models/Membership/UserGroupExtensions.cs index b1d0189c56..93c82367d7 100644 --- a/src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs +++ b/src/Umbraco.Infrastructure/Models/Membership/UserGroupExtensions.cs @@ -3,7 +3,7 @@ using Umbraco.Core.Persistence.Dtos; namespace Umbraco.Core.Models.Membership { - internal static class UserGroupExtensions + public static class UserGroupExtensions { public static IReadOnlyUserGroup ToReadOnlyGroup(this IUserGroup group) { diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs index c0ac48b1c5..03ba93fe59 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2AppDto.cs @@ -5,7 +5,7 @@ namespace Umbraco.Core.Persistence.Dtos { [TableName(Constants.DatabaseSchema.Tables.UserGroup2App)] [ExplicitColumns] - internal class UserGroup2AppDto + public class UserGroup2AppDto { [Column("userGroupId")] [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_userGroup2App", OnColumns = "userGroupId, app")] diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs index 3383ed9e3d..0735912c8f 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Persistence.Dtos [TableName(Constants.DatabaseSchema.Tables.UserGroup)] [PrimaryKey("id")] [ExplicitColumns] - internal class UserGroupDto + public class UserGroupDto { public UserGroupDto() { diff --git a/src/Umbraco.Core/Persistence/Factories/AuditEntryFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/AuditEntryFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/AuditEntryFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/AuditEntryFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/ConsentFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ConsentFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/ConsentFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/ConsentFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/ContentBaseFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/ContentBaseFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/ContentBaseFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ContentTypeFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/ContentTypeFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs similarity index 91% rename from src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs index 84cd641ce5..04609b2821 100644 --- a/src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/DataTypeFactory.cs @@ -1,27 +1,25 @@ using System; -using System.Reflection; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using Umbraco.Composing; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.PropertyEditors; -using Current = Umbraco.Core.Composing.Current; +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) + public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors, ILogger logger, IIOHelper ioHelper, IDataTypeService dataTypeService, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper) { 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, Current.Services.DataTypeService, Current.Services.TextService, Current.Services.LocalizationService, Current.ShortStringHelper); + editor = new LabelPropertyEditor(logger, ioHelper,dataTypeService , localizedTextService, localizationService, shortStringHelper); } var dataType = new DataType(editor); diff --git a/src/Umbraco.Core/Persistence/Factories/DictionaryItemFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/DictionaryItemFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/DictionaryItemFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/DictionaryItemFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/DictionaryTranslationFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/DictionaryTranslationFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/DictionaryTranslationFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/DictionaryTranslationFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/ExternalLoginFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ExternalLoginFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/ExternalLoginFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/ExternalLoginFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/LanguageFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/LanguageFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/LanguageFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/LanguageFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/MacroFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/MacroFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/MacroFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/MacroFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/MemberGroupFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/MemberGroupFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/MemberGroupFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/MemberGroupFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/PropertyFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/PropertyFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/PropertyFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/PropertyGroupFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/PropertyGroupFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/PublicAccessEntryFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/PublicAccessEntryFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/PublicAccessEntryFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/PublicAccessEntryFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/RelationFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/RelationFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/RelationFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/RelationFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/RelationTypeFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/RelationTypeFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/RelationTypeFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/RelationTypeFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/ServerRegistrationFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/ServerRegistrationFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/ServerRegistrationFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/ServerRegistrationFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/TagFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/TagFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/TagFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/TagFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/TemplateFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/TemplateFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/UserFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/UserFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/UserFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/UserFactory.cs diff --git a/src/Umbraco.Core/Persistence/Factories/UserGroupFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/UserGroupFactory.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Factories/UserGroupFactory.cs rename to src/Umbraco.Infrastructure/Persistence/Factories/UserGroupFactory.cs diff --git a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs index b7ae1604c5..5c97bdf034 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, TestHelper.IOHelper); + dtdRepository = new DataTypeRepository(scopeAccessor, appCaches, new Lazy(() => editors), Logger, IOHelper, new Lazy(() => DataTypeService), LocalizedTextService, LocalizationService, ShortStringHelper); return ctRepository; } diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 8b6553ff80..5afd937f84 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -51,6 +51,7 @@ using FileSystems = Umbraco.Core.IO.FileSystems; using Umbraco.Web.Templates; using Umbraco.Web.PropertyEditors; using Umbraco.Core.Dictionary; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Services; using Umbraco.Net; From 03631a1731b35fc254f64c80a846ba9f5e84a488 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 16:07:19 +0100 Subject: [PATCH 06/19] AB4227 - Moved Persistence Root --- src/Umbraco.Core/Umbraco.Core.csproj | 18 ------------------ .../Persistence/DatabaseDebugHelper.cs | 0 .../Persistence/DbCommandExtensions.cs | 0 .../Persistence/EntityNotFoundException.cs | 0 .../Persistence/LocalDb.cs | 0 .../Repositories/IContentRepository.cs | 0 .../IContentTypeCommonRepository.cs | 0 .../Repositories/IContentTypeRepository.cs | 0 .../Repositories/IContentTypeRepositoryBase.cs | 0 .../Repositories/IDataTypeRepository.cs | 0 .../IDocumentBlueprintRepository.cs | 0 .../Repositories/IDocumentRepository.cs | 0 .../Repositories/IEntityRepository.cs | 0 .../Repositories/IMediaRepository.cs | 0 .../Repositories/IMediaTypeRepository.cs | 0 .../Repositories/IMemberRepository.cs | 0 .../Repositories/IMemberTypeRepository.cs | 0 .../Repositories/IPublicAccessRepository.cs | 0 .../Persistence/UmbracoDatabaseExtensions.cs | 0 19 files changed, 18 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/DatabaseDebugHelper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/DbCommandExtensions.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/EntityNotFoundException.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/LocalDb.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IContentRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IContentTypeCommonRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IContentTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IContentTypeRepositoryBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IDataTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IDocumentBlueprintRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IDocumentRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IEntityRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IMediaRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IMediaTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IMemberRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IMemberTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/IPublicAccessRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/UmbracoDatabaseExtensions.cs (100%) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 588e0de045..3a4c32cf59 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -205,7 +205,6 @@ - @@ -294,10 +293,6 @@ - - - - @@ -421,18 +416,6 @@ - - - - - - - - - - - - @@ -464,7 +447,6 @@ - diff --git a/src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs b/src/Umbraco.Infrastructure/Persistence/DatabaseDebugHelper.cs similarity index 100% rename from src/Umbraco.Core/Persistence/DatabaseDebugHelper.cs rename to src/Umbraco.Infrastructure/Persistence/DatabaseDebugHelper.cs diff --git a/src/Umbraco.Core/Persistence/DbCommandExtensions.cs b/src/Umbraco.Infrastructure/Persistence/DbCommandExtensions.cs similarity index 100% rename from src/Umbraco.Core/Persistence/DbCommandExtensions.cs rename to src/Umbraco.Infrastructure/Persistence/DbCommandExtensions.cs diff --git a/src/Umbraco.Core/Persistence/EntityNotFoundException.cs b/src/Umbraco.Infrastructure/Persistence/EntityNotFoundException.cs similarity index 100% rename from src/Umbraco.Core/Persistence/EntityNotFoundException.cs rename to src/Umbraco.Infrastructure/Persistence/EntityNotFoundException.cs diff --git a/src/Umbraco.Core/Persistence/LocalDb.cs b/src/Umbraco.Infrastructure/Persistence/LocalDb.cs similarity index 100% rename from src/Umbraco.Core/Persistence/LocalDb.cs rename to src/Umbraco.Infrastructure/Persistence/LocalDb.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IContentRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IContentRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IContentTypeCommonRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeCommonRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IContentTypeCommonRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeCommonRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IContentTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IContentTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IContentTypeRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepositoryBase.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IContentTypeRepositoryBase.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IContentTypeRepositoryBase.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IDataTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IDataTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IDocumentBlueprintRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IDocumentBlueprintRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IDocumentBlueprintRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IDocumentBlueprintRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IDocumentRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IDocumentRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IDocumentRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IDocumentRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IEntityRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IEntityRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IEntityRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IEntityRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IMediaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IMediaRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IMediaRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IMediaRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IMediaTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IMediaTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IMediaTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IMediaTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IMemberRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IMemberRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IMemberRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IMemberRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IMemberTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IMemberTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IMemberTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IMemberTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/IPublicAccessRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/IPublicAccessRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/IPublicAccessRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/IPublicAccessRepository.cs diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabaseExtensions.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs similarity index 100% rename from src/Umbraco.Core/Persistence/UmbracoDatabaseExtensions.cs rename to src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs From a22824e33a43e0d8b382cdcba87effb1b29ed430 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Dec 2019 16:30:26 +0100 Subject: [PATCH 07/19] AB4227 - Moved Persistence Repository implementations --- .../Security/IPasswordHasher.cs | 12 ++++ src/Umbraco.Core/ContentExtensions.cs | 24 +------ .../Security/IUserAwarePasswordHasher.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 65 ++----------------- .../Cache/DefaultRepositoryCachePolicy.cs | 0 .../Cache/FullDataSetRepositoryCachePolicy.cs | 0 .../Cache/RepositoryCachePolicyBase.cs | 0 .../SingleItemsOnlyRepositoryCachePolicy.cs | 0 .../ContentExtensions.cs | 31 +++++++++ .../ConventionsHelper.cs | 0 .../Models/Editors/UmbracoEntityReference.cs | 0 .../Models/PathValidationExtensions.cs | 0 .../Implement/AuditEntryRepository.cs | 0 .../Repositories/Implement/AuditRepository.cs | 0 .../Implement/ConsentRepository.cs | 0 .../Implement/ContentRepositoryBase.cs | 2 +- .../Implement/ContentTypeCommonRepository.cs | 0 .../Implement/ContentTypeRepository.cs | 0 .../Implement/ContentTypeRepositoryBase.cs | 0 .../Implement/DataTypeContainerRepository.cs | 0 .../Implement/DataTypeRepository.cs | 0 .../Implement/DictionaryRepository.cs | 0 .../Implement/DocumentBlueprintRepository.cs | 0 .../Implement/DocumentRepository.cs | 2 +- .../DocumentTypeContainerRepository.cs | 0 .../Implement/DomainRepository.cs | 0 .../Implement/EntityContainerRepository.cs | 0 .../Implement/EntityRepository.cs | 0 .../Implement/ExternalLoginRepository.cs | 3 +- .../Repositories/Implement/FileRepository.cs | 0 .../Implement/LanguageRepository.cs | 0 .../Implement/LanguageRepositoryExtensions.cs | 0 .../Repositories/Implement/MacroRepository.cs | 0 .../Repositories/Implement/MediaRepository.cs | 2 +- .../Implement/MediaTypeContainerRepository.cs | 0 .../Implement/MediaTypeRepository.cs | 0 .../Implement/MemberGroupRepository.cs | 0 .../Implement/MemberRepository.cs | 11 ++-- .../Implement/MemberTypeRepository.cs | 0 .../Implement/NPocoRepositoryBase.cs | 2 +- .../Implement/NotificationsRepository.cs | 0 .../Implement/PartialViewMacroRepository.cs | 0 .../Implement/PartialViewRepository.cs | 0 .../Implement/PermissionRepository.cs | 0 .../Implement/PublicAccessRepository.cs | 0 .../Repositories/Implement/QueryType.cs | 2 +- .../Implement/RedirectUrlRepository.cs | 0 .../Implement/RelationRepository.cs | 0 .../Implement/RelationTypeRepository.cs | 0 .../Implement/RepositoryBaseOfTIdTEntity.cs | 2 +- .../Implement/RepositoryCacheKeys.cs | 2 +- .../Implement/ScriptRepository.cs | 9 +-- .../Implement/ServerRegistrationRepository.cs | 0 .../Repositories/Implement/SimilarNodeName.cs | 0 .../Implement/SimpleGetRepository.cs | 0 .../Implement/StylesheetRepository.cs | 8 ++- .../Repositories/Implement/TagRepository.cs | 0 .../Implement/TemplateRepository.cs | 3 +- .../Repositories/Implement/TupleExtensions.cs | 0 .../Implement/UserGroupRepository.cs | 3 +- .../Repositories/Implement/UserRepository.cs | 0 .../DataValueReferenceFactoryCollection.cs | 0 ...aValueReferenceFactoryCollectionBuilder.cs | 0 .../PropertyEditors/IDataValueReference.cs | 0 .../IDataValueReferenceFactory.cs | 0 .../Repositories/MemberRepositoryTest.cs | 2 +- .../Repositories/ScriptRepositoryTest.cs | 2 +- .../Repositories/StylesheetRepositoryTest.cs | 2 +- src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 3 + .../{ => Net}/AspNetBackOfficeInfo.cs | 0 .../{ => Net}/AspNetHttpContextAccessor.cs | 0 src/Umbraco.Web/{ => Net}/AspNetIpResolver.cs | 0 src/Umbraco.Web/Net/AspNetPasswordHasher.cs | 20 ++++++ .../{ => Net}/AspNetSessionIdResolver.cs | 0 src/Umbraco.Web/Runtime/WebInitialComposer.cs | 2 + .../Security/BackOfficeUserManager.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 9 +-- 77 files changed, 111 insertions(+), 116 deletions(-) create mode 100644 src/Umbraco.Abstractions/Security/IPasswordHasher.cs rename src/{Umbraco.Core => Umbraco.Infrastructure}/Cache/DefaultRepositoryCachePolicy.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Cache/FullDataSetRepositoryCachePolicy.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Cache/RepositoryCachePolicyBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Cache/SingleItemsOnlyRepositoryCachePolicy.cs (100%) create mode 100644 src/Umbraco.Infrastructure/ContentExtensions.cs rename src/{Umbraco.Core => Umbraco.Infrastructure}/ConventionsHelper.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Models/Editors/UmbracoEntityReference.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Models/PathValidationExtensions.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/AuditEntryRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/AuditRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ConsentRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ContentRepositoryBase.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ContentTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DataTypeContainerRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DataTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DictionaryRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DocumentRepository.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/DomainRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/EntityContainerRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/EntityRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ExternalLoginRepository.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/FileRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/LanguageRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/LanguageRepositoryExtensions.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MacroRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MediaRepository.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MediaTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MemberGroupRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MemberRepository.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/MemberTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/NPocoRepositoryBase.cs (96%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/NotificationsRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/PartialViewMacroRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/PartialViewRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/PermissionRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/PublicAccessRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/QueryType.cs (95%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/RedirectUrlRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/RelationRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/RelationTypeRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/RepositoryCacheKeys.cs (92%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ScriptRepository.cs (94%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/ServerRegistrationRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/SimilarNodeName.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/SimpleGetRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/StylesheetRepository.cs (95%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/TagRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/TemplateRepository.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/TupleExtensions.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/UserGroupRepository.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Persistence/Repositories/Implement/UserRepository.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/PropertyEditors/DataValueReferenceFactoryCollection.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/PropertyEditors/DataValueReferenceFactoryCollectionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/PropertyEditors/IDataValueReference.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/PropertyEditors/IDataValueReferenceFactory.cs (100%) rename src/Umbraco.Web/{ => Net}/AspNetBackOfficeInfo.cs (100%) rename src/Umbraco.Web/{ => Net}/AspNetHttpContextAccessor.cs (100%) rename src/Umbraco.Web/{ => Net}/AspNetIpResolver.cs (100%) create mode 100644 src/Umbraco.Web/Net/AspNetPasswordHasher.cs rename src/Umbraco.Web/{ => Net}/AspNetSessionIdResolver.cs (100%) diff --git a/src/Umbraco.Abstractions/Security/IPasswordHasher.cs b/src/Umbraco.Abstractions/Security/IPasswordHasher.cs new file mode 100644 index 0000000000..2195570605 --- /dev/null +++ b/src/Umbraco.Abstractions/Security/IPasswordHasher.cs @@ -0,0 +1,12 @@ +namespace Umbraco.Core.Security +{ + public interface IPasswordHasher + { + /// + /// Hashes a password + /// + /// The password. + /// The password hashed. + string HashPassword(string password); + } +} diff --git a/src/Umbraco.Core/ContentExtensions.cs b/src/Umbraco.Core/ContentExtensions.cs index 4fd309f134..29520d0b20 100644 --- a/src/Umbraco.Core/ContentExtensions.cs +++ b/src/Umbraco.Core/ContentExtensions.cs @@ -54,29 +54,7 @@ namespace Umbraco.Core #endregion - /// - /// Removes characters that are not valid XML characters from all entity properties - /// of type string. See: http://stackoverflow.com/a/961504/5018 - /// - /// - /// - /// If this is not done then the xml cache can get corrupt and it will throw YSODs upon reading it. - /// - /// - public static void SanitizeEntityPropertiesForXmlStorage(this IContentBase entity) - { - entity.Name = entity.Name.ToValidXmlString(); - foreach (var property in entity.Properties) - { - foreach (var propertyValue in property.Values) - { - if (propertyValue.EditedValue is string editString) - propertyValue.EditedValue = editString.ToValidXmlString(); - if (propertyValue.PublishedValue is string publishedString) - propertyValue.PublishedValue = publishedString.ToValidXmlString(); - } - } - } + /// /// Checks if the IContentBase has children diff --git a/src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs b/src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs index 48a25c0e2b..4af6d7accd 100644 --- a/src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs +++ b/src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs @@ -8,7 +8,7 @@ namespace Umbraco.Core.Security /// /// /// - public interface IUserAwarePasswordHasher : IPasswordHasher + public interface IUserAwarePasswordHasher : Microsoft.AspNet.Identity.IPasswordHasher where TUser : class, IUser where TKey : IEquatable { diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 3a4c32cf59..7cc8ebd928 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -126,10 +126,6 @@ Constants.cs --> - - - - @@ -147,7 +143,6 @@ - @@ -177,7 +172,6 @@ - @@ -194,18 +188,11 @@ - - - - - - - @@ -268,8 +255,6 @@ - - @@ -402,51 +387,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -524,5 +464,10 @@ Umbraco.Infrastructure + + + + + \ No newline at end of file diff --git a/src/Umbraco.Core/Cache/DefaultRepositoryCachePolicy.cs b/src/Umbraco.Infrastructure/Cache/DefaultRepositoryCachePolicy.cs similarity index 100% rename from src/Umbraco.Core/Cache/DefaultRepositoryCachePolicy.cs rename to src/Umbraco.Infrastructure/Cache/DefaultRepositoryCachePolicy.cs diff --git a/src/Umbraco.Core/Cache/FullDataSetRepositoryCachePolicy.cs b/src/Umbraco.Infrastructure/Cache/FullDataSetRepositoryCachePolicy.cs similarity index 100% rename from src/Umbraco.Core/Cache/FullDataSetRepositoryCachePolicy.cs rename to src/Umbraco.Infrastructure/Cache/FullDataSetRepositoryCachePolicy.cs diff --git a/src/Umbraco.Core/Cache/RepositoryCachePolicyBase.cs b/src/Umbraco.Infrastructure/Cache/RepositoryCachePolicyBase.cs similarity index 100% rename from src/Umbraco.Core/Cache/RepositoryCachePolicyBase.cs rename to src/Umbraco.Infrastructure/Cache/RepositoryCachePolicyBase.cs diff --git a/src/Umbraco.Core/Cache/SingleItemsOnlyRepositoryCachePolicy.cs b/src/Umbraco.Infrastructure/Cache/SingleItemsOnlyRepositoryCachePolicy.cs similarity index 100% rename from src/Umbraco.Core/Cache/SingleItemsOnlyRepositoryCachePolicy.cs rename to src/Umbraco.Infrastructure/Cache/SingleItemsOnlyRepositoryCachePolicy.cs diff --git a/src/Umbraco.Infrastructure/ContentExtensions.cs b/src/Umbraco.Infrastructure/ContentExtensions.cs new file mode 100644 index 0000000000..6bff40e306 --- /dev/null +++ b/src/Umbraco.Infrastructure/ContentExtensions.cs @@ -0,0 +1,31 @@ +using Umbraco.Core.Models; + +namespace Umbraco.Core +{ + public static class ContentExtensions + { + /// + /// Removes characters that are not valid XML characters from all entity properties + /// of type string. See: http://stackoverflow.com/a/961504/5018 + /// + /// + /// + /// If this is not done then the xml cache can get corrupt and it will throw YSODs upon reading it. + /// + /// + public static void SanitizeEntityPropertiesForXmlStorage(this IContentBase entity) + { + entity.Name = entity.Name.ToValidXmlString(); + foreach (var property in entity.Properties) + { + foreach (var propertyValue in property.Values) + { + if (propertyValue.EditedValue is string editString) + propertyValue.EditedValue = editString.ToValidXmlString(); + if (propertyValue.PublishedValue is string publishedString) + propertyValue.PublishedValue = publishedString.ToValidXmlString(); + } + } + } + } +} diff --git a/src/Umbraco.Core/ConventionsHelper.cs b/src/Umbraco.Infrastructure/ConventionsHelper.cs similarity index 100% rename from src/Umbraco.Core/ConventionsHelper.cs rename to src/Umbraco.Infrastructure/ConventionsHelper.cs diff --git a/src/Umbraco.Core/Models/Editors/UmbracoEntityReference.cs b/src/Umbraco.Infrastructure/Models/Editors/UmbracoEntityReference.cs similarity index 100% rename from src/Umbraco.Core/Models/Editors/UmbracoEntityReference.cs rename to src/Umbraco.Infrastructure/Models/Editors/UmbracoEntityReference.cs diff --git a/src/Umbraco.Core/Models/PathValidationExtensions.cs b/src/Umbraco.Infrastructure/Models/PathValidationExtensions.cs similarity index 100% rename from src/Umbraco.Core/Models/PathValidationExtensions.cs rename to src/Umbraco.Infrastructure/Models/PathValidationExtensions.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/AuditEntryRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditEntryRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/AuditEntryRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditEntryRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ConsentRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ConsentRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ConsentRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ConsentRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs similarity index 99% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs index e038dd33b2..90f8d454ac 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs @@ -30,7 +30,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement public static bool ThrowOnWarning = false; } - internal abstract class ContentRepositoryBase : NPocoRepositoryBase, IContentRepository + public abstract class ContentRepositoryBase : NPocoRepositoryBase, IContentRepository where TEntity : class, IContentBase where TRepository : class, IRepository { diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeContainerRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeContainerRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeContainerRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DictionaryRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DictionaryRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs similarity index 99% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs index c6041e8f8c..a05e8cfe7f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs @@ -21,7 +21,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// Represents a repository for doing CRUD operations for . /// - internal class DocumentRepository : ContentRepositoryBase, IDocumentRepository + public class DocumentRepository : ContentRepositoryBase, IDocumentRepository { private readonly IContentTypeRepository _contentTypeRepository; private readonly ITemplateRepository _templateRepository; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DomainRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DomainRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/DomainRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DomainRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityContainerRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityContainerRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs similarity index 99% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs index bb1bd29a8a..6d6a654d4e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Identity; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; @@ -152,7 +151,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement protected override void PersistUpdatedItem(IIdentityUserLogin entity) { entity.UpdatingEntity(); - + var dto = ExternalLoginFactory.BuildDto(entity); Database.Update(dto); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/FileRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/FileRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepositoryExtensions.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepositoryExtensions.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepositoryExtensions.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepositoryExtensions.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs similarity index 99% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs index c813bdaa5a..a48012ac26 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs @@ -21,7 +21,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// Represents a repository for doing CRUD operations for /// - internal class MediaRepository : ContentRepositoryBase, IMediaRepository + public class MediaRepository : ContentRepositoryBase, IMediaRepository { private readonly IMediaTypeRepository _mediaTypeRepository; private readonly ITagRepository _tagRepository; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs similarity index 98% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs index 5bf8ce4419..64266f9df8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Identity; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; @@ -12,6 +11,7 @@ using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Scoping; +using Umbraco.Core.Security; using Umbraco.Core.Services; using static Umbraco.Core.Persistence.SqlExtensionsStatics; @@ -20,14 +20,16 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// Represents a repository for doing CRUD operations for /// - internal class MemberRepository : ContentRepositoryBase, IMemberRepository + public class MemberRepository : ContentRepositoryBase, IMemberRepository { private readonly IMemberTypeRepository _memberTypeRepository; private readonly ITagRepository _tagRepository; + private readonly IPasswordHasher _passwordHasher; private readonly IMemberGroupRepository _memberGroupRepository; public MemberRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository, + IPasswordHasher passwordHasher, Lazy propertyEditors, DataValueReferenceFactoryCollection dataValueReferenceFactories, IDataTypeService dataTypeService) @@ -35,6 +37,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { _memberTypeRepository = memberTypeRepository ?? throw new ArgumentNullException(nameof(memberTypeRepository)); _tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository)); + _passwordHasher = passwordHasher; _memberGroupRepository = memberGroupRepository; } @@ -308,8 +311,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // this will hash the guid with a salt so should be nicely random if (entity.RawPasswordValue.IsNullOrWhiteSpace()) { - var aspHasher = new PasswordHasher(); - dto.Password = Constants.Security.EmptyPasswordPrefix + aspHasher.HashPassword(Guid.NewGuid().ToString("N")); + + dto.Password = Constants.Security.EmptyPasswordPrefix + _passwordHasher.HashPassword(Guid.NewGuid().ToString("N")); entity.RawPasswordValue = dto.Password; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/MemberTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/NPocoRepositoryBase.cs similarity index 96% rename from src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/NPocoRepositoryBase.cs index 23236ec9f0..d72eb9de9b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/NPocoRepositoryBase.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// /// - internal abstract class NPocoRepositoryBase : RepositoryBase + public abstract class NPocoRepositoryBase : RepositoryBase where TEntity : class, IEntity { /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/NotificationsRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/NotificationsRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PartialViewMacroRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PartialViewMacroRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PartialViewRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PartialViewRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PermissionRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PermissionRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PublicAccessRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PublicAccessRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/PublicAccessRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PublicAccessRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/QueryType.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/QueryType.cs similarity index 95% rename from src/Umbraco.Core/Persistence/Repositories/Implement/QueryType.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/QueryType.cs index 8b7ab9285a..7b44bd3955 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/QueryType.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/QueryType.cs @@ -3,7 +3,7 @@ /// /// Specifies the type of base query. /// - internal enum QueryType + public enum QueryType { /// /// Get one single complete item. diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RedirectUrlRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RedirectUrlRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationTypeRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationTypeRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs similarity index 98% rename from src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs index 69e4db5940..e8397ba22a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// The type of the entity managed by this repository. /// The type of the entity's unique identifier. - internal abstract class RepositoryBase : IReadWriteQueryRepository + public abstract class RepositoryBase : IReadWriteQueryRepository where TEntity : class, IEntity { private IRepositoryCachePolicy _cachePolicy; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryCacheKeys.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RepositoryCacheKeys.cs similarity index 92% rename from src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryCacheKeys.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RepositoryCacheKeys.cs index 09a7c021f8..693656eb65 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryCacheKeys.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RepositoryCacheKeys.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// Provides cache keys for repositories. /// - internal static class RepositoryCacheKeys + public static class RepositoryCacheKeys { private static readonly Dictionary Keys = new Dictionary(); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ScriptRepository.cs similarity index 94% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ScriptRepository.cs index 22c3ff3067..498cf51432 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ScriptRepository.cs @@ -2,8 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using Umbraco.Core.Composing; -using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Models; @@ -15,11 +14,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class ScriptRepository : FileRepository, IScriptRepository { private readonly IIOHelper _ioHelper; + private readonly IGlobalSettings _globalSettings; - public ScriptRepository(IFileSystems fileSystems, IIOHelper ioHelper) + public ScriptRepository(IFileSystems fileSystems, IIOHelper ioHelper, IGlobalSettings globalSettings) : base(fileSystems.ScriptsFileSystem) { _ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper)); + _globalSettings = globalSettings; } #region Implementation of IRepository @@ -104,7 +105,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } // validate path & extension - var validDir = Current.Configs.Global().UmbracoScriptsPath; + var validDir = _globalSettings.UmbracoScriptsPath; var isValidPath = _ioHelper.VerifyEditPath(fullPath, validDir); var validExts = new[] {"js"}; var isValidExtension = _ioHelper.VerifyFileExtension(script.Path, validExts); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ServerRegistrationRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ServerRegistrationRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/ServerRegistrationRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ServerRegistrationRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/SimilarNodeName.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/SimilarNodeName.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/SimilarNodeName.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/SimilarNodeName.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/SimpleGetRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/SimpleGetRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/StylesheetRepository.cs similarity index 95% rename from src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/StylesheetRepository.cs index dc60c332cd..c1fb5c3159 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/StylesheetRepository.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using Umbraco.Core.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Models; @@ -13,11 +13,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class StylesheetRepository : FileRepository, IStylesheetRepository { private readonly IIOHelper _ioHelper; + private readonly IGlobalSettings _globalSettings; - public StylesheetRepository(IFileSystems fileSystems, IIOHelper ioHelper) + public StylesheetRepository(IFileSystems fileSystems, IIOHelper ioHelper, IGlobalSettings globalSettings) : base(fileSystems.StylesheetsFileSystem) { _ioHelper = ioHelper; + _globalSettings = globalSettings; } #region Overrides of FileRepository @@ -121,7 +123,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } // validate path and extension - var validDir = Current.Configs.Global().UmbracoCssPath; + var validDir = _globalSettings.UmbracoCssPath; var isValidPath = _ioHelper.VerifyEditPath(fullPath, validDir); var isValidExtension = _ioHelper.VerifyFileExtension(stylesheet.Path, ValidExtensions); return isValidPath && isValidExtension; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TagRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TagRepository.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs similarity index 99% rename from src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs index a26b818ca9..3db94b026e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TemplateRepository.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Text; using NPoco; using Umbraco.Core.Cache; -using Umbraco.Core.Composing; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -635,7 +634,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private void EnsureValidAlias(ITemplate template) { //ensure unique alias - template.Alias = template.Alias.ToCleanString(CleanStringType.UnderscoreAlias); + template.Alias = template.Alias.ToCleanString(_shortStringHelper, CleanStringType.UnderscoreAlias); if (template.Alias.Length > 100) template.Alias = template.Alias.Substring(0, 95); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TupleExtensions.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TupleExtensions.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/TupleExtensions.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TupleExtensions.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserGroupRepository.cs similarity index 99% rename from src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserGroupRepository.cs index b8e4a67d78..1f0ab0cbe7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserGroupRepository.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using NPoco; using Umbraco.Core.Cache; -using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; @@ -19,7 +18,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// Represents the UserGroupRepository for doing CRUD operations for /// - internal class UserGroupRepository : NPocoRepositoryBase, IUserGroupRepository + public class UserGroupRepository : NPocoRepositoryBase, IUserGroupRepository { private readonly IShortStringHelper _shortStringHelper; private readonly UserGroupWithUsersRepository _userGroupWithUsersRepository; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs similarity index 100% rename from src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs rename to src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs diff --git a/src/Umbraco.Core/PropertyEditors/DataValueReferenceFactoryCollection.cs b/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs similarity index 100% rename from src/Umbraco.Core/PropertyEditors/DataValueReferenceFactoryCollection.cs rename to src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollection.cs diff --git a/src/Umbraco.Core/PropertyEditors/DataValueReferenceFactoryCollectionBuilder.cs b/src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Core/PropertyEditors/DataValueReferenceFactoryCollectionBuilder.cs rename to src/Umbraco.Infrastructure/PropertyEditors/DataValueReferenceFactoryCollectionBuilder.cs diff --git a/src/Umbraco.Core/PropertyEditors/IDataValueReference.cs b/src/Umbraco.Infrastructure/PropertyEditors/IDataValueReference.cs similarity index 100% rename from src/Umbraco.Core/PropertyEditors/IDataValueReference.cs rename to src/Umbraco.Infrastructure/PropertyEditors/IDataValueReference.cs diff --git a/src/Umbraco.Core/PropertyEditors/IDataValueReferenceFactory.cs b/src/Umbraco.Infrastructure/PropertyEditors/IDataValueReferenceFactory.cs similarity index 100% rename from src/Umbraco.Core/PropertyEditors/IDataValueReferenceFactory.cs rename to src/Umbraco.Infrastructure/PropertyEditors/IDataValueReferenceFactory.cs diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index a1bca7fc89..b8c823f59e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -41,7 +41,7 @@ namespace Umbraco.Tests.Persistence.Repositories var relationRepository = new RelationRepository(accessor, Logger, relationTypeRepository, entityRepository); var propertyEditors = new Lazy(() => new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty()))); var dataValueReferences = new DataValueReferenceFactoryCollection(Enumerable.Empty()); - var repository = new MemberRepository(accessor, AppCaches.Disabled, Logger, memberTypeRepository, memberGroupRepository, tagRepo, Mock.Of(), relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, DataTypeService); + var repository = new MemberRepository(accessor, AppCaches.Disabled, Logger, memberTypeRepository, memberGroupRepository, tagRepo, Mock.Of(), relationRepository, relationTypeRepository, PasswordHasher, propertyEditors, dataValueReferences, DataTypeService); return repository; } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs index 8d7a166f26..a319f8d63b 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs @@ -40,7 +40,7 @@ namespace Umbraco.Tests.Persistence.Repositories private IScriptRepository CreateRepository() { - return new ScriptRepository(_fileSystems, IOHelper); + return new ScriptRepository(_fileSystems, IOHelper, TestObjects.GetGlobalSettings()); } protected override void Compose() diff --git a/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs index c2fbb63442..70e7b664a1 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs @@ -37,7 +37,7 @@ namespace Umbraco.Tests.Persistence.Repositories private IStylesheetRepository CreateRepository() { - return new StylesheetRepository(_fileSystems, IOHelper); + return new StylesheetRepository(_fileSystems, IOHelper, TestObjects.GetGlobalSettings()); } [Test] diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 5afd937f84..ea13a25bbd 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -52,6 +52,7 @@ using Umbraco.Web.Templates; using Umbraco.Web.PropertyEditors; using Umbraco.Core.Dictionary; using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Net; @@ -114,6 +115,7 @@ namespace Umbraco.Tests.Testing protected IIOHelper IOHelper { get; private set; } protected IDataTypeService DataTypeService => Factory.GetInstance(); + protected IPasswordHasher PasswordHasher => Factory.GetInstance(); protected Lazy PropertyEditorCollection => new Lazy(() => Factory.GetInstance()); protected ILocalizationService LocalizationService => Factory.GetInstance(); protected ILocalizedTextService LocalizedTextService { get; private set; } @@ -193,6 +195,7 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(hostingEnvironment); Composition.RegisterUnique(backOfficeInfo); Composition.RegisterUnique(ipResolver); + Composition.RegisterUnique(); TestObjects = new TestObjects(register); Compose(); diff --git a/src/Umbraco.Web/AspNetBackOfficeInfo.cs b/src/Umbraco.Web/Net/AspNetBackOfficeInfo.cs similarity index 100% rename from src/Umbraco.Web/AspNetBackOfficeInfo.cs rename to src/Umbraco.Web/Net/AspNetBackOfficeInfo.cs diff --git a/src/Umbraco.Web/AspNetHttpContextAccessor.cs b/src/Umbraco.Web/Net/AspNetHttpContextAccessor.cs similarity index 100% rename from src/Umbraco.Web/AspNetHttpContextAccessor.cs rename to src/Umbraco.Web/Net/AspNetHttpContextAccessor.cs diff --git a/src/Umbraco.Web/AspNetIpResolver.cs b/src/Umbraco.Web/Net/AspNetIpResolver.cs similarity index 100% rename from src/Umbraco.Web/AspNetIpResolver.cs rename to src/Umbraco.Web/Net/AspNetIpResolver.cs diff --git a/src/Umbraco.Web/Net/AspNetPasswordHasher.cs b/src/Umbraco.Web/Net/AspNetPasswordHasher.cs new file mode 100644 index 0000000000..0f9ff1981c --- /dev/null +++ b/src/Umbraco.Web/Net/AspNetPasswordHasher.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNet.Identity; +using IPasswordHasher = Umbraco.Core.Security.IPasswordHasher; + +namespace Umbraco.Web +{ + public class AspNetPasswordHasher : IPasswordHasher + { + private PasswordHasher _underlyingHasher; + + public AspNetPasswordHasher() + { + _underlyingHasher = new PasswordHasher(); + } + + public string HashPassword(string password) + { + return _underlyingHasher.HashPassword(password); + } + } +} diff --git a/src/Umbraco.Web/AspNetSessionIdResolver.cs b/src/Umbraco.Web/Net/AspNetSessionIdResolver.cs similarity index 100% rename from src/Umbraco.Web/AspNetSessionIdResolver.cs rename to src/Umbraco.Web/Net/AspNetSessionIdResolver.cs diff --git a/src/Umbraco.Web/Runtime/WebInitialComposer.cs b/src/Umbraco.Web/Runtime/WebInitialComposer.cs index fb7ba352b6..9b36012ca2 100644 --- a/src/Umbraco.Web/Runtime/WebInitialComposer.cs +++ b/src/Umbraco.Web/Runtime/WebInitialComposer.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Migrations.PostMigrations; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors.ValueConverters; using Umbraco.Core.Runtime; +using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Net; using Umbraco.Web.Actions; @@ -57,6 +58,7 @@ namespace Umbraco.Web.Runtime composition.Register(); composition.Register(); composition.Register(); + composition.Register(); composition.RegisterUnique(); // required for hybrid accessors diff --git a/src/Umbraco.Web/Security/BackOfficeUserManager.cs b/src/Umbraco.Web/Security/BackOfficeUserManager.cs index c644f5e428..688447e52a 100644 --- a/src/Umbraco.Web/Security/BackOfficeUserManager.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserManager.cs @@ -1,7 +1,6 @@ using System; using System.Security.Claims; using System.Threading.Tasks; -using System.Web; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin.Security.DataProtection; @@ -13,6 +12,7 @@ using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Net; +using IPasswordHasher = Microsoft.AspNet.Identity.IPasswordHasher; namespace Umbraco.Web.Security { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 73694fbc28..d792ad84a3 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -130,9 +130,6 @@ - - - @@ -174,7 +171,6 @@ - @@ -254,6 +250,11 @@ + + + + + From da1cf259c6be29a81b5baf6f154d13bf1574e042 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 18 Dec 2019 10:32:22 +0100 Subject: [PATCH 08/19] AB4227 - Moved Services and Migration --- .../Services/IMembershipMemberService.cs | 10 +- .../Services/IUserService.cs | 2 + src/Umbraco.Core/ContentExtensions.cs | 53 ---- src/Umbraco.Core/RuntimeState.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 227 +----------------- .../ContentExtensions.cs | 61 +++++ .../Expressions/Alter/AlterBuilder.cs | 0 .../Expressions/AlterColumnExpression.cs | 0 .../AlterDefaultConstraintExpression.cs | 0 .../Alter/Expressions/AlterTableExpression.cs | 0 .../Expressions/Alter/IAlterBuilder.cs | 0 .../Alter/Table/AlterTableBuilder.cs | 0 .../Alter/Table/IAlterTableBuilder.cs | 0 .../Table/IAlterTableColumnOptionBuilder.cs | 0 ...bleColumnOptionForeignKeyCascadeBuilder.cs | 0 .../Table/IAlterTableColumnTypeBuilder.cs | 0 .../Expressions/Common/ExecutableBuilder.cs | 0 .../Expressions/CreateColumnExpression.cs | 0 .../Expressions/CreateForeignKeyExpression.cs | 0 .../Expressions/CreateIndexExpression.cs | 0 .../Common/IColumnOptionBuilder.cs | 0 .../Expressions/Common/IColumnTypeBuilder.cs | 0 .../Expressions/Common/IExecutableBuilder.cs | 0 .../Common/IForeignKeyCascadeBuilder.cs | 0 .../Create/Column/CreateColumnBuilder.cs | 0 .../Column/ICreateColumnOnTableBuilder.cs | 0 .../Column/ICreateColumnOptionBuilder.cs | 0 ...ateColumnOptionForeignKeyCascadeBuilder.cs | 0 .../Create/Column/ICreateColumnTypeBuilder.cs | 0 .../Constraint/CreateConstraintBuilder.cs | 0 .../ICreateConstraintColumnsBuilder.cs | 0 .../ICreateConstraintOnTableBuilder.cs | 0 .../Expressions/Create/CreateBuilder.cs | 0 .../Expressions/CreateConstraintExpression.cs | 0 .../Expressions/CreateTableExpression.cs | 0 .../ForeignKey/CreateForeignKeyBuilder.cs | 0 .../ICreateForeignKeyCascadeBuilder.cs | 0 .../ICreateForeignKeyForeignColumnBuilder.cs | 0 .../ICreateForeignKeyFromTableBuilder.cs | 0 .../ICreateForeignKeyPrimaryColumnBuilder.cs | 0 .../ICreateForeignKeyToTableBuilder.cs | 0 .../Expressions/Create/ICreateBuilder.cs | 0 .../Create/Index/CreateIndexBuilder.cs | 0 .../Index/ICreateIndexColumnOptionsBuilder.cs | 0 .../Index/ICreateIndexForTableBuilder.cs | 0 .../Index/ICreateIndexOnColumnBuilder.cs | 0 .../Index/ICreateIndexOptionsBuilder.cs | 0 .../CreateKeysAndIndexesBuilder.cs | 0 .../Create/Table/CreateTableBuilder.cs | 0 .../Create/Table/CreateTableOfDtoBuilder.cs | 0 .../Table/ICreateTableColumnAsTypeBuilder.cs | 0 .../Table/ICreateTableColumnOptionBuilder.cs | 0 ...bleColumnOptionForeignKeyCascadeBuilder.cs | 0 .../Table/ICreateTableWithColumnBuilder.cs | 0 .../Delete/Column/DeleteColumnBuilder.cs | 0 .../Delete/Column/IDeleteColumnBuilder.cs | 0 .../Constraint/DeleteConstraintBuilder.cs | 0 .../Constraint/IDeleteConstraintBuilder.cs | 0 .../Delete/Data/DeleteDataBuilder.cs | 0 .../Delete/Data/IDeleteDataBuilder.cs | 0 .../DeleteDefaultConstraintBuilder.cs | 0 ...IDeleteDefaultConstraintOnColumnBuilder.cs | 0 .../IDeleteDefaultConstraintOnTableBuilder.cs | 0 .../Expressions/Delete/DeleteBuilder.cs | 0 .../Expressions/DeleteColumnExpression.cs | 0 .../Expressions/DeleteConstraintExpression.cs | 0 .../Expressions/DeleteDataExpression.cs | 0 .../DeleteDefaultConstraintExpression.cs | 0 .../Expressions/DeleteForeignKeyExpression.cs | 0 .../Expressions/DeleteIndexExpression.cs | 0 .../Expressions/DeleteTableExpression.cs | 0 .../ForeignKey/DeleteForeignKeyBuilder.cs | 0 .../IDeleteForeignKeyForeignColumnBuilder.cs | 0 .../IDeleteForeignKeyFromTableBuilder.cs | 0 .../IDeleteForeignKeyOnTableBuilder.cs | 0 .../IDeleteForeignKeyPrimaryColumnBuilder.cs | 0 .../IDeleteForeignKeyToTableBuilder.cs | 0 .../Expressions/Delete/IDeleteBuilder.cs | 0 .../Delete/Index/DeleteIndexBuilder.cs | 0 .../Index/IDeleteIndexForTableBuilder.cs | 0 .../Index/IDeleteIndexOnColumnBuilder.cs | 0 .../DeleteKeysAndIndexesBuilder.cs | 0 .../Expressions/Execute/ExecuteBuilder.cs | 0 .../ExecuteSqlStatementExpression.cs | 0 .../Expressions/Execute/IExecuteBuilder.cs | 0 .../Expressions/ExpressionBuilderBase.cs | 0 .../ExpressionBuilderBaseOfNext.cs | 0 .../Migrations/Expressions/IFluentBuilder.cs | 0 .../Expressions/InsertDataExpression.cs | 0 .../Expressions/Insert/IInsertBuilder.cs | 0 .../Expressions/Insert/IInsertIntoBuilder.cs | 0 .../Expressions/Insert/InsertBuilder.cs | 0 .../Expressions/Insert/InsertIntoBuilder.cs | 0 .../Rename/Column/IRenameColumnBuilder.cs | 0 .../Rename/Column/IRenameColumnToBuilder.cs | 0 .../Rename/Column/RenameColumnBuilder.cs | 0 .../Expressions/RenameColumnExpression.cs | 0 .../Expressions/RenameTableExpression.cs | 0 .../Expressions/Rename/IRenameBuilder.cs | 0 .../Expressions/Rename/RenameBuilder.cs | 0 .../Rename/Table/IRenameTableBuilder.cs | 0 .../Rename/Table/RenameTableBuilder.cs | 0 .../Expressions/UpdateDataExpression.cs | 0 .../Expressions/Update/IUpdateBuilder.cs | 0 .../Expressions/Update/IUpdateTableBuilder.cs | 0 .../Expressions/Update/IUpdateWhereBuilder.cs | 0 .../Expressions/Update/UpdateBuilder.cs | 0 .../Expressions/Update/UpdateDataBuilder.cs | 0 .../Migrations/IMigrationBuilder.cs | 0 .../Migrations/IMigrationContext.cs | 0 .../Migrations/IMigrationExpression.cs | 0 .../Migrations/Install/DatabaseBuilder.cs | 15 +- .../Migrations/Install/DatabaseDataCreator.cs | 6 +- .../Install/DatabaseSchemaCreator.cs | 8 +- .../Install/DatabaseSchemaResult.cs | 2 +- .../Migrations/MergeBuilder.cs | 0 .../Migrations/MigrationBase.cs | 0 .../Migrations/MigrationBase_Extra.cs | 0 .../Migrations/MigrationBuilder.cs | 0 .../Migrations/MigrationContext.cs | 0 .../Migrations/MigrationExpressionBase.cs | 0 .../Migrations/MigrationPlan.cs | 0 .../IPublishedSnapshotRebuilder.cs | 0 .../PublishedSnapshotRebuilder.cs | 0 .../RebuildPublishedSnapshot.cs | 0 .../Upgrade/Common/CreateKeysAndIndexes.cs | 0 .../Upgrade/Common/DeleteKeysAndIndexes.cs | 0 .../Migrations/Upgrade/UmbracoPlan.cs | 6 +- .../Migrations/Upgrade/Upgrader.cs | 0 .../Upgrade/V_8_0_0/AddContentNuTable.cs | 0 .../V_8_0_0/AddContentTypeIsElementColumn.cs | 0 .../Upgrade/V_8_0_0/AddLockObjects.cs | 0 .../Upgrade/V_8_0_0/AddLogTableColumns.cs | 0 .../Upgrade/V_8_0_0/AddTypedLabels.cs | 0 .../Upgrade/V_8_0_0/AddVariationTables1A.cs | 0 .../Upgrade/V_8_0_0/AddVariationTables2.cs | 0 .../V_8_0_0/ContentVariationMigration.cs | 0 .../ConvertRelatedLinksToMultiUrlPicker.cs | 0 .../Upgrade/V_8_0_0/DataTypeMigration.cs | 0 .../ContentPickerPreValueMigrator.cs | 0 .../DataTypes/DecimalPreValueMigrator.cs | 0 .../DataTypes/DefaultPreValueMigrator.cs | 0 .../DropDownFlexiblePreValueMigrator.cs | 0 .../V_8_0_0/DataTypes/IPreValueMigrator.cs | 0 .../DataTypes/ListViewPreValueMigrator.cs | 0 .../MarkdownEditorPreValueMigrator.cs | 0 .../DataTypes/MediaPickerPreValueMigrator.cs | 0 .../NestedContentPreValueMigrator.cs | 0 .../Upgrade/V_8_0_0/DataTypes/PreValueDto.cs | 0 .../V_8_0_0/DataTypes/PreValueMigratorBase.cs | 0 .../DataTypes/PreValueMigratorCollection.cs | 0 .../PreValueMigratorCollectionBuilder.cs | 0 .../DataTypes/PreValueMigratorComposer.cs | 0 .../DataTypes/RenamingPreValueMigrator.cs | 0 .../DataTypes/RichTextPreValueMigrator.cs | 0 .../UmbracoSliderPreValueMigrator.cs | 0 .../DataTypes/ValueListPreValueMigrator.cs | 0 .../DropDownPropertyEditorsMigration.cs | 0 .../Upgrade/V_8_0_0/DropMigrationsTable.cs | 0 .../Upgrade/V_8_0_0/DropPreValueTable.cs | 0 .../Upgrade/V_8_0_0/DropTaskTables.cs | 0 .../V_8_0_0/DropTemplateDesignColumn.cs | 0 .../Upgrade/V_8_0_0/DropXmlTables.cs | 0 .../Upgrade/V_8_0_0/FallbackLanguage.cs | 0 .../V_8_0_0/FixLanguageIsoCodeLength.cs | 0 .../Upgrade/V_8_0_0/LanguageColumns.cs | 0 .../Upgrade/V_8_0_0/MakeRedirectUrlVariant.cs | 0 .../Upgrade/V_8_0_0/MakeTagsVariant.cs | 0 .../MergeDateAndDateTimePropertyEditor.cs | 0 .../V_8_0_0/PropertyEditorsMigration.cs | 0 .../V_8_0_0/PropertyEditorsMigrationBase.cs | 0 ...adioAndCheckboxPropertyEditorsMigration.cs | 0 .../Upgrade/V_8_0_0/RefactorMacroColumns.cs | 0 .../Upgrade/V_8_0_0/RefactorVariantsModel.cs | 0 ...meLabelAndRichTextPropertyEditorAliases.cs | 0 .../V_8_0_0/RenameMediaVersionTable.cs | 0 .../V_8_0_0/RenameUmbracoDomainsTable.cs | 0 .../Migrations/Upgrade/V_8_0_0/SuperZero.cs | 0 .../V_8_0_0/TablesForScheduledPublishing.cs | 0 .../Upgrade/V_8_0_0/TagsMigration.cs | 0 .../Upgrade/V_8_0_0/TagsMigrationFix.cs | 0 .../V_8_0_0/UpdateDefaultMandatoryLanguage.cs | 0 .../V_8_0_0/UpdatePickerIntegerValuesToUdi.cs | 0 .../Upgrade/V_8_0_0/UserForeignKeys.cs | 0 .../Upgrade/V_8_0_0/VariantsMigration.cs | 0 .../V_8_0_1/ChangeNuCacheJsonFormat.cs | 0 ...nvertTinyMceAndGridMediaUrlsToLocalLink.cs | 0 .../Upgrade/V_8_1_0/FixContentNuCascade.cs | 0 .../V_8_1_0/RenameUserLoginDtoDateIndex.cs | 0 .../Upgrade/V_8_6_0/AddNewRelationTypes.cs | 0 ...AddPropertyTypeValidationMessageColumns.cs | 0 .../V_8_6_0/UpdateRelationTypeTable.cs | 0 .../Persistence/IDbProviderFactoryCreator.cs | 1 + .../Services/IdkMap.cs | 2 +- .../Services/Implement/AuditService.cs | 0 .../Services/Implement/ConsentService.cs | 0 .../Services/Implement/ContentService.cs | 4 +- .../ContentTypeBaseServiceProvider.cs | 0 .../Services/Implement/ContentTypeService.cs | 0 .../Implement/ContentTypeServiceBase.cs | 0 .../ContentTypeServiceBaseOfTItemTService.cs | 16 +- ...peServiceBaseOfTRepositoryTItemTService.cs | 0 .../Services/Implement/DataTypeService.cs | 0 .../Services/Implement/DomainService.cs | 0 .../Services/Implement/EntityService.cs | 0 .../Services/Implement/EntityXmlSerializer.cs | 15 +- .../Implement/ExternalLoginService.cs | 1 - .../Services/Implement/FileService.cs | 9 +- .../Services/Implement/KeyValueService.cs | 0 .../Services/Implement/LocalizationService.cs | 0 .../Implement/LocalizedTextService.cs | 0 .../LocalizedTextServiceFileSources.cs | 1 + ...lizedTextServiceSupplementaryFileSource.cs | 0 .../Services/Implement/MacroService.cs | 0 .../Services/Implement/MediaService.cs | 0 .../Services/Implement/MediaTypeService.cs | 0 .../Services/Implement/MemberGroupService.cs | 0 .../Services/Implement/MemberService.cs | 17 +- .../Services/Implement/MemberTypeService.cs | 0 .../Services/Implement/NotificationService.cs | 6 +- .../Services/Implement/PackagingService.cs | 0 .../Implement/PropertyValidationService.cs | 0 .../Services/Implement/PublicAccessService.cs | 0 .../Services/Implement/RedirectUrlService.cs | 0 .../Services/Implement/RelationService.cs | 0 .../Services/Implement/RepositoryService.cs | 0 .../Implement/ScopeRepositoryService.cs | 0 .../Implement/ServerRegistrationService.cs | 11 +- .../Services/Implement/TagService.cs | 0 .../Services/Implement/UserService.cs | 6 +- .../BulkInsertBenchmarks.cs | 2 +- .../Migrations/AdvancedMigrationTests.cs | 2 +- .../Migrations/MigrationPlanTests.cs | 2 +- .../Persistence/DatabaseContextTests.cs | 2 +- .../Persistence/SchemaValidationTest.cs | 2 +- .../Persistence/SqlCeTableByTableTest.cs | 70 +++--- src/Umbraco.Tests/Runtimes/StandaloneTests.cs | 2 +- src/Umbraco.Tests/TestHelpers/TestObjects.cs | 8 +- .../TestHelpers/TestWithDatabaseBase.cs | 2 +- .../InstallSteps/DatabaseUpgradeStep.cs | 6 +- .../UmbracoDbProviderFactoryCreator.cs | 8 + 241 files changed, 193 insertions(+), 394 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/AlterBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/IAlterBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/ExecutableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/IColumnOptionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/IColumnTypeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/IExecutableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/CreateBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/ICreateBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Table/CreateTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/DeleteBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/IDeleteBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Execute/ExecuteBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Execute/IExecuteBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/ExpressionBuilderBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/IFluentBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Insert/IInsertBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Insert/IInsertIntoBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Insert/InsertBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Insert/InsertIntoBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/IRenameBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/RenameBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Update/IUpdateBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Update/IUpdateTableBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Update/IUpdateWhereBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Update/UpdateBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Expressions/Update/UpdateDataBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/IMigrationBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/IMigrationContext.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/IMigrationExpression.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Install/DatabaseBuilder.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Install/DatabaseDataCreator.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Install/DatabaseSchemaCreator.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Install/DatabaseSchemaResult.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MergeBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MigrationBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MigrationBase_Extra.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MigrationBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MigrationContext.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MigrationExpressionBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/MigrationPlan.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/PostMigrations/IPublishedSnapshotRebuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/PostMigrations/RebuildPublishedSnapshot.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/Common/CreateKeysAndIndexes.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/Common/DeleteKeysAndIndexes.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/UmbracoPlan.cs (96%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/Upgrader.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddContentNuTable.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddContentTypeIsElementColumn.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddLockObjects.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddLogTableColumns.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddTypedLabels.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddVariationTables1A.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/AddVariationTables2.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/ContentVariationMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/ConvertRelatedLinksToMultiUrlPicker.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypeMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/ContentPickerPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/DecimalPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/DefaultPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/DropDownFlexiblePreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/IPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/ListViewPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/MarkdownEditorPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/MediaPickerPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/NestedContentPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueDto.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollection.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollectionBuilder.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorComposer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/RenamingPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/RichTextPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/UmbracoSliderPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DataTypes/ValueListPreValueMigrator.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DropDownPropertyEditorsMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DropMigrationsTable.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DropPreValueTable.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DropTaskTables.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DropTemplateDesignColumn.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/DropXmlTables.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/FallbackLanguage.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/FixLanguageIsoCodeLength.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/LanguageColumns.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/MakeRedirectUrlVariant.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/MakeTagsVariant.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigrationBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/RadioAndCheckboxPropertyEditorsMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/RefactorVariantsModel.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/RenameLabelAndRichTextPropertyEditorAliases.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/RenameMediaVersionTable.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/RenameUmbracoDomainsTable.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/SuperZero.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/TablesForScheduledPublishing.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/TagsMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/TagsMigrationFix.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/UpdateDefaultMandatoryLanguage.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/UpdatePickerIntegerValuesToUdi.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/UserForeignKeys.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_0/VariantsMigration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_0_1/ChangeNuCacheJsonFormat.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_1_0/FixContentNuCascade.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_1_0/RenameUserLoginDtoDateIndex.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_6_0/AddNewRelationTypes.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_6_0/AddPropertyTypeValidationMessageColumns.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Migrations/Upgrade/V_8_6_0/UpdateRelationTypeTable.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/IdkMap.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/AuditService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ConsentService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ContentService.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ContentTypeBaseServiceProvider.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ContentTypeService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ContentTypeServiceBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs (96%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/DataTypeService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/DomainService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/EntityService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/EntityXmlSerializer.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ExternalLoginService.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/FileService.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/KeyValueService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/LocalizationService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/LocalizedTextService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/LocalizedTextServiceFileSources.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/LocalizedTextServiceSupplementaryFileSource.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/MacroService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/MediaService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/MediaTypeService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/MemberGroupService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/MemberService.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/MemberTypeService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/NotificationService.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/PackagingService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/PropertyValidationService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/PublicAccessService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/RedirectUrlService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/RelationService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/RepositoryService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ScopeRepositoryService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/ServerRegistrationService.cs (94%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/TagService.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Services/Implement/UserService.cs (99%) diff --git a/src/Umbraco.Abstractions/Services/IMembershipMemberService.cs b/src/Umbraco.Abstractions/Services/IMembershipMemberService.cs index 448b0c761a..d3ca954de8 100644 --- a/src/Umbraco.Abstractions/Services/IMembershipMemberService.cs +++ b/src/Umbraco.Abstractions/Services/IMembershipMemberService.cs @@ -124,15 +124,7 @@ namespace Umbraco.Core.Services /// Optional parameter to raise events. /// Default is True otherwise set to False to not raise events void Save(IEnumerable entities, bool raiseEvents = true); - - /// - /// Gets the default MemberType alias - /// - /// By default we'll return the 'writer', but we need to check it exists. If it doesn't we'll - /// return the first type that is not an admin, otherwise if there's only one we will return that one. - /// Alias of the default MemberType - string GetDefaultMemberType(); - + /// /// Finds a list of objects by a partial email string /// diff --git a/src/Umbraco.Abstractions/Services/IUserService.cs b/src/Umbraco.Abstractions/Services/IUserService.cs index 950b4f548d..6d1e8f82ac 100644 --- a/src/Umbraco.Abstractions/Services/IUserService.cs +++ b/src/Umbraco.Abstractions/Services/IUserService.cs @@ -203,6 +203,8 @@ namespace Umbraco.Core.Services /// IEnumerable GetAllNotInGroup(int groupId); + IEnumerable GetNextUsers(int id, int count); + #region User groups /// diff --git a/src/Umbraco.Core/ContentExtensions.cs b/src/Umbraco.Core/ContentExtensions.cs index 29520d0b20..16a86a1527 100644 --- a/src/Umbraco.Core/ContentExtensions.cs +++ b/src/Umbraco.Core/ContentExtensions.cs @@ -21,38 +21,6 @@ namespace Umbraco.Core private static IMediaFileSystem _mediaFileSystem; private static IMediaFileSystem MediaFileSystem => _mediaFileSystem ?? (_mediaFileSystem = Current.MediaFileSystem); - #region IContent - - /// - /// Gets the current status of the Content - /// - public static ContentStatus GetStatus(this IContent content, string culture = null) - { - if (content.Trashed) - return ContentStatus.Trashed; - - if (!content.ContentType.VariesByCulture()) - culture = string.Empty; - else if (culture.IsNullOrWhiteSpace()) - throw new ArgumentNullException($"{nameof(culture)} cannot be null or empty"); - - var expires = content.ContentSchedule.GetSchedule(culture, ContentScheduleAction.Expire); - if (expires != null && expires.Any(x => x.Date > DateTime.MinValue && DateTime.Now > x.Date)) - return ContentStatus.Expired; - - var release = content.ContentSchedule.GetSchedule(culture, ContentScheduleAction.Release); - if (release != null && release.Any(x => x.Date > DateTime.MinValue && x.Date > DateTime.Now)) - return ContentStatus.AwaitingRelease; - - if (content.Published) - return ContentStatus.Published; - - return ContentStatus.Unpublished; - } - - - - #endregion @@ -207,13 +175,6 @@ namespace Umbraco.Core return Current.Services.UserService.GetProfileById(content.CreatorId); } - /// - /// Gets the for the Creator of this content item. - /// - public static IProfile GetCreatorProfile(this IContentBase content, IUserService userService) - { - return userService.GetProfileById(content.CreatorId); - } [Obsolete("Use the overload that declares the IUserService to use")] [EditorBrowsable(EditorBrowsableState.Never)] @@ -222,21 +183,7 @@ namespace Umbraco.Core return Current.Services.UserService.GetProfileById(content.WriterId); } - /// - /// Gets the for the Writer of this content. - /// - public static IProfile GetWriterProfile(this IContent content, IUserService userService) - { - return userService.GetProfileById(content.WriterId); - } - /// - /// Gets the for the Writer of this content. - /// - public static IProfile GetWriterProfile(this IMedia content, IUserService userService) - { - return userService.GetProfileById(content.WriterId); - } #endregion diff --git a/src/Umbraco.Core/RuntimeState.cs b/src/Umbraco.Core/RuntimeState.cs index 8b639fdaec..8c860743a5 100644 --- a/src/Umbraco.Core/RuntimeState.cs +++ b/src/Umbraco.Core/RuntimeState.cs @@ -257,7 +257,7 @@ namespace Umbraco.Core protected virtual bool EnsureUmbracoUpgradeState(IUmbracoDatabaseFactory databaseFactory, ILogger logger) { - var upgrader = new Upgrader(new UmbracoPlan(_umbracoVersion)); + var upgrader = new Upgrader(new UmbracoPlan(_umbracoVersion, _globalSettings)); var stateValueKey = upgrader.StateValueKey; // no scope, no service - just directly accessing the database diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 7cc8ebd928..f6ca9a19be 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -153,37 +153,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -193,10 +162,8 @@ - - @@ -221,49 +188,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -272,121 +199,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -403,42 +216,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -465,9 +242,7 @@ - - - + \ No newline at end of file diff --git a/src/Umbraco.Infrastructure/ContentExtensions.cs b/src/Umbraco.Infrastructure/ContentExtensions.cs index 6bff40e306..f3341c9c8e 100644 --- a/src/Umbraco.Infrastructure/ContentExtensions.cs +++ b/src/Umbraco.Infrastructure/ContentExtensions.cs @@ -1,4 +1,8 @@ +using System; +using System.Linq; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Services; namespace Umbraco.Core { @@ -27,5 +31,62 @@ namespace Umbraco.Core } } } + + + #region IContent + + /// + /// Gets the current status of the Content + /// + public static ContentStatus GetStatus(this IContent content, string culture = null) + { + if (content.Trashed) + return ContentStatus.Trashed; + + if (!content.ContentType.VariesByCulture()) + culture = string.Empty; + else if (culture.IsNullOrWhiteSpace()) + throw new ArgumentNullException($"{nameof(culture)} cannot be null or empty"); + + var expires = content.ContentSchedule.GetSchedule(culture, ContentScheduleAction.Expire); + if (expires != null && expires.Any(x => x.Date > DateTime.MinValue && DateTime.Now > x.Date)) + return ContentStatus.Expired; + + var release = content.ContentSchedule.GetSchedule(culture, ContentScheduleAction.Release); + if (release != null && release.Any(x => x.Date > DateTime.MinValue && x.Date > DateTime.Now)) + return ContentStatus.AwaitingRelease; + + if (content.Published) + return ContentStatus.Published; + + return ContentStatus.Unpublished; + } + + + + #endregion + + /// + /// Gets the for the Creator of this content item. + /// + public static IProfile GetCreatorProfile(this IContentBase content, IUserService userService) + { + return userService.GetProfileById(content.CreatorId); + } + /// + /// Gets the for the Writer of this content. + /// + public static IProfile GetWriterProfile(this IContent content, IUserService userService) + { + return userService.GetProfileById(content.WriterId); + } + + /// + /// Gets the for the Writer of this content. + /// + public static IProfile GetWriterProfile(this IMedia content, IUserService userService) + { + return userService.GetProfileById(content.WriterId); + } } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/AlterBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/AlterBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/AlterBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/AlterBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Expressions/AlterColumnExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Expressions/AlterDefaultConstraintExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Expressions/AlterTableExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/IAlterBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/IAlterBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/IAlterBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/IAlterBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/AlterTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionForeignKeyCascadeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnTypeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/ExecutableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/ExecutableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/ExecutableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/ExecutableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/Expressions/CreateColumnExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/Expressions/CreateForeignKeyExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/Expressions/CreateIndexExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/IColumnOptionBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/IColumnOptionBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/IColumnOptionBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/IColumnOptionBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/IColumnTypeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/IColumnTypeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/IColumnTypeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/IColumnTypeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/IExecutableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/IExecutableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/IExecutableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/IExecutableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Common/IForeignKeyCascadeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/CreateColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnOnTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnOptionBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnOptionForeignKeyCascadeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Column/ICreateColumnTypeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Constraint/CreateConstraintBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Constraint/ICreateConstraintColumnsBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Constraint/ICreateConstraintOnTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/CreateBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/CreateBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/CreateBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Expressions/CreateConstraintExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Expressions/CreateTableExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/CreateForeignKeyBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyCascadeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyForeignColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyFromTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyPrimaryColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ForeignKey/ICreateForeignKeyToTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/ICreateBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/ICreateBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/ICreateBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/CreateIndexBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexColumnOptionsBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexForTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexOnColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Index/ICreateIndexOptionsBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/KeysAndIndexes/CreateKeysAndIndexesBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/CreateTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/CreateTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/CreateTableOfDtoBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableColumnAsTypeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableColumnOptionBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableColumnOptionForeignKeyCascadeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Create/Table/ICreateTableWithColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Column/DeleteColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Column/IDeleteColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Constraint/DeleteConstraintBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Constraint/IDeleteConstraintBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Data/DeleteDataBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Data/IDeleteDataBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DefaultConstraint/IDeleteDefaultConstraintOnTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DeleteBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/DeleteBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/DeleteBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteColumnExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteConstraintExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteDataExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteForeignKeyExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteIndexExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Expressions/DeleteTableExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/DeleteForeignKeyBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyForeignColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyFromTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyOnTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyPrimaryColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/ForeignKey/IDeleteForeignKeyToTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/IDeleteBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/IDeleteBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/IDeleteBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Index/DeleteIndexBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Index/IDeleteIndexForTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/Index/IDeleteIndexOnColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Delete/KeysAndIndexes/DeleteKeysAndIndexesBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Execute/ExecuteBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Execute/ExecuteBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Execute/ExecuteBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Execute/Expressions/ExecuteSqlStatementExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Execute/IExecuteBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Execute/IExecuteBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Execute/IExecuteBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBase.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/ExpressionBuilderBase.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBase.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/ExpressionBuilderBase.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/ExpressionBuilderBaseOfNext.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/IFluentBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/IFluentBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/IFluentBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/IFluentBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Insert/Expressions/InsertDataExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Insert/IInsertBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Insert/IInsertBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Insert/IInsertBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Insert/IInsertIntoBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Insert/IInsertIntoBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Insert/IInsertIntoBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/InsertBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Insert/InsertBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Insert/InsertBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Insert/InsertBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Insert/InsertIntoBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Insert/InsertIntoBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Insert/InsertIntoBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Column/IRenameColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Column/IRenameColumnToBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Column/RenameColumnBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Expressions/RenameColumnExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Expressions/RenameTableExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/IRenameBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/IRenameBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/IRenameBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/RenameBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/RenameBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/RenameBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Table/IRenameTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Rename/Table/RenameTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Update/Expressions/UpdateDataExpression.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Update/IUpdateBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Update/IUpdateBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Update/IUpdateBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Update/IUpdateTableBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Update/IUpdateTableBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Update/IUpdateTableBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Update/IUpdateWhereBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Update/IUpdateWhereBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Update/IUpdateWhereBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Update/UpdateBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Update/UpdateBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Update/UpdateBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Expressions/Update/UpdateDataBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Expressions/Update/UpdateDataBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Expressions/Update/UpdateDataBuilder.cs diff --git a/src/Umbraco.Core/Migrations/IMigrationBuilder.cs b/src/Umbraco.Infrastructure/Migrations/IMigrationBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/IMigrationBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/IMigrationBuilder.cs diff --git a/src/Umbraco.Core/Migrations/IMigrationContext.cs b/src/Umbraco.Infrastructure/Migrations/IMigrationContext.cs similarity index 100% rename from src/Umbraco.Core/Migrations/IMigrationContext.cs rename to src/Umbraco.Infrastructure/Migrations/IMigrationContext.cs diff --git a/src/Umbraco.Core/Migrations/IMigrationExpression.cs b/src/Umbraco.Infrastructure/Migrations/IMigrationExpression.cs similarity index 100% rename from src/Umbraco.Core/Migrations/IMigrationExpression.cs rename to src/Umbraco.Infrastructure/Migrations/IMigrationExpression.cs diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs similarity index 98% rename from src/Umbraco.Core/Migrations/Install/DatabaseBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs index 06d78d1318..8b1e6d741b 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseBuilder.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs @@ -1,9 +1,7 @@ using System; -using System.Data.SqlServerCe; using System.IO; using System.Linq; using System.Xml.Linq; -using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -106,7 +104,7 @@ namespace Umbraco.Core.Migrations.Install return DbConnectionExtensions.IsConnectionAvailable(connectionString, factory); } - internal bool HasSomeNonDefaultUser() + public bool HasSomeNonDefaultUser() { using (var scope = _scopeProvider.CreateScope()) { @@ -143,7 +141,7 @@ namespace Umbraco.Core.Migrations.Install ConfigureEmbeddedDatabaseConnection(_databaseFactory, _ioHelper, _logger); } - private static void ConfigureEmbeddedDatabaseConnection(IUmbracoDatabaseFactory factory, IIOHelper ioHelper, ILogger logger) + private void ConfigureEmbeddedDatabaseConnection(IUmbracoDatabaseFactory factory, IIOHelper ioHelper, ILogger logger) { SaveConnectionString(EmbeddedDatabaseConnectionString, Constants.DbProviderNames.SqlCe, ioHelper, logger); @@ -153,8 +151,7 @@ namespace Umbraco.Core.Migrations.Install // this should probably be in a "using (new SqlCeEngine)" clause but not sure // of the side effects and it's been like this for quite some time now - var engine = new SqlCeEngine(EmbeddedDatabaseConnectionString); - engine.CreateDatabase(); + _dbProviderFactoryCreator.CreateDatabase(); } factory.Configure(EmbeddedDatabaseConnectionString, Constants.DbProviderNames.SqlCe); @@ -366,7 +363,7 @@ namespace Umbraco.Core.Migrations.Install /// This assumes that the database exists and the connection string is /// configured and it is possible to connect to the database. /// - internal DatabaseSchemaResult ValidateSchema() + public DatabaseSchemaResult ValidateSchema() { using (var scope = _scopeProvider.CreateScope()) { @@ -385,7 +382,7 @@ namespace Umbraco.Core.Migrations.Install return _databaseSchemaValidationResult; var database = scope.Database; - var dbSchema = new DatabaseSchemaCreator(database, _logger, _umbracoVersion); + var dbSchema = new DatabaseSchemaCreator(database, _logger, _umbracoVersion, _globalSettings); _databaseSchemaValidationResult = dbSchema.ValidateSchema(); scope.Complete(); return _databaseSchemaValidationResult; @@ -435,7 +432,7 @@ namespace Umbraco.Core.Migrations.Install if (_runtime.Level == RuntimeLevel.Run) throw new Exception("Umbraco is already configured!"); - var creator = new DatabaseSchemaCreator(database, _logger, _umbracoVersion); + var creator = new DatabaseSchemaCreator(database, _logger, _umbracoVersion, _globalSettings); creator.InitializeDatabaseSchema(); message = message + "

Installation completed!

"; diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs similarity index 99% rename from src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs rename to src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs index 41aceb8a69..bd0b733623 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs @@ -16,12 +16,14 @@ namespace Umbraco.Core.Migrations.Install private readonly IDatabase _database; private readonly ILogger _logger; private readonly IUmbracoVersion _umbracoVersion; + private readonly IGlobalSettings _globalSettings; - public DatabaseDataCreator(IDatabase database, ILogger logger, IUmbracoVersion umbracoVersion) + public DatabaseDataCreator(IDatabase database, ILogger logger, IUmbracoVersion umbracoVersion, IGlobalSettings globalSettings) { _database = database; _logger = logger; _umbracoVersion = umbracoVersion; + _globalSettings = globalSettings; } /// @@ -336,7 +338,7 @@ namespace Umbraco.Core.Migrations.Install { // on install, initialize the umbraco migration plan with the final state - var upgrader = new Upgrader(new UmbracoPlan(_umbracoVersion)); + var upgrader = new Upgrader(new UmbracoPlan(_umbracoVersion, _globalSettings)); var stateValueKey = upgrader.StateValueKey; var finalState = upgrader.Plan.FinalState; diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseSchemaCreator.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs similarity index 98% rename from src/Umbraco.Core/Migrations/Install/DatabaseSchemaCreator.cs rename to src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs index 7181460eeb..8a79cca403 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseSchemaCreator.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs @@ -20,12 +20,14 @@ namespace Umbraco.Core.Migrations.Install private readonly IUmbracoDatabase _database; private readonly ILogger _logger; private readonly IUmbracoVersion _umbracoVersion; + private readonly IGlobalSettings _globalSettings; - public DatabaseSchemaCreator(IUmbracoDatabase database, ILogger logger, IUmbracoVersion umbracoVersion) + public DatabaseSchemaCreator(IUmbracoDatabase database, ILogger logger, IUmbracoVersion umbracoVersion, IGlobalSettings globalSettings) { _database = database; _logger = logger; _umbracoVersion = umbracoVersion; + _globalSettings = globalSettings; } private ISqlSyntaxProvider SqlSyntax => _database.SqlContext.SqlSyntax; @@ -128,7 +130,7 @@ namespace Umbraco.Core.Migrations.Install if (e.Cancel == false) { - var dataCreation = new DatabaseDataCreator(_database, _logger,_umbracoVersion); + var dataCreation = new DatabaseDataCreator(_database, _logger,_umbracoVersion, _globalSettings); foreach (var table in OrderedTables) CreateTable(false, table, dataCreation); } @@ -398,7 +400,7 @@ namespace Umbraco.Core.Migrations.Install where T : new() { var tableType = typeof(T); - CreateTable(overwrite, tableType, new DatabaseDataCreator(_database, _logger, _umbracoVersion)); + CreateTable(overwrite, tableType, new DatabaseDataCreator(_database, _logger, _umbracoVersion, _globalSettings)); } /// diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseSchemaResult.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs similarity index 99% rename from src/Umbraco.Core/Migrations/Install/DatabaseSchemaResult.cs rename to src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs index f21216fde3..e7b7b479ec 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseSchemaResult.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Migrations.Install /// /// Represents ... /// - internal class DatabaseSchemaResult + public class DatabaseSchemaResult { public DatabaseSchemaResult(ISqlSyntaxProvider sqlSyntax) { diff --git a/src/Umbraco.Core/Migrations/MergeBuilder.cs b/src/Umbraco.Infrastructure/Migrations/MergeBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MergeBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/MergeBuilder.cs diff --git a/src/Umbraco.Core/Migrations/MigrationBase.cs b/src/Umbraco.Infrastructure/Migrations/MigrationBase.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MigrationBase.cs rename to src/Umbraco.Infrastructure/Migrations/MigrationBase.cs diff --git a/src/Umbraco.Core/Migrations/MigrationBase_Extra.cs b/src/Umbraco.Infrastructure/Migrations/MigrationBase_Extra.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MigrationBase_Extra.cs rename to src/Umbraco.Infrastructure/Migrations/MigrationBase_Extra.cs diff --git a/src/Umbraco.Core/Migrations/MigrationBuilder.cs b/src/Umbraco.Infrastructure/Migrations/MigrationBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MigrationBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/MigrationBuilder.cs diff --git a/src/Umbraco.Core/Migrations/MigrationContext.cs b/src/Umbraco.Infrastructure/Migrations/MigrationContext.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MigrationContext.cs rename to src/Umbraco.Infrastructure/Migrations/MigrationContext.cs diff --git a/src/Umbraco.Core/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MigrationExpressionBase.cs rename to src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs diff --git a/src/Umbraco.Core/Migrations/MigrationPlan.cs b/src/Umbraco.Infrastructure/Migrations/MigrationPlan.cs similarity index 100% rename from src/Umbraco.Core/Migrations/MigrationPlan.cs rename to src/Umbraco.Infrastructure/Migrations/MigrationPlan.cs diff --git a/src/Umbraco.Core/Migrations/PostMigrations/IPublishedSnapshotRebuilder.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/IPublishedSnapshotRebuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/PostMigrations/IPublishedSnapshotRebuilder.cs rename to src/Umbraco.Infrastructure/Migrations/PostMigrations/IPublishedSnapshotRebuilder.cs diff --git a/src/Umbraco.Core/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs rename to src/Umbraco.Infrastructure/Migrations/PostMigrations/PublishedSnapshotRebuilder.cs diff --git a/src/Umbraco.Core/Migrations/PostMigrations/RebuildPublishedSnapshot.cs b/src/Umbraco.Infrastructure/Migrations/PostMigrations/RebuildPublishedSnapshot.cs similarity index 100% rename from src/Umbraco.Core/Migrations/PostMigrations/RebuildPublishedSnapshot.cs rename to src/Umbraco.Infrastructure/Migrations/PostMigrations/RebuildPublishedSnapshot.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/Common/CreateKeysAndIndexes.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/Common/CreateKeysAndIndexes.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/Common/CreateKeysAndIndexes.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/Common/CreateKeysAndIndexes.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/Common/DeleteKeysAndIndexes.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/Common/DeleteKeysAndIndexes.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/Common/DeleteKeysAndIndexes.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/Common/DeleteKeysAndIndexes.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs similarity index 96% rename from src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs index 7e27a857c5..b702730a40 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs @@ -16,15 +16,17 @@ namespace Umbraco.Core.Migrations.Upgrade public class UmbracoPlan : MigrationPlan { private readonly IUmbracoVersion _umbracoVersion; + private readonly IGlobalSettings _globalSettings; private const string InitPrefix = "{init-"; private const string InitSuffix = "}"; /// /// Initializes a new instance of the class. /// - public UmbracoPlan(IUmbracoVersion umbracoVersion) + public UmbracoPlan(IUmbracoVersion umbracoVersion, IGlobalSettings globalSettings) : base(Constants.System.UmbracoUpgradePlanName) { _umbracoVersion = umbracoVersion; + _globalSettings = globalSettings; DefinePlan(); } @@ -63,7 +65,7 @@ namespace Umbraco.Core.Migrations.Upgrade get { // no state in database yet - assume we have something in web.config that makes some sense - if (!SemVersion.TryParse(Current.Configs.Global().ConfigurationStatus, out var currentVersion)) + if (!SemVersion.TryParse(_globalSettings.ConfigurationStatus, out var currentVersion)) throw new InvalidOperationException($"Could not get current version from web.config {Constants.AppSettings.ConfigurationStatus} appSetting."); // cannot go back in time diff --git a/src/Umbraco.Core/Migrations/Upgrade/Upgrader.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/Upgrader.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/Upgrader.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/Upgrader.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddContentNuTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddContentNuTable.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddContentNuTable.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddContentNuTable.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddContentTypeIsElementColumn.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddContentTypeIsElementColumn.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddContentTypeIsElementColumn.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddContentTypeIsElementColumn.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddLockObjects.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddLockObjects.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddLockObjects.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddLockObjects.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddLogTableColumns.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddLogTableColumns.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddLogTableColumns.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddLogTableColumns.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddTypedLabels.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddTypedLabels.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddTypedLabels.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddTypedLabels.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddVariationTables1A.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddVariationTables1A.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddVariationTables1A.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddVariationTables1A.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddVariationTables2.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddVariationTables2.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/AddVariationTables2.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/AddVariationTables2.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/ContentVariationMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/ContentVariationMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/ContentVariationMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/ContentVariationMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/ConvertRelatedLinksToMultiUrlPicker.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/ConvertRelatedLinksToMultiUrlPicker.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/ConvertRelatedLinksToMultiUrlPicker.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/ConvertRelatedLinksToMultiUrlPicker.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypeMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypeMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypeMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypeMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/ContentPickerPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/ContentPickerPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/ContentPickerPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/ContentPickerPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/DecimalPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/DecimalPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/DecimalPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/DecimalPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/DefaultPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/DefaultPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/DefaultPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/DefaultPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/DropDownFlexiblePreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/DropDownFlexiblePreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/DropDownFlexiblePreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/DropDownFlexiblePreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/IPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/IPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/IPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/IPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/ListViewPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/ListViewPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/ListViewPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/ListViewPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/MarkdownEditorPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/MarkdownEditorPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/MarkdownEditorPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/MarkdownEditorPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/MediaPickerPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/MediaPickerPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/MediaPickerPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/MediaPickerPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/NestedContentPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/NestedContentPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/NestedContentPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/NestedContentPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueDto.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueDto.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueDto.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueDto.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorBase.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorBase.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorBase.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorBase.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollection.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollection.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollection.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollection.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollectionBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollectionBuilder.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorCollectionBuilder.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorComposer.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorComposer.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorComposer.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/PreValueMigratorComposer.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/RenamingPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/RenamingPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/RenamingPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/RenamingPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/RichTextPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/RichTextPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/RichTextPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/RichTextPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/UmbracoSliderPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/UmbracoSliderPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/UmbracoSliderPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/UmbracoSliderPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/ValueListPreValueMigrator.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/ValueListPreValueMigrator.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DataTypes/ValueListPreValueMigrator.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DataTypes/ValueListPreValueMigrator.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropDownPropertyEditorsMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropDownPropertyEditorsMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropDownPropertyEditorsMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropDownPropertyEditorsMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropMigrationsTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropMigrationsTable.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropMigrationsTable.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropMigrationsTable.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropPreValueTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropPreValueTable.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropPreValueTable.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropPreValueTable.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropTaskTables.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropTaskTables.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropTaskTables.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropTaskTables.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropTemplateDesignColumn.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropTemplateDesignColumn.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropTemplateDesignColumn.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropTemplateDesignColumn.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropXmlTables.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropXmlTables.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/DropXmlTables.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/DropXmlTables.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/FallbackLanguage.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/FallbackLanguage.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/FallbackLanguage.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/FallbackLanguage.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/FixLanguageIsoCodeLength.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/FixLanguageIsoCodeLength.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/FixLanguageIsoCodeLength.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/FixLanguageIsoCodeLength.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/LanguageColumns.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/LanguageColumns.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/LanguageColumns.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/LanguageColumns.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/MakeRedirectUrlVariant.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MakeRedirectUrlVariant.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/MakeRedirectUrlVariant.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MakeRedirectUrlVariant.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/MakeTagsVariant.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MakeTagsVariant.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/MakeTagsVariant.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MakeTagsVariant.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/MergeDateAndDateTimePropertyEditor.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigrationBase.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigrationBase.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigrationBase.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/PropertyEditorsMigrationBase.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RadioAndCheckboxPropertyEditorsMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RadioAndCheckboxPropertyEditorsMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RadioAndCheckboxPropertyEditorsMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RadioAndCheckboxPropertyEditorsMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorMacroColumns.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RefactorVariantsModel.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorVariantsModel.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RefactorVariantsModel.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RefactorVariantsModel.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RenameLabelAndRichTextPropertyEditorAliases.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RenameLabelAndRichTextPropertyEditorAliases.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RenameLabelAndRichTextPropertyEditorAliases.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RenameLabelAndRichTextPropertyEditorAliases.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RenameMediaVersionTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RenameMediaVersionTable.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RenameMediaVersionTable.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RenameMediaVersionTable.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RenameUmbracoDomainsTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RenameUmbracoDomainsTable.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/RenameUmbracoDomainsTable.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/RenameUmbracoDomainsTable.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/SuperZero.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/SuperZero.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/SuperZero.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/SuperZero.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/TablesForScheduledPublishing.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/TablesForScheduledPublishing.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/TablesForScheduledPublishing.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/TablesForScheduledPublishing.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/TagsMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/TagsMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/TagsMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/TagsMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/TagsMigrationFix.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/TagsMigrationFix.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/TagsMigrationFix.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/TagsMigrationFix.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/UpdateDefaultMandatoryLanguage.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/UpdateDefaultMandatoryLanguage.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/UpdateDefaultMandatoryLanguage.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/UpdateDefaultMandatoryLanguage.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/UpdatePickerIntegerValuesToUdi.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/UpdatePickerIntegerValuesToUdi.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/UpdatePickerIntegerValuesToUdi.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/UpdatePickerIntegerValuesToUdi.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/UserForeignKeys.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/UserForeignKeys.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/UserForeignKeys.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/UserForeignKeys.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/VariantsMigration.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/VariantsMigration.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_0/VariantsMigration.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/VariantsMigration.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_0_1/ChangeNuCacheJsonFormat.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_1/ChangeNuCacheJsonFormat.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_0_1/ChangeNuCacheJsonFormat.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_1/ChangeNuCacheJsonFormat.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_1_0/FixContentNuCascade.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/FixContentNuCascade.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_1_0/FixContentNuCascade.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/FixContentNuCascade.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_1_0/RenameUserLoginDtoDateIndex.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/RenameUserLoginDtoDateIndex.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_1_0/RenameUserLoginDtoDateIndex.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/RenameUserLoginDtoDateIndex.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddNewRelationTypes.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_6_0/AddNewRelationTypes.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddNewRelationTypes.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_6_0/AddNewRelationTypes.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddPropertyTypeValidationMessageColumns.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_6_0/AddPropertyTypeValidationMessageColumns.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/AddPropertyTypeValidationMessageColumns.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_6_0/AddPropertyTypeValidationMessageColumns.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/UpdateRelationTypeTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_6_0/UpdateRelationTypeTable.cs similarity index 100% rename from src/Umbraco.Core/Migrations/Upgrade/V_8_6_0/UpdateRelationTypeTable.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_6_0/UpdateRelationTypeTable.cs diff --git a/src/Umbraco.Infrastructure/Persistence/IDbProviderFactoryCreator.cs b/src/Umbraco.Infrastructure/Persistence/IDbProviderFactoryCreator.cs index cda69480ae..b91be4c1e6 100644 --- a/src/Umbraco.Infrastructure/Persistence/IDbProviderFactoryCreator.cs +++ b/src/Umbraco.Infrastructure/Persistence/IDbProviderFactoryCreator.cs @@ -9,5 +9,6 @@ namespace Umbraco.Core.Persistence DbProviderFactory CreateFactory(); DbProviderFactory CreateFactory(string providerName); ISqlSyntaxProvider GetSqlSyntaxProvider(string providerName); + void CreateDatabase(); } } diff --git a/src/Umbraco.Core/Services/IdkMap.cs b/src/Umbraco.Infrastructure/Services/IdkMap.cs similarity index 99% rename from src/Umbraco.Core/Services/IdkMap.cs rename to src/Umbraco.Infrastructure/Services/IdkMap.cs index 3b719f31d1..f7790ba76b 100644 --- a/src/Umbraco.Core/Services/IdkMap.cs +++ b/src/Umbraco.Infrastructure/Services/IdkMap.cs @@ -47,7 +47,7 @@ namespace Umbraco.Core.Services private readonly ConcurrentDictionary id2key, Func key2id)> _dictionary = new ConcurrentDictionary id2key, Func key2id)>(); - internal void SetMapper(UmbracoObjectTypes umbracoObjectType, Func id2key, Func key2id) + public void SetMapper(UmbracoObjectTypes umbracoObjectType, Func id2key, Func key2id) { _dictionary[umbracoObjectType] = (id2key, key2id); } diff --git a/src/Umbraco.Core/Services/Implement/AuditService.cs b/src/Umbraco.Infrastructure/Services/Implement/AuditService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/AuditService.cs rename to src/Umbraco.Infrastructure/Services/Implement/AuditService.cs diff --git a/src/Umbraco.Core/Services/Implement/ConsentService.cs b/src/Umbraco.Infrastructure/Services/Implement/ConsentService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/ConsentService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ConsentService.cs diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentService.cs similarity index 99% rename from src/Umbraco.Core/Services/Implement/ContentService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ContentService.cs index 8287c071f1..f386f22f39 100644 --- a/src/Umbraco.Core/Services/Implement/ContentService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/ContentService.cs @@ -28,7 +28,7 @@ namespace Umbraco.Core.Services.Implement private readonly ILanguageRepository _languageRepository; private readonly Lazy _propertyValidationService; private IQuery _queryNotTrashed; - + #region Constructors public ContentService(IScopeProvider provider, ILogger logger, @@ -2552,7 +2552,7 @@ namespace Umbraco.Core.Services.Implement /// /// Occurs after change. /// - internal static event TypedEventHandler.EventArgs> TreeChanged; + public static event TypedEventHandler.EventArgs> TreeChanged; /// /// Occurs after a blueprint has been saved. diff --git a/src/Umbraco.Core/Services/Implement/ContentTypeBaseServiceProvider.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeBaseServiceProvider.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/ContentTypeBaseServiceProvider.cs rename to src/Umbraco.Infrastructure/Services/Implement/ContentTypeBaseServiceProvider.cs diff --git a/src/Umbraco.Core/Services/Implement/ContentTypeService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/ContentTypeService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ContentTypeService.cs diff --git a/src/Umbraco.Core/Services/Implement/ContentTypeServiceBase.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBase.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/ContentTypeServiceBase.cs rename to src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBase.cs diff --git a/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs similarity index 96% rename from src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs index 3a1ad64483..a08bc3cd96 100644 --- a/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTItemTService.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core.Services.Implement protected abstract TService This { get; } // that one must be dispatched - internal static event TypedEventHandler.EventArgs> Changed; + public static event TypedEventHandler.EventArgs> Changed; // that one is always immediate (transactional) public static event TypedEventHandler.EventArgs> ScopedRefreshedEntity; @@ -39,7 +39,7 @@ namespace Umbraco.Core.Services.Implement public static event TypedEventHandler> SavedContainer; public static event TypedEventHandler> DeletingContainer; public static event TypedEventHandler> DeletedContainer; - + protected void OnChanged(IScope scope, ContentTypeChange.EventArgs args) { scope.Events.Dispatch(Changed, This, args, nameof(Changed)); @@ -50,7 +50,7 @@ namespace Umbraco.Core.Services.Implement // that one is always immediate (not dispatched, transactional) ScopedRefreshedEntity.RaiseEvent(args, This); } - + protected bool OnSavingCancelled(IScope scope, SaveEventArgs args) { return scope.Events.DispatchCancelable(Saving, This, args); @@ -60,17 +60,17 @@ namespace Umbraco.Core.Services.Implement { scope.Events.Dispatch(Saved, This, args); } - + protected bool OnDeletingCancelled(IScope scope, DeleteEventArgs args) { return scope.Events.DispatchCancelable(Deleting, This, args, nameof(Deleting)); } - + protected void OnDeleted(IScope scope, DeleteEventArgs args) { scope.Events.Dispatch(Deleted, This, args); } - + protected bool OnMovingCancelled(IScope scope, MoveEventArgs args) { return scope.Events.DispatchCancelable(Moving, This, args); @@ -80,7 +80,7 @@ namespace Umbraco.Core.Services.Implement { scope.Events.Dispatch(Moved, This, args); } - + protected bool OnSavingContainerCancelled(IScope scope, SaveEventArgs args) { return scope.Events.DispatchCancelable(SavingContainer, This, args, nameof(SavingContainer)); @@ -100,7 +100,7 @@ namespace Umbraco.Core.Services.Implement { scope.Events.Dispatch(SavedContainer, This, args, nameof(SavedContainer)); } - + protected bool OnDeletingContainerCancelled(IScope scope, DeleteEventArgs args) { return scope.Events.DispatchCancelable(DeletingContainer, This, args); diff --git a/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs diff --git a/src/Umbraco.Core/Services/Implement/DataTypeService.cs b/src/Umbraco.Infrastructure/Services/Implement/DataTypeService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/DataTypeService.cs rename to src/Umbraco.Infrastructure/Services/Implement/DataTypeService.cs diff --git a/src/Umbraco.Core/Services/Implement/DomainService.cs b/src/Umbraco.Infrastructure/Services/Implement/DomainService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/DomainService.cs rename to src/Umbraco.Infrastructure/Services/Implement/DomainService.cs diff --git a/src/Umbraco.Core/Services/Implement/EntityService.cs b/src/Umbraco.Infrastructure/Services/Implement/EntityService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/EntityService.cs rename to src/Umbraco.Infrastructure/Services/Implement/EntityService.cs diff --git a/src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs b/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs similarity index 98% rename from src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs rename to src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs index c8212fc265..e8fea4c0e1 100644 --- a/src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs @@ -5,8 +5,10 @@ using System.Linq; using System.Net; using System.Xml.Linq; using Newtonsoft.Json; +using Umbraco.Composing; using Umbraco.Core.Composing; using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; using Umbraco.Core.Strings; namespace Umbraco.Core.Services.Implement @@ -24,6 +26,7 @@ namespace Umbraco.Core.Services.Implement private readonly ILocalizationService _localizationService; private readonly UrlSegmentProviderCollection _urlSegmentProviders; private readonly IShortStringHelper _shortStringHelper; + private readonly PropertyEditorCollection _propertyEditors; public EntityXmlSerializer( IContentService contentService, @@ -33,7 +36,8 @@ namespace Umbraco.Core.Services.Implement ILocalizationService localizationService, IContentTypeService contentTypeService, UrlSegmentProviderCollection urlSegmentProviders, - IShortStringHelper shortStringHelper) + IShortStringHelper shortStringHelper, + PropertyEditorCollection propertyEditors) { _contentTypeService = contentTypeService; _mediaService = mediaService; @@ -43,6 +47,7 @@ namespace Umbraco.Core.Services.Implement _localizationService = localizationService; _urlSegmentProviders = urlSegmentProviders; _shortStringHelper = shortStringHelper; + _propertyEditors = propertyEditors; } /// @@ -54,7 +59,7 @@ namespace Umbraco.Core.Services.Implement { if (content == null) throw new ArgumentNullException(nameof(content)); - var nodeName = content.ContentType.Alias.ToSafeAlias(); + var nodeName = content.ContentType.Alias.ToSafeAlias(_shortStringHelper); var xml = SerializeContentBase(content, content.GetUrlSegment(_shortStringHelper, _urlSegmentProviders), nodeName, published); @@ -100,7 +105,7 @@ namespace Umbraco.Core.Services.Implement if (media == null) throw new ArgumentNullException(nameof(media)); if (_urlSegmentProviders == null) throw new ArgumentNullException(nameof(_urlSegmentProviders)); - var nodeName = media.ContentType.Alias.ToSafeAlias(); + var nodeName = media.ContentType.Alias.ToSafeAlias(_shortStringHelper); const bool published = false; // always false for media var xml = SerializeContentBase(media, media.GetUrlSegment(_shortStringHelper, _urlSegmentProviders), nodeName, published); @@ -135,7 +140,7 @@ namespace Umbraco.Core.Services.Implement /// public XElement Serialize(IMember member) { - var nodeName = member.ContentType.Alias.ToSafeAlias(); + var nodeName = member.ContentType.Alias.ToSafeAlias(_shortStringHelper); const bool published = false; // always false for member var xml = SerializeContentBase(member, "", nodeName, published); @@ -564,7 +569,7 @@ namespace Umbraco.Core.Services.Implement var propertyType = property.PropertyType; // get the property editor for this property and let it convert it to the xml structure - var propertyEditor = Current.PropertyEditors[propertyType.PropertyEditorAlias]; + var propertyEditor = _propertyEditors[propertyType.PropertyEditorAlias]; return propertyEditor == null ? Array.Empty() : propertyEditor.GetValueEditor().ConvertDbToXml(property, _dataTypeService, _localizationService, published); diff --git a/src/Umbraco.Core/Services/Implement/ExternalLoginService.cs b/src/Umbraco.Infrastructure/Services/Implement/ExternalLoginService.cs similarity index 98% rename from src/Umbraco.Core/Services/Implement/ExternalLoginService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ExternalLoginService.cs index 0d6a345e90..c872cf6abb 100644 --- a/src/Umbraco.Core/Services/Implement/ExternalLoginService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/ExternalLoginService.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Identity; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models.Identity; diff --git a/src/Umbraco.Core/Services/Implement/FileService.cs b/src/Umbraco.Infrastructure/Services/Implement/FileService.cs similarity index 99% rename from src/Umbraco.Core/Services/Implement/FileService.cs rename to src/Umbraco.Infrastructure/Services/Implement/FileService.cs index ebfc82c50c..25f2c619d2 100644 --- a/src/Umbraco.Core/Services/Implement/FileService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/FileService.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using Umbraco.Core.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -28,6 +29,7 @@ namespace Umbraco.Core.Services.Implement private readonly IPartialViewMacroRepository _partialViewMacroRepository; private readonly IAuditRepository _auditRepository; private readonly IShortStringHelper _shortStringHelper; + private readonly IGlobalSettings _globalSettings; private const string PartialViewHeader = "@inherits Umbraco.Web.Mvc.UmbracoViewPage"; private const string PartialViewMacroHeader = "@inherits Umbraco.Web.Macros.PartialViewMacroPage"; @@ -35,7 +37,7 @@ namespace Umbraco.Core.Services.Implement public FileService(IScopeProvider uowProvider, IIOHelper ioHelper, ILogger logger, IEventMessagesFactory eventMessagesFactory, IStylesheetRepository stylesheetRepository, IScriptRepository scriptRepository, ITemplateRepository templateRepository, IPartialViewRepository partialViewRepository, IPartialViewMacroRepository partialViewMacroRepository, - IAuditRepository auditRepository, IShortStringHelper shortStringHelper) + IAuditRepository auditRepository, IShortStringHelper shortStringHelper, IGlobalSettings globalSettings) : base(uowProvider, logger, eventMessagesFactory) { _ioHelper = ioHelper; @@ -46,6 +48,7 @@ namespace Umbraco.Core.Services.Implement _partialViewMacroRepository = partialViewMacroRepository; _auditRepository = auditRepository; _shortStringHelper = shortStringHelper; + _globalSettings = globalSettings; } #region Stylesheets @@ -669,7 +672,7 @@ namespace Umbraco.Core.Services.Implement public IEnumerable GetPartialViewSnippetNames(params string[] filterNames) { - var snippetPath = _ioHelper.MapPath($"{Current.Configs.Global().UmbracoPath}/PartialViewMacros/Templates/"); + var snippetPath = _ioHelper.MapPath($"{_globalSettings.UmbracoPath}/PartialViewMacros/Templates/"); var files = Directory.GetFiles(snippetPath, "*.cshtml") .Select(Path.GetFileNameWithoutExtension) .Except(filterNames, StringComparer.InvariantCultureIgnoreCase) @@ -903,7 +906,7 @@ namespace Umbraco.Core.Services.Implement fileName += ".cshtml"; } - var snippetPath = _ioHelper.MapPath($"{Current.Configs.Global().UmbracoPath}/PartialViewMacros/Templates/{fileName}"); + var snippetPath = _ioHelper.MapPath($"{_globalSettings.UmbracoPath}/PartialViewMacros/Templates/{fileName}"); return System.IO.File.Exists(snippetPath) ? Attempt.Succeed(snippetPath) : Attempt.Fail(); diff --git a/src/Umbraco.Core/Services/Implement/KeyValueService.cs b/src/Umbraco.Infrastructure/Services/Implement/KeyValueService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/KeyValueService.cs rename to src/Umbraco.Infrastructure/Services/Implement/KeyValueService.cs diff --git a/src/Umbraco.Core/Services/Implement/LocalizationService.cs b/src/Umbraco.Infrastructure/Services/Implement/LocalizationService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/LocalizationService.cs rename to src/Umbraco.Infrastructure/Services/Implement/LocalizationService.cs diff --git a/src/Umbraco.Core/Services/Implement/LocalizedTextService.cs b/src/Umbraco.Infrastructure/Services/Implement/LocalizedTextService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/LocalizedTextService.cs rename to src/Umbraco.Infrastructure/Services/Implement/LocalizedTextService.cs diff --git a/src/Umbraco.Core/Services/Implement/LocalizedTextServiceFileSources.cs b/src/Umbraco.Infrastructure/Services/Implement/LocalizedTextServiceFileSources.cs similarity index 99% rename from src/Umbraco.Core/Services/Implement/LocalizedTextServiceFileSources.cs rename to src/Umbraco.Infrastructure/Services/Implement/LocalizedTextServiceFileSources.cs index 86913071fd..8507744fa7 100644 --- a/src/Umbraco.Core/Services/Implement/LocalizedTextServiceFileSources.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/LocalizedTextServiceFileSources.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Xml; using System.Xml.Linq; +using Umbraco.Composing; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Logging; diff --git a/src/Umbraco.Core/Services/Implement/LocalizedTextServiceSupplementaryFileSource.cs b/src/Umbraco.Infrastructure/Services/Implement/LocalizedTextServiceSupplementaryFileSource.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/LocalizedTextServiceSupplementaryFileSource.cs rename to src/Umbraco.Infrastructure/Services/Implement/LocalizedTextServiceSupplementaryFileSource.cs diff --git a/src/Umbraco.Core/Services/Implement/MacroService.cs b/src/Umbraco.Infrastructure/Services/Implement/MacroService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/MacroService.cs rename to src/Umbraco.Infrastructure/Services/Implement/MacroService.cs diff --git a/src/Umbraco.Core/Services/Implement/MediaService.cs b/src/Umbraco.Infrastructure/Services/Implement/MediaService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/MediaService.cs rename to src/Umbraco.Infrastructure/Services/Implement/MediaService.cs diff --git a/src/Umbraco.Core/Services/Implement/MediaTypeService.cs b/src/Umbraco.Infrastructure/Services/Implement/MediaTypeService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/MediaTypeService.cs rename to src/Umbraco.Infrastructure/Services/Implement/MediaTypeService.cs diff --git a/src/Umbraco.Core/Services/Implement/MemberGroupService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberGroupService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/MemberGroupService.cs rename to src/Umbraco.Infrastructure/Services/Implement/MemberGroupService.cs diff --git a/src/Umbraco.Core/Services/Implement/MemberService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs similarity index 99% rename from src/Umbraco.Core/Services/Implement/MemberService.cs rename to src/Umbraco.Infrastructure/Services/Implement/MemberService.cs index 8295d3ee55..e551017295 100644 --- a/src/Umbraco.Core/Services/Implement/MemberService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs @@ -22,12 +22,13 @@ namespace Umbraco.Core.Services.Implement private readonly IMemberTypeRepository _memberTypeRepository; private readonly IMemberGroupRepository _memberGroupRepository; private readonly IAuditRepository _auditRepository; + private readonly IMemberTypeService _memberTypeService; private readonly IMemberGroupService _memberGroupService; #region Constructor - public MemberService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMemberGroupService memberGroupService, + public MemberService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMemberGroupService memberGroupService, IMemberRepository memberRepository, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, IAuditRepository auditRepository) : base(provider, logger, eventMessagesFactory) { @@ -64,7 +65,7 @@ namespace Umbraco.Core.Services.Implement { case MemberCountType.All: query = Query(); - break; + break; case MemberCountType.LockedOut: query = Query().Where(x => ((Member) x).PropertyTypeAlias == Constants.Conventions.Member.IsLockedOut && ((Member) x).BoolPropertyValue); break; @@ -545,7 +546,7 @@ namespace Umbraco.Core.Services.Implement return _memberRepository.GetPage(query, pageIndex, pageSize, out totalRecords, null, Ordering.By("Name")); } } - + /// /// Finds a list of objects by a partial email string /// @@ -803,8 +804,8 @@ namespace Umbraco.Core.Services.Implement { //trimming username and email to make sure we have no trailing space member.Username = member.Username.Trim(); - member.Email = member.Email.Trim(); - + member.Email = member.Email.Trim(); + using (var scope = ScopeProvider.CreateScope()) { var saveEventArgs = new SaveEventArgs(member); @@ -1127,7 +1128,7 @@ namespace Umbraco.Core.Services.Implement /// This is internal for now and is used to export a member in the member editor, /// it will raise an event so that auditing logs can be created. /// - internal MemberExportModel ExportMember(Guid key) + public MemberExportModel ExportMember(Guid key) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { @@ -1244,10 +1245,6 @@ namespace Umbraco.Core.Services.Implement } } - public string GetDefaultMemberType() - { - return Current.Services.MemberTypeService.GetDefault(); - } #endregion } diff --git a/src/Umbraco.Core/Services/Implement/MemberTypeService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberTypeService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/MemberTypeService.cs rename to src/Umbraco.Infrastructure/Services/Implement/MemberTypeService.cs diff --git a/src/Umbraco.Core/Services/Implement/NotificationService.cs b/src/Umbraco.Infrastructure/Services/Implement/NotificationService.cs similarity index 99% rename from src/Umbraco.Core/Services/Implement/NotificationService.cs rename to src/Umbraco.Infrastructure/Services/Implement/NotificationService.cs index c89cb27623..c8b8e617c9 100644 --- a/src/Umbraco.Core/Services/Implement/NotificationService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/NotificationService.cs @@ -92,7 +92,7 @@ namespace Umbraco.Core.Services.Implement do { // users are returned ordered by id, notifications are returned ordered by user id - var users = ((UserService)_userService).GetNextUsers(id, pagesz).Where(x => x.IsApproved).ToList(); + var users = _userService.GetNextUsers(id, pagesz).Where(x => x.IsApproved).ToList(); var notifications = GetUsersNotifications(users.Select(x => x.Id), action, Enumerable.Empty(), Constants.ObjectTypes.Document).ToList(); if (notifications.Count == 0) break; @@ -386,7 +386,7 @@ namespace Umbraco.Core.Services.Implement var protocol = _globalSettings.UseHttps ? "https" : "http"; var subjectVars = new NotificationEmailSubjectParams( - string.Concat(siteUri.Authority, _ioHelper.ResolveUrl(Current.Configs.Global().UmbracoPath)), + string.Concat(siteUri.Authority, _ioHelper.ResolveUrl(_globalSettings.UmbracoPath)), actionName, content.Name); @@ -402,7 +402,7 @@ namespace Umbraco.Core.Services.Implement string.Concat(content.Id, ".aspx"), protocol), performingUser.Name, - string.Concat(siteUri.Authority, _ioHelper.ResolveUrl(Current.Configs.Global().UmbracoPath)), + string.Concat(siteUri.Authority, _ioHelper.ResolveUrl(_globalSettings.UmbracoPath)), summary.ToString()); // create the mail message diff --git a/src/Umbraco.Core/Services/Implement/PackagingService.cs b/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/PackagingService.cs rename to src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs diff --git a/src/Umbraco.Core/Services/Implement/PropertyValidationService.cs b/src/Umbraco.Infrastructure/Services/Implement/PropertyValidationService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/PropertyValidationService.cs rename to src/Umbraco.Infrastructure/Services/Implement/PropertyValidationService.cs diff --git a/src/Umbraco.Core/Services/Implement/PublicAccessService.cs b/src/Umbraco.Infrastructure/Services/Implement/PublicAccessService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/PublicAccessService.cs rename to src/Umbraco.Infrastructure/Services/Implement/PublicAccessService.cs diff --git a/src/Umbraco.Core/Services/Implement/RedirectUrlService.cs b/src/Umbraco.Infrastructure/Services/Implement/RedirectUrlService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/RedirectUrlService.cs rename to src/Umbraco.Infrastructure/Services/Implement/RedirectUrlService.cs diff --git a/src/Umbraco.Core/Services/Implement/RelationService.cs b/src/Umbraco.Infrastructure/Services/Implement/RelationService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/RelationService.cs rename to src/Umbraco.Infrastructure/Services/Implement/RelationService.cs diff --git a/src/Umbraco.Core/Services/Implement/RepositoryService.cs b/src/Umbraco.Infrastructure/Services/Implement/RepositoryService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/RepositoryService.cs rename to src/Umbraco.Infrastructure/Services/Implement/RepositoryService.cs diff --git a/src/Umbraco.Core/Services/Implement/ScopeRepositoryService.cs b/src/Umbraco.Infrastructure/Services/Implement/ScopeRepositoryService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/ScopeRepositoryService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ScopeRepositoryService.cs diff --git a/src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs b/src/Umbraco.Infrastructure/Services/Implement/ServerRegistrationService.cs similarity index 94% rename from src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs rename to src/Umbraco.Infrastructure/Services/Implement/ServerRegistrationService.cs index 1c582953ec..97bf76e672 100644 --- a/src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/ServerRegistrationService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Composing; using Umbraco.Core.Events; +using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; @@ -18,9 +19,7 @@ namespace Umbraco.Core.Services.Implement public sealed class ServerRegistrationService : ScopeRepositoryService, IServerRegistrationService { private readonly IServerRegistrationRepository _serverRegistrationRepository; - - private static readonly string CurrentServerIdentityValue = NetworkHelper.MachineName // eg DOMAIN\SERVER - + "/" + Current.HostingEnvironment.ApplicationId; // eg /LM/S3SVC/11/ROOT + private readonly IHostingEnvironment _hostingEnvironment; private ServerRole _currentServerRole = ServerRole.Unknown; @@ -31,10 +30,11 @@ namespace Umbraco.Core.Services.Implement /// A logger. /// public ServerRegistrationService(IScopeProvider scopeProvider, ILogger logger, IEventMessagesFactory eventMessagesFactory, - IServerRegistrationRepository serverRegistrationRepository) + IServerRegistrationRepository serverRegistrationRepository, IHostingEnvironment hostingEnvironment) : base(scopeProvider, logger, eventMessagesFactory) { _serverRegistrationRepository = serverRegistrationRepository; + _hostingEnvironment = hostingEnvironment; } /// @@ -148,7 +148,8 @@ namespace Umbraco.Core.Services.Implement /// /// Gets the local server identity. /// - public string CurrentServerIdentity => CurrentServerIdentityValue; + public string CurrentServerIdentity => NetworkHelper.MachineName // eg DOMAIN\SERVER + + "/" + _hostingEnvironment.ApplicationId; // eg /LM/S3SVC/11/ROOT; /// /// Gets the role of the current server. diff --git a/src/Umbraco.Core/Services/Implement/TagService.cs b/src/Umbraco.Infrastructure/Services/Implement/TagService.cs similarity index 100% rename from src/Umbraco.Core/Services/Implement/TagService.cs rename to src/Umbraco.Infrastructure/Services/Implement/TagService.cs diff --git a/src/Umbraco.Core/Services/Implement/UserService.cs b/src/Umbraco.Infrastructure/Services/Implement/UserService.cs similarity index 99% rename from src/Umbraco.Core/Services/Implement/UserService.cs rename to src/Umbraco.Infrastructure/Services/Implement/UserService.cs index 2bc9caaba8..1d79cfb88b 100644 --- a/src/Umbraco.Core/Services/Implement/UserService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/UserService.cs @@ -604,7 +604,7 @@ namespace Umbraco.Core.Services.Implement } } - internal IEnumerable GetNextUsers(int id, int count) + public IEnumerable GetNextUsers(int id, int count) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { @@ -1185,7 +1185,7 @@ namespace Umbraco.Core.Services.Implement /// /// Occurs after Save /// - internal static event TypedEventHandler> SavedUserGroup; + public static event TypedEventHandler> SavedUserGroup; /// /// Occurs before Delete @@ -1199,6 +1199,6 @@ namespace Umbraco.Core.Services.Implement // TODO: still don't know if we need this yet unless we start caching permissions, but that also means we'll need another // event on the ContentService since there's a method there to modify node permissions too, or we can proxy events if needed. - internal static event TypedEventHandler> UserGroupPermissionsAssigned; + public static event TypedEventHandler> UserGroupPermissionsAssigned; } } diff --git a/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs b/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs index 775bec75f0..01fd1de080 100644 --- a/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs +++ b/src/Umbraco.Tests.Benchmarks/BulkInsertBenchmarks.cs @@ -107,7 +107,7 @@ namespace Umbraco.Tests.Benchmarks //use the db to create the initial schema so we can reuse in each bench using (_dbSqlCe = GetSqlCeDatabase(sqlCeConnectionString, logger)) { - var creation = new DatabaseSchemaCreator(_dbSqlCe, logger, umbracoVersion); + var creation = new DatabaseSchemaCreator(_dbSqlCe, logger, umbracoVersion, SettingsForTests.GenerateMockGlobalSettings()); creation.InitializeDatabaseSchema(); } _initDbBytes = File.ReadAllBytes(_dbFile); diff --git a/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs b/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs index 82ccd21b80..966c4109c6 100644 --- a/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/AdvancedMigrationTests.cs @@ -42,7 +42,7 @@ namespace Umbraco.Tests.Migrations upgrader.Execute(ScopeProvider, builder, Mock.Of(), logger); - var helper = new DatabaseSchemaCreator(scope.Database, logger, UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, logger, UmbracoVersion, TestObjects.GetGlobalSettings()); var exists = helper.TableExists("umbracoUser"); Assert.IsTrue(exists); diff --git a/src/Umbraco.Tests/Migrations/MigrationPlanTests.cs b/src/Umbraco.Tests/Migrations/MigrationPlanTests.cs index 3241f78b62..b87270327d 100644 --- a/src/Umbraco.Tests/Migrations/MigrationPlanTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationPlanTests.cs @@ -138,7 +138,7 @@ namespace Umbraco.Tests.Migrations [Test] public void ValidateUmbracoPlan() { - var plan = new UmbracoPlan(TestHelper.GetUmbracoVersion()); + var plan = new UmbracoPlan(TestHelper.GetUmbracoVersion(), SettingsForTests.GenerateMockGlobalSettings()); plan.Validate(); Console.WriteLine(plan.FinalState); Assert.IsFalse(plan.FinalState.IsNullOrWhiteSpace()); diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index 382d717761..17dbe431d9 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -91,7 +91,7 @@ namespace Umbraco.Tests.Persistence using (var database = _databaseFactory.CreateDatabase()) using (var transaction = database.GetTransaction()) { - schemaHelper = new DatabaseSchemaCreator(database, _logger, _umbracoVersion); + schemaHelper = new DatabaseSchemaCreator(database, _logger, _umbracoVersion, SettingsForTests.GenerateMockGlobalSettings()); schemaHelper.InitializeDatabaseSchema(); transaction.Complete(); } diff --git a/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs b/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs index 99254edd77..0648e3bc21 100644 --- a/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs +++ b/src/Umbraco.Tests/Persistence/SchemaValidationTest.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Persistence using (var scope = ScopeProvider.CreateScope()) { - var schema = new DatabaseSchemaCreator(scope.Database, Logger, UmbracoVersion); + var schema = new DatabaseSchemaCreator(scope.Database, Logger, UmbracoVersion, TestObjects.GetGlobalSettings()); result = schema.ValidateSchema( //TODO: When we remove the xml cache from tests we can remove this too DatabaseSchemaCreator.OrderedTables.Concat(new []{typeof(ContentXmlDto), typeof(PreviewXmlDto)})); diff --git a/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs b/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs index 660783c784..207e595598 100644 --- a/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs +++ b/src/Umbraco.Tests/Persistence/SqlCeTableByTableTest.cs @@ -16,12 +16,14 @@ namespace Umbraco.Tests.Persistence [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] public class SqlCeTableByTableTest : TestWithDatabaseBase { + public IGlobalSettings GlobalSettings => SettingsForTests.GenerateMockGlobalSettings(); + [Test] public void Can_Create_umbracoNode_Table() { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -34,7 +36,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -48,7 +50,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -63,7 +65,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -77,7 +79,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -92,7 +94,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -106,7 +108,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -122,7 +124,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -138,7 +140,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -152,7 +154,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -165,7 +167,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -180,7 +182,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -194,7 +196,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -211,7 +213,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -227,7 +229,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -241,7 +243,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -254,7 +256,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -267,7 +269,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -280,7 +282,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -296,7 +298,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -313,7 +315,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -328,7 +330,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -345,7 +347,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -363,7 +365,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -380,7 +382,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -395,7 +397,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -410,7 +412,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -423,7 +425,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -436,7 +438,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -457,7 +459,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); @@ -470,7 +472,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -484,7 +486,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -498,7 +500,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); @@ -513,7 +515,7 @@ namespace Umbraco.Tests.Persistence { using (var scope = ScopeProvider.CreateScope()) { - var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion); + var helper = new DatabaseSchemaCreator(scope.Database, Mock.Of(), UmbracoVersion, GlobalSettings); helper.CreateTable(); helper.CreateTable(); diff --git a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs index 9fc695cc3a..64b45d41bf 100644 --- a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs +++ b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs @@ -156,7 +156,7 @@ namespace Umbraco.Tests.Runtimes var scopeProvider = factory.GetInstance(); using (var scope = scopeProvider.CreateScope()) { - var creator = new DatabaseSchemaCreator(scope.Database, logger, umbracoVersion); + var creator = new DatabaseSchemaCreator(scope.Database, logger, umbracoVersion, SettingsForTests.GetDefaultGlobalSettings()); creator.InitializeDatabaseSchema(); scope.Complete(); } diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 649c1e1f1e..73b09fb1f0 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -161,13 +161,13 @@ namespace Umbraco.Tests.TestHelpers 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)); - var serverRegistrationService = GetLazyService(factory, c => new ServerRegistrationService(scopeProvider, logger, eventMessagesFactory, GetRepo(c))); + var serverRegistrationService = GetLazyService(factory, c => new ServerRegistrationService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), TestHelper.GetHostingEnvironment())); var memberGroupService = GetLazyService(factory, c => new MemberGroupService(scopeProvider, logger, eventMessagesFactory, GetRepo(c))); var memberService = GetLazyService(factory, c => new MemberService(scopeProvider, logger, eventMessagesFactory, memberGroupService.Value, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); var mediaService = GetLazyService(factory, c => new MediaService(scopeProvider, mediaFileSystem, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); var contentTypeService = GetLazyService(factory, c => new ContentTypeService(scopeProvider, logger, eventMessagesFactory, contentService.Value, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); var mediaTypeService = GetLazyService(factory, c => new MediaTypeService(scopeProvider, logger, eventMessagesFactory, mediaService.Value, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); - var fileService = GetLazyService(factory, c => new FileService(scopeProvider, ioHelper, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), TestHelper.ShortStringHelper)); + var fileService = GetLazyService(factory, c => new FileService(scopeProvider, ioHelper, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), TestHelper.ShortStringHelper, globalSettings)); var memberTypeService = GetLazyService(factory, c => new MemberTypeService(scopeProvider, logger, eventMessagesFactory, memberService.Value, GetRepo(c), GetRepo(c), GetRepo(c))); var entityService = GetLazyService(factory, c => new EntityService(scopeProvider, logger, eventMessagesFactory, idkMap, GetRepo(c))); @@ -179,9 +179,9 @@ namespace Umbraco.Tests.TestHelpers return new PackagingService( auditService.Value, new PackagesRepository(contentService.Value, contentTypeService.Value, dataTypeService.Value, fileService.Value, macroService.Value, localizationService.Value, ioHelper, - new EntityXmlSerializer(contentService.Value, mediaService.Value, dataTypeService.Value, userService.Value, localizationService.Value, contentTypeService.Value, urlSegmentProviders, TestHelper.ShortStringHelper), logger, umbracoVersion, globalSettings, "createdPackages.config"), + new EntityXmlSerializer(contentService.Value, mediaService.Value, dataTypeService.Value, userService.Value, localizationService.Value, contentTypeService.Value, urlSegmentProviders, TestHelper.ShortStringHelper, propertyEditorCollection), logger, umbracoVersion, globalSettings, "createdPackages.config"), new PackagesRepository(contentService.Value, contentTypeService.Value, dataTypeService.Value, fileService.Value, macroService.Value, localizationService.Value, ioHelper, - new EntityXmlSerializer(contentService.Value, mediaService.Value, dataTypeService.Value, userService.Value, localizationService.Value, contentTypeService.Value, urlSegmentProviders, TestHelper.ShortStringHelper), logger, umbracoVersion, globalSettings, "installedPackages.config"), + new EntityXmlSerializer(contentService.Value, mediaService.Value, dataTypeService.Value, userService.Value, localizationService.Value, contentTypeService.Value, urlSegmentProviders, TestHelper.ShortStringHelper, propertyEditorCollection), logger, umbracoVersion, globalSettings, "installedPackages.config"), new PackageInstallation( new PackageDataInstallation(logger, fileService.Value, macroService.Value, localizationService.Value, dataTypeService.Value, entityService.Value, contentTypeService.Value, contentService.Value, propertyEditorCollection, scopeProvider, shortStringHelper, GetGlobalSettings(), localizedTextService.Value), new PackageFileInstallation(compiledPackageXmlParser, ioHelper, new ProfilingLogger(logger, new TestProfiler())), diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index ef8a0bc599..56da2bfe4e 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -305,7 +305,7 @@ namespace Umbraco.Tests.TestHelpers { using (var scope = ScopeProvider.CreateScope()) { - var schemaHelper = new DatabaseSchemaCreator(scope.Database, Logger, UmbracoVersion); + var schemaHelper = new DatabaseSchemaCreator(scope.Database, Logger, UmbracoVersion, TestObjects.GetGlobalSettings()); //Create the umbraco database and its base data schemaHelper.InitializeDatabaseSchema(); diff --git a/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs b/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs index ec4cc9ea85..34d630c6b6 100644 --- a/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/DatabaseUpgradeStep.cs @@ -19,13 +19,15 @@ namespace Umbraco.Web.Install.InstallSteps private readonly IRuntimeState _runtime; private readonly ILogger _logger; private readonly IUmbracoVersion _umbracoVersion; + private readonly IGlobalSettings _globalSettings; - public DatabaseUpgradeStep(DatabaseBuilder databaseBuilder, IRuntimeState runtime, ILogger logger, IUmbracoVersion umbracoVersion) + public DatabaseUpgradeStep(DatabaseBuilder databaseBuilder, IRuntimeState runtime, ILogger logger, IUmbracoVersion umbracoVersion, IGlobalSettings globalSettings) { _databaseBuilder = databaseBuilder; _runtime = runtime; _logger = logger; _umbracoVersion = umbracoVersion; + _globalSettings = globalSettings; } public override Task ExecuteAsync(object model) @@ -38,7 +40,7 @@ namespace Umbraco.Web.Install.InstallSteps { _logger.Info("Running 'Upgrade' service"); - var plan = new UmbracoPlan(_umbracoVersion); + var plan = new UmbracoPlan(_umbracoVersion, _globalSettings); plan.AddPostMigration(); // needed when running installer (back-office) var result = _databaseBuilder.UpgradeSchemaAndData(plan); diff --git a/src/Umbraco.Web/UmbracoDbProviderFactoryCreator.cs b/src/Umbraco.Web/UmbracoDbProviderFactoryCreator.cs index 99358f990b..3051e6df09 100644 --- a/src/Umbraco.Web/UmbracoDbProviderFactoryCreator.cs +++ b/src/Umbraco.Web/UmbracoDbProviderFactoryCreator.cs @@ -1,6 +1,8 @@ using System; using System.Data.Common; +using System.Data.SqlServerCe; using Umbraco.Core; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; @@ -40,5 +42,11 @@ namespace Umbraco.Web throw new InvalidOperationException($"Unknown provider name \"{providerName}\""); } } + + public void CreateDatabase() + { + var engine = new SqlCeEngine(DatabaseBuilder.EmbeddedDatabaseConnectionString); + engine.CreateDatabase(); + } } } From 897cb63ad63795e157b29f9712dffdc9ea5d3986 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 18 Dec 2019 11:16:43 +0100 Subject: [PATCH 09/19] AB4227 - Moved Packaging, Compose, Dictionary, Manifest and Sync --- .../Hosting/IHostingEnvironment.cs | 2 + .../Services/IRuntimeState.cs | 2 + .../Runtime/CoreInitialComposer.cs | 5 ++- src/Umbraco.Core/Umbraco.Core.csproj | 25 ++---------- .../Compose/ManifestWatcherComponent.cs | 0 .../Compose/ManifestWatcherComposer.cs | 0 .../Compose/RelateOnCopyComponent.cs | 20 +++++++--- .../Compose/RelateOnCopyComposer.cs | 0 .../Compose/RelateOnTrashComponent.cs | 16 ++++---- .../Compose/RelateOnTrashComposer.cs | 0 .../Dictionary/UmbracoCultureDictionary.cs | 0 .../UmbracoCultureDictionaryFactory.cs | 0 .../Events/MigrationEventArgs.cs | 0 .../Manifest/DashboardAccessRuleConverter.cs | 0 .../Manifest/DataEditorConverter.cs | 0 .../Manifest/ManifestParser.cs | 0 .../Manifest/ValueValidatorConverter.cs | 0 .../Packaging/PackageDataInstallation.cs | 8 ++-- .../Packaging/PackageInstallation.cs | 10 ++--- .../Sync/DatabaseServerMessenger.cs | 38 ++++++++++--------- .../Sync/RefreshInstruction.cs | 0 .../Sync/RefreshInstructionEnvelope.cs | 0 .../Sync/ServerMessengerBase.cs | 23 +++++------ .../BatchedDatabaseServerMessenger.cs | 2 +- .../Hosting/AspNetHostingEnvironment.cs | 3 ++ 25 files changed, 79 insertions(+), 75 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Compose/ManifestWatcherComponent.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Compose/ManifestWatcherComposer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Compose/RelateOnCopyComponent.cs (64%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Compose/RelateOnCopyComposer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Compose/RelateOnTrashComponent.cs (95%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Compose/RelateOnTrashComposer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Dictionary/UmbracoCultureDictionary.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Dictionary/UmbracoCultureDictionaryFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Events/MigrationEventArgs.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Manifest/DashboardAccessRuleConverter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Manifest/DataEditorConverter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Manifest/ManifestParser.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Manifest/ValueValidatorConverter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Packaging/PackageDataInstallation.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Packaging/PackageInstallation.cs (98%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Sync/DatabaseServerMessenger.cs (95%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Sync/RefreshInstruction.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Sync/RefreshInstructionEnvelope.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Sync/ServerMessengerBase.cs (99%) diff --git a/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs b/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs index 5ce8392ab4..a71c449bb8 100644 --- a/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs +++ b/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs @@ -9,6 +9,8 @@ namespace Umbraco.Core.Hosting string LocalTempPath { get; } string ApplicationVirtualPath { get; } + int CurrentDomainId { get; } + bool IsDebugMode { get; } /// /// Gets a value indicating whether Umbraco is hosted. diff --git a/src/Umbraco.Abstractions/Services/IRuntimeState.cs b/src/Umbraco.Abstractions/Services/IRuntimeState.cs index 30c768ab01..38da246cc1 100644 --- a/src/Umbraco.Abstractions/Services/IRuntimeState.cs +++ b/src/Umbraco.Abstractions/Services/IRuntimeState.cs @@ -76,5 +76,7 @@ namespace Umbraco.Core /// Gets the exception that caused the boot to fail. /// BootFailedException BootFailedException { get; } + + IMainDom MainDom { get; } } } diff --git a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs b/src/Umbraco.Core/Runtime/CoreInitialComposer.cs index 1e145b33d6..159eb8bca9 100644 --- a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Core/Runtime/CoreInitialComposer.cs @@ -110,8 +110,9 @@ namespace Umbraco.Core.Runtime factory.GetInstance(), factory.GetInstance(), true, new DatabaseServerMessengerOptions(), - factory.GetInstance() - )); + factory.GetInstance(), + factory.GetInstance() + )); composition.CacheRefreshers() .Add(() => composition.TypeLoader.GetCacheRefreshers()); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index f6ca9a19be..a6716e5264 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -128,12 +128,6 @@ --> - - - - - - @@ -144,28 +138,22 @@ - - - - - - - + + - @@ -187,7 +175,6 @@ - @@ -198,12 +185,10 @@ - - @@ -212,13 +197,9 @@ - - - - @@ -242,7 +223,7 @@ - + \ No newline at end of file diff --git a/src/Umbraco.Core/Compose/ManifestWatcherComponent.cs b/src/Umbraco.Infrastructure/Compose/ManifestWatcherComponent.cs similarity index 100% rename from src/Umbraco.Core/Compose/ManifestWatcherComponent.cs rename to src/Umbraco.Infrastructure/Compose/ManifestWatcherComponent.cs diff --git a/src/Umbraco.Core/Compose/ManifestWatcherComposer.cs b/src/Umbraco.Infrastructure/Compose/ManifestWatcherComposer.cs similarity index 100% rename from src/Umbraco.Core/Compose/ManifestWatcherComposer.cs rename to src/Umbraco.Infrastructure/Compose/ManifestWatcherComposer.cs diff --git a/src/Umbraco.Core/Compose/RelateOnCopyComponent.cs b/src/Umbraco.Infrastructure/Compose/RelateOnCopyComponent.cs similarity index 64% rename from src/Umbraco.Core/Compose/RelateOnCopyComponent.cs rename to src/Umbraco.Infrastructure/Compose/RelateOnCopyComponent.cs index b56ff8b87e..56a97e4cba 100644 --- a/src/Umbraco.Core/Compose/RelateOnCopyComponent.cs +++ b/src/Umbraco.Infrastructure/Compose/RelateOnCopyComponent.cs @@ -8,6 +8,15 @@ namespace Umbraco.Core.Compose // TODO: This should just exist in the content service/repo! public sealed class RelateOnCopyComponent : IComponent { + private readonly IRelationService _relationService; + private readonly IAuditService _auditService; + + public RelateOnCopyComponent(IRelationService relationService, IAuditService auditService) + { + _relationService = relationService; + _auditService = auditService; + } + public void Initialize() { ContentService.Copied += ContentServiceCopied; @@ -16,13 +25,12 @@ namespace Umbraco.Core.Compose public void Terminate() { } - private static void ContentServiceCopied(IContentService sender, Events.CopyEventArgs e) + private void ContentServiceCopied(IContentService sender, Events.CopyEventArgs e) { if (e.RelateToOriginal == false) return; - var relationService = Current.Services.RelationService; - var relationType = relationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelateDocumentOnCopyAlias); + var relationType = _relationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelateDocumentOnCopyAlias); if (relationType == null) { @@ -32,13 +40,13 @@ namespace Umbraco.Core.Compose Constants.ObjectTypes.Document, Constants.ObjectTypes.Document); - relationService.Save(relationType); + _relationService.Save(relationType); } var relation = new Relation(e.Original.Id, e.Copy.Id, relationType); - relationService.Save(relation); + _relationService.Save(relation); - Current.Services.AuditService.Add( + _auditService.Add( AuditType.Copy, e.Copy.WriterId, e.Copy.Id, ObjectTypes.GetName(UmbracoObjectTypes.Document), diff --git a/src/Umbraco.Core/Compose/RelateOnCopyComposer.cs b/src/Umbraco.Infrastructure/Compose/RelateOnCopyComposer.cs similarity index 100% rename from src/Umbraco.Core/Compose/RelateOnCopyComposer.cs rename to src/Umbraco.Infrastructure/Compose/RelateOnCopyComposer.cs diff --git a/src/Umbraco.Core/Compose/RelateOnTrashComponent.cs b/src/Umbraco.Infrastructure/Compose/RelateOnTrashComponent.cs similarity index 95% rename from src/Umbraco.Core/Compose/RelateOnTrashComponent.cs rename to src/Umbraco.Infrastructure/Compose/RelateOnTrashComponent.cs index e7b3292956..c81aa2fd7d 100644 --- a/src/Umbraco.Core/Compose/RelateOnTrashComponent.cs +++ b/src/Umbraco.Infrastructure/Compose/RelateOnTrashComponent.cs @@ -12,20 +12,22 @@ namespace Umbraco.Core.Compose private readonly IRelationService _relationService; private readonly IEntityService _entityService; private readonly ILocalizedTextService _textService; + private readonly IAuditService _auditService; - public RelateOnTrashComponent(IRelationService relationService, IEntityService entityService, ILocalizedTextService textService) + public RelateOnTrashComponent(IRelationService relationService, IEntityService entityService, ILocalizedTextService textService, IAuditService auditService) { _relationService = relationService; _entityService = entityService; _textService = textService; + _auditService = auditService; } public void Initialize() { ContentService.Moved += (sender, args) => ContentService_Moved(sender, args, _relationService); - ContentService.Trashed += (sender, args) => ContentService_Trashed(sender, args, _relationService, _entityService, _textService); + ContentService.Trashed += (sender, args) => ContentService_Trashed(sender, args, _relationService, _entityService, _textService, _auditService); MediaService.Moved += (sender, args) => MediaService_Moved(sender, args, _relationService); - MediaService.Trashed += (sender, args) => MediaService_Trashed(sender, args, _relationService, _entityService, _textService); + MediaService.Trashed += (sender, args) => MediaService_Trashed(sender, args, _relationService, _entityService, _textService, _auditService); } public void Terminate() @@ -59,7 +61,7 @@ namespace Umbraco.Core.Compose } } - private static void ContentService_Trashed(IContentService sender, MoveEventArgs e, IRelationService relationService, IEntityService entityService, ILocalizedTextService textService) + private static void ContentService_Trashed(IContentService sender, MoveEventArgs e, IRelationService relationService, IEntityService entityService, ILocalizedTextService textService, IAuditService auditService) { const string relationTypeAlias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias; var relationType = relationService.GetRelationTypeByAlias(relationTypeAlias); @@ -90,7 +92,7 @@ namespace Umbraco.Core.Compose var relation = new Relation(originalParentId, item.Entity.Id, relationType); relationService.Save(relation); - Current.Services.AuditService.Add(AuditType.Delete, + auditService.Add(AuditType.Delete, item.Entity.WriterId, item.Entity.Id, ObjectTypes.GetName(UmbracoObjectTypes.Document), @@ -101,7 +103,7 @@ namespace Umbraco.Core.Compose } } - private static void MediaService_Trashed(IMediaService sender, MoveEventArgs e, IRelationService relationService, IEntityService entityService, ILocalizedTextService textService) + private static void MediaService_Trashed(IMediaService sender, MoveEventArgs e, IRelationService relationService, IEntityService entityService, ILocalizedTextService textService, IAuditService auditService) { const string relationTypeAlias = Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias; var relationType = relationService.GetRelationTypeByAlias(relationTypeAlias); @@ -126,7 +128,7 @@ namespace Umbraco.Core.Compose // Add a relation for the item being deleted, so that we can know the original parent for if we need to restore later var relation = new Relation(originalParentId, item.Entity.Id, relationType); relationService.Save(relation); - Current.Services.AuditService.Add(AuditType.Delete, + auditService.Add(AuditType.Delete, item.Entity.CreatorId, item.Entity.Id, ObjectTypes.GetName(UmbracoObjectTypes.Media), diff --git a/src/Umbraco.Core/Compose/RelateOnTrashComposer.cs b/src/Umbraco.Infrastructure/Compose/RelateOnTrashComposer.cs similarity index 100% rename from src/Umbraco.Core/Compose/RelateOnTrashComposer.cs rename to src/Umbraco.Infrastructure/Compose/RelateOnTrashComposer.cs diff --git a/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs b/src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionary.cs similarity index 100% rename from src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs rename to src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionary.cs diff --git a/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs b/src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionaryFactory.cs similarity index 100% rename from src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs rename to src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionaryFactory.cs diff --git a/src/Umbraco.Core/Events/MigrationEventArgs.cs b/src/Umbraco.Infrastructure/Events/MigrationEventArgs.cs similarity index 100% rename from src/Umbraco.Core/Events/MigrationEventArgs.cs rename to src/Umbraco.Infrastructure/Events/MigrationEventArgs.cs diff --git a/src/Umbraco.Core/Manifest/DashboardAccessRuleConverter.cs b/src/Umbraco.Infrastructure/Manifest/DashboardAccessRuleConverter.cs similarity index 100% rename from src/Umbraco.Core/Manifest/DashboardAccessRuleConverter.cs rename to src/Umbraco.Infrastructure/Manifest/DashboardAccessRuleConverter.cs diff --git a/src/Umbraco.Core/Manifest/DataEditorConverter.cs b/src/Umbraco.Infrastructure/Manifest/DataEditorConverter.cs similarity index 100% rename from src/Umbraco.Core/Manifest/DataEditorConverter.cs rename to src/Umbraco.Infrastructure/Manifest/DataEditorConverter.cs diff --git a/src/Umbraco.Core/Manifest/ManifestParser.cs b/src/Umbraco.Infrastructure/Manifest/ManifestParser.cs similarity index 100% rename from src/Umbraco.Core/Manifest/ManifestParser.cs rename to src/Umbraco.Infrastructure/Manifest/ManifestParser.cs diff --git a/src/Umbraco.Core/Manifest/ValueValidatorConverter.cs b/src/Umbraco.Infrastructure/Manifest/ValueValidatorConverter.cs similarity index 100% rename from src/Umbraco.Core/Manifest/ValueValidatorConverter.cs rename to src/Umbraco.Infrastructure/Manifest/ValueValidatorConverter.cs diff --git a/src/Umbraco.Core/Packaging/PackageDataInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs similarity index 99% rename from src/Umbraco.Core/Packaging/PackageDataInstallation.cs rename to src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs index 0b317c4029..f6902d77b8 100644 --- a/src/Umbraco.Core/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs @@ -19,7 +19,7 @@ using Umbraco.Core.Strings; namespace Umbraco.Core.Packaging { - internal class PackageDataInstallation + public class PackageDataInstallation { private readonly ILogger _logger; private readonly IFileService _fileService; @@ -678,7 +678,7 @@ namespace Umbraco.Core.Packaging foreach (var templateElement in allowedTemplatesElement.Elements("Template")) { var alias = templateElement.Value; - var template = _fileService.GetTemplate(alias.ToSafeAlias()); + var template = _fileService.GetTemplate(alias.ToSafeAlias(_shortStringHelper)); if (template != null) { if (allowedTemplates.Any(x => x.Id == template.Id)) continue; @@ -695,7 +695,7 @@ namespace Umbraco.Core.Packaging if (string.IsNullOrEmpty((string)defaultTemplateElement) == false) { - var defaultTemplate = _fileService.GetTemplate(defaultTemplateElement.Value.ToSafeAlias()); + var defaultTemplate = _fileService.GetTemplate(defaultTemplateElement.Value.ToSafeAlias(_shortStringHelper)); if (defaultTemplate != null) { contentType.SetDefaultTemplate(defaultTemplate); @@ -1231,7 +1231,7 @@ namespace Umbraco.Core.Packaging var name = prop.Element("Name")?.Value; if (sp == null) { - sp = new StylesheetProperty(name, "#" + name.ToSafeAlias(), ""); + sp = new StylesheetProperty(name, "#" + name.ToSafeAlias(_shortStringHelper), ""); s.AddProperty(sp); } else diff --git a/src/Umbraco.Core/Packaging/PackageInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs similarity index 98% rename from src/Umbraco.Core/Packaging/PackageInstallation.cs rename to src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs index a42ee1aeb2..e307802606 100644 --- a/src/Umbraco.Core/Packaging/PackageInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs @@ -11,7 +11,7 @@ using Umbraco.Core.Services; namespace Umbraco.Core.Packaging { - internal class PackageInstallation : IPackageInstallation + public class PackageInstallation : IPackageInstallation { private readonly PackageExtraction _packageExtraction; private readonly PackageDataInstallation _packageDataInstallation; @@ -95,7 +95,7 @@ namespace Umbraco.Core.Packaging installationSummary.Actions = CompiledPackageXmlParser.GetPackageActions(XElement.Parse(compiledPackage.Actions), compiledPackage.Name); installationSummary.MetaData = compiledPackage; installationSummary.FilesInstalled = packageDefinition.Files; - + //make sure the definition is up to date with everything foreach (var x in installationSummary.DataTypesInstalled) packageDefinition.DataTypes.Add(x.Id.ToInvariantString()); foreach (var x in installationSummary.LanguagesInstalled) packageDefinition.Languages.Add(x.Id.ToInvariantString()); @@ -117,7 +117,7 @@ namespace Umbraco.Core.Packaging { foreach (var n in actions) { - //if there is an undo section then save it to the definition so we can run it at uninstallation + //if there is an undo section then save it to the definition so we can run it at uninstallation var undo = n.Undo; if (undo) packageDefinition.Actions += n.XmlData.ToString(); @@ -189,7 +189,7 @@ namespace Umbraco.Core.Packaging } } - - + + } } diff --git a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs b/src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs similarity index 95% rename from src/Umbraco.Core/Sync/DatabaseServerMessenger.cs rename to src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs index 0e7194d5de..948304e4e4 100644 --- a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs +++ b/src/Umbraco.Infrastructure/Sync/DatabaseServerMessenger.cs @@ -33,6 +33,7 @@ namespace Umbraco.Core.Sync private readonly object _locko = new object(); private readonly IProfilingLogger _profilingLogger; private readonly IHostingEnvironment _hostingEnvironment; + private readonly CacheRefresherCollection _cacheRefreshers; private readonly ISqlContext _sqlContext; private readonly Lazy _distCacheFilePath; private int _lastId = -1; @@ -46,7 +47,7 @@ namespace Umbraco.Core.Sync public DatabaseServerMessenger( IRuntimeState runtime, IScopeProvider scopeProvider, ISqlContext sqlContext, IProfilingLogger proflog, - bool distributedEnabled, DatabaseServerMessengerOptions options, IHostingEnvironment hostingEnvironment) + bool distributedEnabled, DatabaseServerMessengerOptions options, IHostingEnvironment hostingEnvironment, CacheRefresherCollection cacheRefreshers) : base(distributedEnabled) { ScopeProvider = scopeProvider ?? throw new ArgumentNullException(nameof(scopeProvider)); @@ -54,6 +55,7 @@ namespace Umbraco.Core.Sync _runtime = runtime; _profilingLogger = proflog ?? throw new ArgumentNullException(nameof(proflog)); _hostingEnvironment = hostingEnvironment; + _cacheRefreshers = cacheRefreshers; Logger = proflog; Options = options ?? throw new ArgumentNullException(nameof(options)); _lastPruned = _lastSync = DateTime.UtcNow; @@ -123,10 +125,12 @@ namespace Umbraco.Core.Sync // the service will *not* be able to properly handle our notifications anymore const int weight = 10; - if (!(_runtime is RuntimeState runtime)) - throw new NotSupportedException($"Unsupported IRuntimeState implementation {_runtime.GetType().FullName}, expecting {typeof(RuntimeState).FullName}."); - var registered = runtime.MainDom.Register( + //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( () => { lock (_locko) @@ -226,7 +230,7 @@ namespace Umbraco.Core.Sync /// /// Synchronize the server (throttled). /// - protected internal void Sync() + public void Sync() { lock (_locko) { @@ -262,7 +266,7 @@ namespace Umbraco.Core.Sync _lastPruned = _lastSync; - switch (Current.RuntimeState.ServerRole) + switch (_runtime.ServerRole) { case ServerRole.Single: case ServerRole.Master: @@ -524,8 +528,8 @@ namespace Umbraco.Core.Sync /// Practically, all we really need is the guid, the other infos are here for information /// and debugging purposes. /// - protected static readonly string LocalIdentity = NetworkHelper.MachineName // eg DOMAIN\SERVER - + "/" + Current.HostingEnvironment.ApplicationId // eg /LM/S3SVC/11/ROOT + protected string LocalIdentity => NetworkHelper.MachineName // eg DOMAIN\SERVER + + "/" + _hostingEnvironment.ApplicationId // eg /LM/S3SVC/11/ROOT + " [P" + Process.GetCurrentProcess().Id // eg 1234 + "/D" + AppDomain.CurrentDomain.Id // eg 22 + "] " + Guid.NewGuid().ToString("N").ToUpper(); // make it truly unique @@ -550,15 +554,15 @@ namespace Umbraco.Core.Sync #region Notify refreshers - private static ICacheRefresher GetRefresher(Guid id) + private ICacheRefresher GetRefresher(Guid id) { - var refresher = Current.CacheRefreshers[id]; + var refresher = _cacheRefreshers[id]; if (refresher == null) throw new InvalidOperationException("Cache refresher with ID \"" + id + "\" does not exist."); return refresher; } - private static IJsonCacheRefresher GetJsonRefresher(Guid id) + private IJsonCacheRefresher GetJsonRefresher(Guid id) { return GetJsonRefresher(GetRefresher(id)); } @@ -647,38 +651,38 @@ namespace Umbraco.Core.Sync return true; } - private static void RefreshAll(Guid uniqueIdentifier) + private void RefreshAll(Guid uniqueIdentifier) { var refresher = GetRefresher(uniqueIdentifier); refresher.RefreshAll(); } - private static void RefreshByGuid(Guid uniqueIdentifier, Guid id) + private void RefreshByGuid(Guid uniqueIdentifier, Guid id) { var refresher = GetRefresher(uniqueIdentifier); refresher.Refresh(id); } - private static void RefreshById(Guid uniqueIdentifier, int id) + private void RefreshById(Guid uniqueIdentifier, int id) { var refresher = GetRefresher(uniqueIdentifier); refresher.Refresh(id); } - private static void RefreshByIds(Guid uniqueIdentifier, string jsonIds) + private void RefreshByIds(Guid uniqueIdentifier, string jsonIds) { var refresher = GetRefresher(uniqueIdentifier); foreach (var id in JsonConvert.DeserializeObject(jsonIds)) refresher.Refresh(id); } - private static void RefreshByJson(Guid uniqueIdentifier, string jsonPayload) + private void RefreshByJson(Guid uniqueIdentifier, string jsonPayload) { var refresher = GetJsonRefresher(uniqueIdentifier); refresher.Refresh(jsonPayload); } - private static void RemoveById(Guid uniqueIdentifier, int id) + private void RemoveById(Guid uniqueIdentifier, int id) { var refresher = GetRefresher(uniqueIdentifier); refresher.Remove(id); diff --git a/src/Umbraco.Core/Sync/RefreshInstruction.cs b/src/Umbraco.Infrastructure/Sync/RefreshInstruction.cs similarity index 100% rename from src/Umbraco.Core/Sync/RefreshInstruction.cs rename to src/Umbraco.Infrastructure/Sync/RefreshInstruction.cs diff --git a/src/Umbraco.Core/Sync/RefreshInstructionEnvelope.cs b/src/Umbraco.Infrastructure/Sync/RefreshInstructionEnvelope.cs similarity index 100% rename from src/Umbraco.Core/Sync/RefreshInstructionEnvelope.cs rename to src/Umbraco.Infrastructure/Sync/RefreshInstructionEnvelope.cs diff --git a/src/Umbraco.Core/Sync/ServerMessengerBase.cs b/src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs similarity index 99% rename from src/Umbraco.Core/Sync/ServerMessengerBase.cs rename to src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs index bbf00c3a6b..3b47cabbaf 100644 --- a/src/Umbraco.Core/Sync/ServerMessengerBase.cs +++ b/src/Umbraco.Infrastructure/Sync/ServerMessengerBase.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; +using Umbraco.Composing; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Logging; @@ -66,7 +67,7 @@ namespace Umbraco.Core.Sync public void PerformRefresh(ICacheRefresher refresher, string jsonPayload) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (jsonPayload == null) throw new ArgumentNullException(nameof(jsonPayload)); @@ -75,7 +76,7 @@ namespace Umbraco.Core.Sync public void PerformRefresh(ICacheRefresher refresher, Func getNumericId, params T[] instances) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (getNumericId == null) throw new ArgumentNullException(nameof(getNumericId)); if (instances == null || instances.Length == 0) return; @@ -86,7 +87,7 @@ namespace Umbraco.Core.Sync public void PerformRefresh(ICacheRefresher refresher, Func getGuidId, params T[] instances) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (getGuidId == null) throw new ArgumentNullException(nameof(getGuidId)); if (instances == null || instances.Length == 0) return; @@ -97,7 +98,7 @@ namespace Umbraco.Core.Sync public void PerformRemove(ICacheRefresher refresher, Func getNumericId, params T[] instances) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (getNumericId == null) throw new ArgumentNullException(nameof(getNumericId)); if (instances == null || instances.Length == 0) return; @@ -108,7 +109,7 @@ namespace Umbraco.Core.Sync public void PerformRemove(ICacheRefresher refresher, params int[] numericIds) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (numericIds == null || numericIds.Length == 0) return; @@ -117,7 +118,7 @@ namespace Umbraco.Core.Sync public void PerformRefresh(ICacheRefresher refresher, params int[] numericIds) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (numericIds == null || numericIds.Length == 0) return; @@ -126,7 +127,7 @@ namespace Umbraco.Core.Sync public void PerformRefresh(ICacheRefresher refresher, params Guid[] guidIds) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); if (guidIds == null || guidIds.Length == 0) return; @@ -135,7 +136,7 @@ namespace Umbraco.Core.Sync public void PerformRefreshAll(ICacheRefresher refresher) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); Deliver(refresher, MessageType.RefreshAll); @@ -288,7 +289,7 @@ namespace Umbraco.Core.Sync protected virtual void Deliver(ICacheRefresher refresher, TPayload[] payload) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); // deliver local @@ -305,7 +306,7 @@ namespace Umbraco.Core.Sync protected virtual void Deliver(ICacheRefresher refresher, MessageType messageType, IEnumerable ids = null, string json = null) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); var idsA = ids?.ToArray(); @@ -323,7 +324,7 @@ namespace Umbraco.Core.Sync protected virtual void Deliver(ICacheRefresher refresher, MessageType messageType, Func getId, IEnumerable instances) { - + if (refresher == null) throw new ArgumentNullException(nameof(refresher)); var instancesA = instances.ToArray(); diff --git a/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs b/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs index 85b8e62d28..228e3144b2 100644 --- a/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs +++ b/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs @@ -31,7 +31,7 @@ namespace Umbraco.Web public BatchedDatabaseServerMessenger( IRuntimeState runtime, IUmbracoDatabaseFactory databaseFactory, IScopeProvider scopeProvider, ISqlContext sqlContext, IProfilingLogger proflog, DatabaseServerMessengerOptions options, IHostingEnvironment hostingEnvironment) - : base(runtime, scopeProvider, sqlContext, proflog, true, options, hostingEnvironment ) + : base(runtime, scopeProvider, sqlContext, proflog, true, options, hostingEnvironment, Current.CacheRefreshers) { _databaseFactory = databaseFactory; } diff --git a/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs b/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs index f1ae5af1f9..2da1c19948 100644 --- a/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs +++ b/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs @@ -20,8 +20,11 @@ namespace Umbraco.Web.Hosting ApplicationId = HostingEnvironment.ApplicationID; ApplicationPhysicalPath = HostingEnvironment.ApplicationPhysicalPath; ApplicationVirtualPath = HostingEnvironment.ApplicationVirtualPath; + CurrentDomainId = AppDomain.CurrentDomain.Id; } + public int CurrentDomainId { get; } + public string SiteName { get; } public string ApplicationId { get; } public string ApplicationPhysicalPath { get; } From 38519b2bab95d80fc2b3ae8b4d801bbce290e739 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 18 Dec 2019 12:27:14 +0100 Subject: [PATCH 10/19] AB4227 - Moved Logging --- src/Umbraco.Core/Umbraco.Core.csproj | 31 ------------------- .../CompositionExtensions.cs | 0 .../CompositionExtensions_Essentials.cs | 0 .../CompositionExtensions_FileSystems.cs | 0 .../Diagnostics/IMarchal.cs | 12 +++++++ .../Diagnostics/MiniDump.cs | 13 +++----- .../Logging/LogHttpRequest.cs | 0 .../Logging/MessageTemplates.cs | 0 .../Logging/OwinLogger.cs | 0 .../Logging/OwinLoggerFactory.cs | 4 +-- .../Enrichers/HttpRequestIdEnricher.cs | 0 .../Enrichers/HttpRequestNumberEnricher.cs | 0 .../Enrichers/HttpSessionIdEnricher.cs | 0 .../Enrichers/Log4NetLevelMapperEnricher.cs | 0 .../Logging/Serilog/LoggerConfigExtensions.cs | 0 .../Logging/Serilog/SerilogLogger.cs | 31 +++++++++++++------ .../Logging/Viewer/CountingFilter.cs | 0 .../Logging/Viewer/ErrorCounterFilter.cs | 0 .../Logging/Viewer/ExpressionFilter.cs | 0 .../Logging/Viewer/ILogFilter.cs | 0 .../Logging/Viewer/ILogViewer.cs | 0 .../Logging/Viewer/JsonLogViewer.cs | 0 .../Logging/Viewer/LogLevelCounts.cs | 0 .../Logging/Viewer/LogMessage.cs | 0 .../Logging/Viewer/LogTemplate.cs | 0 .../Logging/Viewer/LogTimePeriod.cs | 0 .../Logging/Viewer/LogViewerComposer.cs | 0 .../Logging/Viewer/LogViewerSourceBase.cs | 0 .../Logging/Viewer/MessageTemplateFilter.cs | 0 .../Logging/Viewer/SavedLogSearch.cs | 0 .../Umbraco.Infrastructure.csproj | 2 ++ src/Umbraco.Tests/TestHelpers/TestHelper.cs | 3 ++ .../TestHelpers/TestObjects-Mocks.cs | 1 - src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 2 +- .../UmbracoExamine/ExamineBaseTest.cs | 2 +- src/Umbraco.Web/FrameworkMarchal.cs | 13 ++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + src/Umbraco.Web/UmbracoApplicationBase.cs | 2 +- 38 files changed, 63 insertions(+), 54 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/CompositionExtensions.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/CompositionExtensions_Essentials.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/CompositionExtensions_FileSystems.cs (100%) create mode 100644 src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs rename src/{Umbraco.Core => Umbraco.Infrastructure}/Diagnostics/MiniDump.cs (91%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/LogHttpRequest.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/MessageTemplates.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/OwinLogger.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/OwinLoggerFactory.cs (84%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Serilog/LoggerConfigExtensions.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Serilog/SerilogLogger.cs (88%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/CountingFilter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/ErrorCounterFilter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/ExpressionFilter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/ILogFilter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/ILogViewer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/JsonLogViewer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/LogLevelCounts.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/LogMessage.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/LogTemplate.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/LogTimePeriod.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/LogViewerComposer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/LogViewerSourceBase.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/MessageTemplateFilter.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Logging/Viewer/SavedLogSearch.cs (100%) create mode 100644 src/Umbraco.Web/FrameworkMarchal.cs diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index a6716e5264..987855c932 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -129,19 +129,15 @@ - - - - @@ -155,35 +151,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -222,8 +194,5 @@ Umbraco.Infrastructure - - - \ No newline at end of file diff --git a/src/Umbraco.Core/CompositionExtensions.cs b/src/Umbraco.Infrastructure/CompositionExtensions.cs similarity index 100% rename from src/Umbraco.Core/CompositionExtensions.cs rename to src/Umbraco.Infrastructure/CompositionExtensions.cs diff --git a/src/Umbraco.Core/CompositionExtensions_Essentials.cs b/src/Umbraco.Infrastructure/CompositionExtensions_Essentials.cs similarity index 100% rename from src/Umbraco.Core/CompositionExtensions_Essentials.cs rename to src/Umbraco.Infrastructure/CompositionExtensions_Essentials.cs diff --git a/src/Umbraco.Core/CompositionExtensions_FileSystems.cs b/src/Umbraco.Infrastructure/CompositionExtensions_FileSystems.cs similarity index 100% rename from src/Umbraco.Core/CompositionExtensions_FileSystems.cs rename to src/Umbraco.Infrastructure/CompositionExtensions_FileSystems.cs diff --git a/src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs b/src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs new file mode 100644 index 0000000000..30e6a9e619 --- /dev/null +++ b/src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs @@ -0,0 +1,12 @@ +using System; + +namespace Umbraco.Core.Diagnostics +{ + /// + /// Provides a collection of methods for allocating unmanaged memory, copying unmanaged memory blocks, and converting managed to unmanaged types, as well as other miscellaneous methods used when interacting with unmanaged code. + /// + public interface IMarchal + { + IntPtr GetExceptionPointers(); + } +} diff --git a/src/Umbraco.Core/Diagnostics/MiniDump.cs b/src/Umbraco.Infrastructure/Diagnostics/MiniDump.cs similarity index 91% rename from src/Umbraco.Core/Diagnostics/MiniDump.cs rename to src/Umbraco.Infrastructure/Diagnostics/MiniDump.cs index 6534ad705c..9bc0b1c3fb 100644 --- a/src/Umbraco.Core/Diagnostics/MiniDump.cs +++ b/src/Umbraco.Infrastructure/Diagnostics/MiniDump.cs @@ -78,7 +78,7 @@ namespace Umbraco.Core.Diagnostics [DllImport("kernel32.dll", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] private static extern uint GetCurrentThreadId(); - private static bool Write(SafeHandle fileHandle, Option options, bool withException = false) + private static bool Write(IMarchal marchal, SafeHandle fileHandle, Option options, bool withException = false) { var currentProcess = Process.GetCurrentProcess(); var currentProcessHandle = currentProcess.Handle; @@ -91,7 +91,7 @@ namespace Umbraco.Core.Diagnostics exp.ExceptionPointers = IntPtr.Zero; if (withException) - exp.ExceptionPointers = Marshal.GetExceptionPointers(); + exp.ExceptionPointers = marchal.GetExceptionPointers(); var bRet = exp.ExceptionPointers == IntPtr.Zero ? MiniDumpWriteDump(currentProcessHandle, currentProcessId, fileHandle, (uint) options, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero) @@ -100,7 +100,7 @@ namespace Umbraco.Core.Diagnostics return bRet; } - public static bool Dump(Option options = Option.WithFullMemory, bool withException = false) + public static bool Dump(IMarchal marchal, IIOHelper ioHelper, Option options = Option.WithFullMemory, bool withException = false) { lock (LockO) { @@ -110,8 +110,6 @@ namespace Umbraco.Core.Diagnostics // filter everywhere in our code = not! var stacktrace = withException ? Environment.StackTrace : string.Empty; - var ioHelper = Current.Factory.GetInstance(); - var filepath = ioHelper.MapPath("~/App_Data/MiniDump"); if (Directory.Exists(filepath) == false) Directory.CreateDirectory(filepath); @@ -119,16 +117,15 @@ namespace Umbraco.Core.Diagnostics var filename = Path.Combine(filepath, $"{DateTime.UtcNow:yyyyMMddTHHmmss}.{Guid.NewGuid().ToString("N").Substring(0, 4)}.dmp"); using (var stream = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, FileShare.Write)) { - return Write(stream.SafeFileHandle, options, withException); + return Write(marchal, stream.SafeFileHandle, options, withException); } } } - public static bool OkToDump() + public static bool OkToDump(IIOHelper ioHelper) { lock (LockO) { - var ioHelper = Current.Factory.GetInstance(); var filepath = ioHelper.MapPath("~/App_Data/MiniDump"); if (Directory.Exists(filepath) == false) return true; var count = Directory.GetFiles(filepath, "*.dmp").Length; diff --git a/src/Umbraco.Core/Logging/LogHttpRequest.cs b/src/Umbraco.Infrastructure/Logging/LogHttpRequest.cs similarity index 100% rename from src/Umbraco.Core/Logging/LogHttpRequest.cs rename to src/Umbraco.Infrastructure/Logging/LogHttpRequest.cs diff --git a/src/Umbraco.Core/Logging/MessageTemplates.cs b/src/Umbraco.Infrastructure/Logging/MessageTemplates.cs similarity index 100% rename from src/Umbraco.Core/Logging/MessageTemplates.cs rename to src/Umbraco.Infrastructure/Logging/MessageTemplates.cs diff --git a/src/Umbraco.Core/Logging/OwinLogger.cs b/src/Umbraco.Infrastructure/Logging/OwinLogger.cs similarity index 100% rename from src/Umbraco.Core/Logging/OwinLogger.cs rename to src/Umbraco.Infrastructure/Logging/OwinLogger.cs diff --git a/src/Umbraco.Core/Logging/OwinLoggerFactory.cs b/src/Umbraco.Infrastructure/Logging/OwinLoggerFactory.cs similarity index 84% rename from src/Umbraco.Core/Logging/OwinLoggerFactory.cs rename to src/Umbraco.Infrastructure/Logging/OwinLoggerFactory.cs index 31805b2edc..9cd4c06263 100644 --- a/src/Umbraco.Core/Logging/OwinLoggerFactory.cs +++ b/src/Umbraco.Infrastructure/Logging/OwinLoggerFactory.cs @@ -1,10 +1,10 @@ using System; using Microsoft.Owin.Logging; -using Umbraco.Core.Composing; +using Umbraco.Composing; namespace Umbraco.Core.Logging { - internal class OwinLoggerFactory : ILoggerFactory + public class OwinLoggerFactory : ILoggerFactory { /// /// Creates a new ILogger instance of the given name. diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs b/src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs similarity index 100% rename from src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs rename to src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs b/src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs similarity index 100% rename from src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs rename to src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs b/src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs similarity index 100% rename from src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs rename to src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs b/src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs similarity index 100% rename from src/Umbraco.Core/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs rename to src/Umbraco.Infrastructure/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs diff --git a/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs b/src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs similarity index 100% rename from src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs rename to src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs diff --git a/src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs b/src/Umbraco.Infrastructure/Logging/Serilog/SerilogLogger.cs similarity index 88% rename from src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs rename to src/Umbraco.Infrastructure/Logging/Serilog/SerilogLogger.cs index af5f712489..9dde28e95a 100644 --- a/src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs +++ b/src/Umbraco.Infrastructure/Logging/Serilog/SerilogLogger.cs @@ -5,9 +5,10 @@ using System.Threading; using Serilog; using Serilog.Events; using Umbraco.Core.Cache; -using Umbraco.Core.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.Diagnostics; using Umbraco.Core.Hosting; +using Umbraco.Core.IO; using Umbraco.Net; namespace Umbraco.Core.Logging.Serilog @@ -17,19 +18,31 @@ namespace Umbraco.Core.Logging.Serilog /// public class SerilogLogger : ILogger, IDisposable { + private readonly ICoreDebug _coreDebug; + private readonly IIOHelper _ioHelper; + private readonly IMarchal _marchal; + /// /// Initialize a new instance of the class with a configuration file. /// /// - public SerilogLogger(FileInfo logConfigFile) + public SerilogLogger(ICoreDebug coreDebug, IIOHelper ioHelper, IMarchal marchal, FileInfo logConfigFile) { + _coreDebug = coreDebug; + _ioHelper = ioHelper; + _marchal = marchal; + Log.Logger = new LoggerConfiguration() .ReadFrom.AppSettings(filePath: AppDomain.CurrentDomain.BaseDirectory + logConfigFile) .CreateLogger(); } - public SerilogLogger(LoggerConfiguration logConfig) + public SerilogLogger(ICoreDebug coreDebug, IIOHelper ioHelper, IMarchal marchal, LoggerConfiguration logConfig) { + _coreDebug = coreDebug; + _ioHelper = ioHelper; + _marchal = marchal; + //Configure Serilog static global logger with config passed in Log.Logger = logConfig.CreateLogger(); } @@ -38,7 +51,7 @@ namespace Umbraco.Core.Logging.Serilog /// Creates a logger with some pre-defined configuration and remainder from config file /// /// Used by UmbracoApplicationBase to get its logger. - public static SerilogLogger CreateWithDefaultConfiguration(IHostingEnvironment hostingEnvironment, ISessionIdResolver sessionIdResolver, Func requestCacheGetter) + public static SerilogLogger CreateWithDefaultConfiguration(IHostingEnvironment hostingEnvironment, ISessionIdResolver sessionIdResolver, Func requestCacheGetter, ICoreDebug coreDebug, IIOHelper ioHelper, IMarchal marchal) { var loggerConfig = new LoggerConfiguration(); loggerConfig @@ -46,7 +59,7 @@ namespace Umbraco.Core.Logging.Serilog .ReadFromConfigFile() .ReadFromUserConfigFile(); - return new SerilogLogger(loggerConfig); + return new SerilogLogger(coreDebug, ioHelper, marchal, loggerConfig); } /// @@ -157,7 +170,7 @@ namespace Umbraco.Core.Logging.Serilog logger.Error(exception, messageTemplate, propertyValues); } - private static void DumpThreadAborts(global::Serilog.ILogger logger, LogEventLevel level, Exception exception, ref string messageTemplate) + private void DumpThreadAborts(global::Serilog.ILogger logger, LogEventLevel level, Exception exception, ref string messageTemplate) { var dump = false; @@ -166,17 +179,17 @@ namespace Umbraco.Core.Logging.Serilog messageTemplate += "\r\nThe thread has been aborted, because the request has timed out."; // dump if configured, or if stacktrace contains Monitor.ReliableEnter - dump = Current.Configs.CoreDebug().DumpOnTimeoutThreadAbort || IsMonitorEnterThreadAbortException(exception); + dump = _coreDebug.DumpOnTimeoutThreadAbort || IsMonitorEnterThreadAbortException(exception); // dump if it is ok to dump (might have a cap on number of dump...) - dump &= MiniDump.OkToDump(); + dump &= MiniDump.OkToDump(_ioHelper); } if (dump) { try { - var dumped = MiniDump.Dump(withException: true); + var dumped = MiniDump.Dump(_marchal, _ioHelper, withException: true); messageTemplate += dumped ? "\r\nA minidump was created in App_Data/MiniDump" : "\r\nFailed to create a minidump"; diff --git a/src/Umbraco.Core/Logging/Viewer/CountingFilter.cs b/src/Umbraco.Infrastructure/Logging/Viewer/CountingFilter.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/CountingFilter.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/CountingFilter.cs diff --git a/src/Umbraco.Core/Logging/Viewer/ErrorCounterFilter.cs b/src/Umbraco.Infrastructure/Logging/Viewer/ErrorCounterFilter.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/ErrorCounterFilter.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/ErrorCounterFilter.cs diff --git a/src/Umbraco.Core/Logging/Viewer/ExpressionFilter.cs b/src/Umbraco.Infrastructure/Logging/Viewer/ExpressionFilter.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/ExpressionFilter.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/ExpressionFilter.cs diff --git a/src/Umbraco.Core/Logging/Viewer/ILogFilter.cs b/src/Umbraco.Infrastructure/Logging/Viewer/ILogFilter.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/ILogFilter.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/ILogFilter.cs diff --git a/src/Umbraco.Core/Logging/Viewer/ILogViewer.cs b/src/Umbraco.Infrastructure/Logging/Viewer/ILogViewer.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/ILogViewer.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/ILogViewer.cs diff --git a/src/Umbraco.Core/Logging/Viewer/JsonLogViewer.cs b/src/Umbraco.Infrastructure/Logging/Viewer/JsonLogViewer.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/JsonLogViewer.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/JsonLogViewer.cs diff --git a/src/Umbraco.Core/Logging/Viewer/LogLevelCounts.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogLevelCounts.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/LogLevelCounts.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/LogLevelCounts.cs diff --git a/src/Umbraco.Core/Logging/Viewer/LogMessage.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogMessage.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/LogMessage.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/LogMessage.cs diff --git a/src/Umbraco.Core/Logging/Viewer/LogTemplate.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogTemplate.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/LogTemplate.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/LogTemplate.cs diff --git a/src/Umbraco.Core/Logging/Viewer/LogTimePeriod.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogTimePeriod.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/LogTimePeriod.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/LogTimePeriod.cs diff --git a/src/Umbraco.Core/Logging/Viewer/LogViewerComposer.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerComposer.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/LogViewerComposer.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/LogViewerComposer.cs diff --git a/src/Umbraco.Core/Logging/Viewer/LogViewerSourceBase.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerSourceBase.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/LogViewerSourceBase.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/LogViewerSourceBase.cs diff --git a/src/Umbraco.Core/Logging/Viewer/MessageTemplateFilter.cs b/src/Umbraco.Infrastructure/Logging/Viewer/MessageTemplateFilter.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/MessageTemplateFilter.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/MessageTemplateFilter.cs diff --git a/src/Umbraco.Core/Logging/Viewer/SavedLogSearch.cs b/src/Umbraco.Infrastructure/Logging/Viewer/SavedLogSearch.cs similarity index 100% rename from src/Umbraco.Core/Logging/Viewer/SavedLogSearch.cs rename to src/Umbraco.Infrastructure/Logging/Viewer/SavedLogSearch.cs diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index 8e9baebbf0..5763d2aca4 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -9,6 +9,7 @@ + @@ -19,6 +20,7 @@ + diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index fbbb0ecff7..64e7b7e040 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Diagnostics; using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -87,6 +88,8 @@ namespace Umbraco.Tests.TestHelpers public static IShortStringHelper ShortStringHelper => new DefaultShortStringHelper(new DefaultShortStringHelperConfig()); public static IDbProviderFactoryCreator DbProviderFactoryCreator => new UmbracoDbProviderFactoryCreator(Constants.DbProviderNames.SqlCe); public static IBulkSqlInsertProvider BulkSqlInsertProvider => new SqlCeBulkSqlInsertProvider(); + public static IMarchal Marchal => new FrameworkMarchal(); + public static ICoreDebug CoreDebug => new CoreDebug(); public static IIOHelper IOHelper = new IOHelper(GetHostingEnvironment()); diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs index e78b074b89..7230d1101e 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -158,7 +158,6 @@ namespace Umbraco.Tests.TestHelpers { return SettingsForTests.GetDefaultGlobalSettings(); } - public IFileSystems GetFileSystemsMock() { var fileSystems = Mock.Of(); diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index ea13a25bbd..13ee8fea89 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -241,7 +241,7 @@ namespace Umbraco.Tests.Testing profiler = Mock.Of(); break; case UmbracoTestOptions.Logger.Serilog: - logger = new SerilogLogger(new FileInfo(TestHelper.MapPathForTest("~/unit-test.config"))); + logger = new SerilogLogger(TestHelper.CoreDebug, IOHelper, TestHelper.Marchal, new FileInfo(TestHelper.MapPathForTest("~/unit-test.config"))); profiler = new LogProfiler(logger); break; case UmbracoTestOptions.Logger.Console: diff --git a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs index ce3e45c23f..2266bd0104 100644 --- a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs @@ -17,7 +17,7 @@ namespace Umbraco.Tests.UmbracoExamine [OneTimeSetUp] public void InitializeFixture() { - var logger = new SerilogLogger(new FileInfo(TestHelper.MapPathForTest("~/unit-test.config"))); + var logger = new SerilogLogger(TestHelper.CoreDebug, IOHelper, TestHelper.Marchal, new FileInfo(TestHelper.MapPathForTest("~/unit-test.config"))); _profilingLogger = new ProfilingLogger(logger, new LogProfiler(logger)); } diff --git a/src/Umbraco.Web/FrameworkMarchal.cs b/src/Umbraco.Web/FrameworkMarchal.cs new file mode 100644 index 0000000000..c8cd8a5692 --- /dev/null +++ b/src/Umbraco.Web/FrameworkMarchal.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.InteropServices; +using Umbraco.Core.Diagnostics; + +namespace Umbraco.Web +{ + + public class FrameworkMarchal : 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/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index d792ad84a3..bb4df93eb6 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -170,6 +170,7 @@ + diff --git a/src/Umbraco.Web/UmbracoApplicationBase.cs b/src/Umbraco.Web/UmbracoApplicationBase.cs index de780a6b48..9fee53dc48 100644 --- a/src/Umbraco.Web/UmbracoApplicationBase.cs +++ b/src/Umbraco.Web/UmbracoApplicationBase.cs @@ -46,7 +46,7 @@ namespace Umbraco.Web _profiler = new LogProfiler(_logger); - _logger = SerilogLogger.CreateWithDefaultConfiguration(_hostingEnvironment, new AspNetSessionIdResolver(), () => _factory?.GetInstance()); + _logger = SerilogLogger.CreateWithDefaultConfiguration(_hostingEnvironment, new AspNetSessionIdResolver(), () => _factory?.GetInstance(), _configs.CoreDebug(), _ioHelper, new FrameworkMarchal()); _backOfficeInfo = new AspNetBackOfficeInfo(_configs.Global(), _ioHelper, _configs.Settings(), _logger); Umbraco.Composing.Current.Logger = _logger; From 6c923bc9b48cb5596f74ebeb6f24a4a395a005e6 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 18 Dec 2019 13:05:34 +0100 Subject: [PATCH 11/19] AB4227 - Moved a mix of files --- src/Umbraco.Core/Umbraco.Core.csproj | 17 ++---------- .../CompositionExtensions/Configuration.cs | 0 .../CompositionExtensions/FileSystems.cs | 5 ++-- .../CompositionExtensions/Repositories.cs | 0 .../CompositionExtensions/Services.cs | 0 .../LightInject/LightInjectContainer.cs | 0 .../LightInject/LightInjectException.cs | 0 .../MixedLightInjectScopeManagerProvider.cs | 0 .../Composing/RegisterFactory.cs | 0 .../Deploy/IGridCellValueConnector.cs | 0 .../Models/UserExtensions.cs | 26 +++++++++---------- .../Runtime/CoreInitialComponent.cs | 0 .../RuntimeState.cs | 4 +-- .../Security/ContentPermissionsHelper.cs | 4 +-- .../Umbraco.Infrastructure.csproj | 1 + .../Web/Controllers/UsersControllerTests.cs | 14 +++++++--- .../Editors/CurrentUserController.cs | 24 ++++++++++++++++- src/Umbraco.Web/Editors/LogController.cs | 25 +++++++++++++++++- src/Umbraco.Web/Editors/UsersController.cs | 15 ++++++----- .../Models/Mapping/UserMapDefinition.cs | 11 +++++--- 20 files changed, 96 insertions(+), 50 deletions(-) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/CompositionExtensions/Configuration.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/CompositionExtensions/FileSystems.cs (96%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/CompositionExtensions/Repositories.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/CompositionExtensions/Services.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/LightInject/LightInjectContainer.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/LightInject/LightInjectException.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/LightInject/MixedLightInjectScopeManagerProvider.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Composing/RegisterFactory.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Deploy/IGridCellValueConnector.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Models/UserExtensions.cs (92%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Runtime/CoreInitialComponent.cs (100%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/RuntimeState.cs (99%) rename src/{Umbraco.Core => Umbraco.Infrastructure}/Security/ContentPermissionsHelper.cs (98%) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 987855c932..110707c5b9 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -128,42 +128,29 @@ --> - - - - - - - - - + + - - - - - - diff --git a/src/Umbraco.Core/Composing/CompositionExtensions/Configuration.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs similarity index 100% rename from src/Umbraco.Core/Composing/CompositionExtensions/Configuration.cs rename to src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs diff --git a/src/Umbraco.Core/Composing/CompositionExtensions/FileSystems.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs similarity index 96% rename from src/Umbraco.Core/Composing/CompositionExtensions/FileSystems.cs rename to src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs index 0fdcd0ae29..b1c76b0753 100644 --- a/src/Umbraco.Core/Composing/CompositionExtensions/FileSystems.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.IO; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Core.IO.MediaPathSchemes; using Umbraco.Core.Logging; @@ -90,7 +91,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions // register the IFileSystem supporting the IMediaFileSystem // THIS IS THE ONLY THING THAT NEEDS TO CHANGE, IN ORDER TO REPLACE THE UNDERLYING FILESYSTEM // and, SupportingFileSystem.For() returns the underlying filesystem - composition.SetMediaFileSystem(factory => new PhysicalFileSystem(factory.GetInstance(), factory.GetInstance(), Current.Configs.Global().UmbracoMediaPath)); + composition.SetMediaFileSystem(factory => new PhysicalFileSystem(factory.GetInstance(), factory.GetInstance(), factory.GetInstance().UmbracoMediaPath)); return composition; } diff --git a/src/Umbraco.Core/Composing/CompositionExtensions/Repositories.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs similarity index 100% rename from src/Umbraco.Core/Composing/CompositionExtensions/Repositories.cs rename to src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs diff --git a/src/Umbraco.Core/Composing/CompositionExtensions/Services.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs similarity index 100% rename from src/Umbraco.Core/Composing/CompositionExtensions/Services.cs rename to src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs diff --git a/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs b/src/Umbraco.Infrastructure/Composing/LightInject/LightInjectContainer.cs similarity index 100% rename from src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs rename to src/Umbraco.Infrastructure/Composing/LightInject/LightInjectContainer.cs diff --git a/src/Umbraco.Core/Composing/LightInject/LightInjectException.cs b/src/Umbraco.Infrastructure/Composing/LightInject/LightInjectException.cs similarity index 100% rename from src/Umbraco.Core/Composing/LightInject/LightInjectException.cs rename to src/Umbraco.Infrastructure/Composing/LightInject/LightInjectException.cs diff --git a/src/Umbraco.Core/Composing/LightInject/MixedLightInjectScopeManagerProvider.cs b/src/Umbraco.Infrastructure/Composing/LightInject/MixedLightInjectScopeManagerProvider.cs similarity index 100% rename from src/Umbraco.Core/Composing/LightInject/MixedLightInjectScopeManagerProvider.cs rename to src/Umbraco.Infrastructure/Composing/LightInject/MixedLightInjectScopeManagerProvider.cs diff --git a/src/Umbraco.Core/Composing/RegisterFactory.cs b/src/Umbraco.Infrastructure/Composing/RegisterFactory.cs similarity index 100% rename from src/Umbraco.Core/Composing/RegisterFactory.cs rename to src/Umbraco.Infrastructure/Composing/RegisterFactory.cs diff --git a/src/Umbraco.Core/Deploy/IGridCellValueConnector.cs b/src/Umbraco.Infrastructure/Deploy/IGridCellValueConnector.cs similarity index 100% rename from src/Umbraco.Core/Deploy/IGridCellValueConnector.cs rename to src/Umbraco.Infrastructure/Deploy/IGridCellValueConnector.cs diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Infrastructure/Models/UserExtensions.cs similarity index 92% rename from src/Umbraco.Core/Models/UserExtensions.cs rename to src/Umbraco.Infrastructure/Models/UserExtensions.cs index d5dda1a49a..ebc5fab793 100644 --- a/src/Umbraco.Core/Models/UserExtensions.cs +++ b/src/Umbraco.Infrastructure/Models/UserExtensions.cs @@ -7,6 +7,7 @@ using System.Security.Cryptography; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Composing; +using Umbraco.Core.IO; using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; @@ -16,17 +17,16 @@ namespace Umbraco.Core.Models { public static class UserExtensions { - - /// /// Tries to lookup the user's Gravatar to see if the endpoint can be reached, if so it returns the valid URL /// /// /// + /// /// /// A list of 5 different sized avatar URLs /// - internal static string[] GetUserAvatarUrls(this IUser user, IAppCache cache) + public static string[] GetUserAvatarUrls(this IUser user, IAppCache cache, IMediaFileSystem mediaFileSystem) { // If FIPS is required, never check the Gravatar service as it only supports MD5 hashing. // Unfortunately, if the FIPS setting is enabled on Windows, using MD5 will throw an exception @@ -77,7 +77,7 @@ namespace Umbraco.Core.Models } //use the custom avatar - var avatarUrl = Current.MediaFileSystem.GetUrl(user.Avatar); + var avatarUrl = mediaFileSystem.GetUrl(user.Avatar); return new[] { avatarUrl + "?width=30&height=30&mode=crop", @@ -89,47 +89,47 @@ namespace Umbraco.Core.Models } - - internal static bool HasContentRootAccess(this IUser user, IEntityService entityService) + + public static bool HasContentRootAccess(this IUser user, IEntityService entityService) { return ContentPermissionsHelper.HasPathAccess(Constants.System.RootString, user.CalculateContentStartNodeIds(entityService), Constants.System.RecycleBinContent); } - internal static bool HasContentBinAccess(this IUser user, IEntityService entityService) + public static bool HasContentBinAccess(this IUser user, IEntityService entityService) { return ContentPermissionsHelper.HasPathAccess(Constants.System.RecycleBinContentString, user.CalculateContentStartNodeIds(entityService), Constants.System.RecycleBinContent); } - internal static bool HasMediaRootAccess(this IUser user, IEntityService entityService) + public static bool HasMediaRootAccess(this IUser user, IEntityService entityService) { return ContentPermissionsHelper.HasPathAccess(Constants.System.RootString, user.CalculateMediaStartNodeIds(entityService), Constants.System.RecycleBinMedia); } - internal static bool HasMediaBinAccess(this IUser user, IEntityService entityService) + public static bool HasMediaBinAccess(this IUser user, IEntityService entityService) { return ContentPermissionsHelper.HasPathAccess(Constants.System.RecycleBinMediaString, user.CalculateMediaStartNodeIds(entityService), Constants.System.RecycleBinMedia); } - internal static bool HasPathAccess(this IUser user, IContent content, IEntityService entityService) + public static bool HasPathAccess(this IUser user, IContent content, IEntityService entityService) { if (content == null) throw new ArgumentNullException(nameof(content)); return ContentPermissionsHelper.HasPathAccess(content.Path, user.CalculateContentStartNodeIds(entityService), Constants.System.RecycleBinContent); } - internal static bool HasPathAccess(this IUser user, IMedia media, IEntityService entityService) + public static bool HasPathAccess(this IUser user, IMedia media, IEntityService entityService) { if (media == null) throw new ArgumentNullException(nameof(media)); return ContentPermissionsHelper.HasPathAccess(media.Path, user.CalculateMediaStartNodeIds(entityService), Constants.System.RecycleBinMedia); } - internal static bool HasContentPathAccess(this IUser user, IUmbracoEntity entity, IEntityService entityService) + public static bool HasContentPathAccess(this IUser user, IUmbracoEntity entity, IEntityService entityService) { if (entity == null) throw new ArgumentNullException(nameof(entity)); return ContentPermissionsHelper.HasPathAccess(entity.Path, user.CalculateContentStartNodeIds(entityService), Constants.System.RecycleBinContent); } - internal static bool HasMediaPathAccess(this IUser user, IUmbracoEntity entity, IEntityService entityService) + public static bool HasMediaPathAccess(this IUser user, IUmbracoEntity entity, IEntityService entityService) { if (entity == null) throw new ArgumentNullException(nameof(entity)); return ContentPermissionsHelper.HasPathAccess(entity.Path, user.CalculateMediaStartNodeIds(entityService), Constants.System.RecycleBinMedia); diff --git a/src/Umbraco.Core/Runtime/CoreInitialComponent.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComponent.cs similarity index 100% rename from src/Umbraco.Core/Runtime/CoreInitialComponent.cs rename to src/Umbraco.Infrastructure/Runtime/CoreInitialComponent.cs diff --git a/src/Umbraco.Core/RuntimeState.cs b/src/Umbraco.Infrastructure/RuntimeState.cs similarity index 99% rename from src/Umbraco.Core/RuntimeState.cs rename to src/Umbraco.Infrastructure/RuntimeState.cs index 8c860743a5..5952e73e62 100644 --- a/src/Umbraco.Core/RuntimeState.cs +++ b/src/Umbraco.Infrastructure/RuntimeState.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core /// /// Represents the state of the Umbraco runtime. /// - internal class RuntimeState : IRuntimeState + public class RuntimeState : IRuntimeState { private readonly ILogger _logger; private readonly IUmbracoSettingsSection _settings; @@ -105,7 +105,7 @@ namespace Umbraco.Core /// /// Ensures that the property has a value. /// - internal void EnsureApplicationUrl() + public void EnsureApplicationUrl() { //Fixme: This causes problems with site swap on azure because azure pre-warms a site by calling into `localhost` and when it does that // it changes the URL to `localhost:80` which actually doesn't work for pinging itself, it only works internally in Azure. The ironic part diff --git a/src/Umbraco.Core/Security/ContentPermissionsHelper.cs b/src/Umbraco.Infrastructure/Security/ContentPermissionsHelper.cs similarity index 98% rename from src/Umbraco.Core/Security/ContentPermissionsHelper.cs rename to src/Umbraco.Infrastructure/Security/ContentPermissionsHelper.cs index 1a329fcdcb..7f0a5c3c24 100644 --- a/src/Umbraco.Core/Security/ContentPermissionsHelper.cs +++ b/src/Umbraco.Infrastructure/Security/ContentPermissionsHelper.cs @@ -11,7 +11,7 @@ using Umbraco.Core.Services; namespace Umbraco.Core.Security { - internal class ContentPermissionsHelper + public class ContentPermissionsHelper { public enum ContentAccess { @@ -216,7 +216,7 @@ namespace Umbraco.Core.Security return startNodeIds.Any(x => formattedPath.Contains(string.Concat(",", x, ","))); } - internal static bool IsInBranchOfStartNode(string path, int[] startNodeIds, string[] startNodePaths, out bool hasPathAccess) + public static bool IsInBranchOfStartNode(string path, int[] startNodeIds, string[] startNodePaths, out bool hasPathAccess) { if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(path)); diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index 5763d2aca4..f576e09efc 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -8,6 +8,7 @@ + diff --git a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs index d983a835b8..94be446fb8 100644 --- a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs @@ -14,6 +14,7 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; @@ -84,7 +85,9 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + Factory.GetInstance() + ); return usersController; } @@ -148,7 +151,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + Factory.GetInstance()); return usersController; } @@ -183,7 +187,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + Factory.GetInstance()); return usersController; } @@ -253,7 +258,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + Factory.GetInstance()); return usersController; } diff --git a/src/Umbraco.Web/Editors/CurrentUserController.cs b/src/Umbraco.Web/Editors/CurrentUserController.cs index 0aa0dd029a..7a78631283 100644 --- a/src/Umbraco.Web/Editors/CurrentUserController.cs +++ b/src/Umbraco.Web/Editors/CurrentUserController.cs @@ -12,6 +12,11 @@ using Umbraco.Web.WebApi; using System.Linq; using Newtonsoft.Json; using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence; using Umbraco.Web.Security; using Umbraco.Web.WebApi.Filters; @@ -24,6 +29,23 @@ namespace Umbraco.Web.Editors [PluginController("UmbracoApi")] public class CurrentUserController : UmbracoAuthorizedJsonController { + private readonly IMediaFileSystem _mediaFileSystem; + + public CurrentUserController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IMediaFileSystem mediaFileSystem) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) + { + _mediaFileSystem = mediaFileSystem; + } + /// /// Returns permissions for all nodes passed in for the current user /// @@ -155,7 +177,7 @@ namespace Umbraco.Web.Editors public async Task PostSetAvatar() { //borrow the logic from the user controller - return await UsersController.PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, Security.GetUserId().ResultOr(0)); + return await UsersController.PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, _mediaFileSystem, Security.GetUserId().ResultOr(0)); } /// diff --git a/src/Umbraco.Web/Editors/LogController.cs b/src/Umbraco.Web/Editors/LogController.cs index 44eb0a34fc..1924d9c228 100644 --- a/src/Umbraco.Web/Editors/LogController.cs +++ b/src/Umbraco.Web/Editors/LogController.cs @@ -2,7 +2,13 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Persistence; +using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; @@ -15,6 +21,23 @@ namespace Umbraco.Web.Editors [PluginController("UmbracoApi")] public class LogController : UmbracoAuthorizedJsonController { + private readonly IMediaFileSystem _mediaFileSystem; + + public LogController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IMediaFileSystem mediaFileSystem) + : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) + { + _mediaFileSystem = mediaFileSystem; + } + [UmbracoApplicationAuthorize(Core.Constants.Applications.Content, Core.Constants.Applications.Media)] public PagedResult GetPagedEntityLog(int id, int pageNumber = 1, @@ -67,7 +90,7 @@ namespace Umbraco.Web.Editors var mappedItems = items.ToList(); var userIds = mappedItems.Select(x => x.UserId).ToArray(); var userAvatars = Services.UserService.GetUsersById(userIds) - .ToDictionary(x => x.Id, x => x.GetUserAvatarUrls(AppCaches.RuntimeCache)); + .ToDictionary(x => x.Id, x => x.GetUserAvatarUrls(AppCaches.RuntimeCache, _mediaFileSystem)); var userNames = Services.UserService.GetUsersById(userIds).ToDictionary(x => x.Id, x => x.Name); foreach (var item in mappedItems) { diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 1e751d2383..92e3a603f9 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -15,6 +15,7 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; @@ -41,11 +42,13 @@ namespace Umbraco.Web.Editors public class UsersController : UmbracoAuthorizedJsonController { private readonly IGlobalSettings _globalSettings; + private readonly IMediaFileSystem _mediaFileSystem; - public UsersController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) + public UsersController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IMediaFileSystem mediaFileSystem) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { _globalSettings = globalSettings; + _mediaFileSystem = mediaFileSystem; } /// @@ -54,7 +57,7 @@ namespace Umbraco.Web.Editors /// public string[] GetCurrentUserAvatarUrls() { - var urls = UmbracoContext.Security.CurrentUser.GetUserAvatarUrls(AppCaches.RuntimeCache); + var urls = UmbracoContext.Security.CurrentUser.GetUserAvatarUrls(AppCaches.RuntimeCache, _mediaFileSystem); if (urls == null) throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not access Gravatar endpoint")); @@ -66,10 +69,10 @@ namespace Umbraco.Web.Editors [AdminUsersAuthorize] public async Task PostSetAvatar(int id) { - return await PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, id); + return await PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, _mediaFileSystem, id); } - internal static async Task PostSetAvatarInternal(HttpRequestMessage request, IUserService userService, IAppCache cache, int id) + internal static async Task PostSetAvatarInternal(HttpRequestMessage request, IUserService userService, IAppCache cache, IMediaFileSystem mediaFileSystem, int id) { if (request.Content.IsMimeMultipartContent() == false) { @@ -123,7 +126,7 @@ namespace Umbraco.Web.Editors }); } - return request.CreateResponse(HttpStatusCode.OK, user.GetUserAvatarUrls(cache)); + return request.CreateResponse(HttpStatusCode.OK, user.GetUserAvatarUrls(cache, mediaFileSystem)); } [AppendUserModifiedHeader("id")] @@ -157,7 +160,7 @@ namespace Umbraco.Web.Editors Current.MediaFileSystem.DeleteFile(filePath); } - return Request.CreateResponse(HttpStatusCode.OK, found.GetUserAvatarUrls(AppCaches.RuntimeCache)); + return Request.CreateResponse(HttpStatusCode.OK, found.GetUserAvatarUrls(AppCaches.RuntimeCache, _mediaFileSystem)); } /// diff --git a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs index 1937634ada..ea0acea6f8 100644 --- a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs @@ -6,6 +6,7 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Core.Mapping; using Umbraco.Core.Models.Membership; using Umbraco.Web.Models.ContentEditing; @@ -27,9 +28,10 @@ namespace Umbraco.Web.Models.Mapping private readonly ActionCollection _actions; private readonly AppCaches _appCaches; private readonly IGlobalSettings _globalSettings; + private readonly IMediaFileSystem _mediaFileSystem; public UserMapDefinition(ILocalizedTextService textService, IUserService userService, IEntityService entityService, ISectionService sectionService, - AppCaches appCaches, ActionCollection actions, IGlobalSettings globalSettings) + AppCaches appCaches, ActionCollection actions, IGlobalSettings globalSettings, IMediaFileSystem mediaFileSystem) { _sectionService = sectionService; _entityService = entityService; @@ -38,6 +40,7 @@ namespace Umbraco.Web.Models.Mapping _actions = actions; _appCaches = appCaches; _globalSettings = globalSettings; + _mediaFileSystem = mediaFileSystem; } public void DefineMaps(UmbracoMapper mapper) @@ -273,7 +276,7 @@ namespace Umbraco.Web.Models.Mapping private void Map(IUser source, UserDisplay target, MapperContext context) { target.AvailableCultures = _textService.GetSupportedCultures().ToDictionary(x => x.Name, x => x.DisplayName); - target.Avatars = source.GetUserAvatarUrls(_appCaches.RuntimeCache); + target.Avatars = source.GetUserAvatarUrls(_appCaches.RuntimeCache, _mediaFileSystem); target.CalculatedStartContentIds = GetStartNodes(source.CalculateContentStartNodeIds(_entityService), UmbracoObjectTypes.Document, "content/contentRoot", context); target.CalculatedStartMediaIds = GetStartNodes(source.CalculateMediaStartNodeIds(_entityService), UmbracoObjectTypes.Media, "media/mediaRoot", context); target.CreateDate = source.CreateDate; @@ -304,7 +307,7 @@ namespace Umbraco.Web.Models.Mapping //Loading in the user avatar's requires an external request if they don't have a local file avatar, this means that initial load of paging may incur a cost //Alternatively, if this is annoying the back office UI would need to be updated to request the avatars for the list of users separately so it doesn't look //like the load time is waiting. - target.Avatars = source.GetUserAvatarUrls(_appCaches.RuntimeCache); + target.Avatars = source.GetUserAvatarUrls(_appCaches.RuntimeCache, _mediaFileSystem); target.Culture = source.GetUserCulture(_textService, _globalSettings).ToString(); target.Email = source.Email; target.EmailHash = source.Email.ToLowerInvariant().Trim().GenerateHash(); @@ -323,7 +326,7 @@ namespace Umbraco.Web.Models.Mapping private void Map(IUser source, UserDetail target, MapperContext context) { target.AllowedSections = source.AllowedSections; - target.Avatars = source.GetUserAvatarUrls(_appCaches.RuntimeCache); + target.Avatars = source.GetUserAvatarUrls(_appCaches.RuntimeCache, _mediaFileSystem); target.Culture = source.GetUserCulture(_textService, _globalSettings).ToString(); target.Email = source.Email; target.EmailHash = source.Email.ToLowerInvariant().Trim().GenerateHash(); From b3c06be83acfb077f14604b0705c64b36a175a58 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 18 Dec 2019 13:38:03 +0100 Subject: [PATCH 12/19] AB4227 - Moved a mix of files --- src/Umbraco.Core/ContentExtensions.cs | 203 ------------------ src/Umbraco.Core/Umbraco.Core.csproj | 6 +- .../ContentExtensions.cs | 165 ++++++++++++++ .../Security/MachineKeyGenerator.cs | 2 +- .../PublishedContentCacheTests.cs | 2 +- .../PublishedMemberCache.cs | 14 +- .../XmlPublishedSnapshotService.cs | 2 +- .../PublishedContentTestBase.cs | 3 +- .../PublishedContent/PublishedContentTests.cs | 3 +- src/Umbraco.Web/Editors/MediaController.cs | 21 +- .../PublishedContentHashtableConverter.cs | 11 +- .../RichTextEditorPastedImages.cs | 9 +- .../PublishedCache/PublishedMember.cs | 12 +- 13 files changed, 221 insertions(+), 232 deletions(-) delete mode 100644 src/Umbraco.Core/ContentExtensions.cs rename src/{Umbraco.Core => Umbraco.Infrastructure}/Security/MachineKeyGenerator.cs (98%) diff --git a/src/Umbraco.Core/ContentExtensions.cs b/src/Umbraco.Core/ContentExtensions.cs deleted file mode 100644 index 16a86a1527..0000000000 --- a/src/Umbraco.Core/ContentExtensions.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Xml.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Umbraco.Core.Composing; -using Umbraco.Core.IO; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Services; -using Umbraco.Core.Strings; - -namespace Umbraco.Core -{ - public static class ContentExtensions - { - // this ain't pretty - private static IMediaFileSystem _mediaFileSystem; - private static IMediaFileSystem MediaFileSystem => _mediaFileSystem ?? (_mediaFileSystem = Current.MediaFileSystem); - - - - - /// - /// Checks if the IContentBase has children - /// - /// - /// - /// - /// - /// This is a bit of a hack because we need to type check! - /// - internal static bool HasChildren(IContentBase content, ServiceContext services) - { - if (content is IContent) - { - return services.ContentService.HasChildren(content.Id); - } - if (content is IMedia) - { - return services.MediaService.HasChildren(content.Id); - } - return false; - } - - /// - /// Returns properties that do not belong to a group - /// - /// - /// - public static IEnumerable GetNonGroupedProperties(this IContentBase content) - { - return content.Properties - .Where(x => x.PropertyType.PropertyGroupId == null) - .OrderBy(x => x.PropertyType.SortOrder); - } - - /// - /// Returns the Property object for the given property group - /// - /// - /// - /// - public static IEnumerable GetPropertiesForGroup(this IContentBase content, PropertyGroup propertyGroup) - { - //get the properties for the current tab - return content.Properties - .Where(property => propertyGroup.PropertyTypes - .Select(propertyType => propertyType.Id) - .Contains(property.PropertyTypeId)); - } - - #region SetValue for setting file contents - - /// - /// Sets the posted file value of a property. - /// - public static void SetValue(this IContentBase content, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string culture = null, string segment = null) - { - if (filename == null || filestream == null) return; - - // get a safe & clean filename - var shortStringHelper = Current.Factory.GetInstance(); - - filename = shortStringHelper.CleanStringForSafeFileName(filename); - if (string.IsNullOrWhiteSpace(filename)) return; - filename = filename.ToLower(); - - SetUploadFile(content,contentTypeBaseServiceProvider, propertyTypeAlias, filename, filestream, culture, segment); - } - - private static void SetUploadFile(this IContentBase content, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string culture = null, string segment = null) - { - var property = GetProperty(content, contentTypeBaseServiceProvider, propertyTypeAlias); - - // Fixes https://github.com/umbraco/Umbraco-CMS/issues/3937 - Assigning a new file to an - // existing IMedia with extension SetValue causes exception 'Illegal characters in path' - string oldpath = null; - if (property.GetValue(culture, segment) is string svalue) - { - if (svalue.DetectIsJson()) - { - // the property value is a JSON serialized image crop data set - grab the "src" property as the file source - var jObject = JsonConvert.DeserializeObject(svalue); - svalue = jObject != null ? jObject.GetValueAsString("src") : svalue; - } - oldpath = MediaFileSystem.GetRelativePath(svalue); - } - - var filepath = MediaFileSystem.StoreFile(content, property.PropertyType, filename, filestream, oldpath); - property.SetValue(MediaFileSystem.GetUrl(filepath), culture, segment); - } - - // gets or creates a property for a content item. - private static IProperty GetProperty(IContentBase content, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias) - { - var property = content.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); - if (property != null) return property; - - var contentType = contentTypeBaseServiceProvider.GetContentTypeOf(content); - var propertyType = contentType.CompositionPropertyTypes - .FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); - if (propertyType == null) - throw new Exception("No property type exists with alias " + propertyTypeAlias + "."); - - property = new Property(propertyType); - content.Properties.Add(property); - return property; - } - - /// - /// Stores a file. - /// - /// A content item. - /// The property alias. - /// The name of the file. - /// A stream containing the file data. - /// The original file path, if any. - /// The path to the file, relative to the media filesystem. - /// - /// Does NOT set the property value, so one should probably store the file and then do - /// something alike: property.Value = MediaHelper.FileSystem.GetUrl(filepath). - /// The original file path is used, in the old media file path scheme, to try and reuse - /// the "folder number" that was assigned to the previous file referenced by the property, - /// if any. - /// - public static string StoreFile(this IContentBase content, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string filepath) - { - var contentType = contentTypeBaseServiceProvider.GetContentTypeOf(content); - var propertyType = contentType - .CompositionPropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); - if (propertyType == null) throw new ArgumentException("Invalid property type alias " + propertyTypeAlias + "."); - return MediaFileSystem.StoreFile(content, propertyType, filename, filestream, filepath); - } - - #endregion - - #region User/Profile methods - - /// - /// Gets the for the Creator of this media item. - /// - public static IProfile GetCreatorProfile(this IMedia media, IUserService userService) - { - return userService.GetProfileById(media.CreatorId); - } - - [Obsolete("Use the overload that declares the IUserService to use")] - [EditorBrowsable(EditorBrowsableState.Never)] - public static IProfile GetCreatorProfile(this IContentBase content) - { - return Current.Services.UserService.GetProfileById(content.CreatorId); - } - - - [Obsolete("Use the overload that declares the IUserService to use")] - [EditorBrowsable(EditorBrowsableState.Never)] - public static IProfile GetWriterProfile(this IContent content) - { - return Current.Services.UserService.GetProfileById(content.WriterId); - } - - - - #endregion - - - - #region Dirty - - public static IEnumerable GetDirtyUserProperties(this IContentBase entity) - { - return entity.Properties.Where(x => x.IsDirty()).Select(x => x.Alias); - } - - - - #endregion - } -} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 110707c5b9..9f44c65a2a 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -140,6 +140,8 @@ + + @@ -147,15 +149,11 @@ - - - - diff --git a/src/Umbraco.Infrastructure/ContentExtensions.cs b/src/Umbraco.Infrastructure/ContentExtensions.cs index f3341c9c8e..f74ecd5693 100644 --- a/src/Umbraco.Infrastructure/ContentExtensions.cs +++ b/src/Umbraco.Infrastructure/ContentExtensions.cs @@ -1,8 +1,15 @@ using System; +using System.Collections.Generic; +using System.IO; using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Umbraco.Composing; +using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; +using Umbraco.Core.Strings; namespace Umbraco.Core { @@ -88,5 +95,163 @@ namespace Umbraco.Core { return userService.GetProfileById(content.WriterId); } + + #region User/Profile methods + + /// + /// Gets the for the Creator of this media item. + /// + public static IProfile GetCreatorProfile(this IMedia media, IUserService userService) + { + return userService.GetProfileById(media.CreatorId); + } + + + #endregion + + /// + /// Checks if the IContentBase has children + /// + /// + /// + /// + /// + /// This is a bit of a hack because we need to type check! + /// + internal static bool HasChildren(IContentBase content, ServiceContext services) + { + if (content is IContent) + { + return services.ContentService.HasChildren(content.Id); + } + if (content is IMedia) + { + return services.MediaService.HasChildren(content.Id); + } + return false; + } + + + /// + /// Returns properties that do not belong to a group + /// + /// + /// + public static IEnumerable GetNonGroupedProperties(this IContentBase content) + { + return content.Properties + .Where(x => x.PropertyType.PropertyGroupId == null) + .OrderBy(x => x.PropertyType.SortOrder); + } + + /// + /// Returns the Property object for the given property group + /// + /// + /// + /// + public static IEnumerable GetPropertiesForGroup(this IContentBase content, PropertyGroup propertyGroup) + { + //get the properties for the current tab + return content.Properties + .Where(property => propertyGroup.PropertyTypes + .Select(propertyType => propertyType.Id) + .Contains(property.PropertyTypeId)); + } + + + #region SetValue for setting file contents + + /// + /// Sets the posted file value of a property. + /// + public static void SetValue(this IContentBase content, IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string culture = null, string segment = null) + { + if (filename == null || filestream == null) return; + + filename = shortStringHelper.CleanStringForSafeFileName(filename); + if (string.IsNullOrWhiteSpace(filename)) return; + filename = filename.ToLower(); + + SetUploadFile(content, mediaFileSystem, contentTypeBaseServiceProvider, propertyTypeAlias, filename, filestream, culture, segment); + } + + private static void SetUploadFile(this IContentBase content, IMediaFileSystem mediaFileSystem, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string culture = null, string segment = null) + { + var property = GetProperty(content, contentTypeBaseServiceProvider, propertyTypeAlias); + + // Fixes https://github.com/umbraco/Umbraco-CMS/issues/3937 - Assigning a new file to an + // existing IMedia with extension SetValue causes exception 'Illegal characters in path' + string oldpath = null; + if (property.GetValue(culture, segment) is string svalue) + { + if (svalue.DetectIsJson()) + { + // the property value is a JSON serialized image crop data set - grab the "src" property as the file source + var jObject = JsonConvert.DeserializeObject(svalue); + svalue = jObject != null ? jObject.GetValueAsString("src") : svalue; + } + oldpath = mediaFileSystem.GetRelativePath(svalue); + } + + var filepath = mediaFileSystem.StoreFile(content, property.PropertyType, filename, filestream, oldpath); + property.SetValue(mediaFileSystem.GetUrl(filepath), culture, segment); + } + + // gets or creates a property for a content item. + private static IProperty GetProperty(IContentBase content, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias) + { + var property = content.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (property != null) return property; + + var contentType = contentTypeBaseServiceProvider.GetContentTypeOf(content); + var propertyType = contentType.CompositionPropertyTypes + .FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (propertyType == null) + throw new Exception("No property type exists with alias " + propertyTypeAlias + "."); + + property = new Property(propertyType); + content.Properties.Add(property); + return property; + } + + /// + /// Stores a file. + /// + /// A content item. + /// The property alias. + /// The name of the file. + /// A stream containing the file data. + /// The original file path, if any. + /// The path to the file, relative to the media filesystem. + /// + /// Does NOT set the property value, so one should probably store the file and then do + /// something alike: property.Value = MediaHelper.FileSystem.GetUrl(filepath). + /// The original file path is used, in the old media file path scheme, to try and reuse + /// the "folder number" that was assigned to the previous file referenced by the property, + /// if any. + /// + public static string StoreFile(this IContentBase content, IMediaFileSystem mediaFileSystem, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, string propertyTypeAlias, string filename, Stream filestream, string filepath) + { + var contentType = contentTypeBaseServiceProvider.GetContentTypeOf(content); + var propertyType = contentType + .CompositionPropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyTypeAlias)); + if (propertyType == null) throw new ArgumentException("Invalid property type alias " + propertyTypeAlias + "."); + return mediaFileSystem.StoreFile(content, propertyType, filename, filestream, filepath); + } + + #endregion + + + #region Dirty + + public static IEnumerable GetDirtyUserProperties(this IContentBase entity) + { + return entity.Properties.Where(x => x.IsDirty()).Select(x => x.Alias); + } + + + + #endregion } } diff --git a/src/Umbraco.Core/Security/MachineKeyGenerator.cs b/src/Umbraco.Infrastructure/Security/MachineKeyGenerator.cs similarity index 98% rename from src/Umbraco.Core/Security/MachineKeyGenerator.cs rename to src/Umbraco.Infrastructure/Security/MachineKeyGenerator.cs index a20f04c919..60b0ef72c2 100644 --- a/src/Umbraco.Core/Security/MachineKeyGenerator.cs +++ b/src/Umbraco.Infrastructure/Security/MachineKeyGenerator.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Security /// /// Used to generate a machine key /// - internal class MachineKeyGenerator + public class MachineKeyGenerator { /// /// Generates the string to be stored in the web.config diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs index 579923744c..5297f7afd6 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs @@ -70,7 +70,7 @@ namespace Umbraco.Tests.Cache.PublishedCache var publishedShapshot = new PublishedSnapshot( new PublishedContentCache(xmlStore, domainCache, appCache, globalSettings, ContentTypesCache, null, null), new PublishedMediaCache(xmlStore, ServiceContext.MediaService, ServiceContext.UserService, appCache, ContentTypesCache, Factory.GetInstance(), umbracoContextAccessor), - new PublishedMemberCache(null, appCache, Current.Services.MemberService, ContentTypesCache), + new PublishedMemberCache(null, appCache, Current.Services.MemberService, ContentTypesCache, Current.Services.UserService), domainCache); var publishedSnapshotService = new Mock(); publishedSnapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny())).Returns(publishedShapshot); diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMemberCache.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMemberCache.cs index c9ff68b254..6990ffe8a2 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMemberCache.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/PublishedMemberCache.cs @@ -18,13 +18,15 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache private readonly IAppCache _requestCache; private readonly XmlStore _xmlStore; private readonly PublishedContentTypeCache _contentTypeCache; + private readonly IUserService _userService; - public PublishedMemberCache(XmlStore xmlStore, IAppCache requestCache, IMemberService memberService, PublishedContentTypeCache contentTypeCache) + public PublishedMemberCache(XmlStore xmlStore, IAppCache requestCache, IMemberService memberService, PublishedContentTypeCache contentTypeCache, IUserService userService) { _requestCache = requestCache; _memberService = memberService; _xmlStore = xmlStore; _contentTypeCache = contentTypeCache; + _userService = userService; } public IPublishedContent GetByProviderKey(object key) @@ -37,7 +39,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache var result = _memberService.GetByProviderKey(key); if (result == null) return null; var type = _contentTypeCache.Get(PublishedItemType.Member, result.ContentTypeId); - return new PublishedMember(result, type).CreateModel(Current.PublishedModelFactory); + return new PublishedMember(result, type, _userService).CreateModel(Current.PublishedModelFactory); }); } @@ -51,7 +53,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache var result = _memberService.GetById(memberId); if (result == null) return null; var type = _contentTypeCache.Get(PublishedItemType.Member, result.ContentTypeId); - return new PublishedMember(result, type).CreateModel(Current.PublishedModelFactory); + return new PublishedMember(result, type, _userService).CreateModel(Current.PublishedModelFactory); }); } @@ -65,7 +67,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache var result = _memberService.GetByUsername(username); if (result == null) return null; var type = _contentTypeCache.Get(PublishedItemType.Member, result.ContentTypeId); - return new PublishedMember(result, type).CreateModel(Current.PublishedModelFactory); + return new PublishedMember(result, type, _userService).CreateModel(Current.PublishedModelFactory); }); } @@ -79,14 +81,14 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache var result = _memberService.GetByEmail(email); if (result == null) return null; var type = _contentTypeCache.Get(PublishedItemType.Member, result.ContentTypeId); - return new PublishedMember(result, type).CreateModel(Current.PublishedModelFactory); + return new PublishedMember(result, type, _userService).CreateModel(Current.PublishedModelFactory); }); } public IPublishedContent GetByMember(IMember member) { var type = _contentTypeCache.Get(PublishedItemType.Member, member.ContentTypeId); - return new PublishedMember(member, type).CreateModel(Current.PublishedModelFactory); + return new PublishedMember(member, type, _userService).CreateModel(Current.PublishedModelFactory); } public XPathNavigator CreateNavigator() diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs index aed55f3f49..1447e24522 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs @@ -152,7 +152,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache return new PublishedSnapshot( new PublishedContentCache(_xmlStore, domainCache, _requestCache, _globalSettings, _contentTypeCache, _routesCache, previewToken), new PublishedMediaCache(_xmlStore, _mediaService, _userService, _requestCache, _contentTypeCache, _entitySerializer, _umbracoContextAccessor), - new PublishedMemberCache(_xmlStore, _requestCache, _memberService, _contentTypeCache), + new PublishedMemberCache(_xmlStore, _requestCache, _memberService, _contentTypeCache, _userService), domainCache); } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index e9f923c029..177561d1ea 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -6,6 +6,7 @@ using Umbraco.Core.PropertyEditors.ValueConverters; using Umbraco.Tests.TestHelpers; using Moq; using Umbraco.Core.Composing; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Web.PropertyEditors; @@ -44,7 +45,7 @@ namespace Umbraco.Tests.PublishedContent var logger = Mock.Of(); var imageSourceParser = new HtmlImageSourceParser(umbracoContextAccessor); - var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, Mock.Of(), Mock.Of()); + var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, Mock.Of(), Mock.Of(), Mock.Of(), ShortStringHelper); var localLinkParser = new HtmlLocalLinkParser(umbracoContextAccessor); var dataTypeService = new TestObjects.TestDataTypeService( new DataType(new RichTextPropertyEditor( diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs index 78ef0318af..d08a573917 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs @@ -49,10 +49,11 @@ namespace Umbraco.Tests.PublishedContent var logger = Mock.Of(); var mediaService = Mock.Of(); + 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); + var pastedImages = new RichTextEditorPastedImages(umbracoContextAccessor, logger, IOHelper, mediaService, contentTypeBaseServiceProvider, mediaFileService, ShortStringHelper); var linkParser = new HtmlLocalLinkParser(umbracoContextAccessor); var localizationService = Mock.Of(); diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 65c0d561b9..2953c018fc 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -38,6 +38,7 @@ using Umbraco.Web.Editors.Filters; using Umbraco.Core.Models.Entities; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Dictionary; +using Umbraco.Core.Strings; namespace Umbraco.Web.Editors { @@ -50,10 +51,24 @@ namespace Umbraco.Web.Editors [MediaControllerControllerConfiguration] public class MediaController : ContentControllerBase { - public MediaController(ICultureDictionary cultureDictionary, PropertyEditorCollection propertyEditors, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) + public MediaController( + ICultureDictionary cultureDictionary, + PropertyEditorCollection propertyEditors, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IMediaFileSystem mediaFileSystem, + IShortStringHelper shortStringHelper) : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); + _mediaFileSystem = mediaFileSystem; + _shortStringHelper = shortStringHelper; } /// @@ -237,6 +252,8 @@ namespace Umbraco.Web.Editors private int[] _userStartNodes; private readonly PropertyEditorCollection _propertyEditors; + private readonly IMediaFileSystem _mediaFileSystem; + private readonly IShortStringHelper _shortStringHelper; protected int[] UserStartNodes { @@ -724,7 +741,7 @@ namespace Umbraco.Web.Editors if (fs == null) throw new InvalidOperationException("Could not acquire file stream"); using (fs) { - f.SetValue(Services.ContentTypeBaseServices, Constants.Conventions.Media.File,fileName, fs); + f.SetValue(_mediaFileSystem, _shortStringHelper, Services.ContentTypeBaseServices, Constants.Conventions.Media.File,fileName, fs); } var saveResult = mediaService.Save(f, Security.CurrentUser.Id); diff --git a/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs b/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs index 0e43de6410..88b957ad96 100644 --- a/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs +++ b/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs @@ -6,6 +6,7 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Composing; using Umbraco.Web.Editors; @@ -76,8 +77,8 @@ namespace Umbraco.Web.Macros /// The content. /// /// This is for usage only. - internal PublishedContentHashtableConverter(IContent content, IVariationContextAccessor variationContextAccessor) - : this(new PagePublishedContent(content, variationContextAccessor)) + internal PublishedContentHashtableConverter(IContent content, IVariationContextAccessor variationContextAccessor, IUserService userService) + : this(new PagePublishedContent(content, variationContextAccessor, userService)) { } #endregion @@ -192,15 +193,15 @@ namespace Umbraco.Web.Macros Id = id; } - public PagePublishedContent(IContent inner, IVariationContextAccessor variationContextAccessor) + public PagePublishedContent(IContent inner, IVariationContextAccessor variationContextAccessor, IUserService userService) { _inner = inner ?? throw new NullReferenceException("content"); _variationContextAccessor = variationContextAccessor; Id = _inner.Id; Key = _inner.Key; - CreatorName = _inner.GetCreatorProfile()?.Name; - WriterName = _inner.GetWriterProfile()?.Name; + CreatorName = _inner.GetCreatorProfile(userService)?.Name; + WriterName = _inner.GetWriterProfile(userService)?.Name; // TODO: inject var contentType = Current.Services.ContentTypeBaseServices.GetContentTypeOf(_inner); diff --git a/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs b/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs index 23b3050035..e3fa1ce082 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs @@ -8,6 +8,7 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web.Templates; namespace Umbraco.Web.PropertyEditors @@ -19,16 +20,20 @@ namespace Umbraco.Web.PropertyEditors private readonly IIOHelper _ioHelper; private readonly IMediaService _mediaService; private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; + private readonly IMediaFileSystem _mediaFileSystem; + private readonly IShortStringHelper _shortStringHelper; const string TemporaryImageDataAttribute = "data-tmpimg"; - public RichTextEditorPastedImages(IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, IIOHelper ioHelper, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) + public RichTextEditorPastedImages(IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, IIOHelper ioHelper, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _ioHelper = ioHelper; _mediaService = mediaService ?? throw new ArgumentNullException(nameof(mediaService)); _contentTypeBaseServiceProvider = contentTypeBaseServiceProvider ?? throw new ArgumentNullException(nameof(contentTypeBaseServiceProvider)); + _mediaFileSystem = mediaFileSystem; + _shortStringHelper = shortStringHelper; } /// @@ -82,7 +87,7 @@ namespace Umbraco.Web.PropertyEditors if (fileStream == null) throw new InvalidOperationException("Could not acquire file stream"); using (fileStream) { - mediaFile.SetValue(_contentTypeBaseServiceProvider, Constants.Conventions.Media.File, safeFileName, fileStream); + mediaFile.SetValue(_mediaFileSystem, _shortStringHelper, _contentTypeBaseServiceProvider, Constants.Conventions.Media.File, safeFileName, fileStream); } _mediaService.Save(mediaFile, userId); diff --git a/src/Umbraco.Web/PublishedCache/PublishedMember.cs b/src/Umbraco.Web/PublishedCache/PublishedMember.cs index 2c3ba1d7ea..ed8e3bd7cf 100644 --- a/src/Umbraco.Web/PublishedCache/PublishedMember.cs +++ b/src/Umbraco.Web/PublishedCache/PublishedMember.cs @@ -5,6 +5,7 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Services; using Umbraco.Web.Models; namespace Umbraco.Web.PublishedCache @@ -18,14 +19,17 @@ namespace Umbraco.Web.PublishedCache private readonly IMembershipUser _membershipUser; private readonly IPublishedProperty[] _properties; private readonly IPublishedContentType _publishedMemberType; + private readonly IUserService _userService; public PublishedMember( IMember member, - IPublishedContentType publishedMemberType) + IPublishedContentType publishedMemberType, + IUserService userService) { _member = member ?? throw new ArgumentNullException(nameof(member)); _membershipUser = member; _publishedMemberType = publishedMemberType ?? throw new ArgumentNullException(nameof(publishedMemberType)); + _userService = userService ?? throw new ArgumentNullException(nameof(userService)); // RawValueProperty is used for two things here // - for the 'map properties' thing that we should really get rid of @@ -136,11 +140,9 @@ namespace Umbraco.Web.PublishedCache public override string UrlSegment => throw new NotSupportedException(); - // TODO: ARGH! need to fix this - this is not good because it uses ApplicationContext.Current - public override string WriterName => _member.GetCreatorProfile().Name; + public override string WriterName => _member.GetCreatorProfile(_userService).Name; - // TODO: ARGH! need to fix this - this is not good because it uses ApplicationContext.Current - public override string CreatorName => _member.GetCreatorProfile().Name; + public override string CreatorName => _member.GetCreatorProfile(_userService).Name; public override int WriterId => _member.CreatorId; From 7f9fbe9877781aab960e9198725929447be7ccdf Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 18 Dec 2019 18:55:00 +0100 Subject: [PATCH 13/19] AB4227 - Removed StringExtensions from core.. --- src/Umbraco.Abstractions/StringExtensions.cs | 50 ++++++ src/Umbraco.Configuration/ConfigsFactory.cs | 4 +- src/Umbraco.Core/StringExtensions.cs | 148 ------------------ src/Umbraco.Core/TypeExtensions.cs | 9 +- src/Umbraco.Core/Umbraco.Core.csproj | 2 - .../RuntimeOptions.cs | 0 .../Compose/ModelsBuilderComponent.cs | 7 +- .../UmbracoServices.cs | 17 +- .../XmlPublishedSnapshotService.cs | 7 +- .../LegacyXmlPublishedCache/XmlStore.cs | 11 +- src/Umbraco.Tests/Models/ContentXmlTest.cs | 2 +- src/Umbraco.Tests/Models/MediaXmlTest.cs | 2 +- .../Routing/RenderRouteHandlerTests.cs | 7 +- .../Strings/CmsHelperCasingTests.cs | 2 +- .../Strings/StringExtensionsTests.cs | 22 +-- .../TestHelpers/TestWithDatabaseBase.cs | 1 + src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 11 +- .../Web/Controllers/ContentControllerTests.cs | 18 ++- .../Web/Controllers/UsersControllerTests.cs | 12 +- .../Web/Mvc/UmbracoViewPageTests.cs | 1 + src/Umbraco.Web/Editors/CodeFileController.cs | 17 +- src/Umbraco.Web/Editors/ContentController.cs | 16 +- .../Editors/ContentControllerBase.cs | 17 +- .../Editors/ContentTypeController.cs | 4 +- .../Editors/CurrentUserController.cs | 8 +- .../Editors/DashboardController.cs | 18 ++- src/Umbraco.Web/Editors/EntityController.cs | 20 ++- .../Editors/MacroRenderingController.cs | 2 +- src/Umbraco.Web/Editors/MacrosController.cs | 2 +- src/Umbraco.Web/Editors/MediaController.cs | 9 +- src/Umbraco.Web/Editors/MemberController.cs | 19 ++- .../Editors/RelationTypeController.cs | 19 ++- src/Umbraco.Web/Editors/TinyMceController.cs | 7 +- src/Umbraco.Web/Editors/UsersController.cs | 21 ++- src/Umbraco.Web/Mvc/RenderRouteHandler.cs | 10 +- .../RichTextEditorPastedImages.cs | 2 +- .../Runtime/WebInitialComponent.cs | 18 ++- src/Umbraco.Web/Templates/TemplateRenderer.cs | 7 +- src/Umbraco.Web/UmbracoApplicationBase.cs | 3 +- 39 files changed, 309 insertions(+), 243 deletions(-) delete mode 100644 src/Umbraco.Core/StringExtensions.cs rename src/{Umbraco.Core => Umbraco.Infrastructure}/RuntimeOptions.cs (100%) diff --git a/src/Umbraco.Abstractions/StringExtensions.cs b/src/Umbraco.Abstractions/StringExtensions.cs index 00e24b32e8..67c44c9793 100644 --- a/src/Umbraco.Abstractions/StringExtensions.cs +++ b/src/Umbraco.Abstractions/StringExtensions.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; +using Umbraco.Composing; using Umbraco.Core.IO; using Umbraco.Core.Strings; @@ -1396,5 +1397,54 @@ namespace Umbraco.Core { return shortStringHelper.CleanString(text, stringType, separator, culture); } + + // note: LegacyCurrent.ShortStringHelper will produce 100% backward-compatible output for SplitPascalCasing. + // other helpers may not. DefaultCurrent.ShortStringHelper produces better, but non-compatible, results. + + /// + /// Splits a Pascal cased string into a phrase separated by spaces. + /// + /// The text to split. + /// + /// The split text. + public static string SplitPascalCasing(this string phrase, IShortStringHelper shortStringHelper) + { + return shortStringHelper.SplitPascalCasing(phrase, ' '); + } + + //NOTE: Not sure what this actually does but is used a few places, need to figure it out and then move to StringExtensions and obsolete. + // it basically is yet another version of SplitPascalCasing + // plugging string extensions here to be 99% compatible + // the only diff. is with numbers, Number6Is was "Number6 Is", and the new string helper does it too, + // but the legacy one does "Number6Is"... assuming it is not a big deal. + internal static string SpaceCamelCasing(this string phrase, IShortStringHelper shortStringHelper) + { + return phrase.Length < 2 ? phrase : phrase.SplitPascalCasing(shortStringHelper).ToFirstUpperInvariant(); + } + + /// + /// Cleans a string, in the context of the invariant culture, to produce a string that can safely be used as a filename, + /// both internally (on disk) and externally (as a url). + /// + /// The text to filter. + /// + /// The safe filename. + public static string ToSafeFileName(this string text, IShortStringHelper shortStringHelper) + { + return shortStringHelper.CleanStringForSafeFileName(text); + } + + /// + /// Cleans a string, in the context of the invariant culture, to produce a string that can safely be used as a filename, + /// both internally (on disk) and externally (as a url). + /// + /// The text to filter. + /// + /// The culture. + /// The safe filename. + public static string ToSafeFileName(this string text, IShortStringHelper shortStringHelper, string culture) + { + return shortStringHelper.CleanStringForSafeFileName(text, culture); + } } } diff --git a/src/Umbraco.Configuration/ConfigsFactory.cs b/src/Umbraco.Configuration/ConfigsFactory.cs index 6619da90a4..c843467e93 100644 --- a/src/Umbraco.Configuration/ConfigsFactory.cs +++ b/src/Umbraco.Configuration/ConfigsFactory.cs @@ -13,6 +13,8 @@ namespace Umbraco.Core.Configuration } public IHostingSettings HostingSettings { get; } = new HostingSettings(); + public ICoreDebug CoreDebug { get; } = new CoreDebug(); + public IUmbracoSettingsSection UmbracoSettings { get; } public Configs Create(IIOHelper ioHelper) @@ -26,7 +28,7 @@ namespace Umbraco.Core.Configuration configs.Add(() => new DefaultPasswordConfig()); configs.Add(() => new DefaultPasswordConfig()); - configs.Add(() => new CoreDebug()); + configs.Add(() => CoreDebug); configs.Add(() => new ConnectionStrings()); configs.AddCoreConfigs(ioHelper); return configs; diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs deleted file mode 100644 index d3ae4e04f5..0000000000 --- a/src/Umbraco.Core/StringExtensions.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using Umbraco.Core.Composing; -using Umbraco.Core.IO; -using Umbraco.Core.Strings; - -namespace Umbraco.Core -{ - - /// - /// String extension methods - /// - public static class StringExtensions - { - - // FORMAT STRINGS - - /// - /// Cleans a string to produce a string that can safely be used in an alias. - /// - /// The text to filter. - /// The safe alias. - public static string ToSafeAlias(this string alias) - { - return Current.ShortStringHelper.CleanStringForSafeAlias(alias); - } - - /// - /// Cleans a string to produce a string that can safely be used in an alias. - /// - /// The text to filter. - /// A value indicating that we want to camel-case the alias. - /// The safe alias. - public static string ToSafeAlias(this string alias, bool camel) - { - var a = Current.ShortStringHelper.CleanStringForSafeAlias(alias); - if (string.IsNullOrWhiteSpace(a) || camel == false) return a; - return char.ToLowerInvariant(a[0]) + a.Substring(1); - } - - /// - /// Cleans a string, in the context of a specified culture, to produce a string that can safely be used in an alias. - /// - /// The text to filter. - /// The culture. - /// The safe alias. - public static string ToSafeAlias(this string alias, string culture) - { - return Current.ShortStringHelper.CleanStringForSafeAlias(alias, culture); - } - - // the new methods to get a url segment - - /// - /// Cleans a string to produce a string that can safely be used in an url segment. - /// - /// The text to filter. - /// The safe url segment. - public static string ToUrlSegment(this string text) - { - if (text == null) throw new ArgumentNullException(nameof(text)); - if (string.IsNullOrWhiteSpace(text)) throw new ArgumentException("Value can't be empty or consist only of white-space characters.", nameof(text)); - - return Current.ShortStringHelper.CleanStringForUrlSegment(text); - } - - /// - /// Cleans a string, in the context of a specified culture, to produce a string that can safely be used in an url segment. - /// - /// The text to filter. - /// The culture. - /// The safe url segment. - public static string ToUrlSegment(this string text, string culture) - { - if (text == null) throw new ArgumentNullException(nameof(text)); - if (string.IsNullOrWhiteSpace(text)) throw new ArgumentException("Value can't be empty or consist only of white-space characters.", nameof(text)); - - return Current.ShortStringHelper.CleanStringForUrlSegment(text, culture); - } - - // the new methods to clean a string (to alias, url segment...) - - /// - /// Cleans a string. - /// - /// The text to clean. - /// A flag indicating the target casing and encoding of the string. By default, - /// strings are cleaned up to camelCase and Ascii. - /// The clean string. - /// The string is cleaned in the context of the ICurrent.ShortStringHelper default culture. - public static string ToCleanString(this string text, CleanStringType stringType) - { - return Current.ShortStringHelper.CleanString(text, stringType); - } - - // note: LegacyCurrent.ShortStringHelper will produce 100% backward-compatible output for SplitPascalCasing. - // other helpers may not. DefaultCurrent.ShortStringHelper produces better, but non-compatible, results. - - /// - /// Splits a Pascal cased string into a phrase separated by spaces. - /// - /// The text to split. - /// The split text. - public static string SplitPascalCasing(this string phrase) - { - return Current.ShortStringHelper.SplitPascalCasing(phrase, ' '); - } - - //NOTE: Not sure what this actually does but is used a few places, need to figure it out and then move to StringExtensions and obsolete. - // it basically is yet another version of SplitPascalCasing - // plugging string extensions here to be 99% compatible - // the only diff. is with numbers, Number6Is was "Number6 Is", and the new string helper does it too, - // but the legacy one does "Number6Is"... assuming it is not a big deal. - internal static string SpaceCamelCasing(this string phrase) - { - return phrase.Length < 2 ? phrase : phrase.SplitPascalCasing().ToFirstUpperInvariant(); - } - - /// - /// Cleans a string, in the context of the invariant culture, to produce a string that can safely be used as a filename, - /// both internally (on disk) and externally (as a url). - /// - /// The text to filter. - /// The safe filename. - public static string ToSafeFileName(this string text) - { - return Current.ShortStringHelper.CleanStringForSafeFileName(text); - } - - /// - /// Cleans a string, in the context of the invariant culture, to produce a string that can safely be used as a filename, - /// both internally (on disk) and externally (as a url). - /// - /// The text to filter. - /// The culture. - /// The safe filename. - public static string ToSafeFileName(this string text, string culture) - { - return Current.ShortStringHelper.CleanStringForSafeFileName(text, culture); - } - - - - - } -} diff --git a/src/Umbraco.Core/TypeExtensions.cs b/src/Umbraco.Core/TypeExtensions.cs index 5cc1270669..c383faf2af 100644 --- a/src/Umbraco.Core/TypeExtensions.cs +++ b/src/Umbraco.Core/TypeExtensions.cs @@ -15,13 +15,14 @@ namespace Umbraco.Core /// Tries to return a value based on a property name for an object but ignores case sensitivity /// /// + /// /// /// /// /// /// Currently this will only work for ProperCase and camelCase properties, see the TODO below to enable complete case insensitivity /// - internal static Attempt GetMemberIgnoreCase(this Type type, object target, string memberName) + internal static Attempt GetMemberIgnoreCase(this Type type, IShortStringHelper shortStringHelper, object target, string memberName) { Func> getMember = memberAlias => @@ -49,8 +50,8 @@ namespace Umbraco.Core { //if we cannot get with the current alias, try changing it's case attempt = memberName[0].IsUpperCase() - ? getMember(memberName.ToCleanString(CleanStringType.Ascii | CleanStringType.ConvertCase | CleanStringType.CamelCase)) - : getMember(memberName.ToCleanString(CleanStringType.Ascii | CleanStringType.ConvertCase | CleanStringType.PascalCase)); + ? getMember(memberName.ToCleanString(shortStringHelper, CleanStringType.Ascii | CleanStringType.ConvertCase | CleanStringType.CamelCase)) + : getMember(memberName.ToCleanString(shortStringHelper, CleanStringType.Ascii | CleanStringType.ConvertCase | CleanStringType.PascalCase)); // TODO: If this still fails then we should get a list of properties from the object and then compare - doing the above without listing // all properties will surely be faster than using reflection to get ALL properties first and then query against them. @@ -58,6 +59,6 @@ namespace Umbraco.Core return attempt; } - + } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9f44c65a2a..7ff3544f7a 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -144,9 +144,7 @@ - - diff --git a/src/Umbraco.Core/RuntimeOptions.cs b/src/Umbraco.Infrastructure/RuntimeOptions.cs similarity index 100% rename from src/Umbraco.Core/RuntimeOptions.cs rename to src/Umbraco.Infrastructure/RuntimeOptions.cs diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs index 0e41c9ac62..6847c45129 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs @@ -8,6 +8,7 @@ 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; @@ -21,12 +22,14 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose { private readonly IModelsBuilderConfig _config; + private readonly IShortStringHelper _shortStringHelper; private readonly LiveModelsProvider _liveModelsProvider; private readonly OutOfDateModelsStatus _outOfDateModels; - public ModelsBuilderComponent(IModelsBuilderConfig config, LiveModelsProvider liveModelsProvider, OutOfDateModelsStatus outOfDateModels) + public ModelsBuilderComponent(IModelsBuilderConfig config, IShortStringHelper shortStringHelper, LiveModelsProvider liveModelsProvider, OutOfDateModelsStatus outOfDateModels) { _config = config; + _shortStringHelper = shortStringHelper; _liveModelsProvider = liveModelsProvider; _outOfDateModels = outOfDateModels; } @@ -116,7 +119,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose // + this is how we get the default model name in Umbraco.ModelsBuilder.Umbraco.Application var alias = e.AdditionalData["ContentTypeAlias"].ToString(); var name = template.Name; // will be the name of the content type since we are creating - var className = UmbracoServices.GetClrName(name, alias); + var className = UmbracoServices.GetClrName(_shortStringHelper, name, alias); var modelNamespace = _config.ModelsNamespace; diff --git a/src/Umbraco.ModelsBuilder.Embedded/UmbracoServices.cs b/src/Umbraco.ModelsBuilder.Embedded/UmbracoServices.cs index 5ede5f45e9..8763da86a6 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/UmbracoServices.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/UmbracoServices.cs @@ -17,13 +17,20 @@ namespace Umbraco.ModelsBuilder.Embedded private readonly IMediaTypeService _mediaTypeService; private readonly IMemberTypeService _memberTypeService; private readonly IPublishedContentTypeFactory _publishedContentTypeFactory; + private readonly IShortStringHelper _shortStringHelper; - public UmbracoServices(IContentTypeService contentTypeService, IMediaTypeService mediaTypeService, IMemberTypeService memberTypeService, IPublishedContentTypeFactory publishedContentTypeFactory) + public UmbracoServices( + IContentTypeService contentTypeService, + IMediaTypeService mediaTypeService, + IMemberTypeService memberTypeService, + IPublishedContentTypeFactory publishedContentTypeFactory, + IShortStringHelper shortStringHelper) { _contentTypeService = contentTypeService; _mediaTypeService = mediaTypeService; _memberTypeService = memberTypeService; _publishedContentTypeFactory = publishedContentTypeFactory; + _shortStringHelper = shortStringHelper; } #region Services @@ -61,10 +68,10 @@ namespace Umbraco.ModelsBuilder.Embedded return GetTypes(PublishedItemType.Member, memberTypes); // aliases have to be unique here } - public static string GetClrName(string name, string alias) + public static string GetClrName(IShortStringHelper shortStringHelper, string name, string alias) { // ModelsBuilder's legacy - but not ideal - return alias.ToCleanString(CleanStringType.ConvertCase | CleanStringType.PascalCase); + return alias.ToCleanString(shortStringHelper, CleanStringType.ConvertCase | CleanStringType.PascalCase); } private IList GetTypes(PublishedItemType itemType, IContentTypeComposition[] contentTypes) @@ -79,7 +86,7 @@ namespace Umbraco.ModelsBuilder.Embedded { Id = contentType.Id, Alias = contentType.Alias, - ClrName = GetClrName(contentType.Name, contentType.Alias), + ClrName = GetClrName(_shortStringHelper, contentType.Name, contentType.Alias), ParentId = contentType.ParentId, Name = contentType.Name, @@ -121,7 +128,7 @@ namespace Umbraco.ModelsBuilder.Embedded var propertyModel = new PropertyModel { Alias = propertyType.Alias, - ClrName = GetClrName(propertyType.Name, propertyType.Alias), + ClrName = GetClrName(_shortStringHelper, propertyType.Name, propertyType.Alias), Name = propertyType.Name, Description = propertyType.Description diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs index 1447e24522..cbff346c4d 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedSnapshotService.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Scoping; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web; using Umbraco.Web.Cache; using Umbraco.Web.PublishedCache; @@ -54,6 +55,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache ILogger logger, IGlobalSettings globalSettings, IHostingEnvironment hostingEnvironment, + IShortStringHelper shortStringHelper, ISiteDomainHelper siteDomainHelper, IEntityXmlSerializer entitySerializer, MainDom mainDom, @@ -62,7 +64,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache publishedSnapshotAccessor, variationContextAccessor, umbracoContextAccessor, documentRepository, mediaRepository, memberRepository, defaultCultureAccessor, - logger, globalSettings, hostingEnvironment, siteDomainHelper, entitySerializer, null, mainDom, testing, enableRepositoryEvents) + logger, globalSettings, hostingEnvironment, shortStringHelper, siteDomainHelper, entitySerializer, null, mainDom, testing, enableRepositoryEvents) { _umbracoContextAccessor = umbracoContextAccessor; } @@ -79,6 +81,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache ILogger logger, IGlobalSettings globalSettings, IHostingEnvironment hostingEnvironment, + IShortStringHelper shortStringHelper, ISiteDomainHelper siteDomainHelper, IEntityXmlSerializer entitySerializer, PublishedContentTypeCache contentTypeCache, @@ -93,7 +96,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache _xmlStore = new XmlStore(serviceContext.ContentTypeService, serviceContext.ContentService, scopeProvider, _routesCache, _contentTypeCache, publishedSnapshotAccessor, mainDom, testing, enableRepositoryEvents, - documentRepository, mediaRepository, memberRepository, globalSettings, entitySerializer, hostingEnvironment); + documentRepository, mediaRepository, memberRepository, globalSettings, entitySerializer, hostingEnvironment, shortStringHelper); _domainService = serviceContext.DomainService; _memberService = serviceContext.MemberService; diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlStore.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlStore.cs index f10a3975c7..4da218cb48 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlStore.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlStore.cs @@ -19,6 +19,7 @@ using Umbraco.Core.Scoping; using Umbraco.Core.Services; using Umbraco.Core.Services.Changes; using Umbraco.Core.Services.Implement; +using Umbraco.Core.Strings; using Umbraco.Core.Xml; using Umbraco.Web.Cache; using Umbraco.Web.Composing; @@ -45,6 +46,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache private readonly IGlobalSettings _globalSettings; private readonly IEntityXmlSerializer _entitySerializer; private readonly IHostingEnvironment _hostingEnvironment; + private readonly IShortStringHelper _shortStringHelper; private XmlStoreFilePersister _persisterTask; private volatile bool _released; private bool _withRepositoryEvents; @@ -63,8 +65,8 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache /// /// The default constructor will boot the cache, load data from file or database, /// wire events in order to manage changes, etc. public XmlStore(IContentTypeService contentTypeService, IContentService contentService, IScopeProvider scopeProvider, RoutesCache routesCache, PublishedContentTypeCache contentTypeCache, - IPublishedSnapshotAccessor publishedSnapshotAccessor, MainDom mainDom, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, IGlobalSettings globalSettings, IEntityXmlSerializer entitySerializer, IHostingEnvironment hostingEnvironment) - : this(contentTypeService, contentService, scopeProvider, routesCache, contentTypeCache, publishedSnapshotAccessor, mainDom, false, false, documentRepository, mediaRepository, memberRepository, globalSettings, entitySerializer, hostingEnvironment) + IPublishedSnapshotAccessor publishedSnapshotAccessor, MainDom mainDom, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, IGlobalSettings globalSettings, IEntityXmlSerializer entitySerializer, IHostingEnvironment hostingEnvironment, IShortStringHelper shortStringHelper) + : this(contentTypeService, contentService, scopeProvider, routesCache, contentTypeCache, publishedSnapshotAccessor, mainDom, false, false, documentRepository, mediaRepository, memberRepository, globalSettings, entitySerializer, hostingEnvironment, shortStringHelper) { } // internal for unit tests @@ -72,7 +74,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache // TODO: er, we DO have a DB? internal XmlStore(IContentTypeService contentTypeService, IContentService contentService, IScopeProvider scopeProvider, RoutesCache routesCache, PublishedContentTypeCache contentTypeCache, IPublishedSnapshotAccessor publishedSnapshotAccessor, MainDom mainDom, - bool testing, bool enableRepositoryEvents, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, IGlobalSettings globalSettings, IEntityXmlSerializer entitySerializer, IHostingEnvironment hostingEnvironment) + bool testing, bool enableRepositoryEvents, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, IGlobalSettings globalSettings, IEntityXmlSerializer entitySerializer, IHostingEnvironment hostingEnvironment, IShortStringHelper shortStringHelper) { if (testing == false) EnsureConfigurationIsValid(); @@ -89,6 +91,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache _globalSettings = globalSettings; _entitySerializer = entitySerializer; _hostingEnvironment = hostingEnvironment; + _shortStringHelper = shortStringHelper; _xmlFileName = Current.IOHelper.MapPath(SystemFiles.GetContentCacheXml(_hostingEnvironment)); @@ -405,7 +408,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache var dtdInner = new StringBuilder(); var contentTypes = _contentTypeService.GetAll(); // though aliases should be safe and non null already? - var aliases = contentTypes.Select(x => x.Alias.ToSafeAlias()).WhereNotNull(); + var aliases = contentTypes.Select(x => x.Alias.ToSafeAlias(_shortStringHelper)).WhereNotNull(); foreach (var alias in aliases) { dtdInner.AppendLine($""); diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index 023895654d..fe58889d05 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.Models var content = MockedContent.CreateTextpageContent(contentType, "Root Home", -1); ServiceContext.ContentService.Save(content, Constants.Security.SuperUserId); - var nodeName = content.ContentType.Alias.ToSafeAlias(); + var nodeName = content.ContentType.Alias.ToSafeAlias(ShortStringHelper); var urlName = content.GetUrlSegment(ShortStringHelper, new[]{new DefaultUrlSegmentProvider(ShortStringHelper) }); // Act diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index 91a19675f3..36961ebdd3 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -51,7 +51,7 @@ namespace Umbraco.Tests.Models media.SetValue(Constants.Conventions.Media.Bytes, "100"); media.SetValue(Constants.Conventions.Media.Extension, "png"); - var nodeName = media.ContentType.Alias.ToSafeAlias(); + var nodeName = media.ContentType.Alias.ToSafeAlias(ShortStringHelper); var urlName = media.GetUrlSegment(ShortStringHelper, new[] { new DefaultUrlSegmentProvider(ShortStringHelper) }); // Act diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index 8ec3b326ef..dccc658639 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -46,6 +46,7 @@ namespace Umbraco.Tests.Routing WebInitialComponent.CreateRoutes( new TestUmbracoContextAccessor(), TestObjects.GetGlobalSettings(), + ShortStringHelper, new SurfaceControllerTypeCollection(Enumerable.Empty()), new UmbracoApiControllerTypeCollection(Enumerable.Empty())); } @@ -106,7 +107,7 @@ namespace Umbraco.Tests.Routing frequest.TemplateModel = template; var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); - var handler = new RenderRouteHandler(umbracoContext, new TestControllerFactory(umbracoContextAccessor, Mock.Of())); + var handler = new RenderRouteHandler(umbracoContext, new TestControllerFactory(umbracoContextAccessor, Mock.Of()), ShortStringHelper); handler.GetHandlerForRoute(umbracoContext.HttpContext.Request.RequestContext, frequest); Assert.AreEqual("RenderMvc", routeData.Values["controller"].ToString()); @@ -155,13 +156,13 @@ namespace Umbraco.Tests.Routing Factory.GetInstance(), Factory.GetInstance(), new UmbracoHelper(Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), membershipHelper)); - })); + }), ShortStringHelper); handler.GetHandlerForRoute(umbracoContext.HttpContext.Request.RequestContext, frequest); Assert.AreEqual("CustomDocument", routeData.Values["controller"].ToString()); Assert.AreEqual( //global::umbraco.cms.helpers.Casing.SafeAlias(template.Alias), - template.Alias.ToSafeAlias(), + template.Alias.ToSafeAlias(ShortStringHelper), routeData.Values["action"].ToString()); } diff --git a/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs b/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs index a4006409be..ea2041cd9c 100644 --- a/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs +++ b/src/Umbraco.Tests/Strings/CmsHelperCasingTests.cs @@ -18,7 +18,7 @@ namespace Umbraco.Tests.Strings [TestCase("WhoIsNumber6InTheVillage", "Who Is Number6 In The Village")] // now fixed since DefaultShortStringHelper is the default public void SpaceCamelCasing(string input, string expected) { - var output = input.SpaceCamelCasing(); + var output = input.SpaceCamelCasing(ShortStringHelper); Assert.AreEqual(expected, output); } diff --git a/src/Umbraco.Tests/Strings/StringExtensionsTests.cs b/src/Umbraco.Tests/Strings/StringExtensionsTests.cs index a273535b62..e89607250b 100644 --- a/src/Umbraco.Tests/Strings/StringExtensionsTests.cs +++ b/src/Umbraco.Tests/Strings/StringExtensionsTests.cs @@ -228,77 +228,77 @@ namespace Umbraco.Tests.Strings [Test] public void ToUrlAlias() { - var output = "JUST-ANYTHING".ToUrlSegment(); + var output = "JUST-ANYTHING".ToUrlSegment(ShortStringHelper); Assert.AreEqual("URL-SEGMENT::JUST-ANYTHING", output); } [Test] public void FormatUrl() { - var output = "JUST-ANYTHING".ToUrlSegment(); + var output = "JUST-ANYTHING".ToUrlSegment(ShortStringHelper); Assert.AreEqual("URL-SEGMENT::JUST-ANYTHING", output); } [Test] public void ToUmbracoAlias() { - var output = "JUST-ANYTHING".ToSafeAlias(); + var output = "JUST-ANYTHING".ToSafeAlias(ShortStringHelper); Assert.AreEqual("SAFE-ALIAS::JUST-ANYTHING", output); } [Test] public void ToSafeAlias() { - var output = "JUST-ANYTHING".ToSafeAlias(); + var output = "JUST-ANYTHING".ToSafeAlias(ShortStringHelper); Assert.AreEqual("SAFE-ALIAS::JUST-ANYTHING", output); } [Test] public void ToSafeAliasWithCulture() { - var output = "JUST-ANYTHING".ToSafeAlias((string)null); + var output = "JUST-ANYTHING".ToSafeAlias(ShortStringHelper, (string)null); Assert.AreEqual("SAFE-ALIAS-CULTURE::JUST-ANYTHING", output); } [Test] public void ToUrlSegment() { - var output = "JUST-ANYTHING".ToUrlSegment(); + var output = "JUST-ANYTHING".ToUrlSegment(ShortStringHelper); Assert.AreEqual("URL-SEGMENT::JUST-ANYTHING", output); } [Test] public void ToUrlSegmentWithCulture() { - var output = "JUST-ANYTHING".ToUrlSegment((string)null); + var output = "JUST-ANYTHING".ToUrlSegment(ShortStringHelper, (string)null); Assert.AreEqual("URL-SEGMENT-CULTURE::JUST-ANYTHING", output); } [Test] public void ToSafeFileName() { - var output = "JUST-ANYTHING".ToSafeFileName(); + var output = "JUST-ANYTHING".ToSafeFileName(ShortStringHelper); Assert.AreEqual("SAFE-FILE-NAME::JUST-ANYTHING", output); } [Test] public void ToSafeFileNameWithCulture() { - var output = "JUST-ANYTHING".ToSafeFileName(null); + var output = "JUST-ANYTHING".ToSafeFileName(ShortStringHelper, null); Assert.AreEqual("SAFE-FILE-NAME-CULTURE::JUST-ANYTHING", output); } [Test] public void ConvertCase() { - var output = "JUST-ANYTHING".ToCleanString(CleanStringType.Unchanged); + var output = "JUST-ANYTHING".ToCleanString(ShortStringHelper, CleanStringType.Unchanged); Assert.AreEqual("CLEAN-STRING-A::JUST-ANYTHING", output); } [Test] public void SplitPascalCasing() { - var output = "JUST-ANYTHING".SplitPascalCasing(); + var output = "JUST-ANYTHING".SplitPascalCasing(ShortStringHelper); Assert.AreEqual("SPLIT-PASCAL-CASING::JUST-ANYTHING", output); } diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 56da2bfe4e..d38dcfc888 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -269,6 +269,7 @@ namespace Umbraco.Tests.TestHelpers Logger, Factory.GetInstance(), HostingEnvironment, + ShortStringHelper, new SiteDomainHelper(), Factory.GetInstance(), ContentTypesCache, diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 13ee8fea89..ab8a6d1ac2 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -119,7 +119,7 @@ namespace Umbraco.Tests.Testing protected Lazy PropertyEditorCollection => new Lazy(() => Factory.GetInstance()); protected ILocalizationService LocalizationService => Factory.GetInstance(); protected ILocalizedTextService LocalizedTextService { get; private set; } - protected IShortStringHelper ShortStringHelper { get; private set; } + protected IShortStringHelper ShortStringHelper => Factory?.GetInstance() ?? TestHelper.ShortStringHelper; protected IUmbracoVersion UmbracoVersion { get; private set; } protected ITypeFinder TypeFinder { get; private set; } @@ -159,7 +159,7 @@ namespace Umbraco.Tests.Testing var (logger, profiler) = GetLoggers(Options.Logger); var proflogger = new ProfilingLogger(logger, profiler); IOHelper = TestHelper.IOHelper; - ShortStringHelper = TestHelper.ShortStringHelper; + TypeFinder = new TypeFinder(logger); var appCaches = GetAppCaches(); @@ -182,7 +182,7 @@ namespace Umbraco.Tests.Testing Composition = new Composition(register, typeLoader, proflogger, ComponentTests.MockRuntimeState(RuntimeLevel.Run), TestHelper.GetConfigs(), TestHelper.IOHelper, AppCaches.NoCache); - Composition.RegisterUnique(ShortStringHelper); + Composition.RegisterUnique(IOHelper); Composition.RegisterUnique(UmbracoVersion); Composition.RegisterUnique(TypeFinder); @@ -196,6 +196,8 @@ namespace Umbraco.Tests.Testing Composition.RegisterUnique(backOfficeInfo); Composition.RegisterUnique(ipResolver); Composition.RegisterUnique(); + Composition.RegisterUnique(TestHelper.ShortStringHelper); + TestObjects = new TestObjects(register); Compose(); @@ -397,10 +399,11 @@ namespace Umbraco.Tests.Testing // register filesystems Composition.RegisterUnique(factory => TestObjects.GetFileSystemsMock()); + var logger = Mock.Of(); var scheme = Mock.Of(); - var mediaFileSystem = new MediaFileSystem(Mock.Of(), scheme, logger, ShortStringHelper); + var mediaFileSystem = new MediaFileSystem(Mock.Of(), scheme, logger, TestHelper.ShortStringHelper); Composition.RegisterUnique(factory => mediaFileSystem); // no factory (noop) diff --git a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs index cffb2a7aaf..9e6068373f 100644 --- a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs @@ -267,7 +267,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + ShortStringHelper); return controller; } @@ -301,7 +302,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + ShortStringHelper); return controller; } @@ -343,7 +345,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + ShortStringHelper); return controller; } @@ -390,7 +393,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + ShortStringHelper); return controller; } @@ -429,7 +433,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + ShortStringHelper); return controller; } @@ -474,7 +479,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), Factory.GetInstance(), - helper); + helper, + ShortStringHelper); return controller; } diff --git a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs index 94be446fb8..bfd1f10233 100644 --- a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs @@ -86,7 +86,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), helper, - Factory.GetInstance() + Factory.GetInstance(), + ShortStringHelper ); return usersController; } @@ -152,7 +153,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), helper, - Factory.GetInstance()); + Factory.GetInstance(), + ShortStringHelper); return usersController; } @@ -188,7 +190,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), helper, - Factory.GetInstance()); + Factory.GetInstance(), + ShortStringHelper); return usersController; } @@ -259,7 +262,8 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), helper, - Factory.GetInstance()); + Factory.GetInstance(), + ShortStringHelper); return usersController; } diff --git a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index 52bd0253a0..50d18bb52a 100644 --- a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -427,6 +427,7 @@ namespace Umbraco.Tests.Web.Mvc new TestDefaultCultureAccessor(), Current.Logger, TestObjects.GetGlobalSettings(), TestHelper.GetHostingEnvironment(), + ShortStringHelper, new SiteDomainHelper(), Factory.GetInstance(), null, true, false diff --git a/src/Umbraco.Web/Editors/CodeFileController.cs b/src/Umbraco.Web/Editors/CodeFileController.cs index 037e7f1702..ecf0c94483 100644 --- a/src/Umbraco.Web/Editors/CodeFileController.cs +++ b/src/Umbraco.Web/Editors/CodeFileController.cs @@ -14,6 +14,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Core.Strings.Css; using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; @@ -33,9 +34,21 @@ namespace Umbraco.Web.Editors [UmbracoApplicationAuthorize(Core.Constants.Applications.Settings)] public class CodeFileController : BackOfficeNotificationsController { - public CodeFileController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) + private readonly IShortStringHelper _shortStringHelper; + + public CodeFileController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { + _shortStringHelper = shortStringHelper; } /// @@ -229,7 +242,7 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } - return snippets.Select(snippet => new SnippetDisplay() {Name = snippet.SplitPascalCasing().ToFirstUpperInvariant(), FileName = snippet}); + return snippets.Select(snippet => new SnippetDisplay() {Name = snippet.SplitPascalCasing(_shortStringHelper).ToFirstUpperInvariant(), FileName = snippet}); } /// diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index fe490e8699..d6fe5060a9 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -36,6 +36,7 @@ using Umbraco.Core.Security; using Umbraco.Web.Routing; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Dictionary; +using Umbraco.Core.Strings; namespace Umbraco.Web.Editors { @@ -56,8 +57,19 @@ namespace Umbraco.Web.Editors public object Domains { get; private set; } - public ContentController(ICultureDictionary cultureDictionary, PropertyEditorCollection propertyEditors, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) + public ContentController( + ICultureDictionary cultureDictionary, + PropertyEditorCollection propertyEditors, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper) { _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); _allLangs = new Lazy>(() => Services.LocalizationService.GetAllLanguages().ToDictionary(x => x.IsoCode, x => x, StringComparer.InvariantCultureIgnoreCase)); diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index 610f668997..10dc95cc68 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Models.Editors; using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.WebApi; @@ -28,11 +29,23 @@ namespace Umbraco.Web.Editors public abstract class ContentControllerBase : BackOfficeNotificationsController { protected ICultureDictionary CultureDictionary { get; } + public IShortStringHelper ShortStringHelper { get; } - protected ContentControllerBase(ICultureDictionary cultureDictionary, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) + protected ContentControllerBase( + ICultureDictionary cultureDictionary, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { CultureDictionary = cultureDictionary; + ShortStringHelper = shortStringHelper; } protected HttpResponseMessage HandleContentNotFound(object id, bool throwException = true) @@ -84,7 +97,7 @@ namespace Umbraco.Web.Editors .ToArray(); foreach (var file in files) - file.FileName = file.FileName.ToSafeFileName(); + file.FileName = file.FileName.ToSafeFileName(ShortStringHelper); // create the property data for the property editor var data = new ContentPropertyData(propertyDto.Value, propertyDto.DataType.Configuration) diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index c80b23747b..4563a51afb 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -231,7 +231,7 @@ namespace Umbraco.Web.Editors // create item doctype var itemDocType = new ContentType(_shortStringHelper, parentId); itemDocType.Name = collectionItemName; - itemDocType.Alias = collectionItemName.ToSafeAlias(true); + itemDocType.Alias = collectionItemName.ToSafeAlias(_shortStringHelper, true); itemDocType.Icon = collectionItemIcon; // create item doctype template @@ -247,7 +247,7 @@ namespace Umbraco.Web.Editors // create collection doctype var collectionDocType = new ContentType(_shortStringHelper, parentId); collectionDocType.Name = collectionName; - collectionDocType.Alias = collectionName.ToSafeAlias(true); + collectionDocType.Alias = collectionName.ToSafeAlias(_shortStringHelper, true); collectionDocType.Icon = collectionIcon; collectionDocType.IsContainer = true; collectionDocType.AllowedContentTypes = new List() diff --git a/src/Umbraco.Web/Editors/CurrentUserController.cs b/src/Umbraco.Web/Editors/CurrentUserController.cs index 7a78631283..f6b0c48e4d 100644 --- a/src/Umbraco.Web/Editors/CurrentUserController.cs +++ b/src/Umbraco.Web/Editors/CurrentUserController.cs @@ -17,6 +17,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; +using Umbraco.Core.Strings; using Umbraco.Web.Security; using Umbraco.Web.WebApi.Filters; @@ -30,6 +31,7 @@ namespace Umbraco.Web.Editors public class CurrentUserController : UmbracoAuthorizedJsonController { private readonly IMediaFileSystem _mediaFileSystem; + private readonly IShortStringHelper _shortStringHelper; public CurrentUserController( IGlobalSettings globalSettings, @@ -40,10 +42,12 @@ namespace Umbraco.Web.Editors IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, - IMediaFileSystem mediaFileSystem) + IMediaFileSystem mediaFileSystem, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { _mediaFileSystem = mediaFileSystem; + _shortStringHelper = shortStringHelper; } /// @@ -177,7 +181,7 @@ namespace Umbraco.Web.Editors public async Task PostSetAvatar() { //borrow the logic from the user controller - return await UsersController.PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, _mediaFileSystem, Security.GetUserId().ResultOr(0)); + return await UsersController.PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, _mediaFileSystem, _shortStringHelper, Security.GetUserId().ResultOr(0)); } /// diff --git a/src/Umbraco.Web/Editors/DashboardController.cs b/src/Umbraco.Web/Editors/DashboardController.cs index 27c4d41e95..cf6fc32113 100644 --- a/src/Umbraco.Web/Editors/DashboardController.cs +++ b/src/Umbraco.Web/Editors/DashboardController.cs @@ -17,6 +17,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Core.Dashboards; +using Umbraco.Core.Strings; using Umbraco.Web.Services; namespace Umbraco.Web.Editors @@ -32,15 +33,28 @@ namespace Umbraco.Web.Editors { private readonly IDashboardService _dashboardService; private readonly IUmbracoVersion _umbracoVersion; + private readonly IShortStringHelper _shortStringHelper; /// /// Initializes a new instance of the with all its dependencies. /// - public DashboardController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, IDashboardService dashboardService, UmbracoHelper umbracoHelper, IUmbracoVersion umbracoVersion) + public DashboardController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + IDashboardService dashboardService, + UmbracoHelper umbracoHelper, + IUmbracoVersion umbracoVersion, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { _dashboardService = dashboardService; _umbracoVersion = umbracoVersion; + _shortStringHelper = shortStringHelper; } //we have just one instance of HttpClient shared for the entire application @@ -155,7 +169,7 @@ namespace Umbraco.Web.Editors //Make remote call to fetch videos or remote dashboard feed data - var key = $"umbraco-XML-feed-{site}-{url.ToCleanString(Core.Strings.CleanStringType.UrlSegment)}"; + var key = $"umbraco-XML-feed-{site}-{url.ToCleanString(_shortStringHelper, CleanStringType.UrlSegment)}"; var content = AppCaches.RuntimeCache.GetCacheItem(key); var result = string.Empty; diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index f3de782620..8371978903 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -20,6 +20,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Core.Xml; using Umbraco.Web.Models; using Umbraco.Web.Models.Mapping; @@ -50,15 +51,28 @@ namespace Umbraco.Web.Editors { private readonly ITreeService _treeService; private readonly UmbracoTreeSearcher _treeSearcher; + private readonly IShortStringHelper _shortStringHelper; private readonly SearchableTreeCollection _searchableTreeCollection; - public EntityController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, - ITreeService treeService, UmbracoHelper umbracoHelper, SearchableTreeCollection searchableTreeCollection, UmbracoTreeSearcher treeSearcher) + public EntityController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + ITreeService treeService, + UmbracoHelper umbracoHelper, + SearchableTreeCollection searchableTreeCollection, + UmbracoTreeSearcher treeSearcher, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { _treeService = treeService; _searchableTreeCollection = searchableTreeCollection; _treeSearcher = treeSearcher; + _shortStringHelper = shortStringHelper; } /// @@ -88,7 +102,7 @@ namespace Umbraco.Web.Editors /// public dynamic GetSafeAlias(string value, bool camelCase = true) { - var returnValue = string.IsNullOrWhiteSpace(value) ? string.Empty : value.ToSafeAlias(camelCase); + var returnValue = string.IsNullOrWhiteSpace(value) ? string.Empty : value.ToSafeAlias(_shortStringHelper, camelCase); dynamic returnObj = new System.Dynamic.ExpandoObject(); returnObj.alias = returnValue; returnObj.original = value; diff --git a/src/Umbraco.Web/Editors/MacroRenderingController.cs b/src/Umbraco.Web/Editors/MacroRenderingController.cs index 86609a6254..2940f81f28 100644 --- a/src/Umbraco.Web/Editors/MacroRenderingController.cs +++ b/src/Umbraco.Web/Editors/MacroRenderingController.cs @@ -164,7 +164,7 @@ namespace Umbraco.Web.Editors var macro = new Macro(_shortStringHelper) { - Alias = macroName.ToSafeAlias(), + Alias = macroName.ToSafeAlias(_shortStringHelper), Name = macroName, MacroSource = model.VirtualPath.EnsureStartsWith("~"), MacroType = MacroTypes.PartialView diff --git a/src/Umbraco.Web/Editors/MacrosController.cs b/src/Umbraco.Web/Editors/MacrosController.cs index 5254e2fc40..26138b7f26 100644 --- a/src/Umbraco.Web/Editors/MacrosController.cs +++ b/src/Umbraco.Web/Editors/MacrosController.cs @@ -58,7 +58,7 @@ namespace Umbraco.Web.Editors return this.ReturnErrorResponse("Name can not be empty"); } - var alias = name.ToSafeAlias(); + var alias = name.ToSafeAlias(_shortStringHelper); if (_macroService.GetByAlias(alias) != null) { diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 2953c018fc..c1675f924e 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -64,11 +64,10 @@ namespace Umbraco.Web.Editors UmbracoHelper umbracoHelper, IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper) { _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); _mediaFileSystem = mediaFileSystem; - _shortStringHelper = shortStringHelper; } /// @@ -253,7 +252,7 @@ namespace Umbraco.Web.Editors private int[] _userStartNodes; private readonly PropertyEditorCollection _propertyEditors; private readonly IMediaFileSystem _mediaFileSystem; - private readonly IShortStringHelper _shortStringHelper; + protected int[] UserStartNodes { @@ -713,7 +712,7 @@ namespace Umbraco.Web.Editors foreach (var file in result.FileData) { var fileName = file.Headers.ContentDisposition.FileName.Trim(new[] { '\"' }).TrimEnd(); - var safeFileName = fileName.ToSafeFileName(); + var safeFileName = fileName.ToSafeFileName(ShortStringHelper); var ext = safeFileName.Substring(safeFileName.LastIndexOf('.') + 1).ToLower(); if (Current.Configs.Settings().Content.IsFileAllowedForUpload(ext)) @@ -741,7 +740,7 @@ namespace Umbraco.Web.Editors if (fs == null) throw new InvalidOperationException("Could not acquire file stream"); using (fs) { - f.SetValue(_mediaFileSystem, _shortStringHelper, Services.ContentTypeBaseServices, Constants.Conventions.Media.File,fileName, fs); + f.SetValue(_mediaFileSystem, ShortStringHelper, Services.ContentTypeBaseServices, Constants.Conventions.Media.File,fileName, fs); } var saveResult = mediaService.Save(f, Security.CurrentUser.Id); diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index a270460075..2c5c079c36 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -31,6 +31,7 @@ using Umbraco.Core.Dictionary; using Umbraco.Web.Security; using Umbraco.Core.Security; using System.Threading.Tasks; +using Umbraco.Core.Strings; namespace Umbraco.Web.Editors { @@ -43,8 +44,20 @@ namespace Umbraco.Web.Editors [OutgoingNoHyphenGuidFormat] public class MemberController : ContentControllerBase { - public MemberController(IMemberPasswordConfiguration passwordConfig, ICultureDictionary cultureDictionary, PropertyEditorCollection propertyEditors, IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) - : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) + public MemberController( + IMemberPasswordConfiguration passwordConfig, + ICultureDictionary cultureDictionary, + PropertyEditorCollection propertyEditors, + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper) + : base(cultureDictionary, globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper, shortStringHelper) { _passwordConfig = passwordConfig ?? throw new ArgumentNullException(nameof(passwordConfig)); _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); @@ -285,7 +298,7 @@ namespace Umbraco.Web.Editors IsApproved = contentItem.IsApproved }; - return member; + return member; } /// diff --git a/src/Umbraco.Web/Editors/RelationTypeController.cs b/src/Umbraco.Web/Editors/RelationTypeController.cs index f12faf77cc..eb70342ec5 100644 --- a/src/Umbraco.Web/Editors/RelationTypeController.cs +++ b/src/Umbraco.Web/Editors/RelationTypeController.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; @@ -28,9 +29,21 @@ namespace Umbraco.Web.Editors [EnableOverrideAuthorization] public class RelationTypeController : BackOfficeNotificationsController { - public RelationTypeController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper) + private readonly IShortStringHelper _shortStringHelper; + + public RelationTypeController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { + _shortStringHelper = shortStringHelper; } /// @@ -48,7 +61,7 @@ namespace Umbraco.Web.Editors } var display = Mapper.Map(relationType); - + return display; } @@ -100,7 +113,7 @@ namespace Umbraco.Web.Editors /// A containing the persisted relation type's ID. public HttpResponseMessage PostCreate(RelationTypeSave relationType) { - var relationTypePersisted = new RelationType(relationType.Name, relationType.Name.ToSafeAlias(true), relationType.IsBidirectional, relationType.ChildObjectType, relationType.ParentObjectType); + var relationTypePersisted = new RelationType(relationType.Name, relationType.Name.ToSafeAlias(_shortStringHelper, true), relationType.IsBidirectional, relationType.ChildObjectType, relationType.ParentObjectType); try { diff --git a/src/Umbraco.Web/Editors/TinyMceController.cs b/src/Umbraco.Web/Editors/TinyMceController.cs index 9f9cc23e08..d701ce8ddb 100644 --- a/src/Umbraco.Web/Editors/TinyMceController.cs +++ b/src/Umbraco.Web/Editors/TinyMceController.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web.Composing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; @@ -27,12 +28,14 @@ namespace Umbraco.Web.Editors { private IMediaService _mediaService; private IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider; + private readonly IShortStringHelper _shortStringHelper; - public TinyMceController(IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) + public TinyMceController(IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IShortStringHelper shortStringHelper) { _mediaService = mediaService; _contentTypeBaseServiceProvider = contentTypeBaseServiceProvider; + _shortStringHelper = shortStringHelper; } [HttpPost] @@ -75,7 +78,7 @@ namespace Umbraco.Web.Editors // Really we should only have one file per request to this endpoint var file = result.FileData[0]; var fileName = file.Headers.ContentDisposition.FileName.Trim(new[] { '\"' }).TrimEnd(); - var safeFileName = fileName.ToSafeFileName(); + var safeFileName = fileName.ToSafeFileName(_shortStringHelper); var ext = safeFileName.Substring(safeFileName.LastIndexOf('.') + 1).ToLower(); if (Current.Configs.Settings().Content.IsFileAllowedForUpload(ext) == false || Current.Configs.Settings().Content.ImageFileTypes.Contains(ext) == false) diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 92e3a603f9..64c8417893 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -24,6 +24,7 @@ using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.Security; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web.Editors.Filters; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; @@ -43,12 +44,24 @@ namespace Umbraco.Web.Editors { private readonly IGlobalSettings _globalSettings; private readonly IMediaFileSystem _mediaFileSystem; + private readonly IShortStringHelper _shortStringHelper; - public UsersController(IGlobalSettings globalSettings, IUmbracoContextAccessor umbracoContextAccessor, ISqlContext sqlContext, ServiceContext services, AppCaches appCaches, IProfilingLogger logger, IRuntimeState runtimeState, UmbracoHelper umbracoHelper, IMediaFileSystem mediaFileSystem) + public UsersController( + IGlobalSettings globalSettings, + IUmbracoContextAccessor umbracoContextAccessor, + ISqlContext sqlContext, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger logger, + IRuntimeState runtimeState, + UmbracoHelper umbracoHelper, + IMediaFileSystem mediaFileSystem, + IShortStringHelper shortStringHelper) : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, umbracoHelper) { _globalSettings = globalSettings; _mediaFileSystem = mediaFileSystem; + _shortStringHelper = shortStringHelper; } /// @@ -69,10 +82,10 @@ namespace Umbraco.Web.Editors [AdminUsersAuthorize] public async Task PostSetAvatar(int id) { - return await PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, _mediaFileSystem, id); + return await PostSetAvatarInternal(Request, Services.UserService, AppCaches.RuntimeCache, _mediaFileSystem, _shortStringHelper, id); } - internal static async Task PostSetAvatarInternal(HttpRequestMessage request, IUserService userService, IAppCache cache, IMediaFileSystem mediaFileSystem, int id) + internal static async Task PostSetAvatarInternal(HttpRequestMessage request, IUserService userService, IAppCache cache, IMediaFileSystem mediaFileSystem, IShortStringHelper shortStringHelper, int id) { if (request.Content.IsMimeMultipartContent() == false) { @@ -104,7 +117,7 @@ namespace Umbraco.Web.Editors //get the file info var file = result.FileData[0]; var fileName = file.Headers.ContentDisposition.FileName.Trim(new[] { '\"' }).TrimEnd(); - var safeFileName = fileName.ToSafeFileName(); + var safeFileName = fileName.ToSafeFileName(shortStringHelper); var ext = safeFileName.Substring(safeFileName.LastIndexOf('.') + 1).ToLower(); if (Current.Configs.Settings().Content.DisallowedUploadFiles.Contains(ext) == false) diff --git a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs index 8f07dfb18b..e8b9ca7fb1 100644 --- a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs @@ -11,6 +11,7 @@ using Umbraco.Core.Composing; using Umbraco.Web.Models; using Umbraco.Web.Routing; using System.Collections.Generic; +using Umbraco.Core.Strings; using Current = Umbraco.Web.Composing.Current; using Umbraco.Web.Features; @@ -27,19 +28,22 @@ namespace Umbraco.Web.Mvc } private readonly IControllerFactory _controllerFactory; + private readonly IShortStringHelper _shortStringHelper; private readonly IUmbracoContextAccessor _umbracoContextAccessor; private readonly UmbracoContext _umbracoContext; - public RenderRouteHandler(IUmbracoContextAccessor umbracoContextAccessor, IControllerFactory controllerFactory) + public RenderRouteHandler(IUmbracoContextAccessor umbracoContextAccessor, IControllerFactory controllerFactory, IShortStringHelper shortStringHelper) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _controllerFactory = controllerFactory ?? throw new ArgumentNullException(nameof(controllerFactory)); + _shortStringHelper = shortStringHelper ?? throw new ArgumentNullException(nameof(shortStringHelper)); } - public RenderRouteHandler(UmbracoContext umbracoContext, IControllerFactory controllerFactory) + public RenderRouteHandler(UmbracoContext umbracoContext, IControllerFactory controllerFactory, IShortStringHelper shortStringHelper) { _umbracoContext = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext)); _controllerFactory = controllerFactory ?? throw new ArgumentNullException(nameof(controllerFactory)); + _shortStringHelper = shortStringHelper ?? throw new ArgumentNullException(nameof(shortStringHelper)); } private UmbracoContext UmbracoContext => _umbracoContext ?? _umbracoContextAccessor.UmbracoContext; @@ -262,7 +266,7 @@ namespace Umbraco.Web.Mvc //the template Alias should always be already saved with a safe name. //if there are hyphens in the name and there is a hijacked route, then the Action will need to be attributed // with the action name attribute. - var templateName = request.TemplateAlias.Split('.')[0].ToSafeAlias(); + var templateName = request.TemplateAlias.Split('.')[0].ToSafeAlias(_shortStringHelper); def.ActionName = templateName; } diff --git a/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs b/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs index e3fa1ce082..80c55e37d4 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextEditorPastedImages.cs @@ -68,7 +68,7 @@ namespace Umbraco.Web.PropertyEditors var absoluteTempImagePath = _ioHelper.MapPath(tmpImgPath); var fileName = Path.GetFileName(absoluteTempImagePath); - var safeFileName = fileName.ToSafeFileName(); + var safeFileName = fileName.ToSafeFileName(_shortStringHelper); var mediaItemName = safeFileName.ToFriendlyName(); IMedia mediaFile; diff --git a/src/Umbraco.Web/Runtime/WebInitialComponent.cs b/src/Umbraco.Web/Runtime/WebInitialComponent.cs index 1edd289038..84315211b0 100644 --- a/src/Umbraco.Web/Runtime/WebInitialComponent.cs +++ b/src/Umbraco.Web/Runtime/WebInitialComponent.cs @@ -16,6 +16,7 @@ using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Hosting; using Umbraco.Core.IO; +using Umbraco.Core.Strings; using Umbraco.Web.Install; using Umbraco.Web.JavaScript; using Umbraco.Web.Mvc; @@ -34,8 +35,17 @@ namespace Umbraco.Web.Runtime private readonly IGlobalSettings _globalSettings; private readonly IHostingEnvironment _hostingEnvironment; private readonly IIOHelper _ioHelper; + private readonly IShortStringHelper _shortStringHelper; - public WebInitialComponent(IUmbracoContextAccessor umbracoContextAccessor, SurfaceControllerTypeCollection surfaceControllerTypes, UmbracoApiControllerTypeCollection apiControllerTypes, IHostingSettings hostingSettings, IGlobalSettings globalSettings, IHostingEnvironment hostingEnvironment, IIOHelper ioHelper) + public WebInitialComponent( + IUmbracoContextAccessor umbracoContextAccessor, + SurfaceControllerTypeCollection surfaceControllerTypes, + UmbracoApiControllerTypeCollection apiControllerTypes, + IHostingSettings hostingSettings, + IGlobalSettings globalSettings, + IHostingEnvironment hostingEnvironment, + IIOHelper ioHelper, + IShortStringHelper shortStringHelper) { _umbracoContextAccessor = umbracoContextAccessor; _surfaceControllerTypes = surfaceControllerTypes; @@ -44,6 +54,7 @@ namespace Umbraco.Web.Runtime _globalSettings = globalSettings; _hostingEnvironment = hostingEnvironment; _ioHelper = ioHelper; + _shortStringHelper = shortStringHelper; } public void Initialize() @@ -68,7 +79,7 @@ namespace Umbraco.Web.Runtime ConfigureGlobalFilters(); // set routes - CreateRoutes(_umbracoContextAccessor, _globalSettings, _surfaceControllerTypes, _apiControllerTypes); + CreateRoutes(_umbracoContextAccessor, _globalSettings, _shortStringHelper, _surfaceControllerTypes, _apiControllerTypes); } public void Terminate() @@ -154,6 +165,7 @@ namespace Umbraco.Web.Runtime internal static void CreateRoutes( IUmbracoContextAccessor umbracoContextAccessor, IGlobalSettings globalSettings, + IShortStringHelper shortStringHelper, SurfaceControllerTypeCollection surfaceControllerTypes, UmbracoApiControllerTypeCollection apiControllerTypes) { @@ -165,7 +177,7 @@ namespace Umbraco.Web.Runtime umbracoPath + "/RenderMvc/{action}/{id}", new { controller = "RenderMvc", action = "Index", id = UrlParameter.Optional } ); - defaultRoute.RouteHandler = new RenderRouteHandler(umbracoContextAccessor, ControllerBuilder.Current.GetControllerFactory()); + defaultRoute.RouteHandler = new RenderRouteHandler(umbracoContextAccessor, ControllerBuilder.Current.GetControllerFactory(),shortStringHelper); // register install routes RouteTable.Routes.RegisterArea(); diff --git a/src/Umbraco.Web/Templates/TemplateRenderer.cs b/src/Umbraco.Web/Templates/TemplateRenderer.cs index bf7f04a2f4..ffcb466727 100644 --- a/src/Umbraco.Web/Templates/TemplateRenderer.cs +++ b/src/Umbraco.Web/Templates/TemplateRenderer.cs @@ -12,6 +12,7 @@ using Umbraco.Web.Routing; using Umbraco.Core.Composing; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Services; +using Umbraco.Core.Strings; using Umbraco.Web.Macros; using Current = Umbraco.Web.Composing.Current; @@ -30,14 +31,16 @@ namespace Umbraco.Web.Templates private readonly IFileService _fileService; private readonly ILocalizationService _languageService; private readonly IWebRoutingSection _webRoutingSection; + private readonly IShortStringHelper _shortStringHelper; - public TemplateRenderer(IUmbracoContextAccessor umbracoContextAccessor, IPublishedRouter publishedRouter, IFileService fileService, ILocalizationService textService, IWebRoutingSection webRoutingSection) + public TemplateRenderer(IUmbracoContextAccessor umbracoContextAccessor, IPublishedRouter publishedRouter, IFileService fileService, ILocalizationService textService, IWebRoutingSection webRoutingSection, IShortStringHelper shortStringHelper) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _publishedRouter = publishedRouter ?? throw new ArgumentNullException(nameof(publishedRouter)); _fileService = fileService ?? throw new ArgumentNullException(nameof(fileService)); _languageService = textService ?? throw new ArgumentNullException(nameof(textService)); _webRoutingSection = webRoutingSection ?? throw new ArgumentNullException(nameof(webRoutingSection)); + _shortStringHelper = shortStringHelper; } public void Render(int pageId, int? altTemplateId, StringWriter writer) @@ -129,7 +132,7 @@ namespace Umbraco.Web.Templates { Route = RouteTable.Routes["Umbraco_default"] }); - var routeHandler = new RenderRouteHandler(_umbracoContextAccessor, ControllerBuilder.Current.GetControllerFactory()); + var routeHandler = new RenderRouteHandler(_umbracoContextAccessor, ControllerBuilder.Current.GetControllerFactory(), _shortStringHelper); var routeDef = routeHandler.GetUmbracoRouteDefinition(requestContext, request); var renderModel = new ContentModel(request.PublishedContent); //manually add the action/controller, this is required by mvc diff --git a/src/Umbraco.Web/UmbracoApplicationBase.cs b/src/Umbraco.Web/UmbracoApplicationBase.cs index 9fee53dc48..8fd7d3c504 100644 --- a/src/Umbraco.Web/UmbracoApplicationBase.cs +++ b/src/Umbraco.Web/UmbracoApplicationBase.cs @@ -39,6 +39,7 @@ namespace Umbraco.Web var configFactory = new ConfigsFactory(); var hostingSettings = configFactory.HostingSettings; + var coreDebug = configFactory.CoreDebug; _hostingEnvironment = new AspNetHostingEnvironment(hostingSettings); _ioHelper = new IOHelper(_hostingEnvironment); @@ -46,7 +47,7 @@ namespace Umbraco.Web _profiler = new LogProfiler(_logger); - _logger = SerilogLogger.CreateWithDefaultConfiguration(_hostingEnvironment, new AspNetSessionIdResolver(), () => _factory?.GetInstance(), _configs.CoreDebug(), _ioHelper, new FrameworkMarchal()); + _logger = SerilogLogger.CreateWithDefaultConfiguration(_hostingEnvironment, new AspNetSessionIdResolver(), () => _factory?.GetInstance(), coreDebug, _ioHelper, new FrameworkMarchal()); _backOfficeInfo = new AspNetBackOfficeInfo(_configs.Global(), _ioHelper, _configs.Settings(), _logger); Umbraco.Composing.Current.Logger = _logger; From cfacc4912dca134e052e8ceedc2adb2d64763d8a Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Thu, 19 Dec 2019 12:24:30 +0100 Subject: [PATCH 14/19] AB4227 - Made some classes internal --- .../Composing/CompositionExtensions/Configuration.cs | 2 +- .../Composing/CompositionExtensions/FileSystems.cs | 2 +- .../Composing/CompositionExtensions/Repositories.cs | 2 +- .../Composing/CompositionExtensions/Services.cs | 2 +- .../Repositories/Implement/DataTypeContainerRepository.cs | 2 +- .../Repositories/Implement/DocumentTypeContainerRepository.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs index 78475953b7..7169b93cb4 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs @@ -5,7 +5,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions /// /// Compose configurations. /// - public static class Configuration + internal static class Configuration { public static Composition ComposeConfiguration(this Composition composition) { diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs index b1c76b0753..e13b4f9477 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Logging; namespace Umbraco.Core.Composing.CompositionExtensions { - public static class FileSystems + internal static class FileSystems { /* * HOW TO REPLACE THE MEDIA UNDERLYING FILESYSTEM diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs index 23dc9e67c6..0939dd0f71 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions /// /// Composes repositories. /// - public static class Repositories + internal static class Repositories { public static Composition ComposeRepositories(this Composition composition) { diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs index a615630c85..c746c2b8b4 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs @@ -13,7 +13,7 @@ using Umbraco.Core.Services.Implement; namespace Umbraco.Core.Composing.CompositionExtensions { - public static class Services + internal static class Services { public static Composition ComposeServices(this Composition composition) { diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeContainerRepository.cs index 752b641bc3..f36b60484a 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeContainerRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeContainerRepository.cs @@ -4,7 +4,7 @@ using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { - class DataTypeContainerRepository : EntityContainerRepository, IDataTypeContainerRepository + internal class DataTypeContainerRepository : EntityContainerRepository, IDataTypeContainerRepository { public DataTypeContainerRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger) : base(scopeAccessor, cache, logger, Constants.ObjectTypes.DataTypeContainer) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs index d50981e036..4b5fe8817b 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs @@ -4,7 +4,7 @@ using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { - class DocumentTypeContainerRepository : EntityContainerRepository, IDocumentTypeContainerRepository + internal class DocumentTypeContainerRepository : EntityContainerRepository, IDocumentTypeContainerRepository { public DocumentTypeContainerRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger) : base(scopeAccessor, cache, logger, Constants.ObjectTypes.DocumentTypeContainer) From dbf0581cb1bfba5cacc86c22c11afeba6e045d95 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Thu, 19 Dec 2019 15:55:01 +0100 Subject: [PATCH 15/19] AB3791 - Removed unnessasary [Apartment(ApartmentState.STA)] --- src/Umbraco.Tests/Testing/UmbracoTestBase.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 8b6553ff80..c2e076c969 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -65,7 +65,6 @@ namespace Umbraco.Tests.Testing /// provides all the necessary environment, through DI. Yes, DI is bad in tests - unit tests. /// But it is OK in integration tests. /// - [Apartment(ApartmentState.STA)] public abstract class UmbracoTestBase { // this class From bcc0fa391a3be747ce131eeb8b8703c030b1bb87 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 20 Dec 2019 12:50:33 +1100 Subject: [PATCH 16/19] adds notes, changes to use AsyncLocal then will look at full refactor --- src/Umbraco.Abstractions/SafeCallContext.cs | 5 ++++ .../Scoping/CallContext.cs | 30 ++++++++----------- .../Scoping/ScopeProvider.cs | 22 ++++++++------ src/Umbraco.Tests/Scoping/ScopeTests.cs | 7 ++--- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Abstractions/SafeCallContext.cs b/src/Umbraco.Abstractions/SafeCallContext.cs index 7a64f3f7b5..ee1416e833 100644 --- a/src/Umbraco.Abstractions/SafeCallContext.cs +++ b/src/Umbraco.Abstractions/SafeCallContext.cs @@ -4,6 +4,11 @@ using System.Collections.Generic; namespace Umbraco.Core { + // TODO: This may no longer be necessary but I'm unsure. This is based on the premise of using the old CallContext which + // requires all objects to be serializable. Stephane wrote a blog post here https://www.zpqrtbnk.net/posts/putting-things-in-contexts/ + // about this. But now we are not using the CallContext since it doesn't exist and instead using AsyncLocal which probably + // doesn't have this problem... but that would require some testing. For now we'll leave this class here until we + // can acquire/discover more info. public class SafeCallContext : IDisposable { private static readonly List> EnterFuncs = new List>(); diff --git a/src/Umbraco.Infrastructure/Scoping/CallContext.cs b/src/Umbraco.Infrastructure/Scoping/CallContext.cs index 7b256434cd..6a5354fb04 100644 --- a/src/Umbraco.Infrastructure/Scoping/CallContext.cs +++ b/src/Umbraco.Infrastructure/Scoping/CallContext.cs @@ -8,34 +8,30 @@ namespace Umbraco.Core.Scoping /// Provides a way to set contextual data that flows with the call and /// async context of a test or invocation. /// - public static class CallContext + public static class CallContext { - private static readonly ConcurrentDictionary _state = new ConcurrentDictionary(); + static ConcurrentDictionary> _state = new ConcurrentDictionary>(); /// /// Stores a given object and associates it with the specified name. /// /// The name with which to associate the new item in the call context. /// The object to store in the call context. - public static void SetData(string name, Guid? data) - { - _state[name + Thread.CurrentThread.ManagedThreadId] = data; - } - + public static void SetData(string name, T data) => _state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; /// - /// Retrieves an object with the specified name from the . + /// Retrieves an object with the specified name from the . /// + /// The type of the data being retrieved. Must match the type used when the was set via . /// The name of the item in the call context. - /// The object in the call context associated with the specified name, or if not found. - public static Guid? GetData(string name) - { - return _state.TryGetValue(name + Thread.CurrentThread.ManagedThreadId, out var data) ? data : null; - } + /// The object in the call context associated with the specified name, or a default value for if none is found. + public static T GetData(string name) => _state.TryGetValue(name, out var data) ? data.Value : default; - public static bool RemoveData(string name) - { - return _state.TryRemove(name+ Thread.CurrentThread.ManagedThreadId, out _); - } + /// + /// Clears the state from for the given name. + /// + /// + /// + public static bool RemoveData(string name) => _state.TryRemove(name, out _); } } diff --git a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs index ef3afb2dac..7ae8c63905 100644 --- a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs +++ b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs @@ -75,6 +75,9 @@ namespace Umbraco.Core.Scoping #region Context + // TODO: I don't think this whole thing is necessary anymore since we are using AsyncLocal which + // I don't believe has the same odd requirements as the old CallContext! Also see SafeCallContext + // objects that go into the logical call context better be serializable else they'll eventually // cause issues whenever some cross-AppDomain code executes - could be due to ReSharper running // tests, any other things (see https://msdn.microsoft.com/en-us/library/dn458353(v=vs.110).aspx), @@ -88,6 +91,7 @@ namespace Umbraco.Core.Scoping // and we can retrieve the actual objects from the table. // only issue: how are we supposed to clear the table? we can't, really. objects should take // care of de-registering themselves from context. + // see https://www.zpqrtbnk.net/posts/putting-things-in-contexts/ private static readonly object StaticCallContextObjectsLock = new object(); private static readonly Dictionary StaticCallContextObjects @@ -110,12 +114,12 @@ namespace Umbraco.Core.Scoping private static T GetCallContextObject(string key) where T : class { - var objectKey = CallContext.GetData(key); - if (objectKey is null) return null; + var objectKey = CallContext.GetData(key); + if (objectKey == Guid.Empty) return null; lock (StaticCallContextObjectsLock) { - if (StaticCallContextObjects.TryGetValue(objectKey.Value, out object callContextObject)) + if (StaticCallContextObjects.TryGetValue(objectKey, out object callContextObject)) { #if DEBUG_SCOPES Current.Logger.Debug("Got " + typeof(T).Name + " Object " + objectKey.ToString("N").Substring(0, 8)); @@ -125,7 +129,7 @@ namespace Umbraco.Core.Scoping } // hard to inject into a static method :( - Current.Logger.Warn("Missed {TypeName} Object {ObjectKey}", typeof(T).Name, objectKey.Value.ToString("N").Substring(0, 8)); + Current.Logger.Warn("Missed {TypeName} Object {ObjectKey}", typeof(T).Name, objectKey.ToString("N").Substring(0, 8)); #if DEBUG_SCOPES //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); #endif @@ -157,16 +161,16 @@ namespace Umbraco.Core.Scoping #endif if (value == null) { - var objectKey = CallContext.GetData(key); - CallContext.RemoveData(key); - if (objectKey is null) return; + var objectKey = CallContext.GetData(key); + CallContext.RemoveData(key); + if (objectKey == Guid.Empty) return; lock (StaticCallContextObjectsLock) { #if DEBUG_SCOPES Current.Logger.Debug("Remove Object " + objectKey.ToString("N").Substring(0, 8)); //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); #endif - StaticCallContextObjects.Remove(objectKey.Value); + StaticCallContextObjects.Remove(objectKey); } } else @@ -183,7 +187,7 @@ namespace Umbraco.Core.Scoping #endif StaticCallContextObjects.Add(objectKey, value); } - CallContext.SetData(key, objectKey); + CallContext.SetData(key, objectKey); } } diff --git a/src/Umbraco.Tests/Scoping/ScopeTests.cs b/src/Umbraco.Tests/Scoping/ScopeTests.cs index d1f77d4ae0..0f35554472 100644 --- a/src/Umbraco.Tests/Scoping/ScopeTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeTests.cs @@ -8,10 +8,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; -using CallContext = Umbraco.Core.Scoping.CallContext; - -//using CallContext = Umbraco.Core.Scoping.CallContext; - +using CallContext = Umbraco.Core.Scoping.CallContext; namespace Umbraco.Tests.Scoping { @@ -126,7 +123,7 @@ namespace Umbraco.Tests.Scoping Assert.AreSame(scope, ((Scope) nested).ParentScope); // it's moved over to call context - var callContextKey = CallContext.GetData(ScopeProvider.ScopeItemKey).AsGuid(); + var callContextKey = CallContext.GetData(ScopeProvider.ScopeItemKey); Assert.AreNotEqual(Guid.Empty, callContextKey); // only if Core.DEBUG_SCOPES are defined From ef5a6a1db6db10f00d1f54fdf6080f859772fd26 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 20 Dec 2019 15:12:54 +1100 Subject: [PATCH 17/19] Adds notes changes some logic --- .../Scoping/CallContext.cs | 20 +++++++------- .../Scoping/ScopeProvider.cs | 6 ++--- .../CoreThings/CallContextTests.cs | 27 ++++++++++--------- .../Migrations/MigrationTests.cs | 12 +++++++++ src/Umbraco.Tests/Persistence/LocksTests.cs | 2 +- src/Umbraco.Tests/Scoping/ScopeTests.cs | 6 +---- 6 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Infrastructure/Scoping/CallContext.cs b/src/Umbraco.Infrastructure/Scoping/CallContext.cs index 6a5354fb04..2937990eab 100644 --- a/src/Umbraco.Infrastructure/Scoping/CallContext.cs +++ b/src/Umbraco.Infrastructure/Scoping/CallContext.cs @@ -5,12 +5,14 @@ using System.Threading; namespace Umbraco.Core.Scoping { /// - /// Provides a way to set contextual data that flows with the call and - /// async context of a test or invocation. + /// Represents ambient data that is local to a given asynchronous control flow, such as an asynchronous method. /// + /// + /// This is just a simple wrapper around + /// public static class CallContext { - static ConcurrentDictionary> _state = new ConcurrentDictionary>(); + private static ConcurrentDictionary> _state = new ConcurrentDictionary>(); /// /// Stores a given object and associates it with the specified name. @@ -27,11 +29,11 @@ namespace Umbraco.Core.Scoping /// The object in the call context associated with the specified name, or a default value for if none is found. public static T GetData(string name) => _state.TryGetValue(name, out var data) ? data.Value : default; - /// - /// Clears the state from for the given name. - /// - /// - /// - public static bool RemoveData(string name) => _state.TryRemove(name, out _); + // NOTE: If you have used the old CallContext in the past you might be thinking you need to clean this up but that is not the case. + // With CallContext you had to call FreeNamedDataSlot to prevent leaks but with AsyncLocal this is not the case, there is no way to clean this up. + // The above dictionary is sort of a trick because sure, there is always going to be a string key that will exist in the collection but the values + // themselves are managed per ExecutionContext so they don't build up. + // There's an SO article relating to this here https://stackoverflow.com/questions/36511243/safety-of-asynclocal-in-asp-net-core + } } diff --git a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs index 7ae8c63905..10130e820e 100644 --- a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs +++ b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs @@ -145,11 +145,11 @@ namespace Umbraco.Core.Scoping if (key == ScopeItemKey) { // first, null-register the existing value - var ambientKey = CallContext.GetData(ScopeItemKey).AsGuid(); + var ambientKey = CallContext.GetData(ScopeItemKey); object o = null; lock (StaticCallContextObjectsLock) { - if (ambientKey != default(Guid)) + if (ambientKey != default) StaticCallContextObjects.TryGetValue(ambientKey, out o); } var ambientScope = o as IScope; @@ -162,7 +162,7 @@ namespace Umbraco.Core.Scoping if (value == null) { var objectKey = CallContext.GetData(key); - CallContext.RemoveData(key); + CallContext.SetData(key, default); // aka remove if (objectKey == Guid.Empty) return; lock (StaticCallContextObjectsLock) { diff --git a/src/Umbraco.Tests/CoreThings/CallContextTests.cs b/src/Umbraco.Tests/CoreThings/CallContextTests.cs index e01534c8d9..b97a87542c 100644 --- a/src/Umbraco.Tests/CoreThings/CallContextTests.cs +++ b/src/Umbraco.Tests/CoreThings/CallContextTests.cs @@ -1,6 +1,7 @@ -using System.Runtime.Remoting.Messaging; -using NUnit.Framework; +using NUnit.Framework; +using System; using Umbraco.Core; +using Umbraco.Core.Scoping; namespace Umbraco.Tests.CoreThings { @@ -13,10 +14,10 @@ namespace Umbraco.Tests.CoreThings { SafeCallContext.Register(() => { - CallContext.FreeNamedDataSlot("test1"); - CallContext.FreeNamedDataSlot("test2"); + CallContext.SetData("test1", null); + CallContext.SetData("test2", null); return null; - }, o => {}); + }, o => { }); } [OneTimeSetUp] @@ -44,10 +45,10 @@ namespace Umbraco.Tests.CoreThings [Test] public void Test1() { - CallContext.LogicalSetData("test1", "test1"); - Assert.IsNull(CallContext.LogicalGetData("test2")); + CallContext.SetData("test1", "test1"); + Assert.IsNull(CallContext.GetData("test2")); - CallContext.LogicalSetData("test3b", "test3b"); + CallContext.SetData("test3b", "test3b"); if (_first) { @@ -55,21 +56,21 @@ namespace Umbraco.Tests.CoreThings } else { - Assert.IsNotNull(CallContext.LogicalGetData("test3a")); // leak! + Assert.IsNotNull(CallContext.GetData("test3a")); // leak! } } [Test] public void Test2() { - CallContext.LogicalSetData("test2", "test2"); - Assert.IsNull(CallContext.LogicalGetData("test1")); + CallContext.SetData("test2", "test2"); + Assert.IsNull(CallContext.GetData("test1")); } [Test] public void Test3() { - CallContext.LogicalSetData("test3a", "test3a"); + CallContext.SetData("test3a", "test3a"); if (_first) { @@ -77,7 +78,7 @@ namespace Umbraco.Tests.CoreThings } else { - Assert.IsNotNull(CallContext.LogicalGetData("test3b")); // leak! + Assert.IsNotNull(CallContext.GetData("test3b")); // leak! } } } diff --git a/src/Umbraco.Tests/Migrations/MigrationTests.cs b/src/Umbraco.Tests/Migrations/MigrationTests.cs index 6b2d21e4a5..64318bc193 100644 --- a/src/Umbraco.Tests/Migrations/MigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Data; using Moq; using NUnit.Framework; @@ -45,8 +46,19 @@ namespace Umbraco.Tests.Migrations throw new NotImplementedException(); } + + public IScopeContext Context { get; set; } public ISqlContext SqlContext { get; set; } + +#if DEBUG_SCOPES + public ScopeInfo GetScopeInfo(IScope scope) + { + throw new NotImplementedException(); + } + public Dictionary CallContextObjects => throw new NotImplementedException(); + public IEnumerable ScopeInfos => throw new NotImplementedException(); +#endif } [Test] diff --git a/src/Umbraco.Tests/Persistence/LocksTests.cs b/src/Umbraco.Tests/Persistence/LocksTests.cs index afcd481f9f..d4e3d23a70 100644 --- a/src/Umbraco.Tests/Persistence/LocksTests.cs +++ b/src/Umbraco.Tests/Persistence/LocksTests.cs @@ -13,7 +13,7 @@ namespace Umbraco.Tests.Persistence { [TestFixture] [Timeout(60000)] - [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest, Logger = UmbracoTestOptions.Logger.Serilog)] + [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest, Logger = UmbracoTestOptions.Logger.Console)] public class LocksTests : TestWithDatabaseBase { protected override void Initialize() diff --git a/src/Umbraco.Tests/Scoping/ScopeTests.cs b/src/Umbraco.Tests/Scoping/ScopeTests.cs index 0f35554472..1e1f202809 100644 --- a/src/Umbraco.Tests/Scoping/ScopeTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeTests.cs @@ -1,14 +1,10 @@ using System; -using System.Collections; -using System.Runtime.Remoting.Messaging; -using System.Threading; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Persistence; using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; -using CallContext = Umbraco.Core.Scoping.CallContext; namespace Umbraco.Tests.Scoping { @@ -123,7 +119,7 @@ namespace Umbraco.Tests.Scoping Assert.AreSame(scope, ((Scope) nested).ParentScope); // it's moved over to call context - var callContextKey = CallContext.GetData(ScopeProvider.ScopeItemKey); + var callContextKey = CallContext.GetData(ScopeProvider.ScopeItemKey); Assert.AreNotEqual(Guid.Empty, callContextKey); // only if Core.DEBUG_SCOPES are defined From 95d3a87bb2638ece9841b5f5693ba116d2ecf4cc Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 20 Dec 2019 16:19:29 +1100 Subject: [PATCH 18/19] Simplifies ScopeProvider now that we are using AsyncLocal we don't need to worry about the weird constraints of CallContext which was being worked around with the static object dictionary --- .../Scoping/IScopeProvider.cs | 2 +- .../Scoping/ScopeProvider.cs | 125 +++++------------- .../Migrations/MigrationTests.cs | 1 - 3 files changed, 36 insertions(+), 92 deletions(-) diff --git a/src/Umbraco.Infrastructure/Scoping/IScopeProvider.cs b/src/Umbraco.Infrastructure/Scoping/IScopeProvider.cs index 6c9eb63ba0..4a7ccae481 100644 --- a/src/Umbraco.Infrastructure/Scoping/IScopeProvider.cs +++ b/src/Umbraco.Infrastructure/Scoping/IScopeProvider.cs @@ -88,7 +88,7 @@ namespace Umbraco.Core.Scoping ISqlContext SqlContext { get; } #if DEBUG_SCOPES - Dictionary CallContextObjects { get; } + IEnumerable ScopeInfos { get; } ScopeInfo GetScopeInfo(IScope scope); #endif diff --git a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs index 10130e820e..d4bd224eae 100644 --- a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs +++ b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs @@ -49,23 +49,23 @@ namespace Umbraco.Core.Scoping SafeCallContext.Register( () => { - var scope = GetCallContextObject(ScopeItemKey); - var context = GetCallContextObject(ContextItemKey); - SetCallContextObject(ScopeItemKey, null); - SetCallContextObject(ContextItemKey, null); + var scope = GetCallContextObject(ScopeItemKey); + var context = GetCallContextObject(ContextItemKey); + SetCallContextObject(ScopeItemKey, null); + SetCallContextObject(ContextItemKey, null); return Tuple.Create(scope, context); }, o => { // cannot re-attached over leaked scope/context - if (GetCallContextObject(ScopeItemKey) != null) + if (GetCallContextObject(ScopeItemKey) != null) throw new Exception("Found leaked scope when restoring call context."); - if (GetCallContextObject(ContextItemKey) != null) + if (GetCallContextObject(ContextItemKey) != null) throw new Exception("Found leaked context when restoring call context."); - var t = (Tuple) o; - SetCallContextObject(ScopeItemKey, t.Item1); - SetCallContextObject(ContextItemKey, t.Item2); + var t = (Tuple) o; + SetCallContextObject(ScopeItemKey, t.Item1); + SetCallContextObject(ContextItemKey, t.Item2); }); } @@ -93,51 +93,16 @@ namespace Umbraco.Core.Scoping // care of de-registering themselves from context. // see https://www.zpqrtbnk.net/posts/putting-things-in-contexts/ - private static readonly object StaticCallContextObjectsLock = new object(); - private static readonly Dictionary StaticCallContextObjects - = new Dictionary(); - -#if DEBUG_SCOPES - public Dictionary CallContextObjects - { - get - { - lock (StaticCallContextObjectsLock) - { - // capture in a dictionary - return StaticCallContextObjects.ToDictionary(x => x.Key, x => x.Value); - } - } - } -#endif - private static T GetCallContextObject(string key) - where T : class + where T : class, IInstanceIdentifiable { - var objectKey = CallContext.GetData(key); - if (objectKey == Guid.Empty) return null; - - lock (StaticCallContextObjectsLock) - { - if (StaticCallContextObjects.TryGetValue(objectKey, out object callContextObject)) - { -#if DEBUG_SCOPES - Current.Logger.Debug("Got " + typeof(T).Name + " Object " + objectKey.ToString("N").Substring(0, 8)); - //_logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); -#endif - return (T)callContextObject; - } - - // hard to inject into a static method :( - Current.Logger.Warn("Missed {TypeName} Object {ObjectKey}", typeof(T).Name, objectKey.ToString("N").Substring(0, 8)); -#if DEBUG_SCOPES - //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); -#endif - return null; - } + var obj = CallContext.GetData(key); + if (obj == default(T)) return null; + return obj; } - private static void SetCallContextObject(string key, IInstanceIdentifiable value) + private static void SetCallContextObject(string key, T value) + where T: class, IInstanceIdentifiable { #if DEBUG_SCOPES // manage the 'context' that contains the scope (null, "http" or "call") @@ -145,14 +110,8 @@ namespace Umbraco.Core.Scoping if (key == ScopeItemKey) { // first, null-register the existing value - var ambientKey = CallContext.GetData(ScopeItemKey); - object o = null; - lock (StaticCallContextObjectsLock) - { - if (ambientKey != default) - StaticCallContextObjects.TryGetValue(ambientKey, out o); - } - var ambientScope = o as IScope; + var ambientScope = CallContext.GetData(ScopeItemKey); + if (ambientScope != null) RegisterContext(ambientScope, null); // then register the new value var scope = value as IScope; @@ -161,33 +120,18 @@ namespace Umbraco.Core.Scoping #endif if (value == null) { - var objectKey = CallContext.GetData(key); - CallContext.SetData(key, default); // aka remove - if (objectKey == Guid.Empty) return; - lock (StaticCallContextObjectsLock) - { -#if DEBUG_SCOPES - Current.Logger.Debug("Remove Object " + objectKey.ToString("N").Substring(0, 8)); - //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); -#endif - StaticCallContextObjects.Remove(objectKey); - } + var obj = CallContext.GetData(key); + CallContext.SetData(key, default); // aka remove + if (obj == null) return; } else { - // note - we are *not* detecting an already-existing value - // because our code in this class *always* sets to null before - // setting to a real value - var objectKey = value.InstanceId; - lock (StaticCallContextObjectsLock) - { + #if DEBUG_SCOPES - Current.Logger.Debug("AddObject " + objectKey.ToString("N").Substring(0, 8)); - //Current.Logger.Debug("At:\r\n" + Head(Environment.StackTrace, 24)); + Current.Logger.Debug("AddObject " + value.InstanceId.ToString("N").Substring(0, 8)); #endif - StaticCallContextObjects.Add(objectKey, value); - } - CallContext.SetData(key, objectKey); + + CallContext.SetData(key, value); } } @@ -249,12 +193,12 @@ namespace Umbraco.Core.Scoping { // clear both SetHttpContextObject(ContextItemKey, null, false); - SetCallContextObject(ContextItemKey, null); + SetCallContextObject(ContextItemKey, null); if (value == null) return; // set http/call context if (SetHttpContextObject(ContextItemKey, value, false) == false) - SetCallContextObject(ContextItemKey, value); + SetCallContextObject(ContextItemKey, value); } } @@ -274,21 +218,22 @@ namespace Umbraco.Core.Scoping public Scope AmbientScope { // try http context, fallback onto call context - get => GetHttpContextObject(ScopeItemKey, false) - ?? GetCallContextObject(ScopeItemKey); + // we are casting here because we know its a concrete type + get => (Scope)GetHttpContextObject(ScopeItemKey, false) + ?? (Scope)GetCallContextObject(ScopeItemKey); set { // clear both SetHttpContextObject(ScopeItemKey, null, false); SetHttpContextObject(ScopeRefItemKey, null, false); - SetCallContextObject(ScopeItemKey, null); + SetCallContextObject(ScopeItemKey, null); if (value == null) return; // set http/call context if (value.CallContext == false && SetHttpContextObject(ScopeItemKey, value, false)) SetHttpContextObject(ScopeRefItemKey, _scopeReference); else - SetCallContextObject(ScopeItemKey, value); + SetCallContextObject(ScopeItemKey, value); } } @@ -299,9 +244,9 @@ namespace Umbraco.Core.Scoping // clear all SetHttpContextObject(ScopeItemKey, null, false); SetHttpContextObject(ScopeRefItemKey, null, false); - SetCallContextObject(ScopeItemKey, null); + SetCallContextObject(ScopeItemKey, null); SetHttpContextObject(ContextItemKey, null, false); - SetCallContextObject(ContextItemKey, null); + SetCallContextObject(ContextItemKey, null); if (scope == null) { if (context != null) @@ -316,8 +261,8 @@ namespace Umbraco.Core.Scoping } else { - SetCallContextObject(ScopeItemKey, scope); - SetCallContextObject(ContextItemKey, context); + SetCallContextObject(ScopeItemKey, scope); + SetCallContextObject(ContextItemKey, context); } } diff --git a/src/Umbraco.Tests/Migrations/MigrationTests.cs b/src/Umbraco.Tests/Migrations/MigrationTests.cs index 64318bc193..bfadd45b0d 100644 --- a/src/Umbraco.Tests/Migrations/MigrationTests.cs +++ b/src/Umbraco.Tests/Migrations/MigrationTests.cs @@ -56,7 +56,6 @@ namespace Umbraco.Tests.Migrations { throw new NotImplementedException(); } - public Dictionary CallContextObjects => throw new NotImplementedException(); public IEnumerable ScopeInfos => throw new NotImplementedException(); #endif } From 9dd258320a12695533875541ba3e9fc8cb05f359 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 23 Dec 2019 16:04:17 +1100 Subject: [PATCH 19/19] Adds notes, fixes tests --- src/Umbraco.Abstractions/SafeCallContext.cs | 13 ++++++++----- .../Scoping/ScopeProvider.cs | 18 ------------------ src/Umbraco.Tests/Scoping/ScopeTests.cs | 4 ++-- 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Abstractions/SafeCallContext.cs b/src/Umbraco.Abstractions/SafeCallContext.cs index ee1416e833..aeaf4af17e 100644 --- a/src/Umbraco.Abstractions/SafeCallContext.cs +++ b/src/Umbraco.Abstractions/SafeCallContext.cs @@ -4,11 +4,14 @@ using System.Collections.Generic; namespace Umbraco.Core { - // TODO: This may no longer be necessary but I'm unsure. This is based on the premise of using the old CallContext which - // requires all objects to be serializable. Stephane wrote a blog post here https://www.zpqrtbnk.net/posts/putting-things-in-contexts/ - // about this. But now we are not using the CallContext since it doesn't exist and instead using AsyncLocal which probably - // doesn't have this problem... but that would require some testing. For now we'll leave this class here until we - // can acquire/discover more info. + /// + /// Provides a way to stop the data flow of a logical call context (i.e. CallContext or AsyncLocal) from within + /// a SafeCallContext and then have the original data restored to the current logical call context. + /// + /// + /// Some usages of this might be when spawning async thread or background threads in which the current logical call context will be flowed but + /// you don't want it to flow there yet you don't want to clear it either since you want the data to remain on the current thread. + /// public class SafeCallContext : IDisposable { private static readonly List> EnterFuncs = new List>(); diff --git a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs index d4bd224eae..0dba73b55b 100644 --- a/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs +++ b/src/Umbraco.Infrastructure/Scoping/ScopeProvider.cs @@ -75,24 +75,6 @@ namespace Umbraco.Core.Scoping #region Context - // TODO: I don't think this whole thing is necessary anymore since we are using AsyncLocal which - // I don't believe has the same odd requirements as the old CallContext! Also see SafeCallContext - - // objects that go into the logical call context better be serializable else they'll eventually - // cause issues whenever some cross-AppDomain code executes - could be due to ReSharper running - // tests, any other things (see https://msdn.microsoft.com/en-us/library/dn458353(v=vs.110).aspx), - // but we don't want to make all of our objects serializable since they are *not* meant to be - // used in cross-AppDomain scenario anyways. - // in addition, whatever goes into the logical call context is serialized back and forth any - // time cross-AppDomain code executes, so if we put an "object" there, we'll can *another* - // "object" instance - and so we cannot use a random object as a key. - // so what we do is: we register a guid in the call context, and we keep a table mapping those - // guids to the actual objects. the guid serializes back and forth without causing any issue, - // and we can retrieve the actual objects from the table. - // only issue: how are we supposed to clear the table? we can't, really. objects should take - // care of de-registering themselves from context. - // see https://www.zpqrtbnk.net/posts/putting-things-in-contexts/ - private static T GetCallContextObject(string key) where T : class, IInstanceIdentifiable { diff --git a/src/Umbraco.Tests/Scoping/ScopeTests.cs b/src/Umbraco.Tests/Scoping/ScopeTests.cs index 1e1f202809..eb4a01d06b 100644 --- a/src/Umbraco.Tests/Scoping/ScopeTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeTests.cs @@ -119,8 +119,8 @@ namespace Umbraco.Tests.Scoping Assert.AreSame(scope, ((Scope) nested).ParentScope); // it's moved over to call context - var callContextKey = CallContext.GetData(ScopeProvider.ScopeItemKey); - Assert.AreNotEqual(Guid.Empty, callContextKey); + var callContextScope = CallContext.GetData(ScopeProvider.ScopeItemKey); + Assert.IsNotNull(callContextScope); // only if Core.DEBUG_SCOPES are defined //var ccnested = scopeProvider.CallContextObjects[callContextKey];