diff --git a/Moonlight/App/Database/Entities/StatisticsData.cs b/Moonlight/App/Database/Entities/StatisticsData.cs
index 1cef632d..64f8ea7d 100644
--- a/Moonlight/App/Database/Entities/StatisticsData.cs
+++ b/Moonlight/App/Database/Entities/StatisticsData.cs
@@ -3,6 +3,10 @@
public class StatisticsData
{
public int Id { get; set; }
+
public string Chart { get; set; }
+
public double Value { get; set; }
+
+ public DateTime Date { get; set; }
}
\ No newline at end of file
diff --git a/Moonlight/App/Database/Migrations/20230406182554_ChangedStatisticsModel.Designer.cs b/Moonlight/App/Database/Migrations/20230406182554_ChangedStatisticsModel.Designer.cs
new file mode 100644
index 00000000..73544a6e
--- /dev/null
+++ b/Moonlight/App/Database/Migrations/20230406182554_ChangedStatisticsModel.Designer.cs
@@ -0,0 +1,975 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Moonlight.App.Database;
+
+#nullable disable
+
+namespace Moonlight.App.Database.Migrations
+{
+ [DbContext(typeof(DataContext))]
+ [Migration("20230406182554_ChangedStatisticsModel")]
+ partial class ChangedStatisticsModel
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.3")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.DdosAttack", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Data")
+ .HasColumnType("bigint");
+
+ b.Property("Ip")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("NodeId")
+ .HasColumnType("int");
+
+ b.Property("Ongoing")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NodeId");
+
+ b.ToTable("DdosAttacks");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.DockerImage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Default")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ImageId")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ImageId");
+
+ b.ToTable("DockerImages");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Domain", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("OwnerId")
+ .HasColumnType("int");
+
+ b.Property("SharedDomainId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.HasIndex("SharedDomainId");
+
+ b.ToTable("Domains");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Image", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Allocations")
+ .HasColumnType("int");
+
+ b.Property("ConfigFiles")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("InstallDockerImage")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("InstallEntrypoint")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("InstallScript")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Startup")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("StartupDetection")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("StopCommand")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("TagsJson")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Uuid")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Images");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ImageTag", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("ImageTags");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ImageVariable", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("DefaultValue")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("ImageId")
+ .HasColumnType("int");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ImageId");
+
+ b.ToTable("ImageVariables");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.LoadingMessage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Message")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("LoadingMessages");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.LogsEntries.AuditLogEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Ip")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("JsonData")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("System")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Type")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("AuditLog");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.LogsEntries.ErrorLogEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Class")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Ip")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("JsonData")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Stacktrace")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("System")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("Id");
+
+ b.ToTable("ErrorLog");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.LogsEntries.SecurityLogEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Ip")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("JsonData")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("System")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Type")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("SecurityLog");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Node", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Fqdn")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("HttpPort")
+ .HasColumnType("int");
+
+ b.Property("MoonlightDaemonPort")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("SftpPort")
+ .HasColumnType("int");
+
+ b.Property("Ssl")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Token")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("TokenId")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("Nodes");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.NodeAllocation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("NodeId")
+ .HasColumnType("int");
+
+ b.Property("Port")
+ .HasColumnType("int");
+
+ b.Property("ServerId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NodeId");
+
+ b.HasIndex("ServerId");
+
+ b.ToTable("NodeAllocations");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Notification.NotificationAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Action")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("NotificationClientId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NotificationClientId");
+
+ b.ToTable("NotificationActions");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Notification.NotificationClient", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("NotificationClients");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.PleskServer", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("ApiKey")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("ApiUrl")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("PleskServers");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Revoke", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Identifier")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("Revokes");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Server", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Cpu")
+ .HasColumnType("int");
+
+ b.Property("Disk")
+ .HasColumnType("bigint");
+
+ b.Property("DockerImageIndex")
+ .HasColumnType("int");
+
+ b.Property("ImageId")
+ .HasColumnType("int");
+
+ b.Property("Installing")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsCleanupException")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("MainAllocationId")
+ .HasColumnType("int");
+
+ b.Property("Memory")
+ .HasColumnType("bigint");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("NodeId")
+ .HasColumnType("int");
+
+ b.Property("OverrideStartup")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("OwnerId")
+ .HasColumnType("int");
+
+ b.Property("Suspended")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Uuid")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ImageId");
+
+ b.HasIndex("MainAllocationId");
+
+ b.HasIndex("NodeId");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("Servers");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ServerBackup", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Bytes")
+ .HasColumnType("bigint");
+
+ b.Property("Created")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("ServerId")
+ .HasColumnType("int");
+
+ b.Property("Uuid")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ServerId");
+
+ b.ToTable("ServerBackups");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ServerVariable", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("ServerId")
+ .HasColumnType("int");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ServerId");
+
+ b.ToTable("ServerVariables");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.SharedDomain", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("CloudflareId")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("SharedDomains");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.StatisticsData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Chart")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Date")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Value")
+ .HasColumnType("double");
+
+ b.HasKey("Id");
+
+ b.ToTable("Statistics");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Subscription", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("LimitsJson")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("Subscriptions");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.SupportMessage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Answer")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("IsQuestion")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsSupport")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsSystem")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Message")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("RecipientId")
+ .HasColumnType("int");
+
+ b.Property("SenderId")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RecipientId");
+
+ b.HasIndex("SenderId");
+
+ b.ToTable("SupportMessages");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Address")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Admin")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("City")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Country")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CurrentSubscriptionId")
+ .HasColumnType("int");
+
+ b.Property("DiscordId")
+ .HasColumnType("bigint");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("FirstName")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("LastName")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("State")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("SubscriptionDuration")
+ .HasColumnType("int");
+
+ b.Property("SubscriptionSince")
+ .HasColumnType("datetime(6)");
+
+ b.Property("SupportPending")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("TokenValidTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("TotpEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("TotpSecret")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CurrentSubscriptionId");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Website", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("BaseDomain")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("FtpLogin")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("FtpPassword")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("OwnerId")
+ .HasColumnType("int");
+
+ b.Property("PleskId")
+ .HasColumnType("int");
+
+ b.Property("PleskServerId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.HasIndex("PleskServerId");
+
+ b.ToTable("Websites");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.DdosAttack", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Node", "Node")
+ .WithMany()
+ .HasForeignKey("NodeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Node");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.DockerImage", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Image", null)
+ .WithMany("DockerImages")
+ .HasForeignKey("ImageId");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Domain", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Owner")
+ .WithMany()
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.SharedDomain", "SharedDomain")
+ .WithMany()
+ .HasForeignKey("SharedDomainId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Owner");
+
+ b.Navigation("SharedDomain");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ImageVariable", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Image", null)
+ .WithMany("Variables")
+ .HasForeignKey("ImageId");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.NodeAllocation", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Node", null)
+ .WithMany("Allocations")
+ .HasForeignKey("NodeId");
+
+ b.HasOne("Moonlight.App.Database.Entities.Server", null)
+ .WithMany("Allocations")
+ .HasForeignKey("ServerId");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Notification.NotificationAction", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Notification.NotificationClient", "NotificationClient")
+ .WithMany()
+ .HasForeignKey("NotificationClientId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("NotificationClient");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Notification.NotificationClient", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "User")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Server", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Image", "Image")
+ .WithMany()
+ .HasForeignKey("ImageId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.NodeAllocation", "MainAllocation")
+ .WithMany()
+ .HasForeignKey("MainAllocationId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.Node", "Node")
+ .WithMany()
+ .HasForeignKey("NodeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.User", "Owner")
+ .WithMany()
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Image");
+
+ b.Navigation("MainAllocation");
+
+ b.Navigation("Node");
+
+ b.Navigation("Owner");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ServerBackup", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Server", null)
+ .WithMany("Backups")
+ .HasForeignKey("ServerId");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.ServerVariable", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Server", null)
+ .WithMany("Variables")
+ .HasForeignKey("ServerId");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.SupportMessage", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Recipient")
+ .WithMany()
+ .HasForeignKey("RecipientId");
+
+ b.HasOne("Moonlight.App.Database.Entities.User", "Sender")
+ .WithMany()
+ .HasForeignKey("SenderId");
+
+ b.Navigation("Recipient");
+
+ b.Navigation("Sender");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.User", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Subscription", "CurrentSubscription")
+ .WithMany()
+ .HasForeignKey("CurrentSubscriptionId");
+
+ b.Navigation("CurrentSubscription");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Website", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Owner")
+ .WithMany()
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.PleskServer", "PleskServer")
+ .WithMany()
+ .HasForeignKey("PleskServerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Owner");
+
+ b.Navigation("PleskServer");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Image", b =>
+ {
+ b.Navigation("DockerImages");
+
+ b.Navigation("Variables");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Node", b =>
+ {
+ b.Navigation("Allocations");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Server", b =>
+ {
+ b.Navigation("Allocations");
+
+ b.Navigation("Backups");
+
+ b.Navigation("Variables");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Moonlight/App/Database/Migrations/20230406182554_ChangedStatisticsModel.cs b/Moonlight/App/Database/Migrations/20230406182554_ChangedStatisticsModel.cs
new file mode 100644
index 00000000..24d619e9
--- /dev/null
+++ b/Moonlight/App/Database/Migrations/20230406182554_ChangedStatisticsModel.cs
@@ -0,0 +1,30 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Moonlight.App.Database.Migrations
+{
+ ///
+ public partial class ChangedStatisticsModel : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "Date",
+ table: "Statistics",
+ type: "datetime(6)",
+ nullable: false,
+ defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "Date",
+ table: "Statistics");
+ }
+ }
+}
diff --git a/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs b/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs
index a249a969..96bc5cb9 100644
--- a/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs
+++ b/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs
@@ -581,6 +581,9 @@ namespace Moonlight.App.Database.Migrations
.IsRequired()
.HasColumnType("longtext");
+ b.Property("Date")
+ .HasColumnType("datetime(6)");
+
b.Property("Value")
.HasColumnType("double");
diff --git a/Moonlight/App/Models/Misc/StatisticsTimeSpan.cs b/Moonlight/App/Models/Misc/StatisticsTimeSpan.cs
new file mode 100644
index 00000000..6341be6f
--- /dev/null
+++ b/Moonlight/App/Models/Misc/StatisticsTimeSpan.cs
@@ -0,0 +1,10 @@
+namespace Moonlight.App.Models.Misc;
+
+public enum StatisticsTimeSpan
+{
+ Hour = 1,
+ Day = 24,
+ Month = Day * 31,
+ Year = 365 * Day,
+ AllTime = Year * 99
+}
\ No newline at end of file
diff --git a/Moonlight/App/Repositories/StatisticsRepository.cs b/Moonlight/App/Repositories/StatisticsRepository.cs
index d118e71e..f33751b7 100644
--- a/Moonlight/App/Repositories/StatisticsRepository.cs
+++ b/Moonlight/App/Repositories/StatisticsRepository.cs
@@ -27,7 +27,7 @@ public class StatisticsRepository : IDisposable
public StatisticsData Add(string chart, double value)
{
- return Add(new StatisticsData() {Chart = chart, Value = value});
+ return Add(new StatisticsData() {Chart = chart, Value = value, Date = DateTime.Now});
}
public void Dispose()
diff --git a/Moonlight/App/Services/Statistics/StatisticsViewService.cs b/Moonlight/App/Services/Statistics/StatisticsViewService.cs
new file mode 100644
index 00000000..329445fe
--- /dev/null
+++ b/Moonlight/App/Services/Statistics/StatisticsViewService.cs
@@ -0,0 +1,24 @@
+using Moonlight.App.Database.Entities;
+using Moonlight.App.Models.Misc;
+using Moonlight.App.Repositories;
+
+namespace Moonlight.App.Services.Statistics;
+
+public class StatisticsViewService
+{
+ private readonly StatisticsRepository StatisticsRepository;
+
+ public StatisticsViewService(StatisticsRepository statisticsRepository)
+ {
+ StatisticsRepository = statisticsRepository;
+ }
+
+ public StatisticsData[] GetData(string chart, StatisticsTimeSpan timeSpan)
+ {
+ var startDate = DateTime.Now - TimeSpan.FromHours((int)timeSpan);
+
+ var objs = StatisticsRepository.Get().Where(x => x.Date > startDate && x.Chart == chart);
+
+ return objs.ToArray();
+ }
+}
\ No newline at end of file
diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj
index 816407f9..50e4901c 100644
--- a/Moonlight/Moonlight.csproj
+++ b/Moonlight/Moonlight.csproj
@@ -9,6 +9,7 @@
+
diff --git a/Moonlight/Pages/_Layout.cshtml b/Moonlight/Pages/_Layout.cshtml
index b82364f4..2b6904ec 100644
--- a/Moonlight/Pages/_Layout.cshtml
+++ b/Moonlight/Pages/_Layout.cshtml
@@ -114,5 +114,7 @@
+
+