diff --git a/Moonlight/App/Database/Entities/Store/Transaction.cs b/Moonlight/App/Database/Entities/Store/Transaction.cs
index 6ed8d389..53c39fb8 100644
--- a/Moonlight/App/Database/Entities/Store/Transaction.cs
+++ b/Moonlight/App/Database/Entities/Store/Transaction.cs
@@ -5,4 +5,5 @@ public class Transaction
public int Id { get; set; }
public double Price { get; set; }
public string Text { get; set; } = "";
+ public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
\ No newline at end of file
diff --git a/Moonlight/App/Database/Migrations/20240119090835_AddedTransactionDate.Designer.cs b/Moonlight/App/Database/Migrations/20240119090835_AddedTransactionDate.Designer.cs
new file mode 100644
index 00000000..e25d18d4
--- /dev/null
+++ b/Moonlight/App/Database/Migrations/20240119090835_AddedTransactionDate.Designer.cs
@@ -0,0 +1,700 @@
+//
+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("20240119090835_AddedTransactionDate")]
+ partial class AddedTransactionDate
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.Post", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("AuthorId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Type")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.ToTable("Posts");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.PostComment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("AuthorId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("PostId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.HasIndex("PostId");
+
+ b.ToTable("PostComments");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.PostLike", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("PostId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PostId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("PostLikes");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.WordFilter", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Filter")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("WordFilters");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Category", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("Categories");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Coupon", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Amount")
+ .HasColumnType("INTEGER");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Percent")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.ToTable("Coupons");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.CouponUse", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CouponId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CouponId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("CouponUses");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.GiftCode", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Amount")
+ .HasColumnType("INTEGER");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Value")
+ .HasColumnType("REAL");
+
+ b.HasKey("Id");
+
+ b.ToTable("GiftCodes");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.GiftCodeUse", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("GiftCodeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GiftCodeId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("GiftCodeUses");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Product", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CategoryId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ConfigJson")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Duration")
+ .HasColumnType("INTEGER");
+
+ b.Property("MaxPerUser")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Price")
+ .HasColumnType("REAL");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Stock")
+ .HasColumnType("INTEGER");
+
+ b.Property("Type")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CategoryId");
+
+ b.ToTable("Products");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Service", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ConfigJsonOverride")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Nickname")
+ .HasColumnType("TEXT");
+
+ b.Property("OwnerId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProductId")
+ .HasColumnType("INTEGER");
+
+ b.Property("RenewAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Suspended")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.HasIndex("ProductId");
+
+ b.ToTable("Services");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.ServiceShare", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ServiceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ServiceId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("ServiceShares");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Transaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Price")
+ .HasColumnType("REAL");
+
+ b.Property("Text")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("Transaction");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Theme", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Author")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CssUrl")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("DonateUrl")
+ .HasColumnType("TEXT");
+
+ b.Property("Enabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("JsUrl")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("Themes");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Tickets.Ticket", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatorId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Open")
+ .HasColumnType("INTEGER");
+
+ b.Property("Priority")
+ .HasColumnType("INTEGER");
+
+ b.Property("ServiceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Tries")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatorId");
+
+ b.HasIndex("ServiceId");
+
+ b.ToTable("Tickets");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Tickets.TicketMessage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Attachment")
+ .HasColumnType("TEXT");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("IsSupport")
+ .HasColumnType("INTEGER");
+
+ b.Property("SenderId")
+ .HasColumnType("INTEGER");
+
+ b.Property("TicketId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SenderId");
+
+ b.HasIndex("TicketId");
+
+ b.ToTable("TicketMessages");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Avatar")
+ .HasColumnType("TEXT");
+
+ b.Property("Balance")
+ .HasColumnType("REAL");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Flags")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Permissions")
+ .HasColumnType("INTEGER");
+
+ b.Property("TokenValidTimestamp")
+ .HasColumnType("TEXT");
+
+ b.Property("TotpKey")
+ .HasColumnType("TEXT");
+
+ b.Property("Username")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.Post", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Author")
+ .WithMany()
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Author");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.PostComment", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Author")
+ .WithMany()
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.Community.Post", null)
+ .WithMany("Comments")
+ .HasForeignKey("PostId");
+
+ b.Navigation("Author");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.PostLike", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Community.Post", null)
+ .WithMany("Likes")
+ .HasForeignKey("PostId");
+
+ b.HasOne("Moonlight.App.Database.Entities.User", "User")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.CouponUse", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Store.Coupon", "Coupon")
+ .WithMany()
+ .HasForeignKey("CouponId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.User", null)
+ .WithMany("CouponUses")
+ .HasForeignKey("UserId");
+
+ b.Navigation("Coupon");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.GiftCodeUse", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Store.GiftCode", "GiftCode")
+ .WithMany()
+ .HasForeignKey("GiftCodeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.User", null)
+ .WithMany("GiftCodeUses")
+ .HasForeignKey("UserId");
+
+ b.Navigation("GiftCode");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Product", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Store.Category", "Category")
+ .WithMany()
+ .HasForeignKey("CategoryId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Category");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Service", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Owner")
+ .WithMany()
+ .HasForeignKey("OwnerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.Store.Product", "Product")
+ .WithMany()
+ .HasForeignKey("ProductId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Owner");
+
+ b.Navigation("Product");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.ServiceShare", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.Store.Service", null)
+ .WithMany("Shares")
+ .HasForeignKey("ServiceId");
+
+ b.HasOne("Moonlight.App.Database.Entities.User", "User")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Transaction", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", null)
+ .WithMany("Transactions")
+ .HasForeignKey("UserId");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Tickets.Ticket", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Creator")
+ .WithMany()
+ .HasForeignKey("CreatorId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Moonlight.App.Database.Entities.Store.Service", "Service")
+ .WithMany()
+ .HasForeignKey("ServiceId");
+
+ b.Navigation("Creator");
+
+ b.Navigation("Service");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Tickets.TicketMessage", b =>
+ {
+ b.HasOne("Moonlight.App.Database.Entities.User", "Sender")
+ .WithMany()
+ .HasForeignKey("SenderId");
+
+ b.HasOne("Moonlight.App.Database.Entities.Tickets.Ticket", null)
+ .WithMany("Messages")
+ .HasForeignKey("TicketId");
+
+ b.Navigation("Sender");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Community.Post", b =>
+ {
+ b.Navigation("Comments");
+
+ b.Navigation("Likes");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Store.Service", b =>
+ {
+ b.Navigation("Shares");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.Tickets.Ticket", b =>
+ {
+ b.Navigation("Messages");
+ });
+
+ modelBuilder.Entity("Moonlight.App.Database.Entities.User", b =>
+ {
+ b.Navigation("CouponUses");
+
+ b.Navigation("GiftCodeUses");
+
+ b.Navigation("Transactions");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Moonlight/App/Database/Migrations/20240119090835_AddedTransactionDate.cs b/Moonlight/App/Database/Migrations/20240119090835_AddedTransactionDate.cs
new file mode 100644
index 00000000..bb3d3e9e
--- /dev/null
+++ b/Moonlight/App/Database/Migrations/20240119090835_AddedTransactionDate.cs
@@ -0,0 +1,30 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Moonlight.App.Database.Migrations
+{
+ ///
+ public partial class AddedTransactionDate : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "CreatedAt",
+ table: "Transaction",
+ type: "TEXT",
+ nullable: false,
+ defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "CreatedAt",
+ table: "Transaction");
+ }
+ }
+}
diff --git a/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs b/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs
index 3ca1af2c..debff26b 100644
--- a/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs
+++ b/Moonlight/App/Database/Migrations/DataContextModelSnapshot.cs
@@ -340,6 +340,9 @@ namespace Moonlight.App.Database.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
b.Property("Price")
.HasColumnType("REAL");
diff --git a/Moonlight/Shared/Components/Partials/PageHeader.razor b/Moonlight/Shared/Components/Partials/PageHeader.razor
index 37e172f8..d6887719 100644
--- a/Moonlight/Shared/Components/Partials/PageHeader.razor
+++ b/Moonlight/Shared/Components/Partials/PageHeader.razor
@@ -61,7 +61,7 @@