diff --git a/RMuseum/Controllers/GanjoorController.cs b/RMuseum/Controllers/GanjoorController.cs index 7760834d..4bbdc361 100644 --- a/RMuseum/Controllers/GanjoorController.cs +++ b/RMuseum/Controllers/GanjoorController.cs @@ -601,6 +601,29 @@ namespace RMuseum.Controllers return BadRequest(res.ExceptionString); } + + /// + /// Search Verses By query + /// + /// + /// + /// + [HttpGet] + [Route("verse/search")] + [AllowAnonymous] + [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorSearchVerseViewModel[]))] + [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] + [ProducesResponseType((int)HttpStatusCode.NotFound)] + public async Task SearchVersesByQuery(string query, int poetId = 0) + { + RServiceResult res = await _ganjoorService.SearchVersesByQuery(query, poetId); + if (!string.IsNullOrEmpty(res.ExceptionString)) + return BadRequest(res.ExceptionString); + if (res.Result == null) + return NotFound(); + return Ok(res.Result); + } + /// /// Ganjoor Service /// diff --git a/RMuseum/Models/Ganjoor/ViewModels/GanjoorSearchVerseViewModel.cs b/RMuseum/Models/Ganjoor/ViewModels/GanjoorSearchVerseViewModel.cs new file mode 100644 index 00000000..c3abe951 --- /dev/null +++ b/RMuseum/Models/Ganjoor/ViewModels/GanjoorSearchVerseViewModel.cs @@ -0,0 +1,36 @@ +namespace RMuseum.Models.Ganjoor.ViewModels +{ + /// + /// Ganjoor Verse View Model + /// + public class GanjoorSearchVerseViewModel + { + /// + /// global id, auto generated (missing in Ganjoor Desktop database) + /// + public int Id { get; set; } + + /// + /// vorder + /// + public int VOrder { get; set; } + + /// + /// position + /// + public VersePosition VersePosition { get; set; } + + /// + /// text + /// + public string Text { get; set; } + + public int? PoemId { get; set; } + + public string PoemFullTitle { get; set; } + + public string PoemFullUrl { get; set; } + + public int PoetId { get; set; } + } +} diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index 47dc125e..3158323d 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -799,6 +799,14 @@ + + + Search Verses By query + + + + + Ganjoor Service @@ -4550,6 +4558,31 @@ root cat id + + + Ganjoor Verse View Model + + + + + global id, auto generated (missing in Ganjoor Desktop database) + + + + + vorder + + + + + position + + + + + text + + Ganjoor Verse View Model @@ -6112,6 +6145,14 @@ + + + Search Verses By query + + + + + IArtifactService implementation diff --git a/RMuseum/Services/IGanjoorService.cs b/RMuseum/Services/IGanjoorService.cs index bf20264c..8ab58147 100644 --- a/RMuseum/Services/IGanjoorService.cs +++ b/RMuseum/Services/IGanjoorService.cs @@ -212,5 +212,15 @@ namespace RMuseum.Services /// /// RServiceResult ImportFromMySql(); + + /// + /// Search Verses By query + /// + /// + /// + /// + Task> SearchVersesByQuery(string query, int poetId = 0); + + } } diff --git a/RMuseum/Services/Implementation/GanjoorService.cs b/RMuseum/Services/Implementation/GanjoorService.cs index 735d873f..2d47b176 100644 --- a/RMuseum/Services/Implementation/GanjoorService.cs +++ b/RMuseum/Services/Implementation/GanjoorService.cs @@ -1386,9 +1386,42 @@ namespace RMuseum.Services.Implementation return new RServiceResult(null, exp.ToString()); } } - + public async Task> SearchVersesByQuery(string query, int poetId = 0) + { + try + { + var versesQ = _context.GanjoorVerses.Include(v => v.Poem).ThenInclude(p => p.Cat) + .Where(v => v.Text.Contains(query)); + if (poetId != 0) + { + versesQ = versesQ.Where(v => v.Poem.Cat.PoetId == poetId); + } + + var verses = await versesQ.Select + ( + v => new GanjoorSearchVerseViewModel + { + Id = v.Id, + VOrder = v.VOrder, + VersePosition = v.VersePosition, + Text = v.Text, + PoemId = v.PoemId, + PoetId = v.Poem.Cat.PoetId, + PoemFullTitle = v.Poem.FullTitle, + PoemFullUrl = v.Poem.FullUrl, + } + ).Take(50).ToArrayAsync(); + + return new RServiceResult(verses); + } + catch (Exception exp) + { + return new RServiceResult(null, exp.ToString()); + } + } + /// /// Database Contetxt ///