diff --git a/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs b/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs new file mode 100644 index 0000000..71b9f57 --- /dev/null +++ b/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Minecraft_Realms_Emulator.Data; +using Minecraft_Realms_Emulator.Entities; + +namespace Minecraft_Realms_Emulator.Controllers +{ + [Route("[controller]")] + [ApiController] + public class SubscriptionsController : ControllerBase + { + private readonly DataContext _context; + + public SubscriptionsController(DataContext context) + { + _context = context; + } + [HttpGet("{id}")] + public async Task> Get(int id) + { + var world = await _context.Worlds.FindAsync(id); + var subscriptions = await _context.Subscriptions.ToListAsync(); + + if (world == null) return NotFound("Subscription njot found"); + + var subscription = subscriptions.Find(s => s.RemoteId == world.RemoteSubscriptionId); + + return Ok(subscription); + } + } +} diff --git a/Minecraft-Realms-Emulator/Controllers/WorldsController.cs b/Minecraft-Realms-Emulator/Controllers/WorldsController.cs index da84a49..75708cd 100644 --- a/Minecraft-Realms-Emulator/Controllers/WorldsController.cs +++ b/Minecraft-Realms-Emulator/Controllers/WorldsController.cs @@ -53,8 +53,8 @@ namespace Minecraft_Realms_Emulator.Controllers }; worlds.Add(world); - _context.Worlds.Add(world); + _context.SaveChanges(); } @@ -90,7 +90,17 @@ namespace Minecraft_Realms_Emulator.Controllers world.Motd = body.Description; world.State = State.OPEN.ToString(); + var subscription = new Subscription + { + RemoteId = world.RemoteSubscriptionId, + StartDate = ((DateTimeOffset) DateTime.Now).ToUnixTimeMilliseconds().ToString(), + DaysLeft = 30, + SubscriptionType = SubscriptionType.NORMAL.ToString() + }; + _context.Worlds.Update(world); + _context.Subscriptions.Add(subscription); + _context.SaveChanges(); return Ok(world); diff --git a/Minecraft-Realms-Emulator/Data/DataContext.cs b/Minecraft-Realms-Emulator/Data/DataContext.cs index 0710246..547d623 100644 --- a/Minecraft-Realms-Emulator/Data/DataContext.cs +++ b/Minecraft-Realms-Emulator/Data/DataContext.cs @@ -6,5 +6,6 @@ namespace Minecraft_Realms_Emulator.Data public class DataContext(DbContextOptions options) : DbContext(options) { public DbSet Worlds { get; set; } + public DbSet Subscriptions { get; set; } } } diff --git a/Minecraft-Realms-Emulator/Entities/Subscription.cs b/Minecraft-Realms-Emulator/Entities/Subscription.cs new file mode 100644 index 0000000..377b3f5 --- /dev/null +++ b/Minecraft-Realms-Emulator/Entities/Subscription.cs @@ -0,0 +1,11 @@ +namespace Minecraft_Realms_Emulator.Entities +{ + public class Subscription + { + public int Id { get; set; } + public string RemoteId { get; set; } = Guid.NewGuid().ToString(); + public string StartDate { get; set; } = ((DateTimeOffset) DateTime.Now).ToUnixTimeMilliseconds().ToString(); + public int DaysLeft { get; set; } = 30; + public string SubscriptionType { get; set; } = "NORMAL"; + } +} \ No newline at end of file diff --git a/Minecraft-Realms-Emulator/Entities/SubscriptionType.cs b/Minecraft-Realms-Emulator/Entities/SubscriptionType.cs new file mode 100644 index 0000000..b114278 --- /dev/null +++ b/Minecraft-Realms-Emulator/Entities/SubscriptionType.cs @@ -0,0 +1,8 @@ +namespace Minecraft_Realms_Emulator.Entities +{ + public enum SubscriptionType + { + NORMAL, + RECURRING + } +} \ No newline at end of file diff --git a/Minecraft-Realms-Emulator/Entities/World.cs b/Minecraft-Realms-Emulator/Entities/World.cs index b96b39a..bc23c51 100644 --- a/Minecraft-Realms-Emulator/Entities/World.cs +++ b/Minecraft-Realms-Emulator/Entities/World.cs @@ -3,7 +3,7 @@ public class World { public int Id { get; set; } - public string? RemoteSubscriptionId { get; set; } + public string RemoteSubscriptionId { get; set; } = Guid.NewGuid().ToString(); public string? Owner { get; set; } public string? OwnerUUID { get; set; } public string? Name { get; set; } diff --git a/Minecraft-Realms-Emulator/Migrations/20240203132410_Subscriptions.Designer.cs b/Minecraft-Realms-Emulator/Migrations/20240203132410_Subscriptions.Designer.cs new file mode 100644 index 0000000..4a03f81 --- /dev/null +++ b/Minecraft-Realms-Emulator/Migrations/20240203132410_Subscriptions.Designer.cs @@ -0,0 +1,130 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Minecraft_Realms_Emulator.Data; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Minecraft_Realms_Emulator.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20240203132410_Subscriptions")] + partial class Subscriptions + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Minecraft_Realms_Emulator.Entities.Subscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DaysLeft") + .HasColumnType("integer"); + + b.Property("RemoteId") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartDate") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubscriptionType") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Subscriptions"); + }); + + modelBuilder.Entity("Minecraft_Realms_Emulator.Entities.World", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActiveSlot") + .HasColumnType("integer"); + + b.Property("DaysLeft") + .HasColumnType("integer"); + + b.Property("Expired") + .HasColumnType("boolean"); + + b.Property("ExpiredTrial") + .HasColumnType("boolean"); + + b.Property("MaxPlayers") + .HasColumnType("integer"); + + b.Property("Member") + .HasColumnType("boolean"); + + b.Property("MinigameId") + .HasColumnType("integer"); + + b.Property("MinigameImage") + .HasColumnType("text"); + + b.Property("MinigameName") + .HasColumnType("text"); + + b.Property("Motd") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Owner") + .HasColumnType("text"); + + b.Property("OwnerUUID") + .HasColumnType("text"); + + b.Property("Players") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("RemoteSubscriptionId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Slots") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("State") + .IsRequired() + .HasColumnType("text"); + + b.Property("WorldType") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Worlds"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Minecraft-Realms-Emulator/Migrations/20240203132410_Subscriptions.cs b/Minecraft-Realms-Emulator/Migrations/20240203132410_Subscriptions.cs new file mode 100644 index 0000000..081d76e --- /dev/null +++ b/Minecraft-Realms-Emulator/Migrations/20240203132410_Subscriptions.cs @@ -0,0 +1,56 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Minecraft_Realms_Emulator.Migrations +{ + /// + public partial class Subscriptions : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "RemoteSubscriptionId", + table: "Worlds", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.CreateTable( + name: "Subscriptions", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RemoteId = table.Column(type: "text", nullable: false), + StartDate = table.Column(type: "text", nullable: false), + DaysLeft = table.Column(type: "integer", nullable: false), + SubscriptionType = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Subscriptions", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Subscriptions"); + + migrationBuilder.AlterColumn( + name: "RemoteSubscriptionId", + table: "Worlds", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + } + } +} diff --git a/Minecraft-Realms-Emulator/Migrations/DataContextModelSnapshot.cs b/Minecraft-Realms-Emulator/Migrations/DataContextModelSnapshot.cs index c88b29e..e030a58 100644 --- a/Minecraft-Realms-Emulator/Migrations/DataContextModelSnapshot.cs +++ b/Minecraft-Realms-Emulator/Migrations/DataContextModelSnapshot.cs @@ -22,6 +22,34 @@ namespace Minecraft_Realms_Emulator.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + modelBuilder.Entity("Minecraft_Realms_Emulator.Entities.Subscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DaysLeft") + .HasColumnType("integer"); + + b.Property("RemoteId") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartDate") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubscriptionType") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Subscriptions"); + }); + modelBuilder.Entity("Minecraft_Realms_Emulator.Entities.World", b => { b.Property("Id") @@ -74,6 +102,7 @@ namespace Minecraft_Realms_Emulator.Migrations .HasColumnType("text[]"); b.Property("RemoteSubscriptionId") + .IsRequired() .HasColumnType("text"); b.Property("Slots")