diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 94c66e1..623ebe8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,2 @@ -* @CluedIn-io/Back-End \ No newline at end of file +* @CluedIn-io/connector-approvers + diff --git a/docs/4.0.1-release-notes.md b/docs/4.0.1-release-notes.md new file mode 100644 index 0000000..4a22faf --- /dev/null +++ b/docs/4.0.1-release-notes.md @@ -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 \ No newline at end of file diff --git a/src/ExternalSearch.Providers.PermId/Constants.cs b/src/ExternalSearch.Providers.PermId/Constants.cs index bb78072..369152e 100644 --- a/src/ExternalSearch.Providers.PermId/Constants.cs +++ b/src/ExternalSearch.Providers.PermId/Constants.cs @@ -38,7 +38,7 @@ public struct KeyName { displayName = "Accepted Entity Type", type = "input", - isRequired = false, + isRequired = true, name = KeyName.AcceptedEntityType }, new Control() diff --git a/src/ExternalSearch.Providers.PermId/PermIdExternalSearchProvider.cs b/src/ExternalSearch.Providers.PermId/PermIdExternalSearchProvider.cs index aa2f89d..9811b51 100644 --- a/src/ExternalSearch.Providers.PermId/PermIdExternalSearchProvider.cs +++ b/src/ExternalSearch.Providers.PermId/PermIdExternalSearchProvider.cs @@ -27,7 +27,6 @@ using CluedIn.ExternalSearch.Providers.PermId.Vocabularies; using EntityType = CluedIn.Core.Data.EntityType; using CluedIn.Core.Data.Vocabularies; -using AngleSharp.Io; namespace CluedIn.ExternalSearch.Providers.PermId { @@ -35,65 +34,56 @@ namespace CluedIn.ExternalSearch.Providers.PermId /// public class PermIdExternalSearchProvider : ExternalSearchProviderBase, IExtendedEnricherMetadata , IConfigurableExternalSearchProvider { + /********************************************************************************************************** + * FIELDS + **********************************************************************************************************/ - private static readonly EntityType[] AcceptedEntityTypes = { EntityType.Organization }; + private static readonly EntityType[] DefaultAcceptedEntityTypes = { EntityType.Organization }; /********************************************************************************************************** * CONSTRUCTORS **********************************************************************************************************/ public PermIdExternalSearchProvider() - : base(Constants.ProviderId, AcceptedEntityTypes) - { - var nameBasedTokenProvider = new NameBasedTokenProvider("PermId"); - - if (nameBasedTokenProvider.ApiToken != null) - this.TokenProvider = new RoundRobinTokenProvider(nameBasedTokenProvider.ApiToken.Split(',', ';')); - } - - private PermIdExternalSearchProvider(IList tokens) - : this(true) + : base(Constants.ProviderId, DefaultAcceptedEntityTypes) { - this.TokenProvider = new RoundRobinTokenProvider(tokens); - } - - private PermIdExternalSearchProvider([NotNull] IExternalSearchTokenProvider tokenProvider) - : this(true) - { - this.TokenProvider = tokenProvider ?? throw new ArgumentNullException(nameof(tokenProvider)); - } - - private PermIdExternalSearchProvider(bool tokenProviderIsRequired) - : this() - { - this.TokenProviderIsRequired = tokenProviderIsRequired; } /********************************************************************************************************** * METHODS **********************************************************************************************************/ - public override IEnumerable BuildQueries(ExecutionContext context, IExternalSearchRequest request) + public IEnumerable Accepts(IDictionary config, IProvider provider) => this.Accepts(config); + + private IEnumerable Accepts(IDictionary config) + => Accepts(new PermIdExternalSearchJobData(config)); + + private IEnumerable Accepts(PermIdExternalSearchJobData config) { - foreach (var externalSearchQuery in InternalBuildQueries(context, request)) + 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 IEnumerable InternalBuildQueries(ExecutionContext context, IExternalSearchRequest request, IDictionary config = null) + + private bool Accepts(PermIdExternalSearchJobData config, EntityType entityTypeToEvaluate) { - if (config.TryGetValue(Constants.KeyName.AcceptedEntityType, out var customType) && !string.IsNullOrWhiteSpace(customType?.ToString())) - { - if (!request.EntityMetaData.EntityType.Is(customType.ToString())) - { - yield break; - } - } - else if (!this.Accepts(request.EntityMetaData.EntityType)) - yield break; + var configurableAcceptedEntityTypes = this.Accepts(config).ToArray(); + + return configurableAcceptedEntityTypes.Any(entityTypeToEvaluate.Is); + } - //if (string.IsNullOrEmpty(this.TokenProvider.ApiToken)) - // throw new InvalidOperationException("PermId ApiToken have not been configured"); + public IEnumerable BuildQueries(ExecutionContext context, IExternalSearchRequest request, IDictionary config, IProvider provider) + => InternalBuildQueries(context, request, new PermIdExternalSearchJobData(config)); + + private IEnumerable InternalBuildQueries(ExecutionContext context, IExternalSearchRequest request, PermIdExternalSearchJobData config) + { + if (!this.Accepts(config, request.EntityMetaData.EntityType)) + yield break; var existingResults = request.GetQueryResults(this).ToList(); @@ -103,7 +93,7 @@ private IEnumerable InternalBuildQueries(ExecutionContext // Query Input var entityType = request.EntityMetaData.EntityType; - var organizationName = GetValue(request, config, Constants.KeyName.OrganizationName, Core.Data.Vocabularies.Vocabularies.CluedInOrganization.OrganizationName); + var organizationName = GetValue(request, config.ToDictionary(), Constants.KeyName.OrganizationName, Core.Data.Vocabularies.Vocabularies.CluedInOrganization.OrganizationName); if (!string.IsNullOrEmpty(request.EntityMetaData.Name)) @@ -142,21 +132,13 @@ private static HashSet GetValue(IExternalSearchRequest request, IDiction return value; } - /// - public override IEnumerable ExecuteSearch(ExecutionContext context, - IExternalSearchQuery query) + public IEnumerable ExecuteSearch(ExecutionContext context, IExternalSearchQuery query, IDictionary config, IProvider provider) { - var apiKey = this.TokenProvider.ApiToken; - - foreach (var externalSearchQueryResult in InternalExecuteSearch(query, apiKey)) - yield return externalSearchQueryResult; - } + var jobData = new PermIdExternalSearchJobData(config); - private static IEnumerable InternalExecuteSearch(IExternalSearchQuery query, string apiKey) - { var name = query.QueryParameters[ExternalSearchQueryParameter.Name].FirstOrDefault(); var idList = new List(); - var apiToken = apiKey; + var apiToken = jobData.ApiToken; if (string.IsNullOrEmpty(apiToken)) throw new InvalidOperationException("PermId ApiToken has not been configured"); @@ -169,7 +151,7 @@ private static IEnumerable InternalExecuteSearch(IEx if (!string.IsNullOrEmpty(name)) { - var searchResult = RequestWrapper(searchClient, "search?q=" + name, apiKey); + var searchResult = RequestWrapper(searchClient, "search?q=" + name, apiToken); foreach (var res in searchResult.Result.Organizations.Entities) { @@ -179,7 +161,7 @@ private static IEnumerable InternalExecuteSearch(IEx foreach (var permId in idList) { - var socialResult = RequestWrapper(socialClient, permId, apiKey); + var socialResult = RequestWrapper(socialClient, permId, apiToken); if (socialResult != null) { @@ -214,11 +196,9 @@ private static T RequestWrapper(IRestClient client, string parameter, string return retval; } - /// - public override IEnumerable BuildClues(ExecutionContext context, IExternalSearchQuery query, IExternalSearchQueryResult result, IExternalSearchRequest request) + public IEnumerable BuildClues(ExecutionContext context, IExternalSearchQuery query, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary config, IProvider provider) { - var organizationCode = this.GetOriginEntityCode(result.As(), request); - var organizationClue = new Clue(organizationCode, context.Organization); + var organizationClue = new Clue(request.EntityMetaData.OriginEntityCode, context.Organization); organizationClue.Data.EntityData.Codes.Add(request.EntityMetaData.Codes.First()); this.PopulateMetadata(organizationClue.Data.EntityData, result.As(), request); @@ -242,8 +222,7 @@ public override IEnumerable BuildClues(ExecutionContext context, IExternal } } - /// - public override IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request) + public IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary config, IProvider provider) { var resultItem = result.As(); @@ -253,15 +232,16 @@ public override IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext contex return this.CreateMetadata(resultItem, request); } - /// public override IPreviewImage GetPrimaryEntityPreviewImage(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request) { return null; } - /// Creates the metadata. - /// The result item. - /// The metadata. + public IPreviewImage GetPrimaryEntityPreviewImage(ExecutionContext context, IExternalSearchQueryResult result, IExternalSearchRequest request, IDictionary config, IProvider provider) + { + return null; + } + private IEntityMetadata CreateMetadata(IExternalSearchQueryResult resultItem, IExternalSearchRequest request) { if (resultItem == null) @@ -274,49 +254,18 @@ private IEntityMetadata CreateMetadata(IExternalSearchQueryResultGets the origin entity code. - /// The result item. - /// The origin entity code. - private EntityCode GetOriginEntityCode(IExternalSearchQueryResult resultItem, IExternalSearchRequest request) - { - if (resultItem == null) - throw new ArgumentNullException(nameof(resultItem)); - - return new EntityCode(request.EntityMetaData.EntityType, GetCodeOrigin(), request.EntityMetaData.OriginEntityCode.Value); - } - - /// Gets person entity code. - /// The person. - /// The person entity code. - private EntityCode GetPersonEntityCode(AssociatedPerson person, IExternalSearchRequest request) - { - return new EntityCode(request.EntityMetaData.EntityType, GetCodeOrigin(), request.EntityMetaData.OriginEntityCode.Value); - } - - /// Gets the code origin. - /// The code origin - private CodeOrigin GetCodeOrigin() - { - return CodeOrigin.CluedIn.CreateSpecific("permid"); - } - - /// Populates the metadata. - /// The metadata. - /// The result item. private void PopulateMetadata(IEntityMetadata metadata, IExternalSearchQueryResult resultItem, IExternalSearchRequest request) { if (resultItem == null) throw new ArgumentNullException(nameof(resultItem)); - var code = this.GetOriginEntityCode(resultItem, request); var data = resultItem.Data; metadata.EntityType = request.EntityMetaData.EntityType; metadata.Name = request.EntityMetaData.Name; metadata.CreatedDate = resultItem.CreatedDate; - metadata.OriginEntityCode = code; - metadata.Codes.Add(code); + metadata.OriginEntityCode = request.EntityMetaData.OriginEntityCode; metadata.Properties[PermIdVocabularies.Organization.PermId] = data.PermId?.FirstOrDefault().PrintIfAvailable(); metadata.Properties[PermIdVocabularies.Organization.DomiciledIn] = data.DomiciledIn?.FirstOrDefault().PrintIfAvailable(); @@ -365,18 +314,12 @@ private void PopulateMetadata(IEntityMetadata metadata, IExternalSearchQueryResu } } - /// Populate person metadata. - /// The metadata. - /// The person. private void PopulatePersonMetadata(IEntityMetadata metadata, AssociatedPerson person, IExternalSearchRequest request) { - var code = this.GetPersonEntityCode(person, request); - metadata.EntityType = request.EntityMetaData.EntityType; metadata.Name = request.EntityMetaData.Name; - metadata.OriginEntityCode = code; - metadata.Codes.Add(code); + metadata.OriginEntityCode = request.EntityMetaData.OriginEntityCode; metadata.Properties[PermIdVocabularies.Person.PersonUrl] = person.PersonUrl?.FirstOrDefault().PrintIfAvailable(); metadata.Properties[PermIdVocabularies.Person.HonorificPrefix] = person.HonorificPrefix?.FirstOrDefault().PrintIfAvailable(); @@ -396,6 +339,17 @@ private void PopulatePersonMetadata(IEntityMetadata metadata, AssociatedPerson p metadata.Uri = new Uri(string.Format("https://permid.org/1-{0}", person.PersonUrl.First())); } + // 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 BuildQueries(ExecutionContext context, IExternalSearchRequest request) => throw new NotSupportedException(); + public override IEnumerable ExecuteSearch(ExecutionContext context, IExternalSearchQuery query) => throw new NotSupportedException(); + public override IEnumerable 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(); + + /********************************************************************************************************** + * PROPERTIES + **********************************************************************************************************/ + public string Icon { get; } = Constants.Icon; public string Domain { get; } = Constants.Domain; public string About { get; } = Constants.About; @@ -403,44 +357,5 @@ private void PopulatePersonMetadata(IEntityMetadata metadata, AssociatedPerson p public IEnumerable Properties { get; } = Constants.Properties; public Guide Guide { get; } = Constants.Guide; public IntegrationType Type { get; } = Constants.IntegrationType; - - public IEnumerable Accepts(IDictionary config, IProvider provider) - { - return AcceptedEntityTypes; - } - - public IEnumerable BuildQueries(ExecutionContext context, IExternalSearchRequest request, IDictionary config, - IProvider provider) - { - return InternalBuildQueries(context, request, config); - } - - public IEnumerable ExecuteSearch(ExecutionContext context, IExternalSearchQuery query, IDictionary config, IProvider provider) - { - var jobData = new PermIdExternalSearchJobData(config); - - foreach (var externalSearchQueryResult in InternalExecuteSearch(query, jobData.ApiToken)) - { - yield return externalSearchQueryResult; - } - } - - public IEnumerable BuildClues(ExecutionContext context, IExternalSearchQuery query, IExternalSearchQueryResult result, - IExternalSearchRequest request, IDictionary config, IProvider provider) - { - return BuildClues(context, query, result, request); - } - - public IEntityMetadata GetPrimaryEntityMetadata(ExecutionContext context, IExternalSearchQueryResult result, - IExternalSearchRequest request, IDictionary config, IProvider provider) - { - return GetPrimaryEntityMetadata(context, result, request); - } - - public IPreviewImage GetPrimaryEntityPreviewImage(ExecutionContext context, IExternalSearchQueryResult result, - IExternalSearchRequest request, IDictionary config, IProvider provider) - { - return GetPrimaryEntityPreviewImage(context, result, request); - } } }