diff --git a/API/Controllers/SearchController.cs b/API/Controllers/SearchController.cs index d059d93..cdf4516 100644 --- a/API/Controllers/SearchController.cs +++ b/API/Controllers/SearchController.cs @@ -36,7 +36,9 @@ public class SearchController(MangaContext context) : Controller (Manga manga, MangaConnectorId id)[] mangas = connector.SearchManga(Query); - IEnumerable result = mangas.Select(manga => manga.manga).Select(m => + IEnumerable<(Manga manga, MangaConnectorId id)> addedManga = mangas.Where(kv => context.AddMangaToContext(kv, HttpContext.RequestAborted).GetAwaiter().GetResult()); + + IEnumerable result = addedManga.Select(manga => manga.manga).Select(m => { IEnumerable ids = m.MangaConnectorIds.Select(id => new MangaConnectorId(id.Key, id.MangaConnectorName, id.ObjId, id.WebsiteUrl, id.UseForDownload)); @@ -57,15 +59,15 @@ public class SearchController(MangaContext context) : Controller [ProducesResponseType(Status200OK, "application/json")] [ProducesResponseType(Status404NotFound, "text/plain")] [ProducesResponseType(Status500InternalServerError, "text/plain")] - public Results, NotFound, InternalServerError> GetMangaFromUrl ([FromBody]string url) + public async Task, NotFound, InternalServerError>> GetMangaFromUrl ([FromBody]string url) { if(Tranga.MangaConnectors.FirstOrDefault(c => c.Name.Equals("Global", StringComparison.InvariantCultureIgnoreCase)) is not { } connector) return TypedResults.InternalServerError("Could not find Global Connector."); - if(connector.GetMangaFromUrl(url) is not { } manga) + if(connector.GetMangaFromUrl(url) is not ({ } m, not null) manga) return TypedResults.NotFound("Could not retrieve Manga"); - if(Tranga.AddMangaToContext(manga, context, out Manga? m, HttpContext.RequestAborted) == false) + if(await context.AddMangaToContext(manga, HttpContext.RequestAborted) == false) return TypedResults.InternalServerError("Could not add Manga to context"); IEnumerable ids = m.MangaConnectorIds.Select(id => diff --git a/API/Tranga.cs b/API/Tranga.cs index 2391fc3..1f21362 100644 --- a/API/Tranga.cs +++ b/API/Tranga.cs @@ -158,13 +158,14 @@ public static class Tranga RunningWorkers.Remove(worker, out _); } - internal static bool AddMangaToContext((Manga, MangaConnectorId) addManga, MangaContext context, [NotNullWhen(true)]out Manga? manga, CancellationToken token) => - AddMangaToContext(addManga.Item1, addManga.Item2, context, out manga, token); + internal static async Task AddMangaToContext(this MangaContext context, (Manga, MangaConnectorId) addManga, CancellationToken token) => + await AddMangaToContext(context, addManga.Item1, addManga.Item2, token); - internal static bool AddMangaToContext(Manga addManga, MangaConnectorId addMcId, MangaContext context, [NotNullWhen(true)]out Manga? manga, CancellationToken token) + internal static async Task AddMangaToContext(this MangaContext context, Manga addManga, MangaConnectorId addMcId, + CancellationToken token) { context.ChangeTracker.Clear(); - manga = context.FindMangaLike(addManga, token).Result; + Manga? manga = await context.FindMangaLike(addManga, token); if (manga is not null) { foreach (MangaConnectorId mcId in addManga.MangaConnectorIds) @@ -178,6 +179,8 @@ public static class Tranga manga.AltTitles = manga.AltTitles.UnionBy(addManga.AltTitles, altTitle => altTitle.Key).ToList(); manga.Chapters = manga.Chapters.UnionBy(addManga.Chapters, chapter => chapter.Key).ToList(); manga.MangaConnectorIds = manga.MangaConnectorIds.UnionBy(addManga.MangaConnectorIds, id => id.MangaConnectorName).ToList(); + + addManga = manga; } else { @@ -199,7 +202,7 @@ public static class Tranga context.Mangas.Add(manga); } - if (context.Sync(token).Result is { success: false }) + if (await context.Sync(token) is { success: false }) return false; DownloadCoverFromMangaconnectorWorker downloadCoverWorker = new (addMcId);