From 1b28481b5dbf66c57efa582860f12f09e5a91113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Tue, 10 Oct 2023 18:18:17 +0200 Subject: [PATCH] Daten in Wunsch- und Bilddatenbanken speichern --- DataAccess/Data/BildInfoData.cs | 15 +- DataAccess/Data/WunschInfoData.cs | 25 +++ DataAccess/DbAccess/SqlDataAccess.cs | 2 +- DataAccess/Models/BildInfoModel.cs | 6 +- DataAccess/Models/WunschInfoModel.cs | 11 ++ KIKunstKirstenKlöckner/Pages/AiArt.razor | 154 ++++++------------ KIKunstKirstenKlöckner/Program.cs | 1 + KiKunstDatenbank/KiKunstDatenbank.sqlproj | 3 + .../StoredProcedures/spBildInfo_Insert.sql | 22 +-- .../spBildInfo_UpdateFileName.sql | 9 + .../StoredProcedures/spWunschInfo_Insert.sql | 18 ++ KiKunstDatenbank/dpo/Tables/BildInfo.sql | 18 +- KiKunstDatenbank/dpo/Tables/WunschInfo.sql | 9 + 13 files changed, 152 insertions(+), 141 deletions(-) create mode 100644 DataAccess/Data/WunschInfoData.cs create mode 100644 DataAccess/Models/WunschInfoModel.cs create mode 100644 KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_UpdateFileName.sql create mode 100644 KiKunstDatenbank/dpo/StoredProcedures/spWunschInfo_Insert.sql create mode 100644 KiKunstDatenbank/dpo/Tables/WunschInfo.sql diff --git a/DataAccess/Data/BildInfoData.cs b/DataAccess/Data/BildInfoData.cs index 5756895..86245a7 100644 --- a/DataAccess/Data/BildInfoData.cs +++ b/DataAccess/Data/BildInfoData.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using DataAccess.DbAccess; @@ -17,8 +18,18 @@ public class BildInfoData _db = db; } - public async Task AddBildInfo(BildInfoModel bildInfo) + public async Task AddBildInfoAsync(BildInfoModel bildInfo) { - await _db.SaveData("dbo.spBildInfo_Insert", bildInfo); + var id = await _db.LoadData("dbo.spBildInfo_Insert", bildInfo); + bildInfo.Id = id.Single(); + } + + public async Task UpdateBildInfoDateinameAsync(BildInfoModel bildInfo) + { + await _db.SaveData("dbo.spBildInfo_UpdateFileName", + new { + Id = bildInfo.Id, + Dateiname = bildInfo.Dateiname, + }); } } diff --git a/DataAccess/Data/WunschInfoData.cs b/DataAccess/Data/WunschInfoData.cs new file mode 100644 index 0000000..c1d467e --- /dev/null +++ b/DataAccess/Data/WunschInfoData.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataAccess.DbAccess; +using DataAccess.Models; + +namespace DataAccess.Data; + +public class WunschInfoData +{ + private readonly ISqlDataAccess _db; + + public WunschInfoData(ISqlDataAccess db) + { + _db = db; + } + + public async Task AddWunschInfoAsync(WunschInfoModel wunschInfo) + { + var id = await _db.LoadData("dbo.spWunschInfo_Insert", wunschInfo); + wunschInfo.Id = id.Single(); + } +} diff --git a/DataAccess/DbAccess/SqlDataAccess.cs b/DataAccess/DbAccess/SqlDataAccess.cs index f8d323d..f5edcf0 100644 --- a/DataAccess/DbAccess/SqlDataAccess.cs +++ b/DataAccess/DbAccess/SqlDataAccess.cs @@ -20,7 +20,7 @@ public class SqlDataAccess : ISqlDataAccess return await connection.QueryAsync(storedProcedure, parameters, commandType: CommandType.StoredProcedure); } - + public async Task SaveData(string storedProcedure, T parameters, string connectionId = "Default") { using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId)); diff --git a/DataAccess/Models/BildInfoModel.cs b/DataAccess/Models/BildInfoModel.cs index c46d93c..7bb6368 100644 --- a/DataAccess/Models/BildInfoModel.cs +++ b/DataAccess/Models/BildInfoModel.cs @@ -3,12 +3,8 @@ public class BildInfoModel { public int Id { get; set; } - public string BildPrompt { get; set; } - public string Wunsch { get; set; } - public string BildBeschreibung { get; set; } public DateTime Datum { get; set; } public string Dateiname { get; set; } - public string GPTModel { get; set; } public string ImageModel { get; set; } - public int GroupIndex { get; set; } + public int WunschId { get; set; } } diff --git a/DataAccess/Models/WunschInfoModel.cs b/DataAccess/Models/WunschInfoModel.cs new file mode 100644 index 0000000..85d191c --- /dev/null +++ b/DataAccess/Models/WunschInfoModel.cs @@ -0,0 +1,11 @@ +namespace DataAccess.Models; + +public class WunschInfoModel +{ + public int Id { get; set; } + public string BildPrompt { get; set; } + public string Wunsch { get; set; } + public string BildBeschreibung { get; set; } + public DateTime Datum { get; set; } + public string GPTModel { get; set; } +} diff --git a/KIKunstKirstenKlöckner/Pages/AiArt.razor b/KIKunstKirstenKlöckner/Pages/AiArt.razor index 77be345..bb7f5d0 100644 --- a/KIKunstKirstenKlöckner/Pages/AiArt.razor +++ b/KIKunstKirstenKlöckner/Pages/AiArt.razor @@ -12,6 +12,7 @@ @inject DialogService DialogService @inject BildInfoData BildInfoData; +@inject WunschInfoData WunschInfoData; AiArt @@ -263,28 +264,28 @@ _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_inferenceApiKey}"); - BildInfoModel bildInfo = new() - { - BildBeschreibung = "Test", - BildPrompt = "Tost", - Dateiname = "Task", - Datum = DateTime.Now, - GPTModel = "Geht dich nichts an", - ImageModel = "Jup", - Wunsch = request - }; + // BildInfoModel bildInfo = new() + // { + // BildBeschreibung = "Test", + // BildPrompt = "Tost", + // Dateiname = "Task", + // Datum = DateTime.Now, + // GPTModel = "Geht dich nichts an", + // ImageModel = "Jup", + // Wunsch = request + // }; - try - { + // try + // { - await BildInfoData.AddBildInfo(bildInfo); + // //await BildInfoData.AddBildInfo(bildInfo); - } - catch (Exception e) - { - Console.WriteLine(e); - throw; - } + // } + // catch (Exception e) + // { + // Console.WriteLine(e); + // throw; + // } await base.OnInitializedAsync(); } @@ -292,68 +293,7 @@ /// /// Geneiert das Bild für den aktuellen /// - public async Task GenerateImageAsync() - { - var postData = new - { - inputs = _imagePrompt - }; - - JsonContent content = JsonContent.Create(postData); - - async Task FailedToDrawImage() - { - bool? retry = await DialogService.Confirm("Leider konnte das Bild nicht gemalt werden. Möchtest du es noch eimal versuchen?", "Ups, ein Fehler ist aufgetreten...", - new ConfirmOptions { OkButtonText = "Ja", CancelButtonText = "Nein" }); - - if (retry == true) - await GenerateImageAsync(); - } - - try - { - var inferenceModelUrl = "https://api-inference.huggingface.co/models/Nacken/kkkk-sdxl-5000"; - - var response = await _client.PostAsync(inferenceModelUrl, content); - - if (response?.IsSuccessStatusCode == true) - { - await using Stream imageStream = await response.Content.ReadAsStreamAsync(); - - using Image image = await Image.LoadAsync(imageStream); - - string imgUrl = $"generated_images/{DateTime.Now:dd_MM_yyyy_hh_mm_s}.jpg"; - - string mapPath = $"./wwwroot/{imgUrl}"; - await image.SaveAsJpegAsync(mapPath); - - _imageUrl = imgUrl; - } - else - { - Console.WriteLine($"Image conversion failed: {response}"); - - if (Debugger.IsAttached) - Debugger.Break(); - - await FailedToDrawImage(); - } - } - catch (Exception exception) - { - Console.WriteLine($"Image request failed: {exception}"); - - if (Debugger.IsAttached) - Debugger.Break(); - - await FailedToDrawImage(); - } - } - - /// - /// Geneiert das Bild für den aktuellen - /// - public async Task GenerateImageAsync(string prompt, bool isRetry = false) + public async Task GenerateImageAsync(string prompt, WunschInfoModel wunschInfo, bool isRetry = false) { var postData = new { @@ -382,7 +322,7 @@ if (retry == true) { - return await GenerateImageAsync(prompt, true); + return await GenerateImageAsync(prompt, wunschInfo, true); } return null; @@ -390,7 +330,9 @@ try { - var inferenceModelUrl = "https://api-inference.huggingface.co/models/Nacken/kkkk-sdxl-5000"; + const string modelName = "Nacken/kkkk-sdxl-5000"; + + var inferenceModelUrl = $"https://api-inference.huggingface.co/models/{modelName}"; var response = await _client.PostAsync(inferenceModelUrl, content); @@ -401,30 +343,24 @@ using Image image = await Image.LoadAsync(imageStream); DateTime imageDate = DateTime.Now; + + BildInfoModel bildInfo = new() + { + Dateiname = "PlaceHolder", + Datum = imageDate, + ImageModel = modelName, + WunschId = wunschInfo.Id + }; + + await BildInfoData.AddBildInfoAsync(bildInfo); - string imgUrl = $"generated_images/{imageDate:dd_MM_yyyy_hh_mm_s_fffffff}.jpg"; + string imgUrl = $"generated_images/Image_{bildInfo.Id}.jpg"; string mapPath = $"./wwwroot/{imgUrl}"; await image.SaveAsJpegAsync(mapPath); - // Hier speichern wir die Daten in die 'info_texts.txt'-Datei - string infoTextsPath = Path.Combine(_environment.WebRootPath, "generated_images", "info_texts.txt"); - string desc = _imageDescription.Replace("\r\n", "").Replace("\n", "").Replace("\r", ""); - string newLine = $"{imgUrl}: {request}, {desc}\n"; - await File.AppendAllTextAsync(infoTextsPath, newLine); - - BildInfoModel bildInfo = new() - { - BildBeschreibung = desc, - BildPrompt = prompt, - Dateiname = imgUrl, - Datum = imageDate, - GPTModel = "Geht dich nichts an", - ImageModel = "Jup", - Wunsch = request - }; - - await BildInfoData.AddBildInfo(bildInfo); + bildInfo.Dateiname = imgUrl; + await BildInfoData.UpdateBildInfoDateinameAsync(bildInfo); return imgUrl; } @@ -506,11 +442,23 @@ _imageDescription = await converse.GetResponseFromChatbotAsync(); await UpdateBusyMessage("Kirstens Assistent hat eine Idee! Er wird sie nun malen..."); + + WunschInfoModel wunschInfo = new() + { + BildBeschreibung = _imageDescription, + BildPrompt = _imagePrompt, + Datum = DateTime.Now, + GPTModel = converse.Model, + Wunsch = request + }; + + // TODO: Try + await WunschInfoData.AddWunschInfoAsync(wunschInfo); // Vier Bilder generieren for (int i = 0; i < 4; i++) { - _imageUrls[i] = await GenerateImageAsync(_imagePrompt); + _imageUrls[i] = await GenerateImageAsync(_imagePrompt, wunschInfo); _imageStates[i] = ImageState.FadeIn; await InvokeAsync(StateHasChanged); } diff --git a/KIKunstKirstenKlöckner/Program.cs b/KIKunstKirstenKlöckner/Program.cs index 4677e7d..f469532 100644 --- a/KIKunstKirstenKlöckner/Program.cs +++ b/KIKunstKirstenKlöckner/Program.cs @@ -12,6 +12,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); var app = builder.Build(); diff --git a/KiKunstDatenbank/KiKunstDatenbank.sqlproj b/KiKunstDatenbank/KiKunstDatenbank.sqlproj index c72c853..39b284d 100644 --- a/KiKunstDatenbank/KiKunstDatenbank.sqlproj +++ b/KiKunstDatenbank/KiKunstDatenbank.sqlproj @@ -63,6 +63,9 @@ + + + diff --git a/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql b/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql index eb8293c..0011c23 100644 --- a/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql +++ b/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql @@ -1,22 +1,16 @@ CREATE PROCEDURE [dbo].[spBildInfo_Insert] @Id INT, - @BildPrompt NVARCHAR(MAX) , - @Wunsch NVARCHAR(1024) , - @BildBeschreibung NVARCHAR(MAX) , @Datum DATETIME2 , @Dateiname NCHAR(256) , - @GPTModel NCHAR(32) , @ImageModel NCHAR(32) , - @GroupIndex INT + @WunschId INT AS BEGIN - INSERT INTO [dbo].[BildInfo] (BildPrompt, Wunsch, BildBeschreibung, Datum, Dateiname, GPTModel, ImageModel, GroupIndex) - VALUES (@BildPrompt, - @Wunsch, - @BildBeschreibung, - @Datum, - @Dateiname, - @GPTModel, + INSERT INTO [dbo].[BildInfo] (Datum, Dateiname, ImageModel, WunschId) + VALUES (@Datum, + @Dateiname, @ImageModel, - @GroupIndex); -END \ No newline at end of file + @WunschId); + + SELECT Id FROM [dbo].[BildInfo] WHERE Id = CAST(SCOPE_IDENTITY() AS INT); +END diff --git a/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_UpdateFileName.sql b/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_UpdateFileName.sql new file mode 100644 index 0000000..a2d43e0 --- /dev/null +++ b/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_UpdateFileName.sql @@ -0,0 +1,9 @@ +CREATE PROCEDURE [dbo].[spBildInfo_UpdateFileName] + @Id INT, + @Dateiname NCHAR(256) +AS +BEGIN + UPDATE [dbo].[BildInfo] + SET Dateiname = @Dateiname + WHERE Id = @Id; +END diff --git a/KiKunstDatenbank/dpo/StoredProcedures/spWunschInfo_Insert.sql b/KiKunstDatenbank/dpo/StoredProcedures/spWunschInfo_Insert.sql new file mode 100644 index 0000000..7679304 --- /dev/null +++ b/KiKunstDatenbank/dpo/StoredProcedures/spWunschInfo_Insert.sql @@ -0,0 +1,18 @@ +CREATE PROCEDURE [dbo].[spWunschInfo_Insert] + @Id INT, + @Wunsch NVARCHAR(1024), + @BildPrompt NVARCHAR(MAX), + @BildBeschreibung NVARCHAR(MAX), + @Datum DATETIME2, + @GPTModel NCHAR(32) +AS +BEGIN + INSERT INTO [dbo].[WunschInfo] (Wunsch, BildPrompt, BildBeschreibung, Datum, GPTModel) + VALUES (@Wunsch, + @BildPrompt, + @BildBeschreibung, + @Datum, + @GPTModel); + + SELECT Id FROM [dbo].[WunschInfo] WHERE Id = CAST(SCOPE_IDENTITY() AS INT); +END \ No newline at end of file diff --git a/KiKunstDatenbank/dpo/Tables/BildInfo.sql b/KiKunstDatenbank/dpo/Tables/BildInfo.sql index a5a351b..ebde9ac 100644 --- a/KiKunstDatenbank/dpo/Tables/BildInfo.sql +++ b/KiKunstDatenbank/dpo/Tables/BildInfo.sql @@ -1,22 +1,8 @@ CREATE TABLE [dbo].[BildInfo] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, - [BildPrompt] NVARCHAR(MAX) NOT NULL, - [Wunsch] NVARCHAR(1024) NOT NULL, - [BildBeschreibung] NVARCHAR(MAX) NOT NULL, [Datum] DATETIME2 NOT NULL, - [Dateiname] NCHAR(256) NOT NULL, - [GPTModel] NCHAR(32) NOT NULL, + [Dateiname] NCHAR(256) NOT NULL, [ImageModel] NCHAR(32) NOT NULL, - [GroupIndex] INT NOT NULL + [WunschId] INT NOT NULL ) - -GO -EXEC sp_addextendedproperty @name = N'MS_Description', - @value = N'Index der Gruppe, in der dieses Bild generiert wurde und so.', - @level0type = N'SCHEMA', - @level0name = N'dbo', - @level1type = N'TABLE', - @level1name = N'BildInfo', - @level2type = N'COLUMN', - @level2name = 'GroupIndex' \ No newline at end of file diff --git a/KiKunstDatenbank/dpo/Tables/WunschInfo.sql b/KiKunstDatenbank/dpo/Tables/WunschInfo.sql new file mode 100644 index 0000000..01fce3d --- /dev/null +++ b/KiKunstDatenbank/dpo/Tables/WunschInfo.sql @@ -0,0 +1,9 @@ +CREATE TABLE [dbo].[WunschInfo] +( + [Id] INT NOT NULL PRIMARY KEY IDENTITY, + [Wunsch] NVARCHAR (1024) NOT NULL, + [BildPrompt] NVARCHAR (MAX) NOT NULL, + [BildBeschreibung] NVARCHAR (MAX) NOT NULL, + [Datum] DATETIME2 (7) NOT NULL, + [GPTModel] NCHAR (32) NOT NULL +)