Skip to content

Commit 4d8da80

Browse files
authored
Merge pull request #216 from umbraco/feature/algolia-geoloc-support
Add Algolia geolocation service
2 parents af4c810 + b0fa4e3 commit 4d8da80

File tree

10 files changed

+63
-12
lines changed

10 files changed

+63
-12
lines changed

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

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

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

40+
builder.Services.AddSingleton<IAlgoliaGeolocationProvider, AlgoliaNullGeolocationProvider>();
41+
4042
builder.AddAlgoliaConverters();
4143
}
4244

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Umbraco.Cms.Core.Routing;
44
using Umbraco.Cms.Core.Services;
55
using Umbraco.Cms.Core.Web;
6-
using Umbraco.Cms.Integrations.Search.Algolia.Extensions;
76
using Umbraco.Cms.Integrations.Search.Algolia.Models;
87
using Umbraco.Cms.Integrations.Search.Algolia.Services;
98
using Umbraco.Extensions;
@@ -24,10 +23,15 @@ public class ContentRecordBuilder
2423

2524
private readonly IUmbracoContextFactory _umbracoContextFactory;
2625

27-
public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlProvider,
26+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
27+
28+
public ContentRecordBuilder(
29+
IUserService userService,
30+
IPublishedUrlProvider urlProvider,
2831
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
2932
IRecordBuilderFactory recordBuilderFactory,
30-
IUmbracoContextFactory umbracoContextFactory)
33+
IUmbracoContextFactory umbracoContextFactory,
34+
IAlgoliaGeolocationProvider algoliaGeolocationProvider)
3135
{
3236
_userService = userService;
3337

@@ -38,6 +42,8 @@ public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlP
3842
_recordBuilderFactory = recordBuilderFactory;
3943

4044
_umbracoContextFactory = umbracoContextFactory;
45+
46+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
4147
}
4248

4349
public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, bool> filter = null)
@@ -64,6 +70,7 @@ public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, b
6470
_record.Path = content.Path.Split(',').ToList();
6571
_record.ContentTypeAlias = content.ContentType.Alias;
6672
_record.Url = _urlProvider.GetUrl(content.Id);
73+
_record.GeolocationData = _algoliaGeolocationProvider.GetGeolocationAsync().ConfigureAwait(false).GetAwaiter().GetResult();
6774
_record.Data = new();
6875

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

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class SearchController : UmbracoAuthorizedApiController
3737

3838
private readonly IAlgoliaSearchPropertyIndexValueFactory _algoliaSearchPropertyIndexValueFactory;
3939

40+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
41+
4042
private readonly IUmbracoContextFactory _umbracoContextFactory;
4143

4244
private readonly ILogger<SearchController> _logger;
@@ -53,7 +55,8 @@ public SearchController(
5355
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
5456
IUmbracoContextFactory umbracoContextFactory,
5557
ILogger<SearchController> logger,
56-
IRecordBuilderFactory recordBuilderFactory)
58+
IRecordBuilderFactory recordBuilderFactory,
59+
IAlgoliaGeolocationProvider algoliaGeolocationProvider)
5760
{
5861
_indexService = indexService;
5962

@@ -74,6 +77,8 @@ public SearchController(
7477
_logger = logger;
7578

7679
_recordBuilderFactory = recordBuilderFactory;
80+
81+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
7782
}
7883

7984
[HttpGet]
@@ -136,7 +141,13 @@ public async Task<IActionResult> BuildIndex([FromBody] IndexConfiguration indexC
136141

137142
foreach (var contentItem in contentItems.Where(p => !p.Trashed))
138143
{
139-
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory, _recordBuilderFactory, _umbracoContextFactory)
144+
var record = new ContentRecordBuilder(
145+
_userService,
146+
_urlProvider,
147+
_algoliaSearchPropertyIndexValueFactory,
148+
_recordBuilderFactory,
149+
_umbracoContextFactory,
150+
_algoliaGeolocationProvider)
140151
.BuildFromContent(contentItem, (p) => contentDataItem.Properties.Any(q => q.Alias == p.Alias))
141152
.Build();
142153

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public class AlgoliaContentCacheRefresherHandler : INotificationAsyncHandler<Con
3535

3636
private readonly IAlgoliaSearchPropertyIndexValueFactory _algoliaSearchPropertyIndexValueFactory;
3737

38+
private readonly IAlgoliaGeolocationProvider _algoliaGeolocationProvider;
39+
3840
private readonly IRecordBuilderFactory _recordBuilderFactory;
3941

4042
private readonly IUmbracoContextFactory _umbracoContextFactory;
@@ -48,6 +50,7 @@ public AlgoliaContentCacheRefresherHandler(
4850
IUserService userService,
4951
IPublishedUrlProvider urlProvider,
5052
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
53+
IAlgoliaGeolocationProvider algoliaGeolocationProvider,
5154
IRecordBuilderFactory recordBuilderFactory,
5255
IUmbracoContextFactory umbracoContextFactory)
5356
{
@@ -59,6 +62,7 @@ public AlgoliaContentCacheRefresherHandler(
5962
_userService = userService;
6063
_urlProvider = urlProvider;
6164
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
65+
_algoliaGeolocationProvider = algoliaGeolocationProvider;
6266
_recordBuilderFactory = recordBuilderFactory;
6367
_umbracoContextFactory = umbracoContextFactory;
6468
}
@@ -107,7 +111,13 @@ protected async Task RebuildIndex(IEnumerable<IContent> entities)
107111
.FirstOrDefault(p => p.ContentType.Alias == entity.ContentType.Alias);
108112
if (indexConfiguration == null || indexConfiguration.ContentType.Alias != entity.ContentType.Alias) continue;
109113

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

src/Umbraco.Cms.Integrations.Search.Algolia/Models/GeolocProperties.cs renamed to src/Umbraco.Cms.Integrations.Search.Algolia/Models/GeolocationEntity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Umbraco.Cms.Integrations.Search.Algolia.Models
44
{
5-
public class GeolocProperties
5+
public class GeolocationEntity
66
{
77
[JsonProperty("lat")]
88
public double Latitude { get; set; }

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class Record
77
public Record()
88
{
99
Data = new Dictionary<string, object>();
10-
Geoloc = new List<GeolocProperties>();
10+
GeolocationData = new List<GeolocationEntity>();
1111
}
1212

1313
public Record(Record record)
@@ -25,7 +25,7 @@ public Record(Record record)
2525
Path = record.Path;
2626
Url = record.Url;
2727
Data = record.Data;
28-
Geoloc = record.Geoloc;
28+
GeolocationData = record.GeolocationData;
2929
}
3030

3131
public string ObjectID { get; set; }
@@ -63,7 +63,7 @@ public Record(Record record)
6363
public string Url { get; set; }
6464

6565
[JsonProperty("_geoloc")]
66-
public List<GeolocProperties> Geoloc { get; set; }
66+
public List<GeolocationEntity> GeolocationData { get; set; }
6767

6868
public Dictionary<string, object> Data { get; set; }
6969
}

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>2.2.2</Version>
16+
<Version>2.3.0</Version>
1717
<Authors>Umbraco HQ</Authors>
1818
<Company>Umbraco</Company>
1919
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>

0 commit comments

Comments
 (0)