Skip to content
Snippets Groups Projects
Select Git revision
  • 12edfc0bc8f694eede1795d9cb0595cf643e2901
  • master default protected
  • gitkeep
  • dev protected
  • Hotfix/2562-organizations
  • Issue/2309-docs
  • Issue/2295-singleOrganizationFix
  • Issue/2228-userOrganization
  • Hotfix/2087-efNet6
  • Issue/1910-MigrationtoNET6.0
  • Sprint/2022-01
  • Sprint/2021-08
  • Sprint/2021-05
  • Hotfix/1370-swaggerDescription
  • Hotfix/1357-ymlFile
  • Sprint/2021-03
  • Product/1287-dotnet5Sharepoint
  • Topic/1335-dotnet5Apis
  • Sprint/2021-02
  • Product/1180-genericOrganizationMembershipFunction
  • Topic/1281-genericOrganizationMembershipFunction
  • v2.2.5
  • v2.2.4
  • v2.2.3
  • v2.2.2
  • v2.2.1
  • v2.2.0
  • v2.1.2
  • v2.1.1
  • v2.1.0
  • v2.0.3
  • v2.0.2
  • v2.0.1
  • v2.0.0
  • v1.5.0
  • v1.4.1
  • v1.4.0
  • v1.3.1
  • v1.3.0
  • v1.2.3
  • v1.2.2
41 results

OrganizationController.cs

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    OrganizationController.cs 7.48 KiB
    using Coscine.ApiCommons;
    using Coscine.Database.Models;
    using Coscine.Metadata;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using System;
    using System.Linq;
    using System.Collections.Generic;
    using VDS.RDF;
    using Newtonsoft.Json;
    using Coscine.Api.Organization.ReturnObjects;
    
    namespace Coscine.Api.Organization.Controllers
    {
        /// <summary>
        /// This controller represents the actions which can be taken with a organization object.
        /// </summary>
        [Authorize]
        public class OrganizationController : Controller
        {
    
            private readonly Authenticator _authenticator;
            private readonly RdfStoreConnector _rdfStoreConnector;
            private readonly ExternalIdModel _externalIdModel;
    
            /// <summary>
            /// Constructor for the organization controller.
            /// </summary>
            public OrganizationController()
            {
                _authenticator = new Authenticator(this, Program.Configuration);
                _rdfStoreConnector = new RdfStoreConnector(Program.Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url"));
                _externalIdModel = new ExternalIdModel();
            }
    
            /// <summary>
            /// Returns all organizations that match the provided criterea.
            /// </summary>
            /// <param name="member">Filtering organizations that the user is member of.</param>
            /// <param name="filter">Searchterm to filter the results by.</param>
            /// <returns>JSON with a List of the displaynames and urls.</returns>
            [HttpGet("[controller]")]
            public ActionResult<WrapperObject> Index([FromQuery]int member = 0, [FromQuery]string filter = null)
            {
                var user = _authenticator.GetUser();
                var externalIds = _externalIdModel.GetAllWhere((externalId) => externalId.UserId == user.Id);
                var externalIdList = new List<string>();
                foreach (var externalId in externalIds)
                {
                    externalIdList.Add(externalId.ExternalId1);
                }
    
                var organizations = JsonConvert.DeserializeObject<IEnumerable<Uri>>(
                    Program.Configuration.GetStringAndWait("coscine/local/organizations/list", 
                        "['https://ror.org/', 'https://ror.org/04xfq0f34']")
                );
                var externalOrganizations = externalIds.Select((externalId) => externalId.Organization);
    
                var resultSet = new List<Triple>();
                foreach (var orgGraph in organizations)
                {
                    resultSet.AddRange(_rdfStoreConnector.GetTriples(orgGraph, null, filter, member, externalIdList));
                }
                foreach (var externalOrganization in externalOrganizations)
                {
                    resultSet.AddRange(_rdfStoreConnector.GetOrganizationByEntityId(externalOrganization));
                }
                resultSet = resultSet.Distinct().ToList();
    
                return Ok(GetObjectForTripleList(resultSet));
            }
    
            /// <summary>
            /// Returns all labels and urls from the ror graph.
            /// </summary>
            /// <returns>JSON with all labels and urls.</returns>
            [HttpGet("[controller]/-/ror")]
            public ActionResult<WrapperObject> GetROR([FromQuery]string filter)
            {
                return Ok(GetObjectForTripleList(_rdfStoreConnector.GetTriples(new Uri("https://ror.org/"), null, filter)));
            }
    
            /// <summary>
            /// Returns true if the current user is a member of the given organization.
            /// </summary>
            /// <param name="url">Url of the organization.</param>
            /// <returns>JSON with the result.</returns>
            [HttpGet("[controller]/-/isMember/{url}")]
            public ActionResult<IsMemberObject> IsMember(string url)
            {
                var user = _authenticator.GetUser();
                var externalIds = _externalIdModel.GetAllWhere((externalId) => externalId.UserId == user.Id);
                var externalIdList = new List<string>();
                foreach (var externalId in externalIds)
                {
                    externalIdList.Add(externalId.ExternalId1);
                }
                var externalOrganizations = externalIds.Select((externalId) => externalId.Organization);
                var triples = new List<Triple>();
                foreach (var externalOrganization in externalOrganizations)
                {
                    triples.AddRange(_rdfStoreConnector.GetOrganizationByEntityId(externalOrganization));
                }
    
                return Ok(new IsMemberObject { 
                    IsMember = _rdfStoreConnector.GetTriples(new Uri(Uri.UnescapeDataString(url)), null, null, 1, externalIdList).Any()
                        || triples.Any((triple) => triple.Subject.ToString() == Uri.UnescapeDataString(url))
                });
            }
    
            /// <summary>
            /// Returns a list of organizations in which the current user is a member.
            /// </summary>
            /// <returns>JSON with the result.</returns>
            [HttpGet("[controller]/-/isMember")]
            public ActionResult<WrapperObject> IsMember()
            {
                var user = _authenticator.GetUser();
                var externalIds = _externalIdModel.GetAllWhere((externalId) => externalId.UserId == user.Id);
                var externalIdList = new List<string>();
                foreach (var externalId in externalIds)
                {
                    externalIdList.Add(externalId.ExternalId1);
                }
                var externalOrganizations = externalIds.Select((externalId) => externalId.Organization);
    
                var triples = _rdfStoreConnector.GetTriples(null, null, null, 1, externalIdList).ToList();
                foreach (var externalOrganization in externalOrganizations)
                {
                    triples.AddRange(_rdfStoreConnector.GetOrganizationByEntityId(externalOrganization));
                }
                triples = triples.Distinct().ToList();
    
                return Ok(
                    GetObjectForTripleList(triples, true)
                );
            }
    
            /// <summary>
            /// Returns a specific organization.
            /// </summary>
            /// <param name="url">Url of the organization.</param>
            /// <returns>JSON with the organization</returns>
            [HttpGet("[controller]/{url}")]
            public ActionResult<WrapperObject> GetOrganization(string url)
            {
                var unescapedUrl = Uri.UnescapeDataString(url);
                return Ok(GetObjectForTripleList(_rdfStoreConnector.GetLabelForSubject(new Uri(unescapedUrl))));
            }
    
            /// <summary>
            /// Converts the organization triples to return objects.
            /// </summary>
            /// <param name="list">The list of triples to be converted into <see cref="OrganizationObject"/>s.</param>
            /// <param name="fetchEmail">Optional boolean flag indicating whether to fetch the organization's email. Default is false.</param>
            /// <returns>A <see cref="WrapperObject"/> containing the list of converted <see cref="OrganizationObject"/>s.</returns>
            private WrapperObject GetObjectForTripleList(IEnumerable<Triple> list, bool fetchEmail = false)
            {
                var wrapperObject = new WrapperObject();
                foreach (var triple in list)
                {
                    var organization = new OrganizationObject
                    {
                        DisplayName = triple.Object.ToString(),
                        Url = triple.Subject.ToString(),
                        Email = fetchEmail ? _rdfStoreConnector.GetOrganizationEmailByRorUrl(triple.Subject.ToString()) : null
                    };
                    wrapperObject.Data.Add(organization);
                }
                return wrapperObject;
            }
        }
    }