From 9b8fb7596fa01074e0a7031a448a59716f4b3baa Mon Sep 17 00:00:00 2001 From: Scott Merchant Date: Mon, 10 Jun 2024 15:29:46 +0930 Subject: [PATCH] Fix format issues --- .../FilterExtensionMethods.cs | 48 +++++++++++++++---- back/src/Kyoo.Meilisearch/MeiliSync.cs | 2 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/back/src/Kyoo.Meilisearch/FilterExtensionMethods.cs b/back/src/Kyoo.Meilisearch/FilterExtensionMethods.cs index de68b10d..b9a55503 100644 --- a/back/src/Kyoo.Meilisearch/FilterExtensionMethods.cs +++ b/back/src/Kyoo.Meilisearch/FilterExtensionMethods.cs @@ -1,10 +1,11 @@ +using System.Collections; using System.ComponentModel.DataAnnotations; using Kyoo.Abstractions.Models.Utils; using static System.Text.Json.JsonNamingPolicy; namespace Kyoo.Meiliseach; -public static class FilterExtensionMethods +internal static class FilterExtensionMethods { public static string? CreateMeilisearchFilter(this Filter? filter) { @@ -14,17 +15,48 @@ public static class FilterExtensionMethods => $"({and.First.CreateMeilisearchFilter()}) AND ({and.Second.CreateMeilisearchFilter()})", Filter.Or or => $"({or.First.CreateMeilisearchFilter()}) OR ({or.Second.CreateMeilisearchFilter()})", - Filter.Gt gt => $"{CamelCase.ConvertName(gt.Property)} > '{gt.Value}'", - Filter.Lt lt => $"{CamelCase.ConvertName(lt.Property)} < '{lt.Value}'", - Filter.Ge ge => $"{CamelCase.ConvertName(ge.Property)} >= '{ge.Value}'", - Filter.Le le => $"{CamelCase.ConvertName(le.Property)} <= '{le.Value}'", - Filter.Eq eq => $"{CamelCase.ConvertName(eq.Property)} = '{eq.Value}'", - Filter.Has has => $"{CamelCase.ConvertName(has.Property)} = '{has.Value}'", - Filter.Ne ne => $"{CamelCase.ConvertName(ne.Property)} != '{ne.Value}'", + Filter.Gt gt => $"{CamelCase.ConvertName(gt.Property)} > {gt.Value.InMeilsearchFilterFormat()}", + Filter.Lt lt => $"{CamelCase.ConvertName(lt.Property)} < {lt.Value.InMeilsearchFilterFormat()}", + Filter.Ge ge => $"{CamelCase.ConvertName(ge.Property)} >= {ge.Value.InMeilsearchFilterFormat()}", + Filter.Le le => $"{CamelCase.ConvertName(le.Property)} <= {le.Value.InMeilsearchFilterFormat()}", + Filter.Eq eq => $"{CamelCase.ConvertName(eq.Property)} = {eq.Value.InMeilsearchFilterFormat()}", + Filter.Has has => $"{CamelCase.ConvertName(has.Property)} = {has.Value.InMeilsearchFilterFormat()}", + Filter.Ne ne => $"{CamelCase.ConvertName(ne.Property)} != {ne.Value.InMeilsearchFilterFormat()}", Filter.Not not => $"NOT ({not.Filter.CreateMeilisearchFilter()})", Filter.CmpRandom => throw new ValidationException("Random comparison is not supported."), _ => null }; } + + private static object? InMeilsearchFilterFormat(this object? value) + { + return value switch + { + null => null, + string s => s.Any(char.IsWhiteSpace) ? $"\"{s}\"" : s, + DateTimeOffset dateTime => dateTime.ToUnixTimeSeconds(), + DateOnly date => date.ToUnixTimeSeconds(), + _ => value + }; + } + + public static object? InMeilisearchFormat(this object? value) + { + return value switch + { + null => null, + string => value, + Enum => value.ToString(), + IEnumerable enumerable => enumerable.Cast().Select(InMeilisearchFormat).ToArray(), + DateTimeOffset dateTime => dateTime.ToUnixTimeSeconds(), + DateOnly date => date.ToUnixTimeSeconds(), + _ => value + }; + } + + private static long ToUnixTimeSeconds(this DateOnly date) + { + return new DateTimeOffset(date.ToDateTime(new TimeOnly())).ToUnixTimeSeconds(); + } } diff --git a/back/src/Kyoo.Meilisearch/MeiliSync.cs b/back/src/Kyoo.Meilisearch/MeiliSync.cs index 0005ef81..39e55c0f 100644 --- a/back/src/Kyoo.Meilisearch/MeiliSync.cs +++ b/back/src/Kyoo.Meilisearch/MeiliSync.cs @@ -60,7 +60,7 @@ public class MeiliSync var dictionary = (IDictionary)expando; foreach (PropertyInfo property in item.GetType().GetProperties()) - dictionary.Add(CamelCase.ConvertName(property.Name), property.GetValue(item)); + dictionary.Add(CamelCase.ConvertName(property.Name), property.GetValue(item).InMeilisearchFormat()); dictionary.Add("ref", $"{kind}-{item.Id}"); expando.kind = kind; return _client.Index(index).AddDocumentsAsync(new[] { expando });