From d0d9cb8bb3996bb5322ad10532d903295cbfd9be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Tue, 10 Oct 2023 16:21:00 +0200 Subject: [PATCH 1/3] Start of Datenbank --- DataAccess/Data/BildInfoData.cs | 24 ++++++ DataAccess/DataAccess.csproj | 15 ++++ DataAccess/DbAccess/ISqlDataAccess.cs | 7 ++ DataAccess/DbAccess/SqlDataAccess.cs | 30 ++++++++ DataAccess/Models/BildInfoModel.cs | 14 ++++ KIKunstKirstenKlöckner.sln | 14 ++++ .../.config/dotnet-tools.json | 12 +++ .../KIKunstKirstenKlöckner.csproj | 4 + KIKunstKirstenKlöckner/Pages/AiArt.razor | 49 +++++++++++- KIKunstKirstenKlöckner/Program.cs | 4 + .../appsettings.Development.json | 15 ++-- KIKunstKirstenKlöckner/appsettings.json | 3 + KiKunstDatenbank/KiKunstDatenbank.refactorlog | 24 ++++++ KiKunstDatenbank/KiKunstDatenbank.sqlproj | 76 +++++++++++++++++++ KiKunstDatenbank/Script.PostDeployment.sql | 19 +++++ .../StoredProcedures/spBildInfo_Insert.sql | 22 ++++++ KiKunstDatenbank/dpo/Tables/BildInfo.sql | 22 ++++++ 17 files changed, 345 insertions(+), 9 deletions(-) create mode 100644 DataAccess/Data/BildInfoData.cs create mode 100644 DataAccess/DataAccess.csproj create mode 100644 DataAccess/DbAccess/ISqlDataAccess.cs create mode 100644 DataAccess/DbAccess/SqlDataAccess.cs create mode 100644 DataAccess/Models/BildInfoModel.cs create mode 100644 KIKunstKirstenKlöckner/.config/dotnet-tools.json create mode 100644 KiKunstDatenbank/KiKunstDatenbank.refactorlog create mode 100644 KiKunstDatenbank/KiKunstDatenbank.sqlproj create mode 100644 KiKunstDatenbank/Script.PostDeployment.sql create mode 100644 KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql create mode 100644 KiKunstDatenbank/dpo/Tables/BildInfo.sql diff --git a/DataAccess/Data/BildInfoData.cs b/DataAccess/Data/BildInfoData.cs new file mode 100644 index 0000000..5756895 --- /dev/null +++ b/DataAccess/Data/BildInfoData.cs @@ -0,0 +1,24 @@ +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 BildInfoData +{ + private readonly ISqlDataAccess _db; + + public BildInfoData(ISqlDataAccess db) + { + _db = db; + } + + public async Task AddBildInfo(BildInfoModel bildInfo) + { + await _db.SaveData("dbo.spBildInfo_Insert", bildInfo); + } +} diff --git a/DataAccess/DataAccess.csproj b/DataAccess/DataAccess.csproj new file mode 100644 index 0000000..810ea4c --- /dev/null +++ b/DataAccess/DataAccess.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + enable + + + + + + + + + diff --git a/DataAccess/DbAccess/ISqlDataAccess.cs b/DataAccess/DbAccess/ISqlDataAccess.cs new file mode 100644 index 0000000..ed3232e --- /dev/null +++ b/DataAccess/DbAccess/ISqlDataAccess.cs @@ -0,0 +1,7 @@ +namespace DataAccess.DbAccess; + +public interface ISqlDataAccess +{ + Task> LoadData(string storedProcedure, U parameters, string connectionId = "Default"); + Task SaveData(string storedProcedure, T parameters, string connectionId = "Default"); +} \ No newline at end of file diff --git a/DataAccess/DbAccess/SqlDataAccess.cs b/DataAccess/DbAccess/SqlDataAccess.cs new file mode 100644 index 0000000..f8d323d --- /dev/null +++ b/DataAccess/DbAccess/SqlDataAccess.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.Configuration; +using System.Data.SqlClient; +using System.Data; +using Dapper; + +namespace DataAccess.DbAccess; + +public class SqlDataAccess : ISqlDataAccess +{ + private readonly IConfiguration _config; + + public SqlDataAccess(IConfiguration config) + { + _config = config; + } + + public async Task> LoadData(string storedProcedure, U parameters, string connectionId = "Default") + { + using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId)); + + 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)); + + await connection.ExecuteAsync(storedProcedure, parameters, commandType: CommandType.StoredProcedure); + } +} diff --git a/DataAccess/Models/BildInfoModel.cs b/DataAccess/Models/BildInfoModel.cs new file mode 100644 index 0000000..c46d93c --- /dev/null +++ b/DataAccess/Models/BildInfoModel.cs @@ -0,0 +1,14 @@ +namespace DataAccess.Models; + +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; } +} diff --git a/KIKunstKirstenKlöckner.sln b/KIKunstKirstenKlöckner.sln index ff37735..8d4d872 100644 --- a/KIKunstKirstenKlöckner.sln +++ b/KIKunstKirstenKlöckner.sln @@ -5,6 +5,10 @@ VisualStudioVersion = 17.6.33829.357 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KIKunstKirstenKlöckner", "KIKunstKirstenKlöckner\KIKunstKirstenKlöckner.csproj", "{0085541E-50D4-42A5-9BFD-6CE402FB8B26}" EndProject +Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "KiKunstDatenbank", "KiKunstDatenbank\KiKunstDatenbank.sqlproj", "{A19CD19A-FE5B-4D4E-896B-DCC43B45F734}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccess", "DataAccess\DataAccess.csproj", "{0880FD07-236B-42C1-9CA3-2A6F695A623C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +19,16 @@ Global {0085541E-50D4-42A5-9BFD-6CE402FB8B26}.Debug|Any CPU.Build.0 = Debug|Any CPU {0085541E-50D4-42A5-9BFD-6CE402FB8B26}.Release|Any CPU.ActiveCfg = Release|Any CPU {0085541E-50D4-42A5-9BFD-6CE402FB8B26}.Release|Any CPU.Build.0 = Release|Any CPU + {A19CD19A-FE5B-4D4E-896B-DCC43B45F734}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A19CD19A-FE5B-4D4E-896B-DCC43B45F734}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A19CD19A-FE5B-4D4E-896B-DCC43B45F734}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {A19CD19A-FE5B-4D4E-896B-DCC43B45F734}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A19CD19A-FE5B-4D4E-896B-DCC43B45F734}.Release|Any CPU.Build.0 = Release|Any CPU + {A19CD19A-FE5B-4D4E-896B-DCC43B45F734}.Release|Any CPU.Deploy.0 = Release|Any CPU + {0880FD07-236B-42C1-9CA3-2A6F695A623C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0880FD07-236B-42C1-9CA3-2A6F695A623C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0880FD07-236B-42C1-9CA3-2A6F695A623C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0880FD07-236B-42C1-9CA3-2A6F695A623C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/KIKunstKirstenKlöckner/.config/dotnet-tools.json b/KIKunstKirstenKlöckner/.config/dotnet-tools.json new file mode 100644 index 0000000..2be6730 --- /dev/null +++ b/KIKunstKirstenKlöckner/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "7.0.9", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/KIKunstKirstenKlöckner/KIKunstKirstenKlöckner.csproj b/KIKunstKirstenKlöckner/KIKunstKirstenKlöckner.csproj index 03f043e..3c666a9 100644 --- a/KIKunstKirstenKlöckner/KIKunstKirstenKlöckner.csproj +++ b/KIKunstKirstenKlöckner/KIKunstKirstenKlöckner.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/KIKunstKirstenKlöckner/Pages/AiArt.razor b/KIKunstKirstenKlöckner/Pages/AiArt.razor index a2723d6..77be345 100644 --- a/KIKunstKirstenKlöckner/Pages/AiArt.razor +++ b/KIKunstKirstenKlöckner/Pages/AiArt.razor @@ -4,11 +4,15 @@ @using OpenAI_API.Chat @using OpenAI_API.Models @using System.Diagnostics +@using DataAccess.Data +@using DataAccess.Models @inject IConfiguration Config @inject TooltipService TooltipService @inject DialogService DialogService +@inject BildInfoData BildInfoData; + AiArt
@@ -244,7 +248,7 @@ private string _inferenceApiKey = ""; private string _openAiApiKey = ""; - protected override Task OnInitializedAsync() + protected override async Task OnInitializedAsync() { _inferenceApiKey = Config.GetValue("API:HF_Inference"); _openAiApiKey = Config.GetValue("API:OpenAI"); @@ -258,7 +262,31 @@ _client.DefaultRequestHeaders.Clear(); _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_inferenceApiKey}"); - return base.OnInitializedAsync(); + + BildInfoModel bildInfo = new() + { + BildBeschreibung = "Test", + BildPrompt = "Tost", + Dateiname = "Task", + Datum = DateTime.Now, + GPTModel = "Geht dich nichts an", + ImageModel = "Jup", + Wunsch = request + }; + + try + { + + await BildInfoData.AddBildInfo(bildInfo); + + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + + await base.OnInitializedAsync(); } /// @@ -372,7 +400,9 @@ using Image image = await Image.LoadAsync(imageStream); - string imgUrl = $"generated_images/{DateTime.Now:dd_MM_yyyy_hh_mm_s_fffffff}.jpg"; + DateTime imageDate = DateTime.Now; + + string imgUrl = $"generated_images/{imageDate:dd_MM_yyyy_hh_mm_s_fffffff}.jpg"; string mapPath = $"./wwwroot/{imgUrl}"; await image.SaveAsJpegAsync(mapPath); @@ -383,6 +413,19 @@ 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); + return imgUrl; } else diff --git a/KIKunstKirstenKlöckner/Program.cs b/KIKunstKirstenKlöckner/Program.cs index 12038c0..4677e7d 100644 --- a/KIKunstKirstenKlöckner/Program.cs +++ b/KIKunstKirstenKlöckner/Program.cs @@ -1,3 +1,5 @@ +using DataAccess.Data; +using DataAccess.DbAccess; using Radzen; var builder = WebApplication.CreateBuilder(args); @@ -8,6 +10,8 @@ builder.Services.AddServerSideBlazor(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); var app = builder.Build(); diff --git a/KIKunstKirstenKlöckner/appsettings.Development.json b/KIKunstKirstenKlöckner/appsettings.Development.json index 770d3e9..fab8beb 100644 --- a/KIKunstKirstenKlöckner/appsettings.Development.json +++ b/KIKunstKirstenKlöckner/appsettings.Development.json @@ -1,9 +1,12 @@ { - "DetailedErrors": true, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConnectionStrings": { + "Default": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=KiKunstDatenbank;Integrated Security=True;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" } - } } diff --git a/KIKunstKirstenKlöckner/appsettings.json b/KIKunstKirstenKlöckner/appsettings.json index 1f5d6fd..0d8c4f9 100644 --- a/KIKunstKirstenKlöckner/appsettings.json +++ b/KIKunstKirstenKlöckner/appsettings.json @@ -9,5 +9,8 @@ "API": { "OpenAI": "", "HF_Inference": "" + }, + "ConnectionStrings": { + "Default": "" } } diff --git a/KiKunstDatenbank/KiKunstDatenbank.refactorlog b/KiKunstDatenbank/KiKunstDatenbank.refactorlog new file mode 100644 index 0000000..004b191 --- /dev/null +++ b/KiKunstDatenbank/KiKunstDatenbank.refactorlog @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/KiKunstDatenbank/KiKunstDatenbank.sqlproj b/KiKunstDatenbank/KiKunstDatenbank.sqlproj new file mode 100644 index 0000000..c72c853 --- /dev/null +++ b/KiKunstDatenbank/KiKunstDatenbank.sqlproj @@ -0,0 +1,76 @@ + + + + Debug + AnyCPU + KiKunstDatenbank + 2.0 + 4.1 + {a19cd19a-fe5b-4d4e-896b-dcc43b45f734} + Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider + Database + + + KiKunstDatenbank + KiKunstDatenbank + 1033, CI + BySchemaAndSchemaType + True + v4.7.2 + CS + Properties + False + True + True + + + bin\Release\ + $(MSBuildProjectName).sql + False + pdbonly + true + false + true + prompt + 4 + + + bin\Debug\ + $(MSBuildProjectName).sql + false + true + full + false + true + true + prompt + 4 + + + 11.0 + + True + 11.0 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/KiKunstDatenbank/Script.PostDeployment.sql b/KiKunstDatenbank/Script.PostDeployment.sql new file mode 100644 index 0000000..cf6c8e4 --- /dev/null +++ b/KiKunstDatenbank/Script.PostDeployment.sql @@ -0,0 +1,19 @@ +/* +Vorlage für ein Skript nach der Bereitstellung +-------------------------------------------------------------------------------------- + Diese Datei enthält SQL-Anweisungen, die an das Buildskript angefügt werden. + Schließen Sie mit der SQLCMD-Syntax eine Datei in das Skript nach der Bereitstellung ein. + Beispiel: :r .\myfile.sql + Verwenden Sie die SQLCMD-Syntax, um auf eine Variable im Skript nach der Bereitstellung zu verweisen. + Beispiel: :setvar TableName MyTable + SELECT * FROM [$(TableName)] +-------------------------------------------------------------------------------------- +*/ +--IF NOT EXISTS (SELECT 1 FROM [dbo].[User]) +--BEGIN +-- INSERT INTO [dbo].[User] (FirstName, LastName) +-- VALUES ('Simon', 'Lübeß'), +-- ('Peter', 'Enis'), +-- ('John', 'Smith'), +-- ('Mary', 'Jones') +--END diff --git a/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql b/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql new file mode 100644 index 0000000..eb8293c --- /dev/null +++ b/KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_Insert.sql @@ -0,0 +1,22 @@ +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 +AS +BEGIN + INSERT INTO [dbo].[BildInfo] (BildPrompt, Wunsch, BildBeschreibung, Datum, Dateiname, GPTModel, ImageModel, GroupIndex) + VALUES (@BildPrompt, + @Wunsch, + @BildBeschreibung, + @Datum, + @Dateiname, + @GPTModel, + @ImageModel, + @GroupIndex); +END \ No newline at end of file diff --git a/KiKunstDatenbank/dpo/Tables/BildInfo.sql b/KiKunstDatenbank/dpo/Tables/BildInfo.sql new file mode 100644 index 0000000..a5a351b --- /dev/null +++ b/KiKunstDatenbank/dpo/Tables/BildInfo.sql @@ -0,0 +1,22 @@ +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, + [ImageModel] NCHAR(32) NOT NULL, + [GroupIndex] 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 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 2/3] 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 +) From e6a2db0753b09052c83db7f0bda59e68911f24a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Tue, 10 Oct 2023 18:56:05 +0200 Subject: [PATCH 3/3] Gallery verwendet Datenbank MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Menü: Fixed typo in Gallerie - Datenbanken-Funktionen dokumentiert --- DataAccess/Data/BildInfoData.cs | 31 ++++++--- DataAccess/Data/WunschInfoData.cs | 11 ++++ DataAccess/DbAccess/ISqlDataAccess.cs | 23 ++++++- DataAccess/DbAccess/SqlDataAccess.cs | 9 ++- KIKunstKirstenKlöckner/Pages/Gallery.razor | 65 +++++-------------- .../Shared/MainLayout.razor | 2 +- KiKunstDatenbank/KiKunstDatenbank.sqlproj | 2 + .../StoredProcedures/spBildInfo_GetAll.sql | 6 ++ .../dpo/StoredProcedures/spWunschInfo_Get.sql | 8 +++ 9 files changed, 94 insertions(+), 63 deletions(-) create mode 100644 KiKunstDatenbank/dpo/StoredProcedures/spBildInfo_GetAll.sql create mode 100644 KiKunstDatenbank/dpo/StoredProcedures/spWunschInfo_Get.sql diff --git a/DataAccess/Data/BildInfoData.cs b/DataAccess/Data/BildInfoData.cs index 86245a7..e2def08 100644 --- a/DataAccess/Data/BildInfoData.cs +++ b/DataAccess/Data/BildInfoData.cs @@ -1,14 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; -using DataAccess.DbAccess; +using DataAccess.DbAccess; using DataAccess.Models; namespace DataAccess.Data; +/// +/// Ermöglicht den Zugriff auf die BildInfo Datenbank. +/// public class BildInfoData { private readonly ISqlDataAccess _db; @@ -18,18 +15,34 @@ public class BildInfoData _db = db; } + /// + /// Fügt die gegebene BildInfo zur Datenbank hinzu und aktualisiert das -Feld mit dem entsprechenden Wert. + /// + /// Die BildInfo, die zur Datenbank hinzugefügt werden soll. public async Task AddBildInfoAsync(BildInfoModel bildInfo) { var id = await _db.LoadData("dbo.spBildInfo_Insert", bildInfo); bildInfo.Id = id.Single(); } - public async Task UpdateBildInfoDateinameAsync(BildInfoModel bildInfo) + /// + /// Aktualisiert das Dateiname-Feld der übergebenen BildInfo in der Datenbank. + /// + /// Die BildInfo deren Dateiname aktualisiert werden soll. + public Task UpdateBildInfoDateinameAsync(BildInfoModel bildInfo) { - await _db.SaveData("dbo.spBildInfo_UpdateFileName", + return _db.SaveData("dbo.spBildInfo_UpdateFileName", new { Id = bildInfo.Id, Dateiname = bildInfo.Dateiname, }); } + + /// + /// Gibt alle Bild Infos der Datenbank zurück. + /// + public Task> GetAllBildInfosAsync() + { + return _db.LoadData("dbo.spBildInfo_GetAll", new { }); + } } diff --git a/DataAccess/Data/WunschInfoData.cs b/DataAccess/Data/WunschInfoData.cs index c1d467e..26e0854 100644 --- a/DataAccess/Data/WunschInfoData.cs +++ b/DataAccess/Data/WunschInfoData.cs @@ -22,4 +22,15 @@ public class WunschInfoData var id = await _db.LoadData("dbo.spWunschInfo_Insert", wunschInfo); wunschInfo.Id = id.Single(); } + + /// + /// Gibt die WunschInfo mit der gegebenen Id zurück. + /// + /// Die Id der zu ladenen WunschInfo + /// Die WunschInfo mit der gegebenen Id + public async Task GetWunschInfoAsync(int wunschId) + { + var wunschInfo = await _db.LoadData("dbo.spWunschInfo_Get", new { Id = wunschId }); + return wunschInfo.Single(); + } } diff --git a/DataAccess/DbAccess/ISqlDataAccess.cs b/DataAccess/DbAccess/ISqlDataAccess.cs index ed3232e..c1a2103 100644 --- a/DataAccess/DbAccess/ISqlDataAccess.cs +++ b/DataAccess/DbAccess/ISqlDataAccess.cs @@ -1,7 +1,26 @@ namespace DataAccess.DbAccess; +/// +/// Bietet lesenden und schreibenden Zugriff auf eine Datenbank. +/// public interface ISqlDataAccess { - Task> LoadData(string storedProcedure, U parameters, string connectionId = "Default"); - Task SaveData(string storedProcedure, T parameters, string connectionId = "Default"); + /// + /// Führt die angegebene Stored Procedure aus. Diese Prozedur nimmt Parameter des Typs engegen und gibt ein Enumerable des Typs zurück. + /// + /// Der Typ der Parameter + /// Der Typ der Rückgabewerte + /// Der Name der Prozedur + /// Die Parameter für die Prozedur. + /// Die optionale Id des zu verwendenen Connection Strings. + Task> LoadData(string storedProcedure, TParameter parameters, string connectionId = "Default"); + + /// + /// Führt die angegebene Stored Procedure aus. Diese Prozedur nimmt Parameter des Typs engegen und gibt nichts zurück. + /// + /// Der Typ der Parameter + /// Der Name der Prozedur + /// Die Parameter für die Prozedur. + /// Die optionale Id des zu verwendenen Connection Strings. + Task SaveData(string storedProcedure, TParameter parameters, string connectionId = "Default"); } \ No newline at end of file diff --git a/DataAccess/DbAccess/SqlDataAccess.cs b/DataAccess/DbAccess/SqlDataAccess.cs index f5edcf0..1a331aa 100644 --- a/DataAccess/DbAccess/SqlDataAccess.cs +++ b/DataAccess/DbAccess/SqlDataAccess.cs @@ -5,6 +5,9 @@ using Dapper; namespace DataAccess.DbAccess; +/// +/// Bietet lesenden und schreibenden Zugriff auf eine Datenbank. +/// public class SqlDataAccess : ISqlDataAccess { private readonly IConfiguration _config; @@ -14,14 +17,14 @@ public class SqlDataAccess : ISqlDataAccess _config = config; } - public async Task> LoadData(string storedProcedure, U parameters, string connectionId = "Default") + public async Task> LoadData(string storedProcedure, TParameter parameters, string connectionId = "Default") { using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId)); - return await connection.QueryAsync(storedProcedure, parameters, commandType: CommandType.StoredProcedure); + return await connection.QueryAsync(storedProcedure, parameters, commandType: CommandType.StoredProcedure); } - public async Task SaveData(string storedProcedure, T parameters, string connectionId = "Default") + public async Task SaveData(string storedProcedure, TParameter parameters, string connectionId = "Default") { using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId)); diff --git a/KIKunstKirstenKlöckner/Pages/Gallery.razor b/KIKunstKirstenKlöckner/Pages/Gallery.razor index 94554da..9196388 100644 --- a/KIKunstKirstenKlöckner/Pages/Gallery.razor +++ b/KIKunstKirstenKlöckner/Pages/Gallery.razor @@ -1,5 +1,11 @@ @page "/gallery" +@using DataAccess.Data +@using DataAccess.Models + +@inject BildInfoData BildInfoData; +@inject WunschInfoData WunschInfoData; +
- -