Skip to content

Commit 2ea3f04

Browse files
possibility to add custom record values
1 parent 4723fe3 commit 2ea3f04

File tree

8 files changed

+136
-15
lines changed

8 files changed

+136
-15
lines changed

src/Umbraco.Cms.Integrations.Search.Algolia/AlgoliaComposer.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Umbraco.Cms.Core.DependencyInjection;
77
using Umbraco.Cms.Core.Notifications;
88
using Umbraco.Cms.Integrations.Search.Algolia;
9+
using Umbraco.Cms.Integrations.Search.Algolia.Builders;
910
using Umbraco.Cms.Integrations.Search.Algolia.Configuration;
1011
using Umbraco.Cms.Integrations.Search.Algolia.Extensions;
1112
using Umbraco.Cms.Integrations.Search.Algolia.Handlers;
@@ -32,6 +33,8 @@ public void Compose(IUmbracoBuilder builder)
3233

3334
builder.Services.AddScoped<IAlgoliaIndexDefinitionStorage<AlgoliaIndex>, AlgoliaIndexDefinitionStorage>();
3435

36+
builder.Services.AddScoped<IRecordBuilderFactory, RecordBuilderFactory>();
37+
3538
builder.Services.AddScoped<IAlgoliaSearchPropertyIndexValueFactory, AlgoliaSearchPropertyIndexValueFactory>();
3639

3740
builder.AddAlgoliaConverters();

src/Umbraco.Cms.Integrations.Search.Algolia/Builders/ContentRecordBuilder.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Umbraco.Cms.Core.Models;
2-
using Umbraco.Cms.Core.Models.PublishedContent;
32
using Umbraco.Cms.Core.Routing;
43
using Umbraco.Cms.Core.Services;
54
using Umbraco.Cms.Integrations.Search.Algolia.Models;
@@ -10,21 +9,25 @@ namespace Umbraco.Cms.Integrations.Search.Algolia.Builders
109
{
1110
public class ContentRecordBuilder
1211
{
13-
private readonly Record _record = new();
12+
private Record _record = new();
1413

1514
private readonly IUserService _userService;
1615

1716
private readonly IPublishedUrlProvider _urlProvider;
1817

1918
private readonly IAlgoliaSearchPropertyIndexValueFactory _algoliaSearchPropertyIndexValueFactory;
2019

21-
public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlProvider, IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory)
20+
private readonly IRecordBuilderFactory _recordBuilderFactory;
21+
22+
public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlProvider, IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory, IRecordBuilderFactory recordBuilderFactory)
2223
{
2324
_userService = userService;
2425

2526
_urlProvider = urlProvider;
2627

2728
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
29+
30+
_recordBuilderFactory = recordBuilderFactory;
2831
}
2932

3033
public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, bool> filter = null)
@@ -47,6 +50,7 @@ public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, b
4750
_record.Path = content.Path;
4851
_record.ContentTypeAlias = content.ContentType.Alias;
4952
_record.Url = _urlProvider.GetUrl(content.Id);
53+
_record.Data = new();
5054

5155
if (content.PublishedCultures.Count() > 0)
5256
{
@@ -79,9 +83,28 @@ public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, b
7983
}
8084
}
8185

86+
AddCustomValues(_record, content);
87+
8288
return this;
8389
}
8490

8591
public Record Build() => _record;
92+
93+
protected void SetRecord(Record record)
94+
{
95+
_record = record;
96+
}
97+
98+
protected virtual ContentRecordBuilder AddCustomValues(Record record, IContent content)
99+
{
100+
var recordBuilderService = _recordBuilderFactory.GetRecordBuilderService(content);
101+
if (recordBuilderService == null)
102+
{
103+
return this;
104+
}
105+
106+
_record = recordBuilderService.GetRecord(content, record);
107+
return this;
108+
}
86109
}
87110
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Umbraco.Cms.Core.Models;
2+
using Umbraco.Cms.Core.Models.PublishedContent;
3+
using Umbraco.Cms.Integrations.Search.Algolia.Models;
4+
5+
namespace Umbraco.Cms.Integrations.Search.Algolia.Builders
6+
{
7+
public interface IRecordBuilder
8+
{
9+
Record GetRecord(IContent content, Record record);
10+
}
11+
12+
public interface IRecordBuilder<in TContentType>
13+
: IRecordBuilder where TContentType : PublishedContentModel
14+
{
15+
}
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Umbraco.Cms.Core.Models;
2+
3+
namespace Umbraco.Cms.Integrations.Search.Algolia.Builders
4+
{
5+
public interface IRecordBuilderFactory
6+
{
7+
IRecordBuilder GetRecordBuilderService(IContent content);
8+
}
9+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using Umbraco.Cms.Core.Models;
2+
using Umbraco.Cms.Core.Web;
3+
4+
namespace Umbraco.Cms.Integrations.Search.Algolia.Builders
5+
{
6+
public class RecordBuilderFactory : IRecordBuilderFactory
7+
{
8+
private readonly IServiceProvider _serviceProvider;
9+
10+
private readonly IUmbracoContextFactory _umbracoContextFactory;
11+
12+
private readonly IDictionary<string, Type> _recordBuilderCache = new Dictionary<string, Type>();
13+
14+
public RecordBuilderFactory(IServiceProvider serviceProvider, IUmbracoContextFactory umbracoContextFactory)
15+
{
16+
_serviceProvider = serviceProvider;
17+
_umbracoContextFactory = umbracoContextFactory;
18+
}
19+
20+
public IRecordBuilder GetRecordBuilderService(IContent content)
21+
{
22+
using var context = _umbracoContextFactory.EnsureUmbracoContext();
23+
24+
var contentType = context.UmbracoContext.Content
25+
?.GetById(true, content.Id)
26+
?.GetType();
27+
28+
if (contentType == null)
29+
{
30+
return null;
31+
}
32+
var serviceType = GetRecordBuilderType(contentType);
33+
34+
return _serviceProvider.GetService(serviceType) as IRecordBuilder;
35+
}
36+
37+
private Type GetRecordBuilderType(Type contentType)
38+
{
39+
var dictionaryKey = contentType.FullName;
40+
if (_recordBuilderCache.ContainsKey(dictionaryKey))
41+
{
42+
return _recordBuilderCache[dictionaryKey];
43+
}
44+
45+
var type = typeof(IRecordBuilder<>).MakeGenericType(contentType);
46+
_recordBuilderCache[dictionaryKey] = type;
47+
return type;
48+
}
49+
}
50+
}

src/Umbraco.Cms.Integrations.Search.Algolia/Controllers/SearchController.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ public class SearchController : UmbracoAuthorizedApiController
2929

3030
private readonly IAlgoliaIndexDefinitionStorage<AlgoliaIndex> _indexStorage;
3131

32-
private readonly UmbracoHelper _umbracoHelper;
33-
3432
private readonly IUserService _userService;
3533

3634
private readonly IPublishedUrlProvider _urlProvider;
@@ -43,26 +41,26 @@ public class SearchController : UmbracoAuthorizedApiController
4341

4442
private readonly ILogger<SearchController> _logger;
4543

44+
private readonly IRecordBuilderFactory _recordBuilderFactory;
45+
4646
public SearchController(
4747
IAlgoliaIndexService indexService,
4848
IAlgoliaSearchService<SearchResponse<Record>> searchService,
4949
IAlgoliaIndexDefinitionStorage<AlgoliaIndex> indexStorage,
50-
UmbracoHelper umbracoHelper,
5150
IUserService userService,
5251
IPublishedUrlProvider urlProvider,
5352
IContentService contentService,
5453
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
5554
IUmbracoContextFactory umbracoContextFactory,
56-
ILogger<SearchController> logger)
55+
ILogger<SearchController> logger,
56+
IRecordBuilderFactory recordBuilderFactory)
5757
{
5858
_indexService = indexService;
5959

6060
_searchService = searchService;
6161

6262
_indexStorage = indexStorage;
6363

64-
_umbracoHelper = umbracoHelper;
65-
6664
_userService = userService;
6765

6866
_urlProvider = urlProvider;
@@ -74,6 +72,8 @@ public SearchController(
7472
_umbracoContextFactory = umbracoContextFactory;
7573

7674
_logger = logger;
75+
76+
_recordBuilderFactory = recordBuilderFactory;
7777
}
7878

7979
[HttpGet]
@@ -136,7 +136,7 @@ public async Task<IActionResult> BuildIndex([FromBody] IndexConfiguration indexC
136136

137137
foreach (var contentItem in contentItems.Where(p => !p.Trashed))
138138
{
139-
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory)
139+
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory, _recordBuilderFactory)
140140
.BuildFromContent(contentItem, (p) => contentDataItem.Properties.Any(q => q.Alias == p.Alias))
141141
.Build();
142142

src/Umbraco.Cms.Integrations.Search.Algolia/Handlers/AlgoliaContentCacheRefresherHandler.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Text.Json;
1414
using Umbraco.Cms.Integrations.Search.Algolia.Models;
1515
using Umbraco.Cms.Core.Sync;
16+
using Umbraco.Cms.Core.Web;
1617

1718
namespace Umbraco.Cms.Integrations.Search.Algolia.Handlers
1819
{
@@ -34,6 +35,8 @@ public class AlgoliaContentCacheRefresherHandler : INotificationAsyncHandler<Con
3435

3536
private readonly IAlgoliaSearchPropertyIndexValueFactory _algoliaSearchPropertyIndexValueFactory;
3637

38+
private readonly IRecordBuilderFactory _recordBuilderFactory;
39+
3740
public AlgoliaContentCacheRefresherHandler(
3841
IServerRoleAccessor serverRoleAccessor,
3942
ILogger<AlgoliaContentCacheRefresherHandler> logger,
@@ -42,7 +45,8 @@ public AlgoliaContentCacheRefresherHandler(
4245
IAlgoliaIndexService indexService,
4346
IUserService userService,
4447
IPublishedUrlProvider urlProvider,
45-
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory)
48+
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
49+
IRecordBuilderFactory recordBuilderFactory)
4650
{
4751
_serverRoleAccessor = serverRoleAccessor;
4852
_contentService = contentService;
@@ -52,6 +56,7 @@ public AlgoliaContentCacheRefresherHandler(
5256
_userService = userService;
5357
_urlProvider = urlProvider;
5458
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
59+
_recordBuilderFactory = recordBuilderFactory;
5560
}
5661

5762
public async Task HandleAsync(ContentCacheRefresherNotification notification, CancellationToken cancellationToken)
@@ -98,7 +103,7 @@ protected async Task RebuildIndex(IEnumerable<IContent> entities)
98103
.FirstOrDefault(p => p.ContentType.Alias == entity.ContentType.Alias);
99104
if (indexConfiguration == null || indexConfiguration.ContentType.Alias != entity.ContentType.Alias) continue;
100105

101-
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory)
106+
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory, _recordBuilderFactory)
102107
.BuildFromContent(entity, (p) => indexConfiguration.Properties.Any(q => q.Alias == p.Alias))
103108
.Build();
104109

src/Umbraco.Cms.Integrations.Search.Algolia/Models/Record.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Text.Json.Serialization;
2-
3-
namespace Umbraco.Cms.Integrations.Search.Algolia.Models
1+
namespace Umbraco.Cms.Integrations.Search.Algolia.Models
42
{
53
public class Record
64
{
@@ -9,6 +7,23 @@ public Record()
97
Data = new Dictionary<string, object>();
108
}
119

10+
public Record(Record record)
11+
{
12+
ContentTypeAlias = record.ContentTypeAlias;
13+
ObjectID = record.ObjectID;
14+
Id = record.Id;
15+
Name = record.Name;
16+
CreateDate = record.CreateDate;
17+
CreatorName = record.CreatorName;
18+
UpdateDate = record.UpdateDate;
19+
WriterName = record.WriterName;
20+
TemplateId = record.TemplateId;
21+
Level = record.Level;
22+
Path = record.Path;
23+
Url = record.Url;
24+
Data = record.Data;
25+
}
26+
1227
public string ObjectID { get; set; }
1328

1429
public int Id { get; set; }

0 commit comments

Comments
 (0)