From 9d90a54830ef67a5aff285472329e2d3f8b5e85e Mon Sep 17 00:00:00 2001 From: Francesco Lorenzo D'Amico Date: Tue, 3 Jun 2025 09:20:41 +0200 Subject: [PATCH] Refactor some code in one method --- .../Repositories/Recipe/RecipeRepository.cs | 74 +++++++++---------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/Francesco.Recipes.World/Repositories/Recipe/RecipeRepository.cs b/Francesco.Recipes.World/Repositories/Recipe/RecipeRepository.cs index d097f7d..3f8c683 100644 --- a/Francesco.Recipes.World/Repositories/Recipe/RecipeRepository.cs +++ b/Francesco.Recipes.World/Repositories/Recipe/RecipeRepository.cs @@ -1,5 +1,7 @@ namespace Francesco.Recipes.World.Repositories.Recipe { + using System.Linq.Expressions; + using Francesco.Recipes.World.Constants; using Francesco.Recipes.World.Data; using Francesco.Recipes.World.Models; using Francesco.Recipes.World.Models.BackendModels.Category; @@ -158,52 +160,17 @@ return await _context.Recipes .OrderByDescending(r => r.CreatedAt) .Take(20) - .Select(r => new SearchViewModel - { - Id = r.Id, - Name = r.Name, - Description = r.Description, - IsFavorite = r.IsFavorite, - ImageData = r.MediaFiles - .Where(m => m.MimeType != null && m.MimeType.StartsWith("image/")) - .Select(m => m.Data) - .FirstOrDefault(), - MimeType = r.MediaFiles - .Where(m => m.MimeType != null && m.MimeType.StartsWith("image/")) - .Select(m => m.MimeType) - .FirstOrDefault(), - Ingredients = r.RecipeIngredients.Select(ri => ri.Ingredient.Name).ToList(), - TotalTime = r.PreparationTime.Add(r.CookingTime), - }) + .Select(SearchViewModelSelector()) .ToListAsync(); } var normalizedSearchTerm = searchTerm.ToLower(); - return await _context.Recipes - .Where(r => EF.Functions.Like(r.Name.ToLower(), $"%{normalizedSearchTerm}%") || - (r.Description != null && EF.Functions.Like(r.Description.ToLower(), $"%{normalizedSearchTerm}%")) || - r.RecipeIngredients.Any(ri => EF.Functions.Like(ri.Ingredient.Name.ToLower(), $"%{normalizedSearchTerm}%"))) + return await ApplyRecipeSearchFilter(_context.Recipes, normalizedSearchTerm) .OrderByDescending(r => r.CreatedAt) .Take(100) - .Select(r => new SearchViewModel - { - Id = r.Id, - Name = r.Name, - Description = r.Description, - IsFavorite = r.IsFavorite, - ImageData = r.MediaFiles - .Where(m => m.MimeType != null && m.MimeType.StartsWith("image/")) - .Select(m => m.Data) - .FirstOrDefault(), - MimeType = r.MediaFiles - .Where(m => m.MimeType != null && m.MimeType.StartsWith("image/")) - .Select(m => m.MimeType) - .FirstOrDefault(), - Ingredients = r.RecipeIngredients.Select(ri => ri.Ingredient.Name).ToList(), - TotalTime = r.PreparationTime.Add(r.CookingTime), - }) - .ToListAsync(); + .Select(SearchViewModelSelector()) + .ToListAsync(); } catch (Exception ex) { @@ -231,6 +198,35 @@ .ToListAsync(); } + private static Expression> SearchViewModelSelector() + { + return r => new SearchViewModel + { + Id = r.Id, + Name = r.Name, + Description = r.Description, + IsFavorite = r.IsFavorite, + ImageData = r.MediaFiles + .Where(m => m.MimeType != null && m.MimeType.StartsWith(ContentType.Image)) + .Select(m => m.Data) + .FirstOrDefault(), + MimeType = r.MediaFiles + .Where(m => m.MimeType != null && m.MimeType.StartsWith(ContentType.Image)) + .Select(m => m.MimeType) + .FirstOrDefault(), + Ingredients = r.RecipeIngredients.Select(ri => ri.Ingredient.Name).ToList(), + TotalTime = r.PreparationTime.Add(r.CookingTime), + }; + } + + private static IQueryable ApplyRecipeSearchFilter(IQueryable query, string normalizedSearchTerm) + { + return query.Where(r => + EF.Functions.Like(r.Name.ToLower(), $"%{normalizedSearchTerm}%") || + (r.Description != null && EF.Functions.Like(r.Description.ToLower(), $"%{normalizedSearchTerm}%")) || + r.RecipeIngredients.Any(ri => EF.Functions.Like(ri.Ingredient.Name.ToLower(), $"%{normalizedSearchTerm}%"))); + } + public async Task DeleteRecipeAsync(Guid recipeId) { var recipe = await GetRecipeByIdAsync(recipeId);