diff --git a/Watcher/Controllers/AuthController.cs b/Watcher/Controllers/AuthController.cs index bd15c18..bf53f48 100644 --- a/Watcher/Controllers/AuthController.cs +++ b/Watcher/Controllers/AuthController.cs @@ -36,7 +36,7 @@ public class AuthController : Controller if (!ModelState.IsValid) return View(model); - var user = await _context.Users.FirstOrDefaultAsync(u => u.PreferredUsername == model.Username); + var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == model.Username); if (user == null || !BCrypt.Net.BCrypt.Verify(model.Password, user.Password)) { ModelState.AddModelError("", "Benutzername oder Passwort ist falsch."); @@ -45,7 +45,7 @@ public class AuthController : Controller var claims = new List { - new Claim(ClaimTypes.Name, user.PreferredUsername), + new Claim(ClaimTypes.Name, user.Username), new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), }; @@ -100,12 +100,12 @@ public class AuthController : Controller public IActionResult Edit() { var username = User.Identity?.Name; - var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); + var user = _context.Users.FirstOrDefault(u => u.Username == username); if (user == null) return NotFound(); var model = new EditUserViewModel { - Username = user.PreferredUsername + Username = user.Username }; return View(model); } @@ -119,10 +119,10 @@ public class AuthController : Controller if (!ModelState.IsValid) return View(model); var username = User.Identity?.Name; - var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); + var user = _context.Users.FirstOrDefault(u => u.Username == username); if (user == null) return NotFound(); - user.PreferredUsername = model.Username; + user.Username = model.Username; if (!string.IsNullOrWhiteSpace(model.NewPassword)) { @@ -144,7 +144,7 @@ public class AuthController : Controller var username = User.Identity?.Name; var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList(); - var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); + var user = _context.Users.FirstOrDefault(u => u.Username == username); if (user == null) return NotFound(); var DbProvider = _context.Database.ProviderName; @@ -166,17 +166,17 @@ public class AuthController : Controller if (!ModelState.IsValid) return View(model); var username = User.Identity?.Name; - var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); + var user = _context.Users.FirstOrDefault(u => u.Username == username); if (user == null) return NotFound(); var databaseProvider = _context.Database.ProviderName; - user.PreferredUsername = model.Username; + user.Username = model.Username; // Passwort ändern if (!string.IsNullOrWhiteSpace(model.NewPassword)) { - user.PreferredUsername = BCrypt.Net.BCrypt.HashPassword(model.NewPassword); + user.Username = BCrypt.Net.BCrypt.HashPassword(model.NewPassword); } _context.SaveChanges(); diff --git a/Watcher/Controllers/HomeController.cs b/Watcher/Controllers/HomeController.cs index 2010961..aa64f6a 100644 --- a/Watcher/Controllers/HomeController.cs +++ b/Watcher/Controllers/HomeController.cs @@ -24,7 +24,7 @@ namespace Watcher.Controllers var user = await _context.Users - .Where(u => u.PreferredUsername == preferredUserName) + .Where(u => u.Username == preferredUserName) .FirstOrDefaultAsync(); var viewModel = new DashboardViewModel diff --git a/Watcher/Migrations/20250621124832_DB-Update Issue#32.Designer.cs b/Watcher/Migrations/20250621124832_DB-Update Issue#32.Designer.cs new file mode 100644 index 0000000..e8cad36 --- /dev/null +++ b/Watcher/Migrations/20250621124832_DB-Update Issue#32.Designer.cs @@ -0,0 +1,316 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Watcher.Data; + +#nullable disable + +namespace Watcher.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20250621124832_DB-Update Issue#32")] + partial class DBUpdateIssue32 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.6"); + + modelBuilder.Entity("Watcher.Models.Container", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("Hostname") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ImageId") + .HasColumnType("INTEGER"); + + b.Property("IsRunning") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Status") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TagId") + .HasColumnType("INTEGER"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ImageId"); + + b.HasIndex("TagId"); + + b.ToTable("Containers"); + }); + + modelBuilder.Entity("Watcher.Models.Image", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Tag") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Images"); + }); + + modelBuilder.Entity("Watcher.Models.LogEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ContainerId") + .HasColumnType("INTEGER"); + + b.Property("Level") + .HasColumnType("TEXT"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("ServerId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("ServerId"); + + b.ToTable("LogEvents"); + }); + + modelBuilder.Entity("Watcher.Models.Metric", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CPU_Load") + .HasColumnType("REAL"); + + b.Property("CPU_Temp") + .HasColumnType("REAL"); + + b.Property("DISK_Size") + .HasColumnType("REAL"); + + b.Property("DISK_Temp") + .HasColumnType("REAL"); + + b.Property("DISK_Usage") + .HasColumnType("REAL"); + + b.Property("GPU_Load") + .HasColumnType("REAL"); + + b.Property("GPU_Temp") + .HasColumnType("REAL"); + + b.Property("GPU_Vram_Size") + .HasColumnType("REAL"); + + b.Property("GPU_Vram_Usage") + .HasColumnType("REAL"); + + b.Property("NET_In") + .HasColumnType("REAL"); + + b.Property("NET_Out") + .HasColumnType("REAL"); + + b.Property("RAM_Load") + .HasColumnType("REAL"); + + b.Property("RAM_Size") + .HasColumnType("REAL"); + + b.Property("ServerId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Metrics"); + }); + + modelBuilder.Entity("Watcher.Models.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CpuCores") + .HasColumnType("INTEGER"); + + b.Property("CpuType") + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("GpuType") + .HasColumnType("TEXT"); + + b.Property("IPAddress") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsOnline") + .HasColumnType("INTEGER"); + + b.Property("LastSeen") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RamSize") + .HasColumnType("REAL"); + + b.Property("TagId") + .HasColumnType("INTEGER"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.ToTable("Servers"); + }); + + modelBuilder.Entity("Watcher.Models.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("Watcher.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Email") + .HasColumnType("TEXT"); + + b.Property("IdentityProvider") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LastLogin") + .HasColumnType("TEXT"); + + b.Property("OIDC_Id") + .HasColumnType("TEXT"); + + b.Property("Password") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Username") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Watcher.Models.Container", b => + { + b.HasOne("Watcher.Models.Image", "Image") + .WithMany("Containers") + .HasForeignKey("ImageId"); + + b.HasOne("Watcher.Models.Tag", null) + .WithMany("Containers") + .HasForeignKey("TagId"); + + b.Navigation("Image"); + }); + + modelBuilder.Entity("Watcher.Models.LogEvent", b => + { + b.HasOne("Watcher.Models.Container", "Container") + .WithMany() + .HasForeignKey("ContainerId"); + + b.HasOne("Watcher.Models.Server", "Server") + .WithMany() + .HasForeignKey("ServerId"); + + b.Navigation("Container"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Watcher.Models.Server", b => + { + b.HasOne("Watcher.Models.Tag", null) + .WithMany("Servers") + .HasForeignKey("TagId"); + }); + + modelBuilder.Entity("Watcher.Models.Image", b => + { + b.Navigation("Containers"); + }); + + modelBuilder.Entity("Watcher.Models.Tag", b => + { + b.Navigation("Containers"); + + b.Navigation("Servers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Watcher/Migrations/20250621124832_DB-Update Issue#32.cs b/Watcher/Migrations/20250621124832_DB-Update Issue#32.cs new file mode 100644 index 0000000..b7644a8 --- /dev/null +++ b/Watcher/Migrations/20250621124832_DB-Update Issue#32.cs @@ -0,0 +1,251 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Watcher.Migrations +{ + /// + public partial class DBUpdateIssue32 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Metrics_Containers_ContainerId", + table: "Metrics"); + + migrationBuilder.DropForeignKey( + name: "FK_Metrics_Servers_ServerId", + table: "Metrics"); + + migrationBuilder.DropIndex( + name: "IX_Metrics_ContainerId", + table: "Metrics"); + + migrationBuilder.DropIndex( + name: "IX_Metrics_ServerId", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "PocketId", + table: "Users"); + + migrationBuilder.DropColumn( + name: "ContainerId", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "Type", + table: "Metrics"); + + migrationBuilder.RenameColumn( + name: "PreferredUsername", + table: "Users", + newName: "Username"); + + migrationBuilder.RenameColumn( + name: "Value", + table: "Metrics", + newName: "RAM_Size"); + + migrationBuilder.AddColumn( + name: "OIDC_Id", + table: "Users", + type: "TEXT", + nullable: true); + + migrationBuilder.AddColumn( + name: "CPU_Load", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "CPU_Temp", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "DISK_Size", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "DISK_Temp", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "DISK_Usage", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "GPU_Load", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "GPU_Temp", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "GPU_Vram_Size", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "GPU_Vram_Usage", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "NET_In", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "NET_Out", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "RAM_Load", + table: "Metrics", + type: "REAL", + nullable: false, + defaultValue: 0.0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "OIDC_Id", + table: "Users"); + + migrationBuilder.DropColumn( + name: "CPU_Load", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "CPU_Temp", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "DISK_Size", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "DISK_Temp", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "DISK_Usage", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "GPU_Load", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "GPU_Temp", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "GPU_Vram_Size", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "GPU_Vram_Usage", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "NET_In", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "NET_Out", + table: "Metrics"); + + migrationBuilder.DropColumn( + name: "RAM_Load", + table: "Metrics"); + + migrationBuilder.RenameColumn( + name: "Username", + table: "Users", + newName: "PreferredUsername"); + + migrationBuilder.RenameColumn( + name: "RAM_Size", + table: "Metrics", + newName: "Value"); + + migrationBuilder.AddColumn( + name: "PocketId", + table: "Users", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "ContainerId", + table: "Metrics", + type: "INTEGER", + nullable: true); + + migrationBuilder.AddColumn( + name: "Type", + table: "Metrics", + type: "TEXT", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Metrics_ContainerId", + table: "Metrics", + column: "ContainerId"); + + migrationBuilder.CreateIndex( + name: "IX_Metrics_ServerId", + table: "Metrics", + column: "ServerId"); + + migrationBuilder.AddForeignKey( + name: "FK_Metrics_Containers_ContainerId", + table: "Metrics", + column: "ContainerId", + principalTable: "Containers", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_Metrics_Servers_ServerId", + table: "Metrics", + column: "ServerId", + principalTable: "Servers", + principalColumn: "Id"); + } + } +} diff --git a/Watcher/Migrations/20250621125157_DB-Update Issue#32 IsVerified-Servers.Designer.cs b/Watcher/Migrations/20250621125157_DB-Update Issue#32 IsVerified-Servers.Designer.cs new file mode 100644 index 0000000..feb5c2e --- /dev/null +++ b/Watcher/Migrations/20250621125157_DB-Update Issue#32 IsVerified-Servers.Designer.cs @@ -0,0 +1,319 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Watcher.Data; + +#nullable disable + +namespace Watcher.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20250621125157_DB-Update Issue#32 IsVerified-Servers")] + partial class DBUpdateIssue32IsVerifiedServers + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.6"); + + modelBuilder.Entity("Watcher.Models.Container", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("Hostname") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ImageId") + .HasColumnType("INTEGER"); + + b.Property("IsRunning") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Status") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TagId") + .HasColumnType("INTEGER"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ImageId"); + + b.HasIndex("TagId"); + + b.ToTable("Containers"); + }); + + modelBuilder.Entity("Watcher.Models.Image", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Tag") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Images"); + }); + + modelBuilder.Entity("Watcher.Models.LogEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ContainerId") + .HasColumnType("INTEGER"); + + b.Property("Level") + .HasColumnType("TEXT"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("ServerId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("ServerId"); + + b.ToTable("LogEvents"); + }); + + modelBuilder.Entity("Watcher.Models.Metric", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CPU_Load") + .HasColumnType("REAL"); + + b.Property("CPU_Temp") + .HasColumnType("REAL"); + + b.Property("DISK_Size") + .HasColumnType("REAL"); + + b.Property("DISK_Temp") + .HasColumnType("REAL"); + + b.Property("DISK_Usage") + .HasColumnType("REAL"); + + b.Property("GPU_Load") + .HasColumnType("REAL"); + + b.Property("GPU_Temp") + .HasColumnType("REAL"); + + b.Property("GPU_Vram_Size") + .HasColumnType("REAL"); + + b.Property("GPU_Vram_Usage") + .HasColumnType("REAL"); + + b.Property("NET_In") + .HasColumnType("REAL"); + + b.Property("NET_Out") + .HasColumnType("REAL"); + + b.Property("RAM_Load") + .HasColumnType("REAL"); + + b.Property("RAM_Size") + .HasColumnType("REAL"); + + b.Property("ServerId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Metrics"); + }); + + modelBuilder.Entity("Watcher.Models.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CpuCores") + .HasColumnType("INTEGER"); + + b.Property("CpuType") + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("GpuType") + .HasColumnType("TEXT"); + + b.Property("IPAddress") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsOnline") + .HasColumnType("INTEGER"); + + b.Property("IsVerified") + .HasColumnType("INTEGER"); + + b.Property("LastSeen") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RamSize") + .HasColumnType("REAL"); + + b.Property("TagId") + .HasColumnType("INTEGER"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.ToTable("Servers"); + }); + + modelBuilder.Entity("Watcher.Models.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("Watcher.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Email") + .HasColumnType("TEXT"); + + b.Property("IdentityProvider") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LastLogin") + .HasColumnType("TEXT"); + + b.Property("OIDC_Id") + .HasColumnType("TEXT"); + + b.Property("Password") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Username") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Watcher.Models.Container", b => + { + b.HasOne("Watcher.Models.Image", "Image") + .WithMany("Containers") + .HasForeignKey("ImageId"); + + b.HasOne("Watcher.Models.Tag", null) + .WithMany("Containers") + .HasForeignKey("TagId"); + + b.Navigation("Image"); + }); + + modelBuilder.Entity("Watcher.Models.LogEvent", b => + { + b.HasOne("Watcher.Models.Container", "Container") + .WithMany() + .HasForeignKey("ContainerId"); + + b.HasOne("Watcher.Models.Server", "Server") + .WithMany() + .HasForeignKey("ServerId"); + + b.Navigation("Container"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Watcher.Models.Server", b => + { + b.HasOne("Watcher.Models.Tag", null) + .WithMany("Servers") + .HasForeignKey("TagId"); + }); + + modelBuilder.Entity("Watcher.Models.Image", b => + { + b.Navigation("Containers"); + }); + + modelBuilder.Entity("Watcher.Models.Tag", b => + { + b.Navigation("Containers"); + + b.Navigation("Servers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Watcher/Migrations/20250621125157_DB-Update Issue#32 IsVerified-Servers.cs b/Watcher/Migrations/20250621125157_DB-Update Issue#32 IsVerified-Servers.cs new file mode 100644 index 0000000..974f389 --- /dev/null +++ b/Watcher/Migrations/20250621125157_DB-Update Issue#32 IsVerified-Servers.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Watcher.Migrations +{ + /// + public partial class DBUpdateIssue32IsVerifiedServers : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "IsVerified", + table: "Servers", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "IsVerified", + table: "Servers"); + } + } +} diff --git a/Watcher/Migrations/AppDbContextModelSnapshot.cs b/Watcher/Migrations/AppDbContextModelSnapshot.cs index 1231da3..11d908f 100644 --- a/Watcher/Migrations/AppDbContextModelSnapshot.cs +++ b/Watcher/Migrations/AppDbContextModelSnapshot.cs @@ -113,8 +113,44 @@ namespace Watcher.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("ContainerId") - .HasColumnType("INTEGER"); + b.Property("CPU_Load") + .HasColumnType("REAL"); + + b.Property("CPU_Temp") + .HasColumnType("REAL"); + + b.Property("DISK_Size") + .HasColumnType("REAL"); + + b.Property("DISK_Temp") + .HasColumnType("REAL"); + + b.Property("DISK_Usage") + .HasColumnType("REAL"); + + b.Property("GPU_Load") + .HasColumnType("REAL"); + + b.Property("GPU_Temp") + .HasColumnType("REAL"); + + b.Property("GPU_Vram_Size") + .HasColumnType("REAL"); + + b.Property("GPU_Vram_Usage") + .HasColumnType("REAL"); + + b.Property("NET_In") + .HasColumnType("REAL"); + + b.Property("NET_Out") + .HasColumnType("REAL"); + + b.Property("RAM_Load") + .HasColumnType("REAL"); + + b.Property("RAM_Size") + .HasColumnType("REAL"); b.Property("ServerId") .HasColumnType("INTEGER"); @@ -122,18 +158,8 @@ namespace Watcher.Migrations b.Property("Timestamp") .HasColumnType("TEXT"); - b.Property("Type") - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("REAL"); - b.HasKey("Id"); - b.HasIndex("ContainerId"); - - b.HasIndex("ServerId"); - b.ToTable("Metrics"); }); @@ -165,6 +191,9 @@ namespace Watcher.Migrations b.Property("IsOnline") .HasColumnType("INTEGER"); + b.Property("IsVerified") + .HasColumnType("INTEGER"); + b.Property("LastSeen") .HasColumnType("TEXT"); @@ -219,15 +248,14 @@ namespace Watcher.Migrations b.Property("LastLogin") .HasColumnType("TEXT"); + b.Property("OIDC_Id") + .HasColumnType("TEXT"); + b.Property("Password") .IsRequired() .HasColumnType("TEXT"); - b.Property("PocketId") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("PreferredUsername") + b.Property("Username") .IsRequired() .HasColumnType("TEXT"); @@ -264,21 +292,6 @@ namespace Watcher.Migrations b.Navigation("Server"); }); - modelBuilder.Entity("Watcher.Models.Metric", b => - { - b.HasOne("Watcher.Models.Container", "Container") - .WithMany() - .HasForeignKey("ContainerId"); - - b.HasOne("Watcher.Models.Server", "Server") - .WithMany() - .HasForeignKey("ServerId"); - - b.Navigation("Container"); - - b.Navigation("Server"); - }); - modelBuilder.Entity("Watcher.Models.Server", b => { b.HasOne("Watcher.Models.Tag", null) diff --git a/Watcher/Models/Metric.cs b/Watcher/Models/Metric.cs index e069057..36913f8 100644 --- a/Watcher/Models/Metric.cs +++ b/Watcher/Models/Metric.cs @@ -2,15 +2,47 @@ namespace Watcher.Models; public class Metric { + // Metric Metadata public int Id { get; set; } public DateTime Timestamp { get; set; } - public string? Type { get; set; } // z.B. "CPU", "RAM", "Disk", "Network" - public double Value { get; set; } + // Zuordnung zu einem Server -- Foreign Key public int? ServerId { get; set; } - public Server? Server { get; set; } - public int? ContainerId { get; set; } - public Container? Container { get; set; } + + // CPU-Daten + public double CPU_Load { get; set; } = 0.0; // % + + public double CPU_Temp { get; set; } = 0.0; // deg C + + + // GPU-Daten + public double GPU_Load { get; set; } = 0.0; // % + + public double GPU_Temp { get; set; } = 0.0; // deg C + + public double GPU_Vram_Size { get; set; } // GB + + public double GPU_Vram_Usage { get; set; } // % + + + // RAM-Daten + public double RAM_Size { get; set; } = 0.0; // GB + + public double RAM_Load { get; set; } = 0.0; // % + + + // HDD-Daten + public double DISK_Size { get; set; } = 0.0; // GB + + public double DISK_Usage { get; set; } = 0.0; // % + + public double DISK_Temp { get; set; } = 0.0; // deg C + + + // Network-Daten + public double NET_In { get; set; } = 0.0; // Bit + + public double NET_Out { get; set; } = 0.0; // Bit } diff --git a/Watcher/Models/Server.cs b/Watcher/Models/Server.cs index 14121a0..83466a8 100644 --- a/Watcher/Models/Server.cs +++ b/Watcher/Models/Server.cs @@ -5,32 +5,35 @@ namespace Watcher.Models; public class Server { + // System Infos [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } - public string Name { get; set; } = string.Empty; + [Required] + public required string Name { get; set; } - public string IPAddress { get; set; } = string.Empty; + public required string IPAddress { get; set; } + public required string Type { get; set; } + + public string? Description { get; set; } = String.Empty; + + + // Hardware Infos + public string? CpuType { get; set; } = string.Empty; + public int CpuCores { get; set; } = 0; + public string? GpuType { get; set; } = string.Empty; + public double RamSize { get; set; } = 0; + + + // Database public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - // z.B. "VPS", "standalone", "VM", etc. - public string Type { get; set; } = "VPS"; - public Boolean IsOnline { get; set; } = false; public DateTime LastSeen { get; set; } - public string? Description { get; set; } - - // Hardware Infos - public string? CpuType { get; set; } = string.Empty; - public int CpuCores { get; set; } - public string? GpuType { get; set; } = string.Empty; - public double RamSize { get; set; } - - - + public Boolean IsVerified { get; set; } = false; } diff --git a/Watcher/Models/User.cs b/Watcher/Models/User.cs index 10d0f0c..13d366a 100644 --- a/Watcher/Models/User.cs +++ b/Watcher/Models/User.cs @@ -1,12 +1,15 @@ using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace Watcher.Models; public class User { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } // PK - public string PocketId { get; set; } = null!; - public string PreferredUsername { get; set; } = null!; + public string? OIDC_Id { get; set; } = null!; + public string Username { get; set; } = null!; public string? Email { get; set; } public DateTime LastLogin { get; set; } diff --git a/Watcher/Program.cs b/Watcher/Program.cs index 4765b87..baba787 100644 --- a/Watcher/Program.cs +++ b/Watcher/Program.cs @@ -95,14 +95,14 @@ builder.Services.AddAuthentication() if (string.IsNullOrEmpty(pocketId)) return; - var user = await db.Users.FirstOrDefaultAsync(u => u.PocketId == pocketId); + var user = await db.Users.FirstOrDefaultAsync(u => u.OIDC_Id == pocketId); if (user == null) { user = new User { - PocketId = pocketId, - PreferredUsername = preferredUsername ?? "", + OIDC_Id = pocketId, + Username = preferredUsername ?? "", Email = email, LastLogin = DateTime.UtcNow, IdentityProvider = "oidc", @@ -113,7 +113,7 @@ builder.Services.AddAuthentication() else { user.LastLogin = DateTime.UtcNow; - user.PreferredUsername = preferredUsername ?? user.PreferredUsername; + user.Username = preferredUsername ?? user.Username; user.Email = email ?? user.Email; db.Users.Update(user); } @@ -151,8 +151,8 @@ using (var scope = app.Services.CreateScope()) var defaultUser = new User { - PocketId = string.Empty, - PreferredUsername = "admin", + OIDC_Id = string.Empty, + Username = "admin", Email = string.Empty, LastLogin = DateTime.UtcNow, IdentityProvider = "local", diff --git a/Watcher/persistence/watcher.db-shm b/Watcher/persistence/watcher.db-shm new file mode 100644 index 0000000..f7da6f3 Binary files /dev/null and b/Watcher/persistence/watcher.db-shm differ diff --git a/Watcher/persistence/watcher.db-wal b/Watcher/persistence/watcher.db-wal new file mode 100644 index 0000000..cd00959 Binary files /dev/null and b/Watcher/persistence/watcher.db-wal differ