diff --git a/Francesco.Recipes.World/Repositories/Instruction/IInstructionRepository.cs b/Francesco.Recipes.World/Repositories/Instruction/IInstructionRepository.cs index 7969570..1d22238 100644 --- a/Francesco.Recipes.World/Repositories/Instruction/IInstructionRepository.cs +++ b/Francesco.Recipes.World/Repositories/Instruction/IInstructionRepository.cs @@ -1,9 +1,16 @@ namespace Francesco.Recipes.World.Repositories.Instruction { using Francesco.Recipes.World.Models.BackendModels.Instruction; + using Francesco.Recipes.World.Models.BackendModels.Recipe; public interface IInstructionRepository { Task GetInstructionAsync(Guid instructionId); + + Task CreateInstructionToRecipeAsync(Guid recipeId, string description, int number); + + Task> GetInstructionsByRecipeIdAsync(Guid recipeId); + + Task RemoveInstructionFromRecipeAsync(Recipe recipe, Guid instructionId); } } diff --git a/Francesco.Recipes.World/Repositories/Instruction/InstructionRepository.cs b/Francesco.Recipes.World/Repositories/Instruction/InstructionRepository.cs index b772813..09561c5 100644 --- a/Francesco.Recipes.World/Repositories/Instruction/InstructionRepository.cs +++ b/Francesco.Recipes.World/Repositories/Instruction/InstructionRepository.cs @@ -2,13 +2,18 @@ { using Francesco.Recipes.World.Data; using Francesco.Recipes.World.Models.BackendModels.Instruction; + using Francesco.Recipes.World.Models.BackendModels.Recipe; + using Francesco.Recipes.World.Repositories.Recipe; + using Microsoft.EntityFrameworkCore; public class InstructionRepository : IInstructionRepository { private readonly FrancescosRecipesWorldDbContext _context; + private readonly IRecipeRepository _recipeRepository; - public InstructionRepository(FrancescosRecipesWorldDbContext context) + public InstructionRepository(FrancescosRecipesWorldDbContext context, IRecipeRepository recipeRepository) { + _recipeRepository = recipeRepository; _context = context; } @@ -17,5 +22,57 @@ var instruction = await _context.Instructions.FindAsync(instructionId); return instruction ?? throw new InvalidDataException($"Instruction {instructionId} not found."); } + + public async Task CreateInstructionToRecipeAsync(Guid recipeId, string description, int number) + { + var recipe = await _recipeRepository.GetRecipeAsync(recipeId); + + if (string.IsNullOrWhiteSpace(description)) + { + throw new ArgumentException("Description cannot be empty", nameof(description)); + } + + if (number <= 0) + { + throw new ArgumentOutOfRangeException(nameof(number), "Number must be greater than 0."); + } + + var newInstruction = new Instruction + { + Id = Guid.NewGuid(), + Description = description, + Number = number, + Recipe = recipe, + }; + + _context.Instructions.Add(newInstruction); + await _context.SaveChangesAsync(); + + return newInstruction; + } + + public async Task RemoveInstructionFromRecipeAsync(Recipe recipe, Guid instructionId) + { + if (recipe == null) + { + throw new ArgumentNullException(nameof(recipe)); + } + + var instructionToRemove = recipe.Instructions.FirstOrDefault(i => i.Id == instructionId); + + if (instructionToRemove != null) + { + recipe.Instructions.Remove(instructionToRemove); + await _context.SaveChangesAsync(); + } + } + + public async Task> GetInstructionsByRecipeIdAsync(Guid recipeId) + { + return await _context.Instructions + .Include(i => i.Recipe) + .Where(i => i.Recipe.Id == recipeId) + .ToListAsync(); + } } }