diff --git a/src/Project/Controllers/ProjectController.cs b/src/Project/Controllers/ProjectController.cs index d2a952bf18680ef7e256762b7e8f66abf5fc136a..56cd94155d00dedafafb88d875b39591f6ff7c3b 100644 --- a/src/Project/Controllers/ProjectController.cs +++ b/src/Project/Controllers/ProjectController.cs @@ -40,7 +40,7 @@ namespace Coscine.Api.Project.Controllers where projectRole.User == user && projectRole.Role.DisplayName == "Owner" select projectRole).Any() - ).Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project)); + ).Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project)).OrderBy(element => element.DisplayName); })); } @@ -78,7 +78,7 @@ namespace Coscine.Api.Project.Controllers .Select((resource) => { return resourceModel.CreateReturnObjectFromDatabaseObject(resource); - }); + }).OrderBy(element => element.DisplayName); } else { diff --git a/src/Project/Controllers/SearchController.cs b/src/Project/Controllers/SearchController.cs index b5be4b68bda2748226729e5e1e88ab2dd7e5fa71..fac50f5ca188c14f451fcf75479a35543931c4e8 100644 --- a/src/Project/Controllers/SearchController.cs +++ b/src/Project/Controllers/SearchController.cs @@ -1,70 +1,226 @@ -using System.Linq; -using Coscine.Api.Project.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; using Coscine.ApiCommons; using Coscine.ApiCommons.Utils; +using LinqToDB.Tools; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; -using VDS.RDF.Query.Expressions.Functions.Sparql.String; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Coscine.Api.Project.Controllers { public class SearchController : Controller { private readonly Authenticator _authenticator; - private DatabaseConnection _databaseConnection; - private readonly ProjectModel _projectModel; - + private readonly DatabaseConnection _databaseConnection; public SearchController() { _authenticator = new Authenticator(this, Program.Configuration); - _projectModel = new ProjectModel(); _databaseConnection = new DatabaseConnection(Program.Configuration); + } + [HttpGet("[controller]/allNoFilter/")] + public IActionResult SearchNoFilter() + { + return Ok(_authenticator.ValidateAndExecute((user) => + { + return GetSearchResults(user.Id, "", ""); + })); } - [Route("[controller]")] - public IActionResult Index() + [HttpGet("[controller]/all/{encodedSearchWord}")] + public IActionResult Search(string encodedSearchWord) { return Ok(_authenticator.ValidateAndExecute((user) => { - string searchQuery = ""; - return _databaseConnection.ConnectToDatabase((db) => + return GetSearchResults(user.Id, encodedSearchWord, ""); + })); + } + + [HttpGet("[controller]/projectNoFilter/{projectId}")] + public IActionResult SearchProjectNoFilter(string projectId) + { + return Ok(_authenticator.ValidateAndExecute((user) => + { + return GetSearchResults(user.Id, "", projectId); + })); + } + + [HttpGet("[controller]/project/{projectId}/{encodedSearchWord}")] + public IActionResult SearchProject(string projectId, string encodedSearchWord) + { + return Ok(_authenticator.ValidateAndExecute((user) => + { + return GetSearchResults(user.Id, encodedSearchWord, projectId); + })); + } + + private JToken GetSearchResults(Guid userId, string encodedSearchWord, string projectId) + { + string searchQuery; + if (!string.IsNullOrWhiteSpace(encodedSearchWord)) + { + searchQuery = HttpUtility.UrlDecode(encodedSearchWord); + } + else + { + searchQuery = ""; + } + + List<Guid> list; + if (projectId.Equals("")) + { + list = new List<Guid>(); + } + else + { + list = GetAllSubProjects(projectId); + } + + // create return object + var json = new JObject(); + + // search and add results for resources + json["Resources"] = SearchForResources(userId, searchQuery, projectId, list); + + // search and add results for projects + if (projectId.Equals("")) + { + json["Projects"] = SearchForProjects(userId, searchQuery, projectId, list, false); + } + else + { + json["Projects"] = new JArray(); + } + + // remove the id of the root project since it cann not be a subproject of it self + if (list.Count >= 1) { - return + list.RemoveAt(0); + } + + // search and ad results for sub-projects + json["SubProjects"] = SearchForProjects(userId, searchQuery, projectId, list, true); + + return json; + } + + + private List<Guid> GetAllSubProjects(string projectId) + { + var list = new List<Guid>(); + if (!projectId.Equals("")) + { + list.Add(new Guid(projectId)); + var counter = 0; + _databaseConnection.ConnectToDatabase((db) => + { + while (counter != list.Count) + { + var innerResults = (from sp in db.SubProjects + where sp.ProjectId.Equals(list[counter]) + select sp.SubProjectId); + list.AddRange(innerResults.ToList()); + counter++; + } + }); + } + return list; + } + + + private JToken SearchForProjects(Guid userId, string searchQuery, string projectId, List<Guid> listOfSubprojects, bool showSubProjects) + { + return _databaseConnection.ConnectToDatabase((db) => + { + var allSubProjects = (from sp in db.SubProjects select sp.SubProjectId).ToList(); + var allSubProjectsList = new List<Guid>(); + allSubProjectsList.AddRange(allSubProjects); + + var results = (from p in db.Projects - join v in db.Visibilities on p.VisibilityId equals v.Id - join pd in db.ProjectDisciplines on p.Id equals pd.ProjectId - join d in db.Disciplines on pd.DisciplineId equals d.Id - join pi in db.ProjectInstitutes on p.Id equals pi.ProjectId - join i in db.Institutes on pi.InstituteId equals i.Id - - where p.ProjectName.Contains(searchQuery) || - p.Description.Contains(searchQuery) || - p.StartDate.ToString().Contains(searchQuery) || - p.EndDate.ToString().Contains(searchQuery) || - p.Keywords.Contains(searchQuery) || - p.DisplayName.Contains(searchQuery) || - p.PrincipleInvestigators.Contains(searchQuery) || - p.GrantId.Contains(searchQuery) || - v.DisplayName.Contains(searchQuery) || - d.Url.Contains(searchQuery) || - d.DisplayNameDe.Contains(searchQuery) || - d.DisplayNameEn.Contains(searchQuery) || - i.DisplayName.Contains(searchQuery) || - i.IKZ.Contains(searchQuery) - - select new {p.Id, p.DisplayName}); + join pr in db.ProjectRoles on p.Id equals pr.ProjectId into joinedPr + from jpr in joinedPr.DefaultIfEmpty() + join v in db.Visibilities on p.VisibilityId equals v.Id into joinedV + from jv in joinedV.DefaultIfEmpty() + join pd in db.ProjectDisciplines on p.Id equals pd.ProjectId into joinedPd + from jpd in joinedPd.DefaultIfEmpty() + join d in db.Disciplines on jpd.DisciplineId equals d.Id into joinedD + from jd in joinedD.DefaultIfEmpty() + join pi in db.ProjectInstitutes on p.Id equals pi.ProjectId into joinedPi + from jpi in joinedPi.DefaultIfEmpty() + join i in db.Institutes on jpi.InstituteId equals i.Id into joinedI + from ji in joinedI.DefaultIfEmpty() + + where ((!showSubProjects && p.Id.NotIn(allSubProjectsList)) || + (showSubProjects && p.Id.In(allSubProjectsList))) && + (jpr.UserId.Equals(userId) || jv.DisplayName.Equals("Public")) && + (projectId.Equals("") || p.Id.In(listOfSubprojects)) && + (searchQuery.Equals("") || + p.ProjectName.Contains(searchQuery) || + p.Description.Contains(searchQuery) || + p.Keywords.Contains(searchQuery) || + p.DisplayName.Contains(searchQuery) || + p.PrincipleInvestigators.Contains(searchQuery) || + p.GrantId.Contains(searchQuery) || + jv.DisplayName.Contains(searchQuery) || + jd.Url.Contains(searchQuery) || + jd.DisplayNameDe.Contains(searchQuery) || + jd.DisplayNameEn.Contains(searchQuery) || + ji.DisplayName.Contains(searchQuery) || + ji.IKZ.Contains(searchQuery)) + + select new { p.Id, p.DisplayName }).OrderBy(element => element.DisplayName).Distinct(); + return JToken.Parse(JsonConvert.SerializeObject(results)); }); - })); + } + + private JToken SearchForResources(Guid userId, string searchQuery, string projectId, List<Guid> listOfSubprojects) + { + return _databaseConnection.ConnectToDatabase((db) => + { + + var results = (from r in db.Resources + join pres in db.ProjectResources on r.Id equals pres.ResourceId into joinedPres + from jpres in joinedPres.DefaultIfEmpty() + join p in db.Projects on jpres.ProjectId equals p.Id into joinedP + from jp in joinedP.DefaultIfEmpty() + join pr in db.ProjectRoles on jp.Id equals pr.ProjectId into joinedPr + from jpr in joinedPr.DefaultIfEmpty() + join v in db.Visibilities on r.VisibilityId equals v.Id into joinedV + from jv in joinedV.DefaultIfEmpty() + join rd in db.ResourceDisciplines on r.Id equals rd.ResourceId into joinedRd + from jrd in joinedRd.DefaultIfEmpty() + join d in db.Disciplines on jrd.DisciplineId equals d.Id into joinedD + from jd in joinedD.DefaultIfEmpty() + join l in db.Licenses on r.LicenseId equals l.Id into joinedL + from jl in joinedL.DefaultIfEmpty() + join rt in db.ResourceTypes on r.TypeId equals rt.Id into joinedRt + from jrt in joinedRt.DefaultIfEmpty() + + where (jpr.UserId.Equals(userId) || jv.DisplayName.Equals("Public")) && + (projectId.Equals("") || jp.Id.In(listOfSubprojects)) && + (searchQuery.Equals("") || + r.ResourceName.Contains(searchQuery) || + r.DisplayName.Contains(searchQuery) || + r.ResourceName.Contains(searchQuery) || + r.Keywords.Contains(searchQuery) || + r.UsageRights.Contains(searchQuery) || + r.Description.Contains(searchQuery) || + r.ApplicationProfile.Contains(searchQuery) || + jrt.DisplayName.Contains(searchQuery) || + jl.DisplayName.Contains(searchQuery) || + jd.DisplayNameDe.Contains(searchQuery) || + jd.DisplayNameEn.Contains(searchQuery)) - /* - return DatabaseConnection.ConnectToDatabase((db) => (from relation in db.ProjectRoles - where relation.Project == project - && relation.User == user - && (relation.Role.DisplayName == "Owner" - || relation.Role.DisplayName == "Member") - select relation).Any());*/ + select new { r.Id, r.DisplayName, jpr.ProjectId }).OrderBy(element => element.DisplayName).Distinct(); + + return JToken.Parse(JsonConvert.SerializeObject(results)); + + }); } } -} +} \ No newline at end of file diff --git a/src/Project/Controllers/SubProjectController.cs b/src/Project/Controllers/SubProjectController.cs index 74db39e5298c4766a70fb996e2ff0567a4c50717..89f06741ca8d19768ee05dd1cdb24905f31de66d 100644 --- a/src/Project/Controllers/SubProjectController.cs +++ b/src/Project/Controllers/SubProjectController.cs @@ -29,7 +29,8 @@ namespace Coscine.Api.Project.Controllers { var subProjects = _subProjectModel.GetAllWhere((subProjectM) => (subProjectM.ProjectId == parentGuid)) .Select((subProject) => projectModel.GetById(subProject.SubProjectId)) - .Select((project) => projectModel.CreateReturnObjectFromDatabaseObject(project, parentGuid)); + .Select((project) => projectModel.CreateReturnObjectFromDatabaseObject(project, parentGuid)) + .OrderBy(element => element.DisplayName); return subProjects; } else diff --git a/src/Project/Project.csproj b/src/Project/Project.csproj index 82c8b3c09738866ce651c8e3811f637ebfafe714..32d15bb472d764081e272ce7c10c44c0cc44cd2c 100644 --- a/src/Project/Project.csproj +++ b/src/Project/Project.csproj @@ -606,6 +606,7 @@ <Compile Include="Controllers\DataSourceController.cs" /> <Compile Include="Controllers\MetadataController.cs" /> <Compile Include="Controllers\LicenseController.cs" /> + <Compile Include="Controllers\SearchController.cs" /> <Compile Include="Controllers\VisibilityController.cs" /> <Compile Include="Controllers\InstituteController.cs" /> <Compile Include="Controllers\DisciplineController.cs" />