public async Task <IEnumerable <ColidEntryContactsCto> > GetContactReferencedEntries(string userEmailAddress)
        {
            Guard.ArgumentNotNullOrWhiteSpace(userEmailAddress, "userEmailAddress");

            var types        = _metadataService.GetLeafEntityTypes(Resource.Type.FirstResouceType);
            var contactTypes = _metadataService.GetLeafEntityTypes(EnterpriseCore.Person);

            var entries        = _contactRepository.GetContactReferencedEntries(userEmailAddress, types, contactTypes);
            var consumerGroups = await _remoteRegistrationService.GetConsumerGroups();

            entries = entries
                      .Select(entry =>
            {
                var cg = consumerGroups.FirstOrDefault(t => t.Id == entry.ConsumerGroup?.OriginalString);
                if (cg != null && cg.Properties.TryGetValue(ConsumerGroup.HasContactPerson, out var contacts))
                {
                    var consumerGroupContact = new ContactCto()
                    {
                        EmailAddress = contacts?.FirstOrDefault() as string,
                        TypeUri      = new Uri(ConsumerGroup.HasContactPerson),
                        TypeLabel    = "Consumer group contact"
                    };

                    entry.ConsumerGroupContact = consumerGroupContact;
                }

                return(entry);
            });

            return(entries);
        }
        public IEnumerable <ColidEntryContactsCto> GetContactReferencedEntries(string userEmailAddress, IEnumerable <string> resourceTypes, IEnumerable <string> contactTypes)
        {
            if (!resourceTypes.Any())
            {
                return(new List <ColidEntryContactsCto>());
            }

            var parametrizedString = new SparqlParameterizedString
            {
                CommandText =
                    @"SELECT DISTINCT *
                      @fromResourceNamedGraph
                      @fromMetadataNamedGraph
                      WHERE {
                                Values ?contactType { @contactTypes }
                                ?predicate rdfs:range ?contactType.
                                ?shacl sh:path ?predicate.
                                OPTIONAL { ?shacl sh:group ?shaclGroup }
                                ?shacl sh:name ?predicateLabel.
                                { 
                                    Select ?subject 
                                    WHERE
                                    {
                                        Values ?type { @resourceTypes }
                                        ?subject a ?type.
                                        { 
                                            ?subject ?predicate @userEmailAddress.
                                        }
                                        UNION
                                        { 
                                            ?subject @distribution | @mainDistribution ?endpoint.
                                            ?endpoint ?predicate @userEmailAddress.
                                        } 
                                    }
                                }
                                { 
                                    ?subject ?predicate ?contact.
                                }
                                UNION
                                { 
                                    ?subject @distribution | @mainDistribution ?endpoint .
                                    ?endpoint ?predicate ?contact.
                                }
                                ?subject @hasPid ?pidUri.
                                ?subject @hasLabel ?label.
                                ?subject @hasConsumerGroup ?consumerGroup.
                                FILTER NOT EXISTS { ?subject  @hasPidEntryDraft ?draftResource }
                            }
                      ORDER BY ?subject
                     "
            };

            parametrizedString.SetPlainLiteral("fromResourceNamedGraph", _metadataGraphConfigurationRepository.GetGraphs(MetadataGraphConfiguration.HasResourcesGraph).JoinAsFromNamedGraphs());
            parametrizedString.SetPlainLiteral("fromMetadataNamedGraph", _metadataGraphConfigurationRepository.GetGraphs(MetadataGraphConfiguration.HasMetadataGraph).JoinAsFromNamedGraphs());

            parametrizedString.SetPlainLiteral("resourceTypes", resourceTypes.JoinAsValuesList());
            parametrizedString.SetPlainLiteral("contactTypes", contactTypes.JoinAsValuesList());

            parametrizedString.SetLiteral("userEmailAddress", userEmailAddress);
            parametrizedString.SetUri("hasLabel", new Uri(Resource.HasLabel));
            parametrizedString.SetUri("hasPid", new Uri(EnterpriseCore.PidUri));
            parametrizedString.SetUri("hasPidEntryDraft", new Uri(Resource.HasPidEntryDraft));
            parametrizedString.SetUri("hasConsumerGroup", new Uri(Resource.HasConsumerGroup));
            parametrizedString.SetUri("distribution", new Uri(Resource.Distribution));
            parametrizedString.SetUri("mainDistribution", new Uri(Resource.MainDistribution));

            var results = _tripleStoreRepository.QueryTripleStoreResultSet(parametrizedString);

            var groupedResults = results.GroupBy(res => res.GetNodeValuesFromSparqlResult("subject")?.Value);

            var contacts = groupedResults
                           .Select(res =>
            {
                var firstEntry = res.First();

                var pidUriString = firstEntry.GetNodeValuesFromSparqlResult("pidUri")?.Value;
                var pidUri       = string.IsNullOrWhiteSpace(pidUriString) ? null : new Uri(pidUriString);

                var consumerGroupString = firstEntry.GetNodeValuesFromSparqlResult("consumerGroup")?.Value;
                var consumerGroup       = string.IsNullOrWhiteSpace(consumerGroupString) ? null : new Uri(consumerGroupString);

                var cep = new ColidEntryContactsCto()
                {
                    Label         = firstEntry.GetNodeValuesFromSparqlResult("label")?.Value,
                    PidUri        = pidUri,
                    ConsumerGroup = consumerGroup,
                    Contacts      = res
                                    .Select(r =>
                    {
                        var roleId  = r.GetNodeValuesFromSparqlResult("predicate")?.Value;
                        var contact = new ContactCto()
                        {
                            EmailAddress       = r.GetNodeValuesFromSparqlResult("contact")?.Value,
                            TypeUri            = string.IsNullOrWhiteSpace(roleId) ? null : new Uri(roleId),
                            TypeLabel          = r.GetNodeValuesFromSparqlResult("predicateLabel")?.Value,
                            IsTechnicalContact = IsTechnicalGroup(r.GetNodeValuesFromSparqlResult("shaclGroup")?.Value)
                        };
                        return(contact);
                    })
                };

                return(cep);
            });


            return(contacts);
        }
Example #3
0
 public ColidEntryContactBuilder WithCGContact(ContactCto contact)
 {
     _cep.ConsumerGroupContact = contact;
     return(this);
 }