From 167e2853f05795bd9473e9c55db1fd8a99e66102 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 1 Nov 2023 17:12:06 +0100 Subject: [PATCH] Load every items from postgres on meilisearch creation --- back/src/Kyoo.Host/Application.cs | 7 ++++-- .../src/Kyoo.Meilisearch/MeilisearchModule.cs | 21 ++++++++++++++++++ back/src/Kyoo.Meilisearch/SearchManager.cs | 22 +++++++++---------- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/back/src/Kyoo.Host/Application.cs b/back/src/Kyoo.Host/Application.cs index b406cd1e..9263fa6f 100644 --- a/back/src/Kyoo.Host/Application.cs +++ b/back/src/Kyoo.Host/Application.cs @@ -103,8 +103,11 @@ namespace Kyoo.Host .ConfigureContainer(configure) .Build(); - PostgresModule.Initialize(host.Services); - await MeilisearchModule.Initialize(host.Services); + await using (AsyncServiceScope scope = host.Services.CreateAsyncScope()) + { + PostgresModule.Initialize(scope.ServiceProvider); + await MeilisearchModule.Initialize(scope.ServiceProvider); + } await _StartWithHost(host); } diff --git a/back/src/Kyoo.Meilisearch/MeilisearchModule.cs b/back/src/Kyoo.Meilisearch/MeilisearchModule.cs index 642d9617..56e98a7f 100644 --- a/back/src/Kyoo.Meilisearch/MeilisearchModule.cs +++ b/back/src/Kyoo.Meilisearch/MeilisearchModule.cs @@ -137,6 +137,27 @@ namespace Kyoo.Meiliseach await _CreateIndex(client, "items", true); await _CreateIndex(client, nameof(Episode), false); await _CreateIndex(client, nameof(Studio), false); + + IndexStats info = await client.Index("items").GetStatsAsync(); + // If there is no documents in meilisearch, if a db exist and is not empty, add items to meilisearch. + if (info.NumberOfDocuments == 0) + { + ILibraryManager database = provider.GetRequiredService(); + SearchManager search = provider.GetRequiredService(); + + // This is a naive implementation that absolutly does not care about performances. + // This will run only once on users that already had a database when they upgrade. + foreach (Movie movie in await database.Movies.GetAll(limit: 0)) + await search.CreateOrUpdate("items", movie, nameof(Movie)); + foreach (Show show in await database.Shows.GetAll(limit: 0)) + await search.CreateOrUpdate("items", show, nameof(Show)); + foreach (Collection collection in await database.Collections.GetAll(limit: 0)) + await search.CreateOrUpdate("items", collection, nameof(Collection)); + foreach (Episode episode in await database.Episodes.GetAll(limit: 0)) + await search.CreateOrUpdate(nameof(Episode), episode); + foreach (Studio studio in await database.Studios.GetAll(limit: 0)) + await search.CreateOrUpdate(nameof(Studio), studio); + } } private static async Task _CreateIndex(MeilisearchClient client, string index, bool hasKind) diff --git a/back/src/Kyoo.Meilisearch/SearchManager.cs b/back/src/Kyoo.Meilisearch/SearchManager.cs index 22c18d09..20fa7af0 100644 --- a/back/src/Kyoo.Meilisearch/SearchManager.cs +++ b/back/src/Kyoo.Meilisearch/SearchManager.cs @@ -51,26 +51,26 @@ public class SearchManager : ISearchManager _client = client; _libraryManager = libraryManager; - IRepository.OnCreated += (x) => _CreateOrUpdate("items", x, nameof(Movie)); - IRepository.OnEdited += (x) => _CreateOrUpdate("items", x, nameof(Movie)); + IRepository.OnCreated += (x) => CreateOrUpdate("items", x, nameof(Movie)); + IRepository.OnEdited += (x) => CreateOrUpdate("items", x, nameof(Movie)); IRepository.OnDeleted += (x) => _Delete("items", x.Id, nameof(Movie)); - IRepository.OnCreated += (x) => _CreateOrUpdate("items", x, nameof(Show)); - IRepository.OnEdited += (x) => _CreateOrUpdate("items", x, nameof(Show)); + IRepository.OnCreated += (x) => CreateOrUpdate("items", x, nameof(Show)); + IRepository.OnEdited += (x) => CreateOrUpdate("items", x, nameof(Show)); IRepository.OnDeleted += (x) => _Delete("items", x.Id, nameof(Show)); - IRepository.OnCreated += (x) => _CreateOrUpdate("items", x, nameof(Collection)); - IRepository.OnEdited += (x) => _CreateOrUpdate("items", x, nameof(Collection)); + IRepository.OnCreated += (x) => CreateOrUpdate("items", x, nameof(Collection)); + IRepository.OnEdited += (x) => CreateOrUpdate("items", x, nameof(Collection)); IRepository.OnDeleted += (x) => _Delete("items", x.Id, nameof(Collection)); - IRepository.OnCreated += (x) => _CreateOrUpdate(nameof(Episode), x); - IRepository.OnEdited += (x) => _CreateOrUpdate(nameof(Episode), x); + IRepository.OnCreated += (x) => CreateOrUpdate(nameof(Episode), x); + IRepository.OnEdited += (x) => CreateOrUpdate(nameof(Episode), x); IRepository.OnDeleted += (x) => _Delete(nameof(Episode), x.Id); - IRepository.OnCreated += (x) => _CreateOrUpdate(nameof(Studio), x); - IRepository.OnEdited += (x) => _CreateOrUpdate(nameof(Studio), x); + IRepository.OnCreated += (x) => CreateOrUpdate(nameof(Studio), x); + IRepository.OnEdited += (x) => CreateOrUpdate(nameof(Studio), x); IRepository.OnDeleted += (x) => _Delete(nameof(Studio), x.Id); } - private async Task _CreateOrUpdate(string index, IResource item, string? kind = null) + public async Task CreateOrUpdate(string index, IResource item, string? kind = null) { if (kind != null) {