Skip to content

Commit 23b897e

Browse files
authored
Merge pull request #217 from umbraco/feature/v14/algolia-geolocation
Add geolocation extensibility for Algolia
2 parents 435505f + 8f4772a commit 23b897e

File tree

10 files changed

+79
-9
lines changed

10 files changed

+79
-9
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public void Compose(IUmbracoBuilder builder)
3636

3737
builder.Services.AddScoped<IAlgoliaSearchPropertyIndexValueFactory, AlgoliaSearchPropertyIndexValueFactory>();
3838

39+
builder.Services.AddSingleton<IAlgoliaGeolocationProvider, AlgoliaNullGeolocationProvider>();
40+
3941
builder.AddAlgoliaConverters();
4042

4143
// Generate Swagger documentation for Algolia Search API

src/Umbraco.Cms.Integrations.Search.Algolia/Api/Management/Controllers/BuildIndexController.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class BuildIndexController : SearchControllerBase
2727
private readonly IPublishedUrlProvider _urlProvider;
2828
private readonly IAlgoliaSearchPropertyIndexValueFactory _algoliaSearchPropertyIndexValueFactory;
2929
private readonly IRecordBuilderFactory _recordBuilderFactory;
30+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
3031

3132
public BuildIndexController(
3233
IAlgoliaIndexDefinitionStorage<AlgoliaIndex> indexStorage,
@@ -37,7 +38,8 @@ public BuildIndexController(
3738
IUserService userService,
3839
IPublishedUrlProvider urlProvider,
3940
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
40-
IRecordBuilderFactory recordBuilderFactory)
41+
IRecordBuilderFactory recordBuilderFactory,
42+
IAlgoliaGeolocationProvider algoliaGeolocationProvider)
4143
{
4244
_indexStorage = indexStorage;
4345
_umbracoContextFactory = umbracoContextFactory;
@@ -48,6 +50,7 @@ public BuildIndexController(
4850
_urlProvider = urlProvider;
4951
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
5052
_recordBuilderFactory = recordBuilderFactory;
53+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
5154
}
5255

5356
[HttpPost("index/build")]
@@ -82,7 +85,13 @@ public async Task<IActionResult> BuildIndex([FromBody] IndexConfiguration indexC
8285

8386
foreach (var contentItem in contentItems.Where(p => !p.Trashed))
8487
{
85-
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory, _recordBuilderFactory, _umbracoContextFactory)
88+
var record = new ContentRecordBuilder(
89+
_userService,
90+
_urlProvider,
91+
_algoliaSearchPropertyIndexValueFactory,
92+
_recordBuilderFactory,
93+
_umbracoContextFactory,
94+
_algoliaGeolocationProvider)
8695
.BuildFromContent(contentItem, (p) => contentDataItem.Properties.Any(q => q.Alias == p.Alias))
8796
.Build();
8897

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ public class ContentRecordBuilder
2323

2424
private readonly IUmbracoContextFactory _umbracoContextFactory;
2525

26-
public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlProvider,
26+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
27+
28+
public ContentRecordBuilder(
29+
IUserService userService,
30+
IPublishedUrlProvider urlProvider,
2731
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
2832
IRecordBuilderFactory recordBuilderFactory,
29-
IUmbracoContextFactory umbracoContextFactory)
33+
IUmbracoContextFactory umbracoContextFactory,
34+
IAlgoliaGeolocationProvider algoliaGeolocationProvider)
3035
{
3136
_userService = userService;
3237

@@ -37,6 +42,8 @@ public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlP
3742
_recordBuilderFactory = recordBuilderFactory;
3843

3944
_umbracoContextFactory = umbracoContextFactory;
45+
46+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
4047
}
4148

4249
public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, bool> filter = null)
@@ -63,6 +70,7 @@ public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, b
6370
_record.Path = content.Path.Split(',').ToList();
6471
_record.ContentTypeAlias = content.ContentType.Alias;
6572
_record.Url = _urlProvider.GetUrl(content.Id);
73+
_record.GeolocationData = _algoliaGeolocationProvider.GetGeolocationAsync().ConfigureAwait(false).GetAwaiter().GetResult();
6674
_record.Data = new();
6775

6876
if (content.PublishedCultures.Count() > 0)

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class AlgoliaContentCacheRefresherHandler : INotificationAsyncHandler<Con
4040

4141
private readonly IUmbracoContextFactory _umbracoContextFactory;
4242

43+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
44+
4345
public AlgoliaContentCacheRefresherHandler(
4446
IServerRoleAccessor serverRoleAccessor,
4547
ILogger<AlgoliaContentCacheRefresherHandler> logger,
@@ -50,7 +52,8 @@ public AlgoliaContentCacheRefresherHandler(
5052
IPublishedUrlProvider urlProvider,
5153
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
5254
IRecordBuilderFactory recordBuilderFactory,
53-
IUmbracoContextFactory umbracoContextFactory)
55+
IUmbracoContextFactory umbracoContextFactory,
56+
IAlgoliaGeolocationProvider algoliaGeolocationProvider)
5457
{
5558
_serverRoleAccessor = serverRoleAccessor;
5659
_contentService = contentService;
@@ -62,6 +65,7 @@ public AlgoliaContentCacheRefresherHandler(
6265
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
6366
_recordBuilderFactory = recordBuilderFactory;
6467
_umbracoContextFactory = umbracoContextFactory;
68+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
6569
}
6670

6771
public async Task HandleAsync(ContentCacheRefresherNotification notification, CancellationToken cancellationToken)
@@ -108,7 +112,13 @@ protected async Task RebuildIndex(IEnumerable<IContent> entities)
108112
.FirstOrDefault(p => p.Alias == entity.ContentType.Alias);
109113
if (indexConfiguration == null || indexConfiguration.Alias != entity.ContentType.Alias) continue;
110114

111-
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory, _recordBuilderFactory, _umbracoContextFactory)
115+
var record = new ContentRecordBuilder(
116+
_userService,
117+
_urlProvider,
118+
_algoliaSearchPropertyIndexValueFactory,
119+
_recordBuilderFactory,
120+
_umbracoContextFactory,
121+
_algoliaGeolocationProvider)
112122
.BuildFromContent(entity, (p) => indexConfiguration.Properties.Any(q => q.Alias == p.Alias))
113123
.Build();
114124

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Newtonsoft.Json;
2+
3+
namespace Umbraco.Cms.Integrations.Search.Algolia.Models
4+
{
5+
public class GeolocationEntity
6+
{
7+
[JsonProperty("lat")]
8+
public double Latitude { get; set; }
9+
10+
[JsonProperty("lng")]
11+
public double Longitude { get; set; }
12+
}
13+
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
namespace Umbraco.Cms.Integrations.Search.Algolia.Models
1+
using Newtonsoft.Json;
2+
3+
namespace Umbraco.Cms.Integrations.Search.Algolia.Models
24
{
35
public class Record
46
{
57
public Record()
68
{
79
Data = new Dictionary<string, object>();
10+
GeolocationData = new List<GeolocationEntity>();
811
}
912

1013
public Record(Record record)
@@ -22,6 +25,7 @@ public Record(Record record)
2225
Path = record.Path;
2326
Url = record.Url;
2427
Data = record.Data;
28+
GeolocationData = record.GeolocationData;
2529
}
2630

2731
public string ObjectID { get; set; }
@@ -58,6 +62,9 @@ public Record(Record record)
5862

5963
public string Url { get; set; }
6064

65+
[JsonProperty("_geoloc")]
66+
public List<GeolocationEntity> GeolocationData { get; set; }
67+
6168
public Dictionary<string, object> Data { get; set; }
6269
}
6370
}

src/Umbraco.Cms.Integrations.Search.Algolia/Services/AlgoliaIndexService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ namespace Umbraco.Cms.Integrations.Search.Algolia.Services
1111
public class AlgoliaIndexService : IAlgoliaIndexService
1212
{
1313
private readonly AlgoliaSettings _settings;
14+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
1415

15-
public AlgoliaIndexService(IOptions<AlgoliaSettings> options)
16+
public AlgoliaIndexService(IOptions<AlgoliaSettings> options, IAlgoliaGeolocationProvider algoliaGeolocationProvider)
1617
{
1718
_settings = options.Value;
19+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
1820
}
1921

2022
public async Task<Result> PushData(string name, List<Record> payload = null)
@@ -30,6 +32,7 @@ await index.SaveObjectsAsync(payload != null
3032
: new List<Record> {
3133
new Record {
3234
ObjectID = Guid.NewGuid().ToString(),
35+
GeolocationData = await _algoliaGeolocationProvider.GetGeolocationAsync(),
3336
Data = new Dictionary<string, object>()}
3437
}, autoGenerateObjectId: false);
3538

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Umbraco.Cms.Integrations.Search.Algolia.Models;
2+
3+
namespace Umbraco.Cms.Integrations.Search.Algolia.Services
4+
{
5+
public class AlgoliaNullGeolocationProvider : IAlgoliaGeolocationProvider
6+
{
7+
public async Task<List<GeolocationEntity>> GetGeolocationAsync() => null;
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Umbraco.Cms.Integrations.Search.Algolia.Models;
2+
3+
namespace Umbraco.Cms.Integrations.Search.Algolia.Services
4+
{
5+
public interface IAlgoliaGeolocationProvider
6+
{
7+
Task<List<GeolocationEntity>> GetGeolocationAsync();
8+
}
9+
}

src/Umbraco.Cms.Integrations.Search.Algolia/Umbraco.Cms.Integrations.Search.Algolia.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<PackageIconUrl></PackageIconUrl>
1414
<PackageProjectUrl>https://github.com/umbraco/Umbraco.Cms.Integrations/tree/main/src/Umbraco.Cms.Integrations.Search.Algolia</PackageProjectUrl>
1515
<RepositoryUrl>https://github.com/umbraco/Umbraco.Cms.Integrations</RepositoryUrl>
16-
<Version>3.0.1</Version>
16+
<Version>3.1.0</Version>
1717
<Authors>Umbraco HQ</Authors>
1818
<Company>Umbraco</Company>
1919
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>

0 commit comments

Comments
 (0)