From 0323215a70b54471b518f1ff602a3530f8a0abe8 Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Sat, 28 Jun 2025 09:41:46 -0700 Subject: [PATCH] Impliment ProductImages --- ToDo.txt | 3 - .../Entities/DatabaseObjects.cs | 4 +- .../Services/DatabaseService/Product.cs | 48 +++------- .../Services/DatabaseService/ProductImage.cs | 91 +++++++++++++++++++ 4 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 src/MistoxWebsite.Server/Services/DatabaseService/ProductImage.cs diff --git a/ToDo.txt b/ToDo.txt index 4563410..770d47c 100755 --- a/ToDo.txt +++ b/ToDo.txt @@ -11,9 +11,6 @@ Server: Emails: Dont follow theme of website - ProductController: - GetProduct, GetAllProducts, UpdateProduct dont update the images in the new SQL table anymore - Client: Program Probably need to turn on cors at some point diff --git a/src/MistoxWebsite.Server/Entities/DatabaseObjects.cs b/src/MistoxWebsite.Server/Entities/DatabaseObjects.cs index b948b75..fff125d 100755 --- a/src/MistoxWebsite.Server/Entities/DatabaseObjects.cs +++ b/src/MistoxWebsite.Server/Entities/DatabaseObjects.cs @@ -25,7 +25,7 @@ namespace MistoxWebsite.Server.Entities { public string Name { get; set; } = ""; public string Description { get; set; } = ""; public int CurShowingIMG = 0; - public FormFile[] Images { get; set; } = []; + public ProductImage[] Images { get; set; } = []; public int Cost { get; set; } public string URL { get; set; } = ""; } @@ -33,7 +33,7 @@ namespace MistoxWebsite.Server.Entities { public class ProductImage { public int ImageID { get; set; } // PK public int ProductID { get; set; } - public byte[] Image { get; set; } = []; + public FormFile? Image { get; set; } = null; } public class Cart { diff --git a/src/MistoxWebsite.Server/Services/DatabaseService/Product.cs b/src/MistoxWebsite.Server/Services/DatabaseService/Product.cs index d2815de..8ca96b4 100755 --- a/src/MistoxWebsite.Server/Services/DatabaseService/Product.cs +++ b/src/MistoxWebsite.Server/Services/DatabaseService/Product.cs @@ -29,9 +29,12 @@ namespace MistoxWebsite.Server.Services.DatabaseService { int _cost = reader.GetInt32("Cost"); string _url = reader.GetString("URL"); + ProductImage[] images = await GetAllImages(_id); + items = new Product() { ID = _id, Name = _name, + Images = images, Description = _description, Cost = _cost, URL = _url @@ -42,7 +45,7 @@ namespace MistoxWebsite.Server.Services.DatabaseService { return items; } - public async Task> GetAllProducts() { + public async Task GetAllProducts() { List items = new List(); using (MySqlConnection connection = GetConnection()) { connection.Open(); @@ -58,9 +61,12 @@ namespace MistoxWebsite.Server.Services.DatabaseService { int _cost = reader.GetInt32("Cost"); string _url = reader.GetString("URL"); + ProductImage[] images = await GetAllImages(_id); + items.Add(new Product() { ID = _id, Name = _name, + Images = images, Description = _description, Cost = _cost, URL = _url @@ -68,13 +74,12 @@ namespace MistoxWebsite.Server.Services.DatabaseService { } } } - return items; + return items.ToArray(); } public async Task NewProduct(Product Item) { using (MySqlConnection connection = GetConnection()) { connection.Open(); - string command = @" INSERT INTO Product (Name, Description, Cost, URL) @@ -99,9 +104,8 @@ namespace MistoxWebsite.Server.Services.DatabaseService { Item.ID = reader.GetInt32("ID"); } } - foreach (FormFile cur in Item.Images) { - await AddImage( Item, cur ); - } + + await AddAllImages(Item); } } @@ -109,11 +113,6 @@ namespace MistoxWebsite.Server.Services.DatabaseService { using (MySqlConnection connection = GetConnection()) { connection.Open(); - string buildingImages = ""; - foreach (FormFile cur in Item.Images) { - buildingImages = buildingImages + "|" + cur; - } - string command = @"UPDATE Product SET Name = @Name, Description = @Description, @@ -130,31 +129,10 @@ namespace MistoxWebsite.Server.Services.DatabaseService { cmd.Parameters.AddWithValue("@ID", Item.ID); await cmd.ExecuteNonQueryAsync(); + + await DeleteAllImages(Item.ID); + await AddAllImages(Item); } } - - public async Task AddImage(Product Item, FormFile Image) { - using (MySqlConnection connection = GetConnection()) { - connection.Open(); - - string command = @" - INSERT INTO ProductImage - (ProductID, Image) - VALUES - (@ProductID, @Image); - "; - - MySqlCommand cmd = new MySqlCommand(command, connection); - cmd.Parameters.AddWithValue("@ProductID", Item.ID); - cmd.Parameters.AddWithValue("@Image", Image); - - await cmd.ExecuteNonQueryAsync(); - } - } - - public async Task RemoveImage() { - - } - } } diff --git a/src/MistoxWebsite.Server/Services/DatabaseService/ProductImage.cs b/src/MistoxWebsite.Server/Services/DatabaseService/ProductImage.cs new file mode 100644 index 0000000..aa6480c --- /dev/null +++ b/src/MistoxWebsite.Server/Services/DatabaseService/ProductImage.cs @@ -0,0 +1,91 @@ +using MistoxWebsite.Server.Entities; +using MySql.Data.MySqlClient; +using System.Data; +using System.Data.Common; + +namespace MistoxWebsite.Server.Services.DatabaseService { + public partial class DatabaseService { + + public async Task GetAllImages(int ProductID) { + List items = new List(); + using (MySqlConnection connection = GetConnection()) { + connection.Open(); + string command = @" + SELECT * FROM ProductImage + WHERE ProductID = @ProductID; + "; + + MySqlCommand cmd = new MySqlCommand(command, connection); + cmd.Parameters.AddWithValue("@ProductID", ProductID); + + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + if (reader == null) { + break; + } + int _ImageID = reader.GetInt32("ImageID"); + int _ProductID = reader.GetInt32("ProductID"); + byte[] _Image = (byte[])reader["Image"]; + + items.Add(new ProductImage() { + ImageID = _ImageID, + ProductID = _ProductID, + Image = BytesToFile(_Image) + }); + } + } + } + return items.ToArray(); + } + + public async Task AddAllImages(Product Item) { + using (MySqlConnection connection = GetConnection()) { + connection.Open(); + foreach (ProductImage cur in Item.Images) { + if (cur.Image != null) { + string command = @" + INSERT INTO ProductImage + (ProductID, Image) + VALUES + (@ProductID, @Image); + "; + MySqlCommand cmd = new MySqlCommand(command, connection); + cmd.Parameters.AddWithValue("@ProductID", Item.ID); + cmd.Parameters.AddWithValue("@Image", await FileToBytes( cur.Image )); + await cmd.ExecuteNonQueryAsync(); + } + } + } + } + + public async Task DeleteAllImages(int ItemID) { + using (MySqlConnection connection = GetConnection()) { + connection.Open(); + string command = @" + DELETE FROM ProductImage + WHERE ProductID = @ProductID; + "; + MySqlCommand cmd = new MySqlCommand(command, connection); + cmd.Parameters.AddWithValue("@ProductID", ItemID); + + await cmd.ExecuteNonQueryAsync(); + } + } + + public async Task FileToBytes(IFormFile file) { + using (var memoryStream = new MemoryStream()) { + await file.CopyToAsync(memoryStream); + return memoryStream.ToArray(); + } + } + + public FormFile BytesToFile(byte[] fileBytes) { + var stream = new MemoryStream(fileBytes); + return new FormFile(stream, 0, fileBytes.Length, "file", Guid.NewGuid().ToString()) { + Headers = new HeaderDictionary() + }; +} + + + } +}