Browse Source

Algolia fixes.

pull/579/head
Sebastian 5 years ago
parent
commit
3c732f8d9b
  1. 4
      backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs
  2. 17
      backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaActionHandler.cs
  3. 9
      backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs
  4. 45
      backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchActionHandler.cs
  5. 32
      backend/extensions/Squidex.Extensions/Actions/RuleHelper.cs

4
backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs

@ -43,5 +43,9 @@ namespace Squidex.Extensions.Actions.Algolia
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]
public string Document { get; set; } public string Document { get; set; }
[Display(Name = "Deletion", Description = "The condition when to delete the entry.")]
[DataType(DataType.Text)]
public string Delete { get; set; }
} }
} }

17
backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaActionHandler.cs

@ -13,6 +13,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents;
using Squidex.Domain.Apps.Core.Scripting;
#pragma warning disable IDE0059 // Value assigned to symbol is never used #pragma warning disable IDE0059 // Value assigned to symbol is never used
@ -21,8 +22,9 @@ namespace Squidex.Extensions.Actions.Algolia
public sealed class AlgoliaActionHandler : RuleActionHandler<AlgoliaAction, AlgoliaJob> public sealed class AlgoliaActionHandler : RuleActionHandler<AlgoliaAction, AlgoliaJob>
{ {
private readonly ClientPool<(string AppId, string ApiKey, string IndexName), ISearchIndex> clients; private readonly ClientPool<(string AppId, string ApiKey, string IndexName), ISearchIndex> clients;
private readonly IScriptEngine scriptEngine;
public AlgoliaActionHandler(RuleEventFormatter formatter) public AlgoliaActionHandler(RuleEventFormatter formatter, IScriptEngine scriptEngine)
: base(formatter) : base(formatter)
{ {
clients = new ClientPool<(string AppId, string ApiKey, string IndexName), ISearchIndex>(key => clients = new ClientPool<(string AppId, string ApiKey, string IndexName), ISearchIndex>(key =>
@ -31,13 +33,17 @@ namespace Squidex.Extensions.Actions.Algolia
return client.InitIndex(key.IndexName); return client.InitIndex(key.IndexName);
}); });
this.scriptEngine = scriptEngine;
} }
protected override async Task<(string Description, AlgoliaJob Data)> CreateJobAsync(EnrichedEvent @event, AlgoliaAction action) protected override async Task<(string Description, AlgoliaJob Data)> CreateJobAsync(EnrichedEvent @event, AlgoliaAction action)
{ {
if (@event is EnrichedContentEvent contentEvent) if (@event is IEnrichedEntityEvent entityEvent)
{ {
var contentId = contentEvent.Id.ToString(); var delete = @event.ShouldDelete(scriptEngine, action.Delete);
var contentId = entityEvent.Id.ToString();
var ruleDescription = string.Empty; var ruleDescription = string.Empty;
var ruleJob = new AlgoliaJob var ruleJob = new AlgoliaJob
@ -48,8 +54,7 @@ namespace Squidex.Extensions.Actions.Algolia
IndexName = await FormatAsync(action.IndexName, @event) IndexName = await FormatAsync(action.IndexName, @event)
}; };
if (contentEvent.Type == EnrichedContentEventType.Deleted || if (delete)
contentEvent.Type == EnrichedContentEventType.Unpublished)
{ {
ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; ruleDescription = $"Delete entry from Algolia index: {action.IndexName}";
} }
@ -69,7 +74,7 @@ namespace Squidex.Extensions.Actions.Algolia
} }
else else
{ {
jsonString = ToJson(contentEvent); jsonString = ToJson(@event);
} }
json = JObject.Parse(jsonString); json = JObject.Parse(jsonString);

9
backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs

@ -41,5 +41,14 @@ namespace Squidex.Extensions.Actions.ElasticSearch
[Display(Name = "Password", Description = "The optional password.")] [Display(Name = "Password", Description = "The optional password.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string Password { get; set; } public string Password { get; set; }
[Display(Name = "Document", Description = "The optional custom document.")]
[DataType(DataType.MultilineText)]
[Formattable]
public string Document { get; set; }
[Display(Name = "Deletion", Description = "The condition when to delete the document.")]
[DataType(DataType.Text)]
public string Delete { get; set; }
} }
} }

45
backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchActionHandler.cs

@ -9,8 +9,10 @@ using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Elasticsearch.Net; using Elasticsearch.Net;
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents;
using Squidex.Domain.Apps.Core.Scripting;
#pragma warning disable IDE0059 // Value assigned to symbol is never used #pragma warning disable IDE0059 // Value assigned to symbol is never used
@ -19,8 +21,9 @@ namespace Squidex.Extensions.Actions.ElasticSearch
public sealed class ElasticSearchActionHandler : RuleActionHandler<ElasticSearchAction, ElasticSearchJob> public sealed class ElasticSearchActionHandler : RuleActionHandler<ElasticSearchAction, ElasticSearchJob>
{ {
private readonly ClientPool<(Uri Host, string Username, string Password), ElasticLowLevelClient> clients; private readonly ClientPool<(Uri Host, string Username, string Password), ElasticLowLevelClient> clients;
private readonly IScriptEngine scriptEngine;
public ElasticSearchActionHandler(RuleEventFormatter formatter) public ElasticSearchActionHandler(RuleEventFormatter formatter, IScriptEngine scriptEngine)
: base(formatter) : base(formatter)
{ {
clients = new ClientPool<(Uri Host, string Username, string Password), ElasticLowLevelClient>(key => clients = new ClientPool<(Uri Host, string Username, string Password), ElasticLowLevelClient>(key =>
@ -34,16 +37,19 @@ namespace Squidex.Extensions.Actions.ElasticSearch
return new ElasticLowLevelClient(config); return new ElasticLowLevelClient(config);
}); });
this.scriptEngine = scriptEngine;
} }
protected override async Task<(string Description, ElasticSearchJob Data)> CreateJobAsync(EnrichedEvent @event, ElasticSearchAction action) protected override async Task<(string Description, ElasticSearchJob Data)> CreateJobAsync(EnrichedEvent @event, ElasticSearchAction action)
{ {
if (@event is EnrichedContentEvent contentEvent) if (@event is IEnrichedEntityEvent entityEvent)
{ {
var contentId = contentEvent.Id.ToString(); var delete = @event.ShouldDelete(scriptEngine, action.Delete);
var ruleDescription = string.Empty; var contentId = entityEvent.Id.ToString();
var ruleDescription = string.Empty;
var ruleJob = new ElasticSearchJob var ruleJob = new ElasticSearchJob
{ {
IndexName = await FormatAsync(action.IndexName, @event), IndexName = await FormatAsync(action.IndexName, @event),
@ -53,8 +59,7 @@ namespace Squidex.Extensions.Actions.ElasticSearch
ContentId = contentId ContentId = contentId
}; };
if (contentEvent.Type == EnrichedContentEventType.Deleted || if (delete)
contentEvent.Type == EnrichedContentEventType.Unpublished)
{ {
ruleDescription = $"Delete entry index: {action.IndexName}"; ruleDescription = $"Delete entry index: {action.IndexName}";
} }
@ -62,9 +67,31 @@ namespace Squidex.Extensions.Actions.ElasticSearch
{ {
ruleDescription = $"Upsert to index: {action.IndexName}"; ruleDescription = $"Upsert to index: {action.IndexName}";
var json = ToJson(contentEvent); JObject json;
try
ruleJob.Content = $"{{ \"objectId\": \"{contentId}\", {json.Substring(1)}"; {
string jsonString;
if (!string.IsNullOrEmpty(action.Document))
{
jsonString = await FormatAsync(action.Document, @event);
jsonString = jsonString?.Trim();
}
else
{
jsonString = ToJson(@event);
}
json = JObject.Parse(jsonString);
}
catch (Exception ex)
{
json = new JObject(new JProperty("error", $"Invalid JSON: {ex.Message}"));
}
json.AddFirst(new JProperty("contentId", contentId));
ruleJob.Content = json.ToString();
} }
return (ruleDescription, ruleJob); return (ruleDescription, ruleJob);

32
backend/extensions/Squidex.Extensions/Actions/HttpHelper.cs → backend/extensions/Squidex.Extensions/Actions/RuleHelper.cs

@ -10,12 +10,42 @@ using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents;
using Squidex.Domain.Apps.Core.Scripting;
using Squidex.Infrastructure.Http; using Squidex.Infrastructure.Http;
namespace Squidex.Extensions.Actions namespace Squidex.Extensions.Actions
{ {
public static class HttpHelper public static class RuleHelper
{ {
public static bool ShouldDelete(this EnrichedEvent @event, IScriptEngine scriptEngine, string? expression)
{
if (!string.IsNullOrWhiteSpace(expression))
{
var vars = new ScriptVars
{
["event"] = @event
};
return scriptEngine.Evaluate(vars, expression);
}
return IsContentDeletion(@event) || IsAssetDeletion(@event);
}
public static bool IsContentDeletion(this EnrichedEvent @event)
{
return @event is EnrichedContentEvent contentEvent &&
(contentEvent.Type == EnrichedContentEventType.Deleted ||
contentEvent.Type == EnrichedContentEventType.Unpublished);
}
public static bool IsAssetDeletion(this EnrichedEvent @event)
{
return @event is EnrichedAssetEvent assetEvent &&
(assetEvent.Type == EnrichedAssetEventType.Deleted);
}
public static async Task<Result> OneWayRequestAsync(this HttpClient client, HttpRequestMessage request, string requestBody = null, CancellationToken ct = default) public static async Task<Result> OneWayRequestAsync(this HttpClient client, HttpRequestMessage request, string requestBody = null, CancellationToken ct = default)
{ {
HttpResponseMessage response = null; HttpResponseMessage response = null;
Loading…
Cancel
Save