Skip to content
Snippets Groups Projects
Select Git revision
  • b1f65f81df3ae9847338a88f54a9ad6778a39ee4
  • master default protected
  • dev protected
  • Issue/3003-stsInstitute
  • gitkeep
  • Issue/2449-GuidPidSlugToProjectSettings
  • Issue/2309-docs
  • Fix/xxxx-updateDependencies
  • Issue/2364-testingKpiParser
  • Issue/2287-guestRole
  • Test/xxxx-pipelineTriggers
  • Issue/2102-gitLabResTypeRCV
  • Issue/2278-gitlabToS
  • Issue/2101-gitLabResTypeUi
  • Issue/1788-extractionCronjob
  • Issue/2183-kpiGeneratorResource
  • Issue/2222-resourceDateCreated
  • Issue/2221-projectDateCreated
  • Issue/1321-pidEnquiryOverhaul
  • Issue/1999-gitlabResourcesLib
  • Issue/1951-quotaImplementation
  • v2.22.0
  • v2.20.0
  • v2.19.1
  • v2.19.0
  • v2.18.0
  • v2.17.0
  • v2.16.2
  • v2.16.1
  • v2.16.0
  • v2.15.0
  • v2.14.0
  • v2.13.0
  • v2.12.1
  • v2.12.0
  • v2.11.1
  • v2.11.0
  • v2.10.1
  • v2.10.0
  • v2.9.1
  • v2.9.0
41 results

local_db_manual_scaffolding.ps1

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    OrganizationModel.cs 7.58 KiB
    using Coscine.Configuration;
    using Coscine.Database.DataModel;
    using Coscine.Database.Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using VDS.RDF;
    
    namespace Coscine.Metadata.Models
    {
        public class OrganizationModel
        {
            private readonly IConfiguration _configuration;
            private const string _uriStringOpenIdPredicate = "http://xmlns.com/foaf/0.1/#openId";
            private const string _uriStringLabelPredicate = "http://www.w3.org/2000/01/rdf-schema#label";
            private const string _uriStringOrgIdentifierPredicate = "http://www.w3.org/ns/org#identifier";
            private const string _uriStringOrgHasMemberPredicate = "http://www.w3.org/ns/org#hasMember"; 
            private const string _uriStringOrgMembershipPredicate = "http://www.w3.org/ns/org#Membership";
            private const string _uriStringOrgPersonPredicate = "http://xmlns.com/foaf/0.1/#Person";
    
            public OrganizationModel(IConfiguration configuration)
            {
                _configuration = configuration;
            }
    
            private List<string> AdaptExternalIds(IEnumerable<ExternalId> externalIds)
            {
                List<string> adaptedIds = new List<string>();
    
                var externalAuthenticatorModel = new ExternalAuthenticatorModel();
                var orcid = externalAuthenticatorModel.GetWhere((exAuth) => exAuth.DisplayName == "ORCiD");
    
                foreach (var externalId in externalIds)
                {
                    var exId = externalId.ExternalId_Column;
                    if (externalId.ExternalAuthenticatorId == orcid.Id)
                    {
                        exId = "https://orcid.org/" + exId;
                    }
                    adaptedIds.Add(exId);
                }
                return adaptedIds;
            }
    
            private bool IsMemberFilteringActivated()
            {
                var memberFilterOption = _configuration.GetStringAndWait("coscine/local/organizations/memberfiltering");
    
                var parseable = int.TryParse(memberFilterOption, out int memberFiltering);
    
                return memberFilterOption == null || (parseable && memberFiltering == 1);
            }
    
            public bool IsMember(IEnumerable<ExternalId> externalIds, IGraph graph)
            {
                if (IsMemberFilteringActivated())
                {
                    bool access = false;
                    var adaptedIds = AdaptExternalIds(externalIds);
                    foreach (var externalIdObject in graph.GetTriplesWithPredicate(new Uri(_uriStringOpenIdPredicate))
                                                            .Select((triple) => triple.Object.ToString()))
                    {
                        if (adaptedIds.Any((externalId) => externalId == externalIdObject))
                        {
                            access = true;
                            break;
                        }
                    }
    
                    return access;
                }
                else
                {
                    return true;
                }
            }
    
            public bool HasLabel(string query, IGraph graph)
            {
                var labelUri = new Uri(_uriStringLabelPredicate);
                var transformedQuery = query.ToLower();
                return graph.GetTriplesWithPredicate(labelUri).Any((triple) => triple.Object.ToString().ToLower().Contains(transformedQuery));
            }
    
            public void RemoveBySubject(IGraph graph, INode subject)
            {
                foreach (var triple in graph.GetTriplesWithSubject(subject).ToList())
                {
                    graph.Retract(triple);
                }
            }
    
            public IGraph FilterByMember(IGraph organizationGraph, IEnumerable<ExternalId> externalIds)
            {
                if (IsMemberFilteringActivated())
                {
                    var identifierPredicateUri = new Uri(_uriStringOrgIdentifierPredicate);
                    var hasMemberPredicateUri = new Uri(_uriStringOrgHasMemberPredicate);
                    var hasMemberPredicateNode = organizationGraph.CreateUriNode(hasMemberPredicateUri);
                    var adaptedIds = AdaptExternalIds(externalIds);
                    var removedSubOrganisations = organizationGraph.GetTriplesWithPredicate(identifierPredicateUri)
                                                                .Select((triple) => triple.Subject);
                    foreach (var externalIdTriple in organizationGraph.GetTriplesWithPredicate(new Uri(_uriStringOpenIdPredicate)))
                    {
                        var externalIdObject = externalIdTriple.Object.ToString();
                        if (adaptedIds.Any((externalId) => externalId == externalIdObject))
                        {
                            foreach (var subOrganisation in organizationGraph.GetTriplesWithPredicateObject(hasMemberPredicateNode,
                                                                                                                externalIdTriple.Subject))
                            {
                                removedSubOrganisations = removedSubOrganisations.Where((entry) => entry.ToString() != subOrganisation.Subject.ToString());
                            }
                        }
                    }
    
                    foreach (var removedSubOrganisation in removedSubOrganisations.ToList())
                    {
                        RemoveBySubject(organizationGraph, removedSubOrganisation);
                    }
                }
    
                return organizationGraph;
            }
    
            public IGraph FilterByQuery(IGraph organizationGraph, string query)
            {
                var identifierPredicateUri = new Uri(_uriStringOrgIdentifierPredicate);
                var labelUri = new Uri(_uriStringLabelPredicate);
                var removedSubOrganisations = organizationGraph.GetTriplesWithPredicate(identifierPredicateUri)
                                                            .Select((triple) => triple.Subject);
                foreach (var externalIdTriple in organizationGraph.GetTriplesWithPredicate(labelUri))
                {
                    var label = externalIdTriple.Object.ToString();
                    if (label.Contains(query))
                    {
                        removedSubOrganisations = removedSubOrganisations.Where((entry) => entry.ToString() != externalIdTriple.Subject.ToString());
                    }
                }
    
                foreach (var removedSubOrganisation in removedSubOrganisations.ToList())
                {
                    RemoveBySubject(organizationGraph, removedSubOrganisation);
                }
    
                return organizationGraph;
            }
    
            public void RemoveMembershipTriples(IGraph graph)
            {
                var membershipObject = _uriStringOrgMembershipPredicate;
                var personObject = _uriStringOrgPersonPredicate;
    
                var memberShipSubjects = graph.GetTriplesWithObject(new Uri(membershipObject)).Select((triple) => triple.Subject);
    
                foreach (var memberShibSubject in memberShipSubjects.ToList())
                {
                    RemoveBySubject(graph, memberShibSubject);
                }
    
                var personSubjects = graph.GetTriplesWithObject(new Uri(personObject)).Select((triple) => triple.Subject);
    
                foreach (var personSubject in personSubjects.ToList())
                {
                    RemoveBySubject(graph, personSubject);
                }
    
                var hasMember = _uriStringOrgHasMemberPredicate;
    
                foreach (var membershipLink in graph.GetTriplesWithPredicate(new Uri(hasMember)).ToList())
                {
                    graph.Retract(membershipLink);
                }
    
            }
    
            public IEnumerable<Triple> GetTriplesByPredicate(IGraph graph, Uri predicate)
            {
                INode predicateNode = graph.GetUriNode(predicate);
                IEnumerable<Triple> filteredTriples = graph.GetTriplesWithPredicate(predicateNode);
                return filteredTriples;
            }
        }
    }