Skip to content

Commit 949b163

Browse files
committed
Stub implementation of sign provider for documents with a scheduled publish pending.
1 parent 2d0a1a0 commit 949b163

File tree

8 files changed

+92
-12
lines changed

8 files changed

+92
-12
lines changed

src/Umbraco.Cms.Api.Management/Controllers/Tree/EntityTreeControllerBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ protected virtual TItem[] MapTreeItemViewModels(Guid? parentKey, IEntitySlim[] e
147147

148148
protected virtual async Task PopulateSigns(TItem[] treeItemViewModels, IEnumerable<IEntitySlim> entities)
149149
{
150-
foreach (ISignProvider signProvider in _signProviders)
150+
foreach (ISignProvider signProvider in _signProviders.Where(x => x.CanProvideTreeSigns<TItem>()))
151151
{
152152
await signProvider.PopulateTreeSignsAsync(treeItemViewModels, entities);
153153
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Umbraco.Cms.Api.Management.Services.Signs;
2+
using Umbraco.Cms.Core.DependencyInjection;
3+
4+
namespace Umbraco.Extensions
5+
{
6+
/// <summary>
7+
/// Extension methods for <see cref="IUmbracoBuilder"/> for the Umbraco back office
8+
/// </summary>
9+
public static partial class UmbracoBuilderExtensions
10+
{
11+
internal static void AddCollectionBuilders(this IUmbracoBuilder builder)
12+
{
13+
builder.SignProviders()
14+
.Append<HasScheduleSignProvider>();
15+
}
16+
17+
/// <summary>
18+
/// Gets the sign providers collection builder.
19+
/// </summary>
20+
/// <param name="builder">The builder.</param>
21+
public static SignProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder)
22+
=> builder.WithCollectionBuilder<SignProviderCollectionBuilder>();
23+
}
24+
}

src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilderExtensions.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
using Umbraco.Cms.Api.Management.Routing;
88
using Umbraco.Cms.Api.Management.Serialization;
99
using Umbraco.Cms.Api.Management.Services;
10-
using Umbraco.Cms.Api.Management.Services.Signs;
1110
using Umbraco.Cms.Core;
1211
using Umbraco.Cms.Core.DependencyInjection;
1312
using Umbraco.Cms.Core.Services;
14-
using Umbraco.Cms.Core.Services.Filters;
1513
using Umbraco.Cms.Web.Common.ApplicationBuilder;
1614

1715
namespace Umbraco.Extensions;
@@ -97,15 +95,8 @@ public static IUmbracoBuilder AddUmbracoManagementApi(this IUmbracoBuilder build
9795
});
9896
}
9997

100-
builder.SignProviders();
98+
builder.AddCollectionBuilders();
10199

102100
return builder;
103101
}
104-
105-
/// <summary>
106-
/// Gets the sign providers collection builder.
107-
/// </summary>
108-
/// <param name="builder">The builder.</param>
109-
public static SignProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder)
110-
=> builder.WithCollectionBuilder<SignProviderCollectionBuilder>();
111102
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Umbraco.Cms.Api.Management.ViewModels.Tree;
2+
using Umbraco.Cms.Core.Models.Entities;
3+
using Umbraco.Cms.Core.Services;
4+
using Umbraco.Extensions;
5+
6+
namespace Umbraco.Cms.Api.Management.Services.Signs;
7+
8+
/// <summary>
9+
/// Implements a <see cref="SignProviderCollection"/> that provides signs for content items that have a schedule.
10+
/// </summary>
11+
internal class HasScheduleSignProvider : ISignProvider
12+
{
13+
private const string Alias = "ScheduledForPublish";
14+
15+
private readonly IContentService _contentService;
16+
17+
/// <summary>
18+
/// Initializes a new instance of the <see cref="HasScheduleSignProvider"/> class.
19+
/// </summary>
20+
public HasScheduleSignProvider(IContentService contentService) => _contentService = contentService;
21+
22+
/// <inheritdoc/>
23+
public bool CanProvideTreeSigns<TItem>() => typeof(TItem) == typeof(DocumentTreeItemResponseModel);
24+
25+
/// <inheritdoc/>
26+
public Task PopulateTreeSignsAsync<TItem>(TItem[] treeItemViewModels, IEnumerable<IEntitySlim> entities)
27+
where TItem : EntityTreeItemResponseModel, new()
28+
{
29+
IEnumerable<Guid> contentKeysScheduledForPublishing = _contentService.GetScheduledContentKeys(treeItemViewModels.Select(x => x.Id));
30+
foreach (Guid key in contentKeysScheduledForPublishing)
31+
{
32+
treeItemViewModels.First(x => x.Id == key).AddSign(Core.Constants.System.UmbracoSignProvider, Alias);
33+
}
34+
35+
return Task.CompletedTask;
36+
}
37+
}

src/Umbraco.Cms.Api.Management/Services/Signs/ISignProvider.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Diagnostics.Eventing.Reader;
12
using Umbraco.Cms.Api.Management.ViewModels.Tree;
23
using Umbraco.Cms.Core.Models.Entities;
34

@@ -8,6 +9,13 @@ namespace Umbraco.Cms.Api.Management.Services.Signs;
89
/// </summary>
910
public interface ISignProvider
1011
{
12+
/// <summary>
13+
/// Gets a value indicating whether this provider can provide tree signs for the specified item type.
14+
/// </summary>
15+
/// <typeparam name="TItem">Type of tree item view model.</typeparam>
16+
/// <returns></returns>
17+
bool CanProvideTreeSigns<TItem>();
18+
1119
/// <summary>
1220
/// Populates the provided tree item view models with signs.
1321
/// </summary>

src/Umbraco.Cms.Api.Management/ViewModels/Tree/EntityTreeItemResponseModel.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@ namespace Umbraco.Cms.Api.Management.ViewModels.Tree;
22

33
public class EntityTreeItemResponseModel : TreeItemPresentationModel
44
{
5+
private readonly List<SignModel> _signs = [];
6+
57
public Guid Id { get; set; }
68

79
public ReferenceByIdModel? Parent { get; set; }
810

9-
public IEnumerable<SignModel> Signs { get; set; } = [];
11+
public IEnumerable<SignModel> Signs => _signs.AsEnumerable();
12+
13+
public void AddSign(string provider, string alias) => _signs.Add(new SignModel { Provider = provider, Alias = alias });
14+
15+
public void RemoveSign(string provider, string alias) => _signs.RemoveAll(x => x.Provider == provider && x.Alias == alias);
1016
}

src/Umbraco.Core/Constants-System.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,10 @@ public static class System
115115
public const string DataDirectoryPlaceholder = "|DataDirectory|";
116116

117117
public const string InvariantCulture = "*";
118+
119+
/// <summary>
120+
/// The provider name for Umbraco core backoffice tree and collection signs.
121+
/// </summary>
122+
public const string UmbracoSignProvider = "umbCore";
118123
}
119124
}

src/Umbraco.Core/Services/IContentService.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,15 @@ IContent CreateBlueprintFromContent(IContent blueprint, string name, int userId
275275
/// </summary>
276276
bool HasChildren(int id);
277277

278+
/// <summary>
279+
/// Gets the content Ids from the provided collection of content Ids that are scheduled for publishing.
280+
/// </summary>
281+
/// <param name="keys">The content keys </param>
282+
/// <returns>
283+
/// The provided collection of content Ids filtered for those that are scheduled for publishing.
284+
/// </returns>
285+
IEnumerable<Guid> GetScheduledContentKeys(IEnumerable<Guid> keys) => keys.Count() > 0 ? [keys.First()] : [];
286+
278287
#endregion
279288

280289
#region Save, Delete Document

0 commit comments

Comments
 (0)