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
///