Added hangfire. Implemented hangfire statistics. Updated lucide icons
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Hangfire.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Extended.SingleDb;
|
using MoonCore.Extended.SingleDb;
|
||||||
using Moonlight.ApiServer.Configuration;
|
using Moonlight.ApiServer.Configuration;
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
using Moonlight.ApiServer.Database.Entities;
|
||||||
using Moonlight.ApiServer.Helpers;
|
|
||||||
|
|
||||||
namespace Moonlight.ApiServer.Database;
|
namespace Moonlight.ApiServer.Database;
|
||||||
|
|
||||||
@@ -24,4 +24,10 @@ public class CoreDataContext : DatabaseContext
|
|||||||
Database = configuration.Database.Database
|
Database = configuration.Database.Database
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
base.OnModelCreating(modelBuilder);
|
||||||
|
modelBuilder.OnHangfireModelCreating();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
393
Moonlight.ApiServer/Database/Migrations/20250405172522_AddedHangfireTables.Designer.cs
generated
Normal file
393
Moonlight.ApiServer/Database/Migrations/20250405172522_AddedHangfireTables.Designer.cs
generated
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Moonlight.ApiServer.Database;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Moonlight.ApiServer.Database.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(CoreDataContext))]
|
||||||
|
[Migration("20250405172522_AddedHangfireTables")]
|
||||||
|
partial class AddedHangfireTables
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "8.0.11")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<long>("Value")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.HasIndex("Key", "Value");
|
||||||
|
|
||||||
|
b.ToTable("HangfireCounter");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("Field")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Key", "Field");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.ToTable("HangfireHash");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("InvocationData")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<long?>("StateId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("StateName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.HasIndex("StateId");
|
||||||
|
|
||||||
|
b.HasIndex("StateName");
|
||||||
|
|
||||||
|
b.ToTable("HangfireJob");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("JobId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("JobId", "Name");
|
||||||
|
|
||||||
|
b.ToTable("HangfireJobParameter");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<int>("Position")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Key", "Position");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.ToTable("HangfireList");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("AcquiredAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("HangfireLock");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime?>("FetchedAt")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<long>("JobId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Queue")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("JobId");
|
||||||
|
|
||||||
|
b.HasIndex("Queue", "FetchedAt");
|
||||||
|
|
||||||
|
b.ToTable("HangfireQueuedJob");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("Heartbeat")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Queues")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime>("StartedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<int>("WorkerCount")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("Heartbeat");
|
||||||
|
|
||||||
|
b.ToTable("HangfireServer");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("character varying(100)");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<double>("Score")
|
||||||
|
.HasColumnType("double precision");
|
||||||
|
|
||||||
|
b.HasKey("Key", "Value");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.HasIndex("Key", "Score");
|
||||||
|
|
||||||
|
b.ToTable("HangfireSet");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Data")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<long>("JobId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("Reason")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("JobId");
|
||||||
|
|
||||||
|
b.ToTable("HangfireState");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Moonlight.ApiServer.Database.Entities.ApiKey", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ExpiresAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("PermissionsJson")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("jsonb");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Core_ApiKeys", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Moonlight.ApiServer.Database.Entities.User", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Password")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PermissionsJson")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("jsonb");
|
||||||
|
|
||||||
|
b.Property<DateTime>("TokenValidTimestamp")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Username")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Core_Users", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("StateId");
|
||||||
|
|
||||||
|
b.Navigation("State");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job")
|
||||||
|
.WithMany("Parameters")
|
||||||
|
.HasForeignKey("JobId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Job");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job")
|
||||||
|
.WithMany("QueuedJobs")
|
||||||
|
.HasForeignKey("JobId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Job");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job")
|
||||||
|
.WithMany("States")
|
||||||
|
.HasForeignKey("JobId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Job");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Parameters");
|
||||||
|
|
||||||
|
b.Navigation("QueuedJobs");
|
||||||
|
|
||||||
|
b.Navigation("States");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,290 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Moonlight.ApiServer.Database.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class AddedHangfireTables : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireCounter",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<long>(type: "bigint", nullable: false)
|
||||||
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
Key = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Value = table.Column<long>(type: "bigint", nullable: false),
|
||||||
|
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireCounter", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireHash",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Key = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Field = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "text", nullable: true),
|
||||||
|
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireHash", x => new { x.Key, x.Field });
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireList",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Key = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Position = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Value = table.Column<string>(type: "text", nullable: true),
|
||||||
|
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireList", x => new { x.Key, x.Position });
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireLock",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
AcquiredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireLock", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireServer",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
StartedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
Heartbeat = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
WorkerCount = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Queues = table.Column<string>(type: "text", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireServer", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireSet",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Key = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Score = table.Column<double>(type: "double precision", nullable: false),
|
||||||
|
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireSet", x => new { x.Key, x.Value });
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireJob",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<long>(type: "bigint", nullable: false)
|
||||||
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
StateId = table.Column<long>(type: "bigint", nullable: true),
|
||||||
|
StateName = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
|
||||||
|
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||||
|
InvocationData = table.Column<string>(type: "text", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireJob", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireJobParameter",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
JobId = table.Column<long>(type: "bigint", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "text", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireJobParameter", x => new { x.JobId, x.Name });
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_HangfireJobParameter_HangfireJob_JobId",
|
||||||
|
column: x => x.JobId,
|
||||||
|
principalTable: "HangfireJob",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireQueuedJob",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<long>(type: "bigint", nullable: false)
|
||||||
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
JobId = table.Column<long>(type: "bigint", nullable: false),
|
||||||
|
Queue = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
FetchedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireQueuedJob", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_HangfireQueuedJob_HangfireJob_JobId",
|
||||||
|
column: x => x.JobId,
|
||||||
|
principalTable: "HangfireJob",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "HangfireState",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<long>(type: "bigint", nullable: false)
|
||||||
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
JobId = table.Column<long>(type: "bigint", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
|
||||||
|
Reason = table.Column<string>(type: "text", nullable: true),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
Data = table.Column<string>(type: "text", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_HangfireState", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_HangfireState_HangfireJob_JobId",
|
||||||
|
column: x => x.JobId,
|
||||||
|
principalTable: "HangfireJob",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireCounter_ExpireAt",
|
||||||
|
table: "HangfireCounter",
|
||||||
|
column: "ExpireAt");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireCounter_Key_Value",
|
||||||
|
table: "HangfireCounter",
|
||||||
|
columns: new[] { "Key", "Value" });
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireHash_ExpireAt",
|
||||||
|
table: "HangfireHash",
|
||||||
|
column: "ExpireAt");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireJob_ExpireAt",
|
||||||
|
table: "HangfireJob",
|
||||||
|
column: "ExpireAt");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireJob_StateId",
|
||||||
|
table: "HangfireJob",
|
||||||
|
column: "StateId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireJob_StateName",
|
||||||
|
table: "HangfireJob",
|
||||||
|
column: "StateName");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireList_ExpireAt",
|
||||||
|
table: "HangfireList",
|
||||||
|
column: "ExpireAt");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireQueuedJob_JobId",
|
||||||
|
table: "HangfireQueuedJob",
|
||||||
|
column: "JobId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireQueuedJob_Queue_FetchedAt",
|
||||||
|
table: "HangfireQueuedJob",
|
||||||
|
columns: new[] { "Queue", "FetchedAt" });
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireServer_Heartbeat",
|
||||||
|
table: "HangfireServer",
|
||||||
|
column: "Heartbeat");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireSet_ExpireAt",
|
||||||
|
table: "HangfireSet",
|
||||||
|
column: "ExpireAt");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireSet_Key_Score",
|
||||||
|
table: "HangfireSet",
|
||||||
|
columns: new[] { "Key", "Score" });
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_HangfireState_JobId",
|
||||||
|
table: "HangfireState",
|
||||||
|
column: "JobId");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_HangfireJob_HangfireState_StateId",
|
||||||
|
table: "HangfireJob",
|
||||||
|
column: "StateId",
|
||||||
|
principalTable: "HangfireState",
|
||||||
|
principalColumn: "Id");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_HangfireJob_HangfireState_StateId",
|
||||||
|
table: "HangfireJob");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireCounter");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireHash");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireJobParameter");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireList");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireLock");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireQueuedJob");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireServer");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireSet");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireState");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "HangfireJob");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,259 @@ namespace Moonlight.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<long>("Value")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.HasIndex("Key", "Value");
|
||||||
|
|
||||||
|
b.ToTable("HangfireCounter");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("Field")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Key", "Field");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.ToTable("HangfireHash");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("InvocationData")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<long?>("StateId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("StateName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.HasIndex("StateId");
|
||||||
|
|
||||||
|
b.HasIndex("StateName");
|
||||||
|
|
||||||
|
b.ToTable("HangfireJob");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("JobId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("JobId", "Name");
|
||||||
|
|
||||||
|
b.ToTable("HangfireJobParameter");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<int>("Position")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Key", "Position");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.ToTable("HangfireList");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("AcquiredAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("HangfireLock");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime?>("FetchedAt")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<long>("JobId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Queue")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("JobId");
|
||||||
|
|
||||||
|
b.HasIndex("Queue", "FetchedAt");
|
||||||
|
|
||||||
|
b.ToTable("HangfireQueuedJob");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("Heartbeat")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Queues")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime>("StartedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<int>("WorkerCount")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("Heartbeat");
|
||||||
|
|
||||||
|
b.ToTable("HangfireServer");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("character varying(100)");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("ExpireAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<double>("Score")
|
||||||
|
.HasColumnType("double precision");
|
||||||
|
|
||||||
|
b.HasKey("Key", "Value");
|
||||||
|
|
||||||
|
b.HasIndex("ExpireAt");
|
||||||
|
|
||||||
|
b.HasIndex("Key", "Score");
|
||||||
|
|
||||||
|
b.ToTable("HangfireSet");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Data")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<long>("JobId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("character varying(256)");
|
||||||
|
|
||||||
|
b.Property<string>("Reason")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("JobId");
|
||||||
|
|
||||||
|
b.ToTable("HangfireState");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Moonlight.ApiServer.Database.Entities.ApiKey", b =>
|
modelBuilder.Entity("Moonlight.ApiServer.Database.Entities.ApiKey", b =>
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
@@ -80,6 +333,57 @@ namespace Moonlight.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.ToTable("Core_Users", (string)null);
|
b.ToTable("Core_Users", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("StateId");
|
||||||
|
|
||||||
|
b.Navigation("State");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job")
|
||||||
|
.WithMany("Parameters")
|
||||||
|
.HasForeignKey("JobId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Job");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job")
|
||||||
|
.WithMany("QueuedJobs")
|
||||||
|
.HasForeignKey("JobId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Job");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job")
|
||||||
|
.WithMany("States")
|
||||||
|
.HasForeignKey("JobId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Job");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Parameters");
|
||||||
|
|
||||||
|
b.Navigation("QueuedJobs");
|
||||||
|
|
||||||
|
b.Navigation("States");
|
||||||
|
});
|
||||||
#pragma warning restore 612, 618
|
#pragma warning restore 612, 618
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using Hangfire;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using MoonCore.Extended.PermFilter;
|
||||||
|
using Moonlight.Shared.Http.Responses.Admin.Hangfire;
|
||||||
|
|
||||||
|
namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/admin/system/hangfire")]
|
||||||
|
[RequirePermission("admin.system.hangfire")]
|
||||||
|
public class HangfireController : Controller
|
||||||
|
{
|
||||||
|
private readonly JobStorage JobStorage;
|
||||||
|
|
||||||
|
public HangfireController(JobStorage jobStorage)
|
||||||
|
{
|
||||||
|
JobStorage = jobStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("stats")]
|
||||||
|
public Task<HangfireStatsResponse> GetStats()
|
||||||
|
{
|
||||||
|
var statistics = JobStorage.GetMonitoringApi().GetStatistics();
|
||||||
|
|
||||||
|
return Task.FromResult(new HangfireStatsResponse()
|
||||||
|
{
|
||||||
|
Awaiting = statistics.Awaiting,
|
||||||
|
Deleted = statistics.Deleted,
|
||||||
|
Enqueued = statistics.Enqueued,
|
||||||
|
Failed = statistics.Failed,
|
||||||
|
Processing = statistics.Processing,
|
||||||
|
Queues = statistics.Queues,
|
||||||
|
Recurring = statistics.Recurring,
|
||||||
|
Retries = statistics.Retries,
|
||||||
|
Scheduled = statistics.Scheduled,
|
||||||
|
Servers = statistics.Servers,
|
||||||
|
Succeeded = statistics.Succeeded
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,9 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ExCSS" Version="4.3.0" />
|
<PackageReference Include="ExCSS" Version="4.3.0" />
|
||||||
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.18" />
|
||||||
|
<PackageReference Include="Hangfire.Core" Version="1.8.18" />
|
||||||
|
<PackageReference Include="Hangfire.EntityFrameworkCore" Version="0.7.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.10"/>
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.10"/>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.8">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.8">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ using System.Reflection;
|
|||||||
using System.Runtime.Loader;
|
using System.Runtime.Loader;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using Hangfire;
|
||||||
|
using Hangfire.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
@@ -15,6 +17,7 @@ using MoonCore.Extensions;
|
|||||||
using MoonCore.Helpers;
|
using MoonCore.Helpers;
|
||||||
using MoonCore.Services;
|
using MoonCore.Services;
|
||||||
using Moonlight.ApiServer.Configuration;
|
using Moonlight.ApiServer.Configuration;
|
||||||
|
using Moonlight.ApiServer.Database;
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
using Moonlight.ApiServer.Database.Entities;
|
||||||
using Moonlight.ApiServer.Helpers;
|
using Moonlight.ApiServer.Helpers;
|
||||||
using Moonlight.ApiServer.Interfaces.Startup;
|
using Moonlight.ApiServer.Interfaces.Startup;
|
||||||
@@ -78,9 +81,10 @@ public class Startup
|
|||||||
await RegisterBase();
|
await RegisterBase();
|
||||||
await RegisterDatabase();
|
await RegisterDatabase();
|
||||||
await RegisterAuth();
|
await RegisterAuth();
|
||||||
|
await RegisterCors();
|
||||||
|
await RegisterHangfire();
|
||||||
await HookPluginBuild();
|
await HookPluginBuild();
|
||||||
await RegisterPluginAssets();
|
await RegisterPluginAssets();
|
||||||
await RegisterCors();
|
|
||||||
|
|
||||||
await BuildWebApplication();
|
await BuildWebApplication();
|
||||||
|
|
||||||
@@ -90,6 +94,7 @@ public class Startup
|
|||||||
await UsePluginAssets(); // We need to move the plugin assets to the top to allow plugins to override content
|
await UsePluginAssets(); // We need to move the plugin assets to the top to allow plugins to override content
|
||||||
await UseBase();
|
await UseBase();
|
||||||
await UseAuth();
|
await UseAuth();
|
||||||
|
await UseHangfire();
|
||||||
await HookPluginConfigure();
|
await HookPluginConfigure();
|
||||||
|
|
||||||
await MapBase();
|
await MapBase();
|
||||||
@@ -619,4 +624,45 @@ public class Startup
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Hangfire
|
||||||
|
|
||||||
|
private Task RegisterHangfire()
|
||||||
|
{
|
||||||
|
WebApplicationBuilder.Services.AddHangfire((provider, configuration) =>
|
||||||
|
{
|
||||||
|
configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_180);
|
||||||
|
configuration.UseSimpleAssemblyNameTypeSerializer();
|
||||||
|
configuration.UseRecommendedSerializerSettings();
|
||||||
|
configuration.UseEFCoreStorage(() =>
|
||||||
|
{
|
||||||
|
var scope = provider.CreateScope();
|
||||||
|
return scope.ServiceProvider.GetRequiredService<CoreDataContext>();
|
||||||
|
}, new EFCoreStorageOptions());
|
||||||
|
});
|
||||||
|
|
||||||
|
WebApplicationBuilder.Services.AddHangfireServer();
|
||||||
|
|
||||||
|
WebApplicationBuilder.Logging.AddFilter(
|
||||||
|
"Hangfire.Server.BackgroundServerProcess",
|
||||||
|
LogLevel.Warning
|
||||||
|
);
|
||||||
|
|
||||||
|
WebApplicationBuilder.Logging.AddFilter(
|
||||||
|
"Hangfire.BackgroundJobServer",
|
||||||
|
LogLevel.Warning
|
||||||
|
);
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task UseHangfire()
|
||||||
|
{
|
||||||
|
if (WebApplication.Environment.IsDevelopment())
|
||||||
|
WebApplication.UseHangfireDashboard();
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback');
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback');
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap');
|
@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap');
|
||||||
@import url("https://cdn.jsdelivr.net/npm/lucide-static@0.460.0/font/lucide.css");
|
@import url("https://cdn.jsdelivr.net/npm/lucide-static@0.487.0/font/lucide.css");
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
@inject DownloadService DownloadService
|
@inject DownloadService DownloadService
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<NavTabs Index="3" Names="UiConstants.AdminNavNames" Links="UiConstants.AdminNavLinks" />
|
<NavTabs Index="4" Names="UiConstants.AdminNavNames" Links="UiConstants.AdminNavLinks" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
|
|||||||
42
Moonlight.Client/UI/Views/Admin/Sys/Hangfire.razor
Normal file
42
Moonlight.Client/UI/Views/Admin/Sys/Hangfire.razor
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
@page "/admin/system/hangfire"
|
||||||
|
|
||||||
|
@using MoonCore.Attributes
|
||||||
|
@using MoonCore.Helpers
|
||||||
|
@using Moonlight.Shared.Http.Responses.Admin.Hangfire
|
||||||
|
@using Moonlight.Client.UI.Components
|
||||||
|
|
||||||
|
@attribute [RequirePermission("admin.system.hangfire")]
|
||||||
|
|
||||||
|
@inject HttpApiClient ApiClient
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<NavTabs Index="3" Names="UiConstants.AdminNavNames" Links="UiConstants.AdminNavLinks"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<LazyLoader Load="Load">
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-4 gap-5">
|
||||||
|
<StatCard Title="Servers" Text="@Stats.Servers.ToString()" Icon="icon-server"/>
|
||||||
|
<StatCard Title="Recurring" Text="@Stats.Recurring.ToString()" Icon="icon-calendar-sync"/>
|
||||||
|
<StatCard Title="Enqueued" Text="@Stats.Enqueued.ToString()" Icon="icon-list-end"/>
|
||||||
|
<StatCard Title="Queues" Text="@Stats.Queues.ToString()" Icon="icon-logs"/>
|
||||||
|
<StatCard Title="Scheduled" Text="@Stats.Scheduled.ToString()" Icon="icon-calendar-check-2"/>
|
||||||
|
<StatCard Title="Processing" Text="@Stats.Processing.ToString()" Icon="icon-pickaxe"/>
|
||||||
|
<StatCard Title="Succeeded" Text="@Stats.Succeeded.ToString()" Icon="icon-check-check"/>
|
||||||
|
<StatCard Title="Failed" Text="@Stats.Failed.ToString()" Icon="icon-ban"/>
|
||||||
|
<StatCard Title="Deleted" Text="@Stats.Deleted.ToString()" Icon="icon-trash-2"/>
|
||||||
|
<StatCard Title="Retries" Text="@(Stats.Retries?.ToString() ?? "-")" Icon="icon-rotate-ccw"/>
|
||||||
|
<StatCard Title="Awaiting" Text="@(Stats.Awaiting?.ToString() ?? "-")" Icon="icon-loader"/>
|
||||||
|
</div>
|
||||||
|
</LazyLoader>
|
||||||
|
|
||||||
|
@code
|
||||||
|
{
|
||||||
|
private HangfireStatsResponse Stats;
|
||||||
|
|
||||||
|
private async Task Load(LazyLoader _)
|
||||||
|
{
|
||||||
|
Stats = await ApiClient.GetJson<HangfireStatsResponse>(
|
||||||
|
"api/admin/system/hangfire/stats"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,14 @@ namespace Moonlight.Client;
|
|||||||
|
|
||||||
public static class UiConstants
|
public static class UiConstants
|
||||||
{
|
{
|
||||||
public static readonly string[] AdminNavNames = ["Overview", "Theme", "Files", "Advanced"];
|
public static readonly string[] AdminNavNames =
|
||||||
public static readonly string[] AdminNavLinks = ["/admin/system", "/admin/system/theme", "/admin/system/files", "/admin/system/advanced"];
|
[
|
||||||
|
"Overview", "Theme", "Files", "Hangfire", "Advanced"
|
||||||
|
];
|
||||||
|
|
||||||
|
public static readonly string[] AdminNavLinks =
|
||||||
|
[
|
||||||
|
"/admin/system", "/admin/system/theme", "/admin/system/files", "/admin/system/hangfire",
|
||||||
|
"/admin/system/advanced"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
namespace Moonlight.Shared.Http.Responses.Admin.Hangfire;
|
||||||
|
|
||||||
|
public class HangfireStatsResponse
|
||||||
|
{
|
||||||
|
public long Servers { get; set; }
|
||||||
|
public long Recurring { get; set; }
|
||||||
|
public long Enqueued { get; set; }
|
||||||
|
public long Queues { get; set; }
|
||||||
|
public long Scheduled { get; set; }
|
||||||
|
public long Processing { get; set; }
|
||||||
|
public long Succeeded { get; set; }
|
||||||
|
public long Failed { get; set; }
|
||||||
|
public long Deleted { get; set; }
|
||||||
|
public long? Retries { get; set; }
|
||||||
|
public long? Awaiting { get; set; }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user