From bd8c3a0fab5a0cc277792b66a4c6d52109aed56a Mon Sep 17 00:00:00 2001 From: Elias Jansson Date: Thu, 22 May 2025 22:15:33 +0200 Subject: [PATCH] Recept och bilder --- Aberwyn/Controllers/MealController.cs | 7 +- Aberwyn/Data/MenuService.cs | 80 +++++++++-- Aberwyn/Models/MenuViewModel.cs | 10 +- Aberwyn/Views/Meal/Meal.cshtml | 4 + Aberwyn/Views/Meal/View.cshtml | 188 +++++++++++++++++--------- Aberwyn/wwwroot/css/menu.css | 1 + 6 files changed, 213 insertions(+), 77 deletions(-) diff --git a/Aberwyn/Controllers/MealController.cs b/Aberwyn/Controllers/MealController.cs index 12b5649..75df2a5 100644 --- a/Aberwyn/Controllers/MealController.cs +++ b/Aberwyn/Controllers/MealController.cs @@ -94,7 +94,6 @@ namespace Aberwyn.Controllers } else { - // ✅ Hämta tidigare måltid och kopiera bilddata var existingMeal = service.GetMealById(meal.Id); if (existingMeal != null) { @@ -103,13 +102,17 @@ namespace Aberwyn.Controllers } } - service.SaveOrUpdateMeal(meal); + // 🔁 Här är ändringen – använd metoden som även sparar ingredienser + service.SaveOrUpdateMealWithIngredients(meal); + return RedirectToAction("View", new { id = meal.Id }); } + + [HttpPost] public IActionResult DeleteMeal(int id) { diff --git a/Aberwyn/Data/MenuService.cs b/Aberwyn/Data/MenuService.cs index 7a559be..07fb322 100644 --- a/Aberwyn/Data/MenuService.cs +++ b/Aberwyn/Data/MenuService.cs @@ -134,6 +134,55 @@ namespace Aberwyn.Data return weeklyMenu; } + public List GetIngredientsForMeal(int mealId) + { + var ingredients = new List(); + using var conn = GetConnection(); + conn.Open(); + string query = "SELECT Id, MealId, Quantity, Item FROM Ingredients WHERE MealId = @mealId"; + + using var cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@mealId", mealId); + + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + ingredients.Add(new Ingredient + { + Id = reader.GetInt32("Id"), + MealId = reader.GetInt32("MealId"), + Quantity = reader.GetString("Quantity"), + Item = reader.GetString("Item") + }); + } + return ingredients; + } + public void SaveIngredients(int mealId, List ingredients) + { + using var conn = GetConnection(); + conn.Open(); + + using var tx = conn.BeginTransaction(); + + // Ta bort gamla + var deleteCmd = new MySqlCommand("DELETE FROM Ingredients WHERE MealId = @mealId", conn, tx); + deleteCmd.Parameters.AddWithValue("@mealId", mealId); + deleteCmd.ExecuteNonQuery(); + + foreach (var ingredient in ingredients) + { + var insertCmd = new MySqlCommand( + "INSERT INTO Ingredients (MealId, Quantity, Item) VALUES (@mealId, @quantity, @item)", + conn, tx); + + insertCmd.Parameters.AddWithValue("@mealId", mealId); + insertCmd.Parameters.AddWithValue("@quantity", ingredient.Quantity ?? ""); + insertCmd.Parameters.AddWithValue("@item", ingredient.Item ?? ""); + insertCmd.ExecuteNonQuery(); + } + + tx.Commit(); + } public List GetMeals() { @@ -205,7 +254,7 @@ namespace Aberwyn.Data using var connection = GetConnection(); connection.Open(); - string query = @"SELECT Id, Name, Description, ProteinType, CarbType, RecipeUrl, CreatedAt, ImageUrl, ImageData, ImageMimeType FROM Meals WHERE Id = @id"; + string query = @"SELECT Id, Name, Description, ProteinType, CarbType, RecipeUrl, CreatedAt, ImageUrl, ImageData, ImageMimeType, Instructions FROM Meals WHERE Id = @id"; using var cmd = new MySqlCommand(query, connection); cmd.Parameters.AddWithValue("@id", id); @@ -224,8 +273,9 @@ namespace Aberwyn.Data ImageUrl = reader.IsDBNull(reader.GetOrdinal("ImageUrl")) ? null : reader.GetString(reader.GetOrdinal("ImageUrl")), CreatedAt = reader.GetDateTime(reader.GetOrdinal("CreatedAt")), ImageData = reader.IsDBNull(reader.GetOrdinal("ImageData")) ? null : (byte[])reader["ImageData"], - ImageMimeType = reader.IsDBNull(reader.GetOrdinal("ImageMimeType")) ? null : reader.GetString(reader.GetOrdinal("ImageMimeType")) - + ImageMimeType = reader.IsDBNull(reader.GetOrdinal("ImageMimeType")) ? null : reader.GetString(reader.GetOrdinal("ImageMimeType")), + Instructions = reader.IsDBNull(reader.GetOrdinal("Instructions")) ? null : reader.GetString(reader.GetOrdinal("Instructions")), + Ingredients = GetIngredientsForMeal(id) }; @@ -254,9 +304,9 @@ namespace Aberwyn.Data { cmd.CommandText = @" INSERT INTO Meals - (Name, Description, ProteinType, CarbType, RecipeUrl, CreatedAt, ImageUrl, ImageData, ImageMimeType) + (Name, Description, ProteinType, CarbType, RecipeUrl, CreatedAt, ImageUrl, ImageData, ImageMimeType, Instructions) VALUES - (@Name, @Description, @ProteinType, @CarbType, @RecipeUrl, @CreatedAt, @ImageUrl, @ImageData, @ImageMimeType); + (@Name, @Description, @ProteinType, @CarbType, @RecipeUrl, @CreatedAt, @ImageUrl, @ImageData, @ImageMimeType, @Instructions); SELECT LAST_INSERT_ID();"; } else @@ -270,7 +320,8 @@ namespace Aberwyn.Data RecipeUrl = @RecipeUrl, ImageUrl = @ImageUrl, ImageData = @ImageData, - ImageMimeType = @ImageMimeType + ImageMimeType = @ImageMimeType, + Instructions = @Instructions WHERE Id = @Id"; cmd.Parameters.AddWithValue("@Id", meal.Id); } @@ -282,10 +333,9 @@ namespace Aberwyn.Data cmd.Parameters.AddWithValue("@RecipeUrl", meal.RecipeUrl ?? ""); cmd.Parameters.AddWithValue("@CreatedAt", meal.CreatedAt == default ? DateTime.Now : meal.CreatedAt); cmd.Parameters.AddWithValue("@ImageUrl", meal.ImageUrl ?? ""); - - // ✨ Här är nyckeln cmd.Parameters.AddWithValue("@ImageData", (object?)meal.ImageData ?? DBNull.Value); cmd.Parameters.AddWithValue("@ImageMimeType", meal.ImageMimeType ?? (object)DBNull.Value); + cmd.Parameters.AddWithValue("@Instructions", meal.Instructions ?? ""); if (meal.Id == 0) { @@ -298,9 +348,6 @@ namespace Aberwyn.Data } } - - - public void UpdateWeeklyMenu(MenuViewModel menuData) { if (menuData == null || menuData.WeeklyMenus == null) @@ -413,6 +460,17 @@ namespace Aberwyn.Data _ => throw new System.ArgumentException("Invalid day name") }; } + public void SaveOrUpdateMealWithIngredients(Meal meal) + { + // Spara/uppdatera måltid + SaveOrUpdateMeal(meal); + + // Om måltiden har ingredienser – spara dem + if (meal.Ingredients != null && meal.Ingredients.Count > 0) + { + SaveIngredients(meal.Id, meal.Ingredients); + } + } public List GetMenuEntriesByDateRange(DateTime startDate, DateTime endDate) { var results = new List(); diff --git a/Aberwyn/Models/MenuViewModel.cs b/Aberwyn/Models/MenuViewModel.cs index 311c01a..849eb2f 100644 --- a/Aberwyn/Models/MenuViewModel.cs +++ b/Aberwyn/Models/MenuViewModel.cs @@ -46,7 +46,15 @@ namespace Aberwyn.Models public DateTime CreatedAt { get; set; } public byte[] ImageData { get; set; } public string ImageMimeType { get; set; } // t.ex. "image/jpeg" - + public string Instructions { get; set; } // 👈 Tillagningstext + public List Ingredients { get; set; } = new(); + } + public class Ingredient + { + public int Id { get; set; } + public int MealId { get; set; } + public string Quantity { get; set; } + public string Item { get; set; } } public class MealDto diff --git a/Aberwyn/Views/Meal/Meal.cshtml b/Aberwyn/Views/Meal/Meal.cshtml index 94b6601..b1777df 100644 --- a/Aberwyn/Views/Meal/Meal.cshtml +++ b/Aberwyn/Views/Meal/Meal.cshtml @@ -151,4 +151,8 @@ } } }); + + const modalImageInput = document.getElementById("modalImageInput"); + + diff --git a/Aberwyn/Views/Meal/View.cshtml b/Aberwyn/Views/Meal/View.cshtml index d9b3e87..50cdb75 100644 --- a/Aberwyn/Views/Meal/View.cshtml +++ b/Aberwyn/Views/Meal/View.cshtml @@ -1,4 +1,7 @@ @model Aberwyn.Models.Meal +@using Microsoft.AspNetCore.Authorization +@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor + @{ ViewData["Title"] = Model.Name; bool isEditing = (bool)(ViewData["IsEditing"] ?? false); @@ -14,13 +17,21 @@ imageSrc = "/images/placeholder-meal.jpg"; } + bool isChef = HttpContextAccessor.HttpContext.User.IsInRole("Chef"); + isEditing = isEditing && isChef; }
-
+
@Model.Name
+ @if (isEditing) + { +
+ +
+ }

@Model.Name

@@ -32,8 +43,6 @@ {
- -
@@ -61,6 +70,27 @@
+
+

Så här gör du

+
+ + +
+
+ +
+ @for (int i = 0; i < Model.Ingredients.Count; i++) + { +
+ + +
+ } +
+ +
+
+
@@ -87,100 +117,118 @@ }
- - Redigera + @if (isChef) + { + Redigera + } + +
+ + } - -
- -