From 8b36c65437c48a74e54d1fbb53a98c8cd2691570 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 22 Dec 2025 16:52:06 +0100 Subject: [PATCH] Added search cache updating --- .../Controllers/SearchdomainController.cs | 30 +++++++++++++++++++ src/Shared/Models/SearchdomainModels.cs | 13 ++++++-- src/Shared/Models/SearchdomainResults.cs | 9 ++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/Server/Controllers/SearchdomainController.cs b/src/Server/Controllers/SearchdomainController.cs index 20f0f2e..286d8b5 100644 --- a/src/Server/Controllers/SearchdomainController.cs +++ b/src/Server/Controllers/SearchdomainController.cs @@ -185,6 +185,36 @@ public class SearchdomainController : ControllerBase return Ok(new SearchdomainDeleteSearchResult() {Success = false, Message = "Query not found in search cache"}); } + [HttpPatch("Searches")] + public ActionResult UpdateSearch(string searchdomain, string query, [FromBody]List results) + { + Searchdomain searchdomain_; + try + { + searchdomain_ = _domainManager.GetSearchdomain(searchdomain); + } + catch (SearchdomainNotFoundException) + { + _logger.LogError("Unable to retrieve the searchdomain {searchdomain} - it likely does not exist yet", [searchdomain]); + return Ok(new SearchdomainUpdateSearchResult() { Success = false, Message = "Searchdomain not found" }); + } + catch (Exception ex) + { + _logger.LogError("Unable to retrieve the searchdomain {searchdomain} - {ex.Message} - {ex.StackTrace}", [searchdomain, ex.Message, ex.StackTrace]); + return Ok(new SearchdomainUpdateSearchResult() { Success = false, Message = ex.Message }); + } + Dictionary searchCache = searchdomain_.searchCache; + bool containsKey = searchCache.ContainsKey(query); + if (containsKey) + { + DateTimedSearchResult element = searchCache[query]; + element.Results = results; + searchCache[query] = element; + return Ok(new SearchdomainUpdateSearchResult() {Success = true}); + } + return Ok(new SearchdomainUpdateSearchResult() {Success = false, Message = "Query not found in search cache"}); + } + [HttpGet("GetSettings")] public ActionResult GetSettings(string searchdomain) { diff --git a/src/Shared/Models/SearchdomainModels.cs b/src/Shared/Models/SearchdomainModels.cs index 646d701..f7cf407 100644 --- a/src/Shared/Models/SearchdomainModels.cs +++ b/src/Shared/Models/SearchdomainModels.cs @@ -2,12 +2,19 @@ using System.Text.Json.Serialization; namespace Shared.Models; -public readonly struct ResultItem(float score, string name) +public readonly struct ResultItem { [JsonPropertyName("Score")] - public readonly float Score { get; } = score; + public readonly float Score { get; } [JsonPropertyName("Name")] - public readonly string Name { get; } = name; + public readonly string Name { get; } + + [JsonConstructor] + public ResultItem(float score, string name) + { + Score = score; + Name = name; + } public static long EstimateSize(ResultItem item) { diff --git a/src/Shared/Models/SearchdomainResults.cs b/src/Shared/Models/SearchdomainResults.cs index 6866ca4..f6f1de7 100644 --- a/src/Shared/Models/SearchdomainResults.cs +++ b/src/Shared/Models/SearchdomainResults.cs @@ -64,6 +64,15 @@ public class SearchdomainDeleteSearchResult public string? Message { get; set; } } +public class SearchdomainUpdateSearchResult +{ + [JsonPropertyName("Success")] + public required bool Success { get; set; } + + [JsonPropertyName("Message")] + public string? Message { get; set; } +} + public class SearchdomainSettingsResults { [JsonPropertyName("Success")]