Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • coscine/backend/apis/search
1 result
Show changes
Commits on Source (4)
......@@ -6,7 +6,9 @@ using Coscine.SemanticSearch.Clients;
using Coscine.SemanticSearch.Core;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
......@@ -41,31 +43,43 @@ namespace Coscine.Api.Search.Controllers
_searchClient = new ElasticsearchSearchClient(elasticsearchServer, elasticsearchPort);
}
/// <summary>
/// Search Elasticsearch
/// </summary>
/// <param name="query">Elasticsearch query</param>
/// <param name="user">Specify user or only public metadata records could be found</param>
/// <param name="adv">Set true for advanced Elasticsearch search syntax</param>
/// <param name="languages">Set the used languages</param>
/// <param name="searchParameters"></param>
/// <returns>Search results</returns>
[HttpGet("[controller]/{query?}/{user?}/{adv?}/{languages?}")]
public async Task<ActionResult<SearchResult>> SearchAsync(string query = "*", bool user = true, bool adv = false, [System.Web.Http.FromUri] string[] languages = null)
[HttpGet("[controller]/")]
public async Task<ActionResult<IEnumerable<ItemSearchResult>>> SearchAsync([FromQuery] SearchParameters searchParameters = null)
{
if (searchParameters is null)
{
searchParameters = new SearchParameters();
}
var currentUser = _authenticator.GetUser();
if (languages is null || languages.Length == 0)
if (searchParameters.IncludedLanguages is null || !searchParameters.IncludedLanguages.Any())
{
languages = _defaultLanguages;
searchParameters.IncludedLanguages = _defaultLanguages;
}
try
{
var items = await Searchers.SearchForItemsAsync(currentUser.Id, query, adv, includePrivateRecords: user, _connector, _searchClient, languages.ToList());
var res = new SearchResult()
var items = await Searchers.SearchForItemsAsync(currentUser.Id, searchParameters.SearchQuery, searchParameters.UseAdvancedSyntax, includePrivateRecords: searchParameters.IncludeUsers, _connector, _searchClient, searchParameters.IncludedLanguages.ToList());
var res = PagedList<ItemSearchResult>.ToPagedList(items, searchParameters.PageNumber, searchParameters.PageSize);
var metadata = new
{
Items = items,
res.TotalCount,
res.PageSize,
res.CurrentPage,
res.TotalPages,
res.HasNext,
res.HasPrevious
};
Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata));
return res;
}
catch (Exception e)
......@@ -74,4 +88,4 @@ namespace Coscine.Api.Search.Controllers
}
}
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
namespace Coscine.Api.Search.Helpers;
/// <summary>
/// Helper class for paged results
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedList<T> : List<T>
{
/// <summary>
/// The current page
/// </summary>
public int CurrentPage { get; }
/// <summary>
/// Total pages
/// </summary>
public int TotalPages { get; }
/// <summary>
/// The site of a page
/// </summary>
public int PageSize { get; }
/// <summary>
/// Total amount of results
/// </summary>
public int TotalCount { get; }
/// <summary>
/// Has a previous pages
/// </summary>
public bool HasPrevious => CurrentPage > 1;
/// <summary>
/// Has a following page
/// </summary>
public bool HasNext => CurrentPage < TotalPages;
/// <summary>
/// Create a paged list
/// </summary>
/// <param name="items"></param>
/// <param name="count"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
public PagedList(IEnumerable<T> items, int count, int pageNumber, int pageSize)
{
TotalCount = count;
PageSize = pageSize;
CurrentPage = pageNumber;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
AddRange(items);
}
/// <summary>
/// Create a paged list
/// </summary>
/// <param name="source"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
// source should better be IQueryable
public static PagedList<T> ToPagedList(IEnumerable<T> source, int pageNumber, int pageSize)
{
var count = source.Count();
var items = source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
return new PagedList<T>(items, count, pageNumber, pageSize);
}
}
\ No newline at end of file
namespace Coscine.Api.Search.Models
{
/// <summary>
/// Parameters for pagination of the search
/// </summary>
public class QueryStringParameters
{
private const int maxPageSize = 50;
/// <summary>
/// The requested page number
/// </summary>
public int PageNumber { get; set; } = 1;
private int _pageSize = 10;
/// <summary>
/// The size of a page
/// </summary>
public int PageSize
{
get
{
return _pageSize;
}
set
{
_pageSize = (value > maxPageSize) ? maxPageSize : value;
}
}
}
}
\ No newline at end of file
using System.Collections.Generic;
namespace Coscine.Api.Search.Models
{
/// <summary>
/// Parameters and filters for the search
/// </summary>
public class SearchParameters : QueryStringParameters
{
/// <summary>
/// The actual search query
/// </summary>
public string SearchQuery { get; set; } = "*";
/// <summary>
/// Specify user or only public metadata records could be found
/// </summary>
public bool IncludeUsers { get; set; } = true;
/// <summary>
/// Set true for advanced Elasticsearch search syntax
/// </summary>
public bool UseAdvancedSyntax { get; set; }
/// <summary>
/// Set the used languages
/// </summary>
public IEnumerable<string> IncludedLanguages { get; set; }
}
}
\ No newline at end of file
using System.Collections.Generic;
using Coscine.Api.Search.Helpers;
namespace Coscine.Api.Search.Models
{
......@@ -10,6 +10,6 @@ namespace Coscine.Api.Search.Models
/// <summary>
/// Search result files
/// </summary>
public IEnumerable<ItemSearchResult> Items { get; set; }
public PagedList<ItemSearchResult> Items { get; set; }
}
}
}
\ No newline at end of file
......@@ -5,7 +5,7 @@
<AssemblyName>Coscine.Api.Search</AssemblyName>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<TargetFramework>net6.0</TargetFramework>
<Version>1.5.0</Version>
<Version>1.6.0</Version>
</PropertyGroup>
<PropertyGroup>
<Authors>RWTH Aachen University</Authors>
......