From 7e7d9da144f2aec1821d3bfce2105b73a3b5c6a3 Mon Sep 17 00:00:00 2001 From: Anders Reus <88318565+andersreus@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:40:18 +0200 Subject: [PATCH] Added trashed state so when requesting content from the recycle bin via the management api it will return trashed instead of published state (#20542) Added trashed state so when requesting content from the recycle bin via the management api, the state will be trashed instead of published. --- .../Content/DocumentVariantStateHelper.cs | 9 +++- .../Document/DocumentVariantState.cs | 5 ++ .../DocumentVariantStateHelperTests.cs | 54 ++++++++++--------- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelper.cs b/src/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelper.cs index 6d7539b825..f565b9cdf0 100644 --- a/src/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelper.cs +++ b/src/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelper.cs @@ -12,6 +12,7 @@ internal static class DocumentVariantStateHelper culture, content.Edited, content.Published, + content.Trashed, content.AvailableCultures, content.EditedCultures ?? Enumerable.Empty(), content.PublishedCultures); @@ -22,17 +23,23 @@ internal static class DocumentVariantStateHelper culture, content.Edited, content.Published, + content.Trashed, content.CultureNames.Keys, content.EditedCultures, content.PublishedCultures); - private static DocumentVariantState GetState(IEntity entity, string? culture, bool edited, bool published, IEnumerable availableCultures, IEnumerable editedCultures, IEnumerable publishedCultures) + private static DocumentVariantState GetState(IEntity entity, string? culture, bool edited, bool published, bool trashed, IEnumerable availableCultures, IEnumerable editedCultures, IEnumerable publishedCultures) { if (entity.Id <= 0 || (culture is not null && availableCultures.Contains(culture) is false)) { return DocumentVariantState.NotCreated; } + if (trashed) + { + return DocumentVariantState.Trashed; + } + var isDraft = published is false || (culture != null && publishedCultures.Contains(culture) is false); if (isDraft) diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantState.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantState.cs index 3ed51114e1..d3edd54cd9 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantState.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantState.cs @@ -24,4 +24,9 @@ public enum DocumentVariantState /// The item is published and there are pending changes /// PublishedPendingChanges = 4, + + /// + /// The item is in the recycle bin + /// + Trashed = 5, } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelperTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelperTests.cs index d63eda2eed..f3c0fe9f70 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelperTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Mapping/Content/DocumentVariantStateHelperTests.cs @@ -11,13 +11,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Mapping.Content [TestFixture] public class DocumentVariantStateHelperTests { - [TestCase(false, false, DocumentVariantState.Draft)] - [TestCase(false, true, DocumentVariantState.Published)] - [TestCase(true, false, DocumentVariantState.Draft)] - [TestCase(true, true, DocumentVariantState.PublishedPendingChanges)] - public void Culture_Invariant_Content_State(bool edited, bool published, DocumentVariantState expectedResult) + [TestCase(false, false, false, DocumentVariantState.Draft)] + [TestCase(false, true, false, DocumentVariantState.Published)] + [TestCase(true, false, false, DocumentVariantState.Draft)] + [TestCase(true, true, false, DocumentVariantState.PublishedPendingChanges)] + [TestCase(true, false, true, DocumentVariantState.Trashed)] + public void Culture_Invariant_Content_State(bool edited, bool published, bool trashed, DocumentVariantState expectedResult) { - var content = Mock.Of(c => c.Id == 1 && c.Published == published && c.Edited == edited); + var content = Mock.Of(c => c.Id == 1 && c.Published == published && c.Edited == edited && c.Trashed == trashed); Assert.AreEqual(expectedResult, DocumentVariantStateHelper.GetState(content, culture: null)); } @@ -31,11 +32,12 @@ public class DocumentVariantStateHelperTests Assert.AreEqual(DocumentVariantState.NotCreated, DocumentVariantStateHelper.GetState(content, culture: null)); } - [TestCase(false, false, DocumentVariantState.Draft)] - [TestCase(false, true, DocumentVariantState.Published)] - [TestCase(true, false, DocumentVariantState.Draft)] - [TestCase(true, true, DocumentVariantState.PublishedPendingChanges)] - public void Culture_Variant_Content_Existing_Culture_State(bool edited, bool published, DocumentVariantState expectedResult) + [TestCase(false, false, false, DocumentVariantState.Draft)] + [TestCase(false, true, false, DocumentVariantState.Published)] + [TestCase(true, false, false, DocumentVariantState.Draft)] + [TestCase(true, true, false, DocumentVariantState.PublishedPendingChanges)] + [TestCase(true, false, true, DocumentVariantState.Trashed)] + public void Culture_Variant_Content_Existing_Culture_State(bool edited, bool published, bool trashed, DocumentVariantState expectedResult) { const string culture = "en"; var content = Mock.Of(c => @@ -43,7 +45,8 @@ public class DocumentVariantStateHelperTests && c.AvailableCultures == new[] { culture } && c.EditedCultures == (edited ? new[] { culture } : Enumerable.Empty()) && c.Published == published - && c.PublishedCultures == (published ? new[] { culture } : Enumerable.Empty())); + && c.PublishedCultures == (published ? new[] { culture } : Enumerable.Empty()) + && c.Trashed == trashed); Assert.AreEqual(expectedResult, DocumentVariantStateHelper.GetState(content, culture)); } @@ -63,13 +66,14 @@ public class DocumentVariantStateHelperTests Assert.AreEqual(DocumentVariantState.NotCreated, DocumentVariantStateHelper.GetState(content, "dk")); } - [TestCase(false, false, DocumentVariantState.Draft)] - [TestCase(false, true, DocumentVariantState.Published)] - [TestCase(true, false, DocumentVariantState.Draft)] - [TestCase(true, true, DocumentVariantState.PublishedPendingChanges)] - public void Culture_Invariant_DocumentEntitySlim_State(bool edited, bool published, DocumentVariantState expectedResult) + [TestCase(false, false, false, DocumentVariantState.Draft)] + [TestCase(false, true, false, DocumentVariantState.Published)] + [TestCase(true, false, false, DocumentVariantState.Draft)] + [TestCase(true, true, false, DocumentVariantState.PublishedPendingChanges)] + [TestCase(true, false, true, DocumentVariantState.Trashed)] + public void Culture_Invariant_DocumentEntitySlim_State(bool edited, bool published, bool trashed, DocumentVariantState expectedResult) { - var entity = Mock.Of(c => c.Id == 1 && c.Published == published && c.Edited == edited && c.CultureNames == new Dictionary()); + var entity = Mock.Of(c => c.Id == 1 && c.Published == published && c.Edited == edited && c.CultureNames == new Dictionary() && c.Trashed == trashed); Assert.AreEqual(expectedResult, DocumentVariantStateHelper.GetState(entity, culture: null)); } @@ -83,11 +87,12 @@ public class DocumentVariantStateHelperTests Assert.AreEqual(DocumentVariantState.NotCreated, DocumentVariantStateHelper.GetState(entity, culture: null)); } - [TestCase(false, false, DocumentVariantState.Draft)] - [TestCase(false, true, DocumentVariantState.Published)] - [TestCase(true, false, DocumentVariantState.Draft)] - [TestCase(true, true, DocumentVariantState.PublishedPendingChanges)] - public void Culture_Variant_DocumentEntitySlim_Existing_Culture_State(bool edited, bool published, DocumentVariantState expectedResult) + [TestCase(false, false, false, DocumentVariantState.Draft)] + [TestCase(false, true, false, DocumentVariantState.Published)] + [TestCase(true, false, false, DocumentVariantState.Draft)] + [TestCase(true, true, false, DocumentVariantState.PublishedPendingChanges)] + [TestCase(true, false, true, DocumentVariantState.Trashed)] + public void Culture_Variant_DocumentEntitySlim_Existing_Culture_State(bool edited, bool published, bool trashed, DocumentVariantState expectedResult) { const string culture = "en"; var entity = Mock.Of(c => @@ -95,7 +100,8 @@ public class DocumentVariantStateHelperTests && c.CultureNames == new Dictionary { { culture, "value does not matter" } } && c.EditedCultures == (edited ? new[] { culture } : Enumerable.Empty()) && c.Published == published - && c.PublishedCultures == (published ? new[] { culture } : Enumerable.Empty())); + && c.PublishedCultures == (published ? new[] { culture } : Enumerable.Empty()) + && c.Trashed == trashed); Assert.AreEqual(expectedResult, DocumentVariantStateHelper.GetState(entity, culture)); }