diff --git a/README.md b/README.md index d66740b..09f883c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This package automaticaly removes any previous versions for those times when a v ### Installation -> *Note:* UnVersion has been developed against **Umbraco v7.1.4** and will support that version and above. +> *Note:* UnVersion has been developed against **Umbraco v8.2.? (Pending PR)** and will support that version and above. UnVersion can be installed from either Our Umbraco or NuGet package repositories, or build manually from the source-code: @@ -34,7 +34,7 @@ We also have a [MyGet package repository](https://www.myget.org/gallery/umbraco- If you prefer, you can compile UnVersion yourself, you'll need: -* Visual Studio 2012 (or above) +* Visual Studio 2017 (or above) To clone it locally click the "Clone in Windows" button above or run the following git commands. diff --git a/appveyor.yml b/appveyor.yml index 1819f67..64097f1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ # version format -version: 2.2.0.{build} +version: 3.0.0.{build} # UMBRACO_PACKAGE_PRERELEASE_SUFFIX if a rtm release build this should be blank, otherwise if empty will default to alpha # example UMBRACO_PACKAGE_PRERELEASE_SUFFIX=beta diff --git a/build/package.proj b/build/package.proj index f9855ac..024e138 100644 --- a/build/package.proj +++ b/build/package.proj @@ -18,8 +18,8 @@ Our.Umbraco.UnVersion UnVersion - 7.1.4 - A content un-versioning package for Umbraco 7.1+ + 8.2.1 + A content un-versioning package for Umbraco 8.2+ Matt Brailsford, Lee Kelleher https://github.com/umco/umbraco-unversion/graphs/contributors MIT license diff --git a/docs/developers-guide.md b/docs/developers-guide.md index 818bf57..0d87fa2 100644 --- a/docs/developers-guide.md +++ b/docs/developers-guide.md @@ -13,7 +13,7 @@ To define a new unversion rule, create an `` element with the following att ```xml - + ``` diff --git a/src/Our.Umbraco.UnVersion.Tests/Our.Umbraco.UnVersion.Tests.csproj b/src/Our.Umbraco.UnVersion.Tests/Our.Umbraco.UnVersion.Tests.csproj new file mode 100644 index 0000000..ea41b88 --- /dev/null +++ b/src/Our.Umbraco.UnVersion.Tests/Our.Umbraco.UnVersion.Tests.csproj @@ -0,0 +1,287 @@ + + + + + + Debug + AnyCPU + {DB4825F3-92CB-44CA-96F1-2680026DAFB1} + Library + Properties + Our.Umbraco.UnVersion.Tests + Our.Umbraco.UnVersion.Tests + v4.7.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\AutoMapper.8.0.0\lib\net461\AutoMapper.dll + + + ..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll + + + ..\packages\ClientDependency.1.9.8\lib\net45\ClientDependency.Core.dll + + + ..\packages\ClientDependency-Mvc5.1.9.3\lib\net45\ClientDependency.Core.Mvc.dll + + + ..\packages\CSharpTest.Net.Collections.14.906.1403.1082\lib\net40\CSharpTest.Net.Collections.dll + + + ..\packages\Examine.1.0.1\lib\net452\Examine.dll + + + ..\packages\HtmlAgilityPack.1.8.14\lib\Net45\HtmlAgilityPack.dll + + + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + ..\packages\ImageProcessor.2.7.0.100\lib\net452\ImageProcessor.dll + + + ..\packages\LightInject.5.4.0\lib\net46\LightInject.dll + + + ..\packages\LightInject.Annotation.1.1.0\lib\net46\LightInject.Annotation.dll + + + ..\packages\LightInject.Mvc.2.0.0\lib\net46\LightInject.Mvc.dll + + + ..\packages\LightInject.Web.2.0.0\lib\net46\LightInject.Web.dll + + + ..\packages\LightInject.WebApi.2.0.0\lib\net46\LightInject.WebApi.dll + + + ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll + + + ..\packages\Markdown.2.2.1\lib\net451\Markdown.dll + + + ..\packages\Microsoft.AspNet.Identity.Core.2.2.2\lib\net45\Microsoft.AspNet.Identity.Core.dll + + + ..\packages\Microsoft.AspNet.Identity.Owin.2.2.2\lib\net45\Microsoft.AspNet.Identity.Owin.dll + + + ..\packages\Microsoft.AspNet.SignalR.Core.2.4.0\lib\net45\Microsoft.AspNet.SignalR.Core.dll + + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.0.0\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Owin.4.0.1\lib\net45\Microsoft.Owin.dll + + + ..\packages\Microsoft.Owin.Host.SystemWeb.4.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + + + ..\packages\Microsoft.Owin.Security.4.0.1\lib\net45\Microsoft.Owin.Security.dll + + + ..\packages\Microsoft.Owin.Security.Cookies.4.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll + + + ..\packages\Microsoft.Owin.Security.OAuth.4.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll + + + ..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + ..\packages\MiniProfiler.4.0.138\lib\net461\MiniProfiler.dll + + + ..\packages\MiniProfiler.Shared.4.0.138\lib\net461\MiniProfiler.Shared.dll + + + ..\packages\Moq.4.13.1\lib\net45\Moq.dll + + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NPoco.3.9.4\lib\net45\NPoco.dll + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + ..\packages\Semver.2.0.4\lib\net452\Semver.dll + + + ..\packages\Serilog.2.8.0\lib\net46\Serilog.dll + + + ..\packages\Serilog.Enrichers.Process.2.0.1\lib\net45\Serilog.Enrichers.Process.dll + + + ..\packages\Serilog.Enrichers.Thread.3.0.0\lib\net45\Serilog.Enrichers.Thread.dll + + + ..\packages\Serilog.Filters.Expressions.2.0.0\lib\net45\Serilog.Filters.Expressions.dll + + + ..\packages\Serilog.Formatting.Compact.1.0.0\lib\net45\Serilog.Formatting.Compact.dll + + + ..\packages\Serilog.Formatting.Compact.Reader.1.0.3\lib\net45\Serilog.Formatting.Compact.Reader.dll + + + ..\packages\Serilog.Settings.AppSettings.2.2.2\lib\net45\Serilog.Settings.AppSettings.dll + + + ..\packages\Serilog.Sinks.Async.1.3.0\lib\net45\Serilog.Sinks.Async.dll + + + ..\packages\Serilog.Sinks.File.4.0.0\lib\net45\Serilog.Sinks.File.dll + + + ..\packages\Serilog.Sinks.Map.1.0.0\lib\netstandard2.0\Serilog.Sinks.Map.dll + + + ..\packages\Superpower.2.0.0\lib\net45\Superpower.dll + + + + + + + + + ..\packages\Umbraco.SqlServerCE.4.0.0.1\lib\net472\System.Data.SqlServerCe.dll + + + ..\packages\Umbraco.SqlServerCE.4.0.0.1\lib\net472\System.Data.SqlServerCe.Entity.dll + + + ..\packages\System.Diagnostics.DiagnosticSource.4.4.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll + + + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + + + + ..\packages\System.Threading.Tasks.Dataflow.4.9.0\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.7\lib\net45\System.Web.Http.dll + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.7\lib\net45\System.Web.Http.WebHost.dll + + + ..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll + + + ..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll + + + + ..\packages\UmbracoCms.Core.8.4.0\lib\net472\Umbraco.Core.dll + + + ..\packages\UmbracoCms.Web.8.4.0\lib\net472\Umbraco.Examine.dll + + + ..\packages\UmbracoCms.Web.8.4.0\lib\net472\Umbraco.Web.dll + + + ..\packages\UmbracoCms.Web.8.4.0\lib\net472\Umbraco.Web.UI.dll + + + + + + + + + + + + + + {a3e6b76a-35ac-415a-bced-971223d63bac} + Our.Umbraco.UnVersion + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion.Tests/Properties/AssemblyInfo.cs b/src/Our.Umbraco.UnVersion.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0f61368 --- /dev/null +++ b/src/Our.Umbraco.UnVersion.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Our.Umbraco.UnVersion.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Our.Umbraco.UnVersion.Tests")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("db4825f3-92cb-44ca-96f1-2680026dafb1")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Our.Umbraco.UnVersion.Tests/Services/UnVersionServiceTests.cs b/src/Our.Umbraco.UnVersion.Tests/Services/UnVersionServiceTests.cs new file mode 100644 index 0000000..a240640 --- /dev/null +++ b/src/Our.Umbraco.UnVersion.Tests/Services/UnVersionServiceTests.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Our.Umbraco.UnVersion.Services; +using Umbraco.Core.Models; + +namespace Our.Umbraco.UnVersion.Tests.Services +{ + [TestClass] + public class ServiceTests + { + [TestMethod] + public void GetVersions_Returns_Right_Based_On_Date() + { + + var config = new UnVersionConfigEntry() {MaxDays = 10}; + + List versions = new List() + { + TestHelper.GetVersionMock(1, new DateTime(2019, 12, 10)).Object, // should be deleted + TestHelper.GetVersionMock(2, new DateTime(2019, 12, 19)).Object, // should be deleted + TestHelper.GetVersionMock(3, new DateTime(2019, 12, 20)).Object // should be kept + }; + + var service = new UnVersionService(null,null,null,null); + + var res = service.GetVersionsToDelete(versions, config, new DateTime(2019, 12, 30)); + + Assert.IsTrue(res.Contains(1)); + Assert.IsTrue(res.Contains(2)); + Assert.IsFalse(res.Contains(3)); + + } + + [TestMethod] + public void GetVersions_Returns_Right_Based_Max_Count() + { + var config = new UnVersionConfigEntry() { MaxCount = 5 }; + + List versions = new List() + { + TestHelper.GetVersionMock(10, new DateTime(2019, 12, 10)).Object, // should be kept + TestHelper.GetVersionMock(20, new DateTime(2019, 12, 19)).Object, // should be kept + TestHelper.GetVersionMock(30, new DateTime(2019, 12, 20)).Object, // should be kept + TestHelper.GetVersionMock(40, new DateTime(2019, 12, 10)).Object, // should be kept + TestHelper.GetVersionMock(50, new DateTime(2019, 12, 19)).Object, // should be kept + TestHelper.GetVersionMock(60, new DateTime(2019, 12, 20)).Object, // should be deleted + TestHelper.GetVersionMock(70, new DateTime(2019, 12, 10)).Object, // should be deleted + TestHelper.GetVersionMock(80, new DateTime(2019, 12, 19)).Object, // should be deleted + TestHelper.GetVersionMock(90, new DateTime(2019, 12, 20)).Object, // should be deleted + }; + + var service = new UnVersionService(null,null, null,null); + + var res = service.GetVersionsToDelete(versions, config, new DateTime(2019, 12, 30)); + + Assert.IsFalse(res.Contains(50)); + + Assert.IsTrue(res.Contains(60)); + Assert.IsTrue(res.Contains(70)); + Assert.IsTrue(res.Contains(80)); + Assert.IsTrue(res.Contains(90)); + + } + + } +} diff --git a/src/Our.Umbraco.UnVersion.Tests/TestHelper.cs b/src/Our.Umbraco.UnVersion.Tests/TestHelper.cs new file mode 100644 index 0000000..383fde1 --- /dev/null +++ b/src/Our.Umbraco.UnVersion.Tests/TestHelper.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Moq; +using Umbraco.Core.Models; + +namespace Our.Umbraco.UnVersion.Tests +{ + public static class TestHelper + { + public static Mock GetVersionMock(int versionId, DateTime updateDate) + { + var mock = new Mock(); + mock.Setup(x => x.VersionId).Returns(versionId); + mock.Setup(x => x.UpdateDate).Returns(updateDate); + return mock; + } + } +} diff --git a/src/Our.Umbraco.UnVersion.Tests/app.config b/src/Our.Umbraco.UnVersion.Tests/app.config new file mode 100644 index 0000000..430296e --- /dev/null +++ b/src/Our.Umbraco.UnVersion.Tests/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion.Tests/packages.config b/src/Our.Umbraco.UnVersion.Tests/packages.config new file mode 100644 index 0000000..d01829b --- /dev/null +++ b/src/Our.Umbraco.UnVersion.Tests/packages.config @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion.sln b/src/Our.Umbraco.UnVersion.sln index f84d868..f08aeae 100644 --- a/src/Our.Umbraco.UnVersion.sln +++ b/src/Our.Umbraco.UnVersion.sln @@ -1,6 +1,7 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29411.108 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Our.Umbraco.UnVersion", "Our.Umbraco.UnVersion\Our.Umbraco.UnVersion.csproj", "{A3E6B76A-35AC-415A-BCED-971223D63BAC}" EndProject @@ -21,6 +22,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\README.md = ..\README.md EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{BA0FC6AB-55AD-4AFF-A5EB-AF4A654C7341}" + ProjectSection(SolutionItems) = preProject + ..\docs\developers-guide.md = ..\docs\developers-guide.md + EndProjectSection +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Our.Umbraco.UnVersion.Tests", "Our.Umbraco.UnVersion.Tests\Our.Umbraco.UnVersion.Tests.csproj", "{DB4825F3-92CB-44CA-96F1-2680026DAFB1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,11 +38,22 @@ Global {A3E6B76A-35AC-415A-BCED-971223D63BAC}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3E6B76A-35AC-415A-BCED-971223D63BAC}.Release|Any CPU.ActiveCfg = Release|Any CPU {A3E6B76A-35AC-415A-BCED-971223D63BAC}.Release|Any CPU.Build.0 = Release|Any CPU + {DB4825F3-92CB-44CA-96F1-2680026DAFB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB4825F3-92CB-44CA-96F1-2680026DAFB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB4825F3-92CB-44CA-96F1-2680026DAFB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB4825F3-92CB-44CA-96F1-2680026DAFB1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {AE05CC62-1E54-4E24-AA99-B7EED3CFFA3C} = {E155CD07-7718-4EE8-B51E-FECABE034A33} + {BA0FC6AB-55AD-4AFF-A5EB-AF4A654C7341} = {E155CD07-7718-4EE8-B51E-FECABE034A33} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AAE25AE6-314C-45E6-BD87-04A97F90EE16} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A3114DD6-96F4-4EB1-B6DA-0811E052F9F9} EndGlobalSection EndGlobal diff --git a/src/Our.Umbraco.UnVersion/Bootstrap.cs b/src/Our.Umbraco.UnVersion/Bootstrap.cs deleted file mode 100644 index 8edf8c9..0000000 --- a/src/Our.Umbraco.UnVersion/Bootstrap.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.IO; -using System.Web; -using Our.Umbraco.UnVersion.Services; -using Umbraco.Core; -using Umbraco.Core.Events; -using Umbraco.Core.Models; -using Umbraco.Core.Publishing; -using Umbraco.Core.Services; - -namespace Our.Umbraco.UnVersion -{ - public class Bootstrap : ApplicationEventHandler - { - protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, - ApplicationContext applicationContext) - { - // Init config - var appPath = umbracoApplication.Server.MapPath("~/"); - var configFilePath = Path.Combine(appPath, @"config\unVersion.config"); - var config = new UnVersionConfig(configFilePath); - - // Init context - UnVersionContext.Instance.UnVersionService = new UnVersionService(config, true); - - // Hookup event listener - ContentService.Published += ContentServicePublished; - } - - void ContentServicePublished(IPublishingStrategy sender, PublishEventArgs e) - { - if (HttpContext.Current == null) - return; - - foreach (var entity in e.PublishedEntities) - { - UnVersionContext.Instance.UnVersionService.UnVersion(entity); - } - } - } -} \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion/Our.Umbraco.UnVersion.csproj b/src/Our.Umbraco.UnVersion/Our.Umbraco.UnVersion.csproj index 9a3c94a..c8e334c 100644 --- a/src/Our.Umbraco.UnVersion/Our.Umbraco.UnVersion.csproj +++ b/src/Our.Umbraco.UnVersion/Our.Umbraco.UnVersion.csproj @@ -1,33 +1,19 @@  - + Debug AnyCPU - - - 2.0 - {A3E6B76A-35AC-415A-BCED-971223D63BAC} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + {9C419222-B1A9-42F5-850F-6D5804E585D9} Library Properties Our.Umbraco.UnVersion Our.Umbraco.UnVersion - v4.5 - - - - - - 4.0 - false - - - - - ..\..\ - true - + v4.7.2 + 512 + true + + true @@ -37,7 +23,6 @@ DEBUG;TRACE prompt 4 - false pdbonly @@ -46,85 +31,225 @@ TRACE prompt 4 - false - - ..\packages\UmbracoCms.Core.7.1.4\lib\interfaces.dll - False + + ..\packages\ClientDependency.1.9.8\lib\net45\ClientDependency.Core.dll - - ..\packages\UmbracoCms.Core.7.1.4\lib\log4net.dll - False + + ..\packages\ClientDependency-Mvc5.1.9.3\lib\net45\ClientDependency.Core.Mvc.dll - - ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll - False + + ..\packages\CSharpTest.Net.Collections.14.906.1403.1082\lib\net40\CSharpTest.Net.Collections.dll - - False - ..\packages\UmbracoCms.Core.7.1.4\lib\System.Data.SqlServerCe.dll + + ..\packages\Examine.1.0.1\lib\net452\Examine.dll + + + ..\packages\HtmlAgilityPack.1.8.14\lib\Net45\HtmlAgilityPack.dll + + + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + ..\packages\ImageProcessor.2.7.0.100\lib\net452\ImageProcessor.dll + + + ..\packages\LightInject.5.4.0\lib\net46\LightInject.dll + + + ..\packages\LightInject.Annotation.1.1.0\lib\net46\LightInject.Annotation.dll + + + ..\packages\LightInject.Mvc.2.0.0\lib\net46\LightInject.Mvc.dll + + + ..\packages\LightInject.Web.2.0.0\lib\net46\LightInject.Web.dll + + + ..\packages\LightInject.WebApi.2.0.0\lib\net46\LightInject.WebApi.dll + + + ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll + + + ..\packages\Markdown.2.2.1\lib\net451\Markdown.dll + + + ..\packages\Microsoft.AspNet.Identity.Core.2.2.2\lib\net45\Microsoft.AspNet.Identity.Core.dll + + + ..\packages\Microsoft.AspNet.Identity.Owin.2.2.2\lib\net45\Microsoft.AspNet.Identity.Owin.dll + + + ..\packages\Microsoft.AspNet.SignalR.Core.2.4.0\lib\net45\Microsoft.AspNet.SignalR.Core.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.0.0\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Owin.4.0.1\lib\net45\Microsoft.Owin.dll + + + ..\packages\Microsoft.Owin.Host.SystemWeb.4.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + + + ..\packages\Microsoft.Owin.Security.4.0.1\lib\net45\Microsoft.Owin.Security.dll + + + ..\packages\Microsoft.Owin.Security.Cookies.4.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll + + + ..\packages\Microsoft.Owin.Security.OAuth.4.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll + + + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + ..\packages\MiniProfiler.4.0.138\lib\net461\MiniProfiler.dll + + + ..\packages\MiniProfiler.Shared.4.0.138\lib\net461\MiniProfiler.Shared.dll + + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NPoco.3.9.4\lib\net45\NPoco.dll + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + ..\packages\Semver.2.0.4\lib\net452\Semver.dll + + + ..\packages\Serilog.2.8.0\lib\net46\Serilog.dll + + + ..\packages\Serilog.Enrichers.Process.2.0.1\lib\net45\Serilog.Enrichers.Process.dll + + + ..\packages\Serilog.Enrichers.Thread.3.0.0\lib\net45\Serilog.Enrichers.Thread.dll + + + ..\packages\Serilog.Filters.Expressions.2.0.0\lib\net45\Serilog.Filters.Expressions.dll + + + ..\packages\Serilog.Formatting.Compact.1.0.0\lib\net45\Serilog.Formatting.Compact.dll + + + ..\packages\Serilog.Formatting.Compact.Reader.1.0.3\lib\net45\Serilog.Formatting.Compact.Reader.dll + + + ..\packages\Serilog.Settings.AppSettings.2.2.2\lib\net45\Serilog.Settings.AppSettings.dll + + + ..\packages\Serilog.Sinks.Async.1.3.0\lib\net45\Serilog.Sinks.Async.dll + + + ..\packages\Serilog.Sinks.File.4.0.0\lib\net45\Serilog.Sinks.File.dll + + + ..\packages\Serilog.Sinks.Map.1.0.0\lib\netstandard2.0\Serilog.Sinks.Map.dll + + + ..\packages\Superpower.2.0.0\lib\net45\Superpower.dll - + + + + + + ..\packages\Umbraco.SqlServerCE.4.0.0.1\lib\net472\System.Data.SqlServerCe.dll + + + ..\packages\Umbraco.SqlServerCE.4.0.0.1\lib\net472\System.Data.SqlServerCe.Entity.dll + + + ..\packages\System.Diagnostics.DiagnosticSource.4.4.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll + + + + + + + + ..\packages\System.Threading.Tasks.Dataflow.4.9.0\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll + + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.7\lib\net45\System.Web.Http.dll + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.7\lib\net45\System.Web.Http.WebHost.dll + + + ..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll + + + ..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll + + + + + + - - - ..\packages\UmbracoCms.Core.7.1.4\lib\umbraco.dll - False + + ..\packages\UmbracoCms.Core.8.4.0\lib\net472\Umbraco.Core.dll + + + ..\packages\UmbracoCms.Web.8.4.0\lib\net472\Umbraco.Examine.dll + + + ..\packages\UmbracoCms.Web.8.4.0\lib\net472\Umbraco.Web.dll - - ..\packages\UmbracoCms.Core.7.1.4\lib\Umbraco.Core.dll - False + + ..\packages\UmbracoCms.Web.8.4.0\lib\net472\Umbraco.Web.UI.dll - - + + - - + + + - - - - - - - - - - - - False - True - 50320 - / - - - False - False - - - False - - - - - \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion/Services/UnVersionService.cs b/src/Our.Umbraco.UnVersion/Services/UnVersionService.cs index aea1832..b67e7ba 100644 --- a/src/Our.Umbraco.UnVersion/Services/UnVersionService.cs +++ b/src/Our.Umbraco.UnVersion/Services/UnVersionService.cs @@ -1,44 +1,42 @@ using System; using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Data.SqlClient; -using System.Data.SqlServerCe; -using System.Reflection; -using log4net; -using umbraco; using Umbraco.Core.Models; +using Umbraco.Core.Logging; +using Umbraco.Web; +using System.Linq; +using Umbraco.Core.Services; namespace Our.Umbraco.UnVersion.Services { public class UnVersionService : IUnVersionService { - private readonly static ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly ILogger _logger; + private readonly IUmbracoContextFactory _context; + private readonly IContentService _contentService; + private IUnVersionConfig _config; - private readonly IUnVersionConfig _config; - private readonly bool _catchSqlExceptions; - - public UnVersionService(IUnVersionConfig config, bool catchSqlExceptions) + public UnVersionService(IUnVersionConfig config, ILogger logger, IUmbracoContextFactory context, IContentService contentService) { + _logger = logger; _config = config; - _catchSqlExceptions = catchSqlExceptions; + _context = context; + _contentService = contentService; } public void UnVersion(IContent content) { + var configEntries = new List(); if (_config.ConfigEntries.ContainsKey(content.ContentType.Alias)) configEntries.AddRange(_config.ConfigEntries[content.ContentType.Alias]); - if (_config.ConfigEntries.ContainsKey("$_ALL")) - configEntries.AddRange(_config.ConfigEntries["$_ALL"]); + if (_config.ConfigEntries.ContainsKey(UnVersionConfig.AllDocumentTypesKey)) + configEntries.AddRange(_config.ConfigEntries[UnVersionConfig.AllDocumentTypesKey]); if (configEntries.Count <= 0) { - if (Logger.IsDebugEnabled) - Logger.Debug("No unversion configuration found for type " + content.ContentType.Alias); - + _logger.Debug("No unversion configuration found for type " + content.ContentType.Alias); return; } @@ -46,9 +44,11 @@ public void UnVersion(IContent content) { var isValid = true; + // Check the RootXPath if configured if (!String.IsNullOrEmpty(configEntry.RootXPath)) { - if (content.Level > 1 && content.Parent() != null) + // TODO: Fix in some otherway + if (content.Level > 1 && content.ParentId > 0) { var ids = GetNodeIdsFromXpath(configEntry.RootXPath); isValid = ids.Contains(content.ParentId); @@ -58,155 +58,74 @@ public void UnVersion(IContent content) if (!isValid) continue; - var connStr = ConfigurationManager.ConnectionStrings["umbracoDbDSN"]; + var allVersions = _contentService.GetVersionsSlim(content.Id, 0, int.MaxValue).ToList(); - using (var conn = connStr.ProviderName.Contains("SqlServerCe") - ? (IDbConnection)new SqlCeConnection(connStr.ConnectionString) - : (IDbConnection)new SqlConnection(connStr.ConnectionString)) - { + if (!allVersions.Any()) + continue; - conn.Open(); - - var vesionsToKeep = VersionsToKeep(content.Id, configEntry, conn); - var versionsToKeepString = string.Join(",", vesionsToKeep); - - if (Logger.IsDebugEnabled) - Logger.Debug("Keeping versions " + versionsToKeepString); - - var sqlStrings = new List { - string.Format(@" - DELETE - FROM cmsPreviewXml - WHERE nodeId = {0} AND versionId NOT IN ({1})", - content.Id, - versionsToKeepString), - - string.Format(@" - DELETE - FROM cmsPropertyData - WHERE contentNodeId = {0} AND versionId NOT IN ({1})", - content.Id, - versionsToKeepString), - - - string.Format(@" - DELETE - FROM cmsContentVersion - WHERE contentId = {0} AND versionId NOT IN ({1})", - content.Id, - versionsToKeepString), - - string.Format(@" - DELETE - FROM cmsDocument - WHERE nodeId = {0} AND versionId NOT IN ({1})", - content.Id, - versionsToKeepString) - }; - - foreach (var sqlString in sqlStrings) - { - ExecuteSql(sqlString, conn); - } + var versionIdsToDelete = GetVersionsToDelete(allVersions, configEntry, DateTime.Now); - conn.Close(); + foreach (var vid in versionIdsToDelete) + { + _contentService.DeleteVersion(content.Id, vid, false); } + } + } - void ExecuteSql(string sql, IDbConnection connection) + /// + /// Iterates a list of IContent versions and returns items to be removed based on a configEntry. + /// + /// + /// + /// + /// + public List GetVersionsToDelete(List versions, UnVersionConfigEntry configEntry, DateTime currentDateTime) { - if (Logger.IsDebugEnabled) - Logger.Debug(sql); + List versionIdsToDelete = new List(); - var command = connection.CreateCommand(); - command.CommandType = CommandType.Text; - command.CommandText = sql; + int iterationCount = 0; - if (_catchSqlExceptions) + foreach (var version in versions) { - try + iterationCount++; + + // If we have a maxCount and the current iteration is above that max-count + if (configEntry.MaxCount > 0 && iterationCount > configEntry.MaxCount) { - command.ExecuteNonQuery(); + versionIdsToDelete.Add(version.VersionId); + // no need to compare dates since we've already added this version for deletion + continue; } - catch (Exception ex) + + // If we have a max days and the current version is older + if (configEntry.MaxDays > 0 && configEntry.MaxDays != int.MaxValue) { - Logger.Warn("Executing " + sql, ex); + var dateRemoveBefore = currentDateTime.AddDays(0 - configEntry.MaxDays); + if (version.UpdateDate < dateRemoveBefore) + { + versionIdsToDelete.Add(version.VersionId); + } } - } - else - { - command.ExecuteNonQuery(); - } - } - private IEnumerable VersionsToKeep(int contentId, UnVersionConfigEntry configEntry, IDbConnection connection) - { - // Get a list of all versions - // TODO: Need to find a better way to do this, but SQL CE 4 doesn't allow sub queries - var sql = string.Format(@"SELECT - cv.VersionId, - cv.VersionDate, - d.published, - d.newest - FROM cmsContentVersion cv - LEFT OUTER JOIN cmsDocument d ON d.versionId = cv.VersionId - WHERE cv.ContentId = {0} - ORDER BY cv.VersionDate DESC", - contentId); - - if (Logger.IsDebugEnabled) - Logger.Debug(sql); - - var command = connection.CreateCommand(); - command.CommandType = CommandType.Text; - command.CommandText = sql; - - var versionsToKeep = new List(); - var readerIndex = 0; - - try - { - using (var reader = command.ExecuteReader()) - { - while (reader.Read()) - { - var versionId = reader.GetGuid(0); - var versionDate = reader.GetDateTime(1); - var published = !reader.IsDBNull(2) && reader.GetBoolean(2); - var newest = !reader.IsDBNull(3) && reader.GetBoolean(3); - - readerIndex++; - - var daysDiff = (DateTime.Now - versionDate).Days; - if (published || newest || (daysDiff < configEntry.MaxDays && readerIndex <= configEntry.MaxCount)) - versionsToKeep.Add("'" + versionId.ToString("D") + "'"); - } - - reader.Close(); - reader.Dispose(); - } } - catch (Exception ex) - { - Logger.Warn(ex); - if (!_catchSqlExceptions) - throw ex; - } + return versionIdsToDelete; - return versionsToKeep; } private List GetNodeIdsFromXpath(string xpath) { - var ids = new List(); - var nodes = library.GetXmlNodeByXPath(xpath); + using (var ctx = _context.EnsureUmbracoContext()) + { + var nodes = ctx.UmbracoContext.Content.GetByXPath(xpath); - while (nodes.MoveNext()) - ids.Add(Convert.ToInt32(nodes.Current.GetAttribute("id", ""))); + if (nodes == null) + return new List(); - return ids; + return nodes.Select(x => x.Id).ToList(); + } } } } diff --git a/src/Our.Umbraco.UnVersion/UnVersionComponent.cs b/src/Our.Umbraco.UnVersion/UnVersionComponent.cs new file mode 100644 index 0000000..ad662e1 --- /dev/null +++ b/src/Our.Umbraco.UnVersion/UnVersionComponent.cs @@ -0,0 +1,32 @@ +using Our.Umbraco.UnVersion.Services; +using Umbraco.Core.Composing; +using Umbraco.Core.Services.Implement; + +namespace Our.Umbraco.UnVersion +{ + public class UnVersionComponent : IComponent + { + private readonly IUnVersionService unVersionService; + + public UnVersionComponent(IUnVersionService _unVersionService) + { + unVersionService = _unVersionService; + } + + public void Initialize() + { + ContentService.Published += ContentService_Published; + } + + private void ContentService_Published(global::Umbraco.Core.Services.IContentService sender, global::Umbraco.Core.Events.ContentPublishedEventArgs e) + { + foreach (var content in e.PublishedEntities) { + unVersionService.UnVersion(content); + } + } + + public void Terminate() + { + } + } +} diff --git a/src/Our.Umbraco.UnVersion/UnVersionComposer.cs b/src/Our.Umbraco.UnVersion/UnVersionComposer.cs new file mode 100644 index 0000000..fd2165c --- /dev/null +++ b/src/Our.Umbraco.UnVersion/UnVersionComposer.cs @@ -0,0 +1,16 @@ +using Our.Umbraco.UnVersion.Services; +using Umbraco.Core; +using Umbraco.Core.Composing; + +namespace Our.Umbraco.UnVersion +{ + public class UnVersionComposer : IUserComposer + { + public void Compose(Composition composition) + { + composition.Register(); + composition.Register(); + composition.Components().Append(); + } + } +} \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion/UnVersionConfig.cs b/src/Our.Umbraco.UnVersion/UnVersionConfig.cs index 58036e8..eeb1624 100644 --- a/src/Our.Umbraco.UnVersion/UnVersionConfig.cs +++ b/src/Our.Umbraco.UnVersion/UnVersionConfig.cs @@ -1,30 +1,43 @@ using System; using System.Collections.Generic; using System.IO; -using System.Reflection; +using System.Web; using System.Xml; -using log4net; +using Umbraco.Core.Logging; namespace Our.Umbraco.UnVersion { public class UnVersionConfig : IUnVersionConfig { - private readonly static ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + public const string AllDocumentTypesKey = "$_ALL"; public IDictionary> ConfigEntries { get; set; } - public UnVersionConfig(string configPath) + private ILogger _logger; + + public UnVersionConfig(ILogger logger) { + _logger = logger; + ConfigEntries = new Dictionary>(); - LoadXmlConfig(configPath); + try + { + var appPath = HttpRuntime.AppDomainAppPath; + var configFilePath = Path.Combine(appPath, @"config\unVersion.config"); + LoadXmlConfig(string.Concat(configFilePath)); + } + catch (Exception e) + { + _logger.Error(e, "Error when parsing unVersion.config."); + } + } private void LoadXmlConfig(string configPath) { if (!File.Exists(configPath)) { - Logger.Warn("Couldn't find config file " + configPath); + _logger.Warn("Couldn't find config file " + configPath); return; } @@ -39,7 +52,7 @@ private void LoadXmlConfig(string configPath) { DocTypeAlias = xmlConfigEntry.Attributes["docTypeAlias"] != null ? xmlConfigEntry.Attributes["docTypeAlias"].Value - : "$_ALL" + : AllDocumentTypesKey }; if (xmlConfigEntry.Attributes["rootXpath"] != null) diff --git a/src/Our.Umbraco.UnVersion/UnVersionContext.cs b/src/Our.Umbraco.UnVersion/UnVersionContext.cs deleted file mode 100644 index be6a538..0000000 --- a/src/Our.Umbraco.UnVersion/UnVersionContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using Our.Umbraco.UnVersion.Services; - -namespace Our.Umbraco.UnVersion -{ - public class UnVersionContext - { - public IUnVersionService UnVersionService { get; internal set; } - - #region Singleton - - private static readonly Lazy _instance = new Lazy(() => new UnVersionContext()); - - public static UnVersionContext Instance - { - get { return _instance.Value; } - } - - private UnVersionContext() { } - - #endregion - } -} \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion/Web/UI/Config/unVersion.config b/src/Our.Umbraco.UnVersion/Web/UI/Config/unVersion.config index 27dd576..514d749 100644 --- a/src/Our.Umbraco.UnVersion/Web/UI/Config/unVersion.config +++ b/src/Our.Umbraco.UnVersion/Web/UI/Config/unVersion.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion/app.config b/src/Our.Umbraco.UnVersion/app.config new file mode 100644 index 0000000..430296e --- /dev/null +++ b/src/Our.Umbraco.UnVersion/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Our.Umbraco.UnVersion/packages.config b/src/Our.Umbraco.UnVersion/packages.config index d0f2fca..e4a9699 100644 --- a/src/Our.Umbraco.UnVersion/packages.config +++ b/src/Our.Umbraco.UnVersion/packages.config @@ -1,25 +1,57 @@  - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file