Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/release/4.0.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
andrew-hardy committed Nov 11, 2024
2 parents f500aa0 + 04a7602 commit 050c008
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 120 deletions.
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* @CluedIn-io/connector-approvers

6 changes: 6 additions & 0 deletions docs/4.0.1-release-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Features
- Set Accepted Entity Type to mandatory

# Fix
- Fixed Accept not responding correctly to configured entity type
- No longer adding codes to entity
2 changes: 1 addition & 1 deletion src/ExternalSearch.Providers.VatLayer/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public struct KeyName
{
displayName = "Accepted Entity Type",
type = "input",
isRequired = false,
isRequired = true,
name = KeyName.AcceptedEntityType
},
new Control()
Expand Down
179 changes: 60 additions & 119 deletions src/ExternalSearch.Providers.VatLayer/VatLayerExternalSearchProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,28 @@
using Newtonsoft.Json;

using RestSharp;
//using RestSharp.Extensions.MonoHttp;
using EntityType = CluedIn.Core.Data.EntityType;

namespace CluedIn.ExternalSearch.Providers.VatLayer
{
using CluedIn.ExternalSearch.Provider;

/// <summary>The VatLayer graph external search provider.</summary>
/// <seealso cref="ExternalSearchProviderBase" />
public class VatLayerExternalSearchProvider : ExternalSearchProviderBase, IExtendedEnricherMetadata, IConfigurableExternalSearchProvider
{
private static EntityType[] AcceptedEntityTypes = { EntityType.Organization };
/**********************************************************************************************************
* FIELDS
**********************************************************************************************************/

private static readonly EntityType[] DefaultAcceptedEntityTypes = { EntityType.Organization };

/**********************************************************************************************************
* CONSTRUCTORS
**********************************************************************************************************/

public VatLayerExternalSearchProvider()
: base(Constants.ProviderId, AcceptedEntityTypes)
: base(Constants.ProviderId, DefaultAcceptedEntityTypes)
{
var nameBasedTokenProvider = new NameBasedTokenProvider("VatLayer");

Expand Down Expand Up @@ -65,21 +70,34 @@ private VatLayerExternalSearchProvider(bool tokenProviderIsRequired)
* METHODS
**********************************************************************************************************/

/// <summary>Builds the queries.</summary>
/// <param name="context">The context.</param>
/// <param name="request">The request.</param>
/// <returns>The search queries.</returns>
public override IEnumerable<IExternalSearchQuery> BuildQueries(ExecutionContext context, IExternalSearchRequest request)
{
var apiToken = TokenProvider?.ApiToken;
public IEnumerable<EntityType> Accepts(IDictionary<string, object> config, IProvider provider) => this.Accepts(config);

foreach (var externalSearchQuery in InternalBuildQueries(context, request, apiToken))
private IEnumerable<EntityType> Accepts(IDictionary<string, object> config)
=> Accepts(new VatLayerExternalSearchJobData(config));

private IEnumerable<EntityType> Accepts(VatLayerExternalSearchJobData config)
{
if (!string.IsNullOrWhiteSpace(config.AcceptedEntityType))
{
yield return externalSearchQuery;
// If configured, only accept the configured entity types
return new EntityType[] { config.AcceptedEntityType };
}

// Fallback to default accepted entity types
return DefaultAcceptedEntityTypes;
}

private bool Accepts(VatLayerExternalSearchJobData config, EntityType entityTypeToEvaluate)
{
var configurableAcceptedEntityTypes = this.Accepts(config).ToArray();

return configurableAcceptedEntityTypes.Any(entityTypeToEvaluate.Is);
}

private IEnumerable<IExternalSearchQuery> InternalBuildQueries(ExecutionContext context, IExternalSearchRequest request, string apiToken, IDictionary<string, object> config = null)
public IEnumerable<IExternalSearchQuery> BuildQueries(ExecutionContext context, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
=> InternalBuildQueries(context, request, new VatLayerExternalSearchJobData(config));

private IEnumerable<IExternalSearchQuery> InternalBuildQueries(ExecutionContext context, IExternalSearchRequest request, VatLayerExternalSearchJobData config)
{
if (context == null)
{
Expand All @@ -93,24 +111,15 @@ private IEnumerable<IExternalSearchQuery> InternalBuildQueries(ExecutionContext

using (context.Log.BeginScope($"{GetType().Name} BuildQueries: request {request}"))
{
if (string.IsNullOrEmpty(apiToken))
if (string.IsNullOrEmpty(config.ApiToken))
{
context.Log.LogError("ApiToken for VatLayer must be provided.");
yield break;
}
if (config.TryGetValue(Constants.KeyName.AcceptedEntityType, out var customType) && !string.IsNullOrWhiteSpace(customType?.ToString()))
{
if (!request.EntityMetaData.EntityType.Is(customType.ToString()))
{
context.Log.LogTrace("Unacceptable entity type from '{EntityName}', entity code '{EntityCode}'", request.EntityMetaData.DisplayName, request.EntityMetaData.EntityType.Code);

yield break;
}
}
else if (!Accepts(request.EntityMetaData.EntityType))
if (!this.Accepts(config, request.EntityMetaData.EntityType))
{
context.Log.LogTrace("Unacceptable entity type from '{EntityName}', entity code '{EntityCode}'", request.EntityMetaData.DisplayName, request.EntityMetaData.EntityType.Code);

yield break;
}

Expand All @@ -123,9 +132,9 @@ private IEnumerable<IExternalSearchQuery> InternalBuildQueries(ExecutionContext
var entityType = request.EntityMetaData.EntityType;

var vatNumber = new HashSet<string>();
if (config.TryGetValue(Constants.KeyName.AcceptedVocabKey, out var customVocabKey) && !string.IsNullOrWhiteSpace(customVocabKey?.ToString()))
if (!string.IsNullOrWhiteSpace(config.AcceptedVocabKey))
{
vatNumber = request.QueryParameters.GetValue<string, HashSet<string>>(config[Constants.KeyName.AcceptedVocabKey].ToString(), new HashSet<string>());
vatNumber = request.QueryParameters.GetValue<string, HashSet<string>>(config.AcceptedVocabKey, new HashSet<string>());
}
else
{
Expand Down Expand Up @@ -168,18 +177,10 @@ private IEnumerable<IExternalSearchQuery> InternalBuildQueries(ExecutionContext
}
}

/// <summary>Executes the search.</summary>
/// <param name="context">The context.</param>
/// <param name="query">The query.</param>
/// <returns>The results.</returns>
public override IEnumerable<IExternalSearchQueryResult> ExecuteSearch(ExecutionContext context, IExternalSearchQuery query)
public IEnumerable<IExternalSearchQueryResult> ExecuteSearch(ExecutionContext context, IExternalSearchQuery query, IDictionary<string, object> config, IProvider provider)
{
var apiToken = TokenProvider?.ApiToken;

foreach (var externalSearchQueryResult in InternalExecuteSearch(context, query, apiToken))
{
yield return externalSearchQueryResult;
}
var jobData = new VatLayerExternalSearchJobData(config);
return InternalExecuteSearch(context, query, jobData.ApiToken);
}

private IEnumerable<IExternalSearchQueryResult> InternalExecuteSearch(ExecutionContext context, IExternalSearchQuery query, string apiToken)
Expand Down Expand Up @@ -281,16 +282,7 @@ private IEnumerable<IExternalSearchQueryResult> InternalExecuteSearch(ExecutionC
}
}

/// <summary>Builds the clues.</summary>
/// <param name="context">The context.</param>
/// <param name="query">The query.</param>
/// <param name="result">The result.</param>
/// <param name="request">The request.</param>
/// <returns>The clues.</returns>
public override IEnumerable<Clue> BuildClues(ExecutionContext context,
IExternalSearchQuery query,
IExternalSearchQueryResult result,
IExternalSearchRequest request)
public IEnumerable<Clue> BuildClues(ExecutionContext context, IExternalSearchQuery query, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
if (context == null)
{
Expand All @@ -316,8 +308,7 @@ public override IEnumerable<Clue> BuildClues(ExecutionContext context,
{
var resultItem = result.As<VatLayerResponse>();
var dirtyClue = request.CustomQueryInput.ToString();
var code = GetOriginEntityCode(resultItem, request);
var clue = new Clue(code, context.Organization);
var clue = new Clue(request.EntityMetaData.OriginEntityCode, context.Organization);

PopulateMetadata(clue.Data.EntityData, resultItem, request);

Expand All @@ -327,14 +318,7 @@ public override IEnumerable<Clue> BuildClues(ExecutionContext context,
}
}

/// <summary>Gets the primary entity metadata.</summary>
/// <param name="context">The context.</param>
/// <param name="result">The result.</param>
/// <param name="request">The request.</param>
/// <returns>The primary entity metadata.</returns>
public override IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context,
IExternalSearchQueryResult result,
IExternalSearchRequest request)
public IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
if (context == null)
{
Expand All @@ -361,12 +345,16 @@ public override IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext contex
}
}

/// <summary>Gets the preview image.</summary>
/// <param name="context">The context.</param>
/// <param name="result">The result.</param>
/// <param name="request">The request.</param>
/// <returns>The preview image.</returns>
public override IPreviewImage GetPrimaryEntityPreviewImage(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request)
{
// Note: This needs to be cleaned up, but since config and provider is not used in GetPrimaryEntityPreviewImage this is fine.
var dummyConfig = new Dictionary<string, object>();
var dummyProvider = new DefaultExternalSearchProviderProvider(context.ApplicationContext, this);

return GetPrimaryEntityPreviewImage(context, result, request, dummyConfig, dummyProvider);
}

public IPreviewImage GetPrimaryEntityPreviewImage(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
if (context == null)
{
Expand Down Expand Up @@ -395,24 +383,11 @@ private IEntityMetadata CreateMetadata(IExternalSearchQueryResult<VatLayerRespon
return metadata;
}

private EntityCode GetOriginEntityCode(IExternalSearchQueryResult<VatLayerResponse> resultItem, IExternalSearchRequest request)
{
return new EntityCode(request.EntityMetaData.EntityType, this.GetCodeOrigin(), request.EntityMetaData.OriginEntityCode.Value);
}

private CodeOrigin GetCodeOrigin()
{
return CodeOrigin.CluedIn.CreateSpecific("vatlayer");
}

private void PopulateMetadata(IEntityMetadata metadata, IExternalSearchQueryResult<VatLayerResponse> resultItem, IExternalSearchRequest request)
{
var code = GetOriginEntityCode(resultItem, request);

metadata.EntityType = request.EntityMetaData.EntityType;
metadata.Name = request.EntityMetaData.Name;
metadata.OriginEntityCode = code;
metadata.Codes.Add(request.EntityMetaData.OriginEntityCode);
metadata.OriginEntityCode = request.EntityMetaData.OriginEntityCode;

metadata.Properties[VatLayerVocabulary.Organization.Name] = resultItem.Data.CompanyName;

Expand All @@ -425,50 +400,16 @@ private void PopulateMetadata(IEntityMetadata metadata, IExternalSearchQueryResu
metadata.Properties[VatLayerVocabulary.Organization.Address] = resultItem.Data.CompanyAddress;
}

public IEnumerable<EntityType> Accepts(IDictionary<string, object> config, IProvider provider)
{
if (config.TryGetValue(Constants.KeyName.AcceptedEntityType, out var customTypes))
{
AcceptedEntityTypes = new EntityType[] { customTypes.ToString() };
};

return AcceptedEntityTypes;
}

public IEnumerable<IExternalSearchQuery> BuildQueries(ExecutionContext context, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
var jobData = new VatLayerExternalSearchJobData(config);

foreach (var externalSearchQuery in InternalBuildQueries(context, request, jobData.ApiToken, config))
{
yield return externalSearchQuery;
}
}

public IEnumerable<IExternalSearchQueryResult> ExecuteSearch(ExecutionContext context, IExternalSearchQuery query, IDictionary<string, object> config, IProvider provider)
{
var jobData = new VatLayerExternalSearchJobData(config);

foreach (var externalSearchQueryResult in InternalExecuteSearch(context, query, jobData.ApiToken))
{
yield return externalSearchQueryResult;
}
}

public IEnumerable<Clue> BuildClues(ExecutionContext context, IExternalSearchQuery query, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
return BuildClues(context, query, result, request);
}

public IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
return GetPrimaryEntityMetadata(context, result, request);
}
// Since this is a configurable external search provider, theses methods should never be called
public override bool Accepts(EntityType entityType) => throw new NotSupportedException();
public override IEnumerable<IExternalSearchQuery> BuildQueries(ExecutionContext context, IExternalSearchRequest request) => throw new NotSupportedException();
public override IEnumerable<IExternalSearchQueryResult> ExecuteSearch(ExecutionContext context, IExternalSearchQuery query) => throw new NotSupportedException();
public override IEnumerable<Clue> BuildClues(ExecutionContext context, IExternalSearchQuery query, IExternalSearchQueryResult result, IExternalSearchRequest request) => throw new NotSupportedException();
public override IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request) => throw new NotSupportedException();

public IPreviewImage GetPrimaryEntityPreviewImage(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary<string, object> config, IProvider provider)
{
return GetPrimaryEntityPreviewImage(context, result, request);
}
/**********************************************************************************************************
* PROPERTIES
**********************************************************************************************************/

public string Icon { get; } = Constants.Icon;
public string Domain { get; } = Constants.Domain;
Expand Down

0 comments on commit 050c008

Please sign in to comment.