Updated to latest moonlight and mooncore version. Done refactoring to async scheme and other changes. Recreated database migrations and cleaned models
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.7" />
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.9" />
|
||||||
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.8"/>
|
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.8"/>
|
||||||
<PackageReference Include="MoonCore.PluginFramework.Generator" Version="1.0.2"/>
|
<PackageReference Include="MoonCore.PluginFramework.Generator" Version="1.0.2"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -6,15 +6,15 @@ pluginLoader.Initialize();
|
|||||||
|
|
||||||
var cs = new Startup();
|
var cs = new Startup();
|
||||||
|
|
||||||
await cs.Initialize(args, pluginLoader.Instances);
|
await cs.InitializeAsync(args, pluginLoader.Instances);
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
await cs.AddMoonlight(builder);
|
await cs.AddMoonlightAsync(builder);
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
await cs.AddMoonlight(app);
|
await cs.AddMoonlightAsync(app);
|
||||||
|
|
||||||
// Handle setup of wasm app hosting in the runtime
|
// Handle setup of wasm app hosting in the runtime
|
||||||
// so the Moonlight.ApiServer doesn't need the wasm package
|
// so the Moonlight.ApiServer doesn't need the wasm package
|
||||||
|
|||||||
@@ -18,8 +18,4 @@ public class Node
|
|||||||
public int HttpPort { get; set; }
|
public int HttpPort { get; set; }
|
||||||
public int FtpPort { get; set; }
|
public int FtpPort { get; set; }
|
||||||
public bool UseSsl { get; set; }
|
public bool UseSsl { get; set; }
|
||||||
|
|
||||||
// Misc
|
|
||||||
public bool EnableTransparentMode { get; set; }
|
|
||||||
public bool EnableDynamicFirewall { get; set; }
|
|
||||||
}
|
}
|
||||||
@@ -24,6 +24,4 @@ public class Server
|
|||||||
public int Cpu { get; set; }
|
public int Cpu { get; set; }
|
||||||
public int Memory { get; set; }
|
public int Memory { get; set; }
|
||||||
public int Disk { get; set; }
|
public int Disk { get; set; }
|
||||||
public bool UseVirtualDisk { get; set; }
|
|
||||||
public int Bandwidth { get; set; }
|
|
||||||
}
|
}
|
||||||
@@ -1,452 +0,0 @@
|
|||||||
// <auto-generated />
|
|
||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
||||||
using MoonlightServers.ApiServer.Database;
|
|
||||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Database.Migrations
|
|
||||||
{
|
|
||||||
[DbContext(typeof(ServersDataContext))]
|
|
||||||
[Migration("20250226210232_RecreatedMigrationsForPostgresql")]
|
|
||||||
partial class RecreatedMigrationsForPostgresql
|
|
||||||
{
|
|
||||||
/// <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("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("IpAddress")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("NodeId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Port")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int?>("ServerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("NodeId");
|
|
||||||
|
|
||||||
b.HasIndex("ServerId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Allocations", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("EnableDynamicFirewall")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<bool>("EnableTransparentMode")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("Fqdn")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("FtpPort")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("HttpPort")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Token")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<bool>("UseSsl")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Nodes", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<int>("Bandwidth")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Cpu")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Disk")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("DockerImageIndex")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Memory")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("NodeId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("OwnerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("StarId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("StartupOverride")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<bool>("UseVirtualDisk")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("NodeId");
|
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Servers", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("Completed")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CompletedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<int?>("ServerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<long>("Size")
|
|
||||||
.HasColumnType("bigint");
|
|
||||||
|
|
||||||
b.Property<bool>("Successful")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ServerId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_ServerBackups", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("Key")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("ServerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Value")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ServerId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_ServerVariables", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("AllowDockerImageChange")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("Author")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("DefaultDockerImage")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("DonateUrl")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("InstallDockerImage")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("InstallScript")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("InstallShell")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("OnlineDetection")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("ParseConfiguration")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("RequiredAllocations")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("StartupCommand")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("StopCommand")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("UpdateUrl")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Version")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Stars", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("AutoPulling")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("DisplayName")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Identifier")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("StarId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_StarDockerImages", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("AllowEditing")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<bool>("AllowViewing")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("DefaultValue")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Description")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Filter")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Key")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("StarId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Type")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_StarVariables", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node")
|
|
||||||
.WithMany("Allocations")
|
|
||||||
.HasForeignKey("NodeId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server")
|
|
||||||
.WithMany("Allocations")
|
|
||||||
.HasForeignKey("ServerId");
|
|
||||||
|
|
||||||
b.Navigation("Node");
|
|
||||||
|
|
||||||
b.Navigation("Server");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node")
|
|
||||||
.WithMany("Servers")
|
|
||||||
.HasForeignKey("NodeId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star")
|
|
||||||
.WithMany()
|
|
||||||
.HasForeignKey("StarId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Node");
|
|
||||||
|
|
||||||
b.Navigation("Star");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", null)
|
|
||||||
.WithMany("Backups")
|
|
||||||
.HasForeignKey("ServerId");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server")
|
|
||||||
.WithMany("Variables")
|
|
||||||
.HasForeignKey("ServerId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Server");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star")
|
|
||||||
.WithMany("DockerImages")
|
|
||||||
.HasForeignKey("StarId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Star");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star")
|
|
||||||
.WithMany("Variables")
|
|
||||||
.HasForeignKey("StarId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Star");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Allocations");
|
|
||||||
|
|
||||||
b.Navigation("Servers");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Allocations");
|
|
||||||
|
|
||||||
b.Navigation("Backups");
|
|
||||||
|
|
||||||
b.Navigation("Variables");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("DockerImages");
|
|
||||||
|
|
||||||
b.Navigation("Variables");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,456 +0,0 @@
|
|||||||
// <auto-generated />
|
|
||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
||||||
using MoonlightServers.ApiServer.Database;
|
|
||||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Database.Migrations
|
|
||||||
{
|
|
||||||
[DbContext(typeof(ServersDataContext))]
|
|
||||||
[Migration("20250301142415_AddedTokenIdField")]
|
|
||||||
partial class AddedTokenIdField
|
|
||||||
{
|
|
||||||
/// <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("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("IpAddress")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("NodeId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Port")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int?>("ServerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("NodeId");
|
|
||||||
|
|
||||||
b.HasIndex("ServerId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Allocations", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("EnableDynamicFirewall")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<bool>("EnableTransparentMode")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("Fqdn")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("FtpPort")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("HttpPort")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Token")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("TokenId")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<bool>("UseSsl")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Nodes", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<int>("Bandwidth")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Cpu")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Disk")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("DockerImageIndex")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Memory")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("NodeId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("OwnerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("StarId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("StartupOverride")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<bool>("UseVirtualDisk")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("NodeId");
|
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Servers", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("Completed")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CompletedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<int?>("ServerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<long>("Size")
|
|
||||||
.HasColumnType("bigint");
|
|
||||||
|
|
||||||
b.Property<bool>("Successful")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ServerId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_ServerBackups", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<string>("Key")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("ServerId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Value")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ServerId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_ServerVariables", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("AllowDockerImageChange")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("Author")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("DefaultDockerImage")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("DonateUrl")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("InstallDockerImage")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("InstallScript")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("InstallShell")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("OnlineDetection")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("ParseConfiguration")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("RequiredAllocations")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("StartupCommand")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("StopCommand")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("UpdateUrl")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Version")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("Servers_Stars", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("AutoPulling")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("DisplayName")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Identifier")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("StarId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_StarDockerImages", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
|
||||||
{
|
|
||||||
b.Property<int>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
|
||||||
|
|
||||||
b.Property<bool>("AllowEditing")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<bool>("AllowViewing")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("DefaultValue")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Description")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Filter")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Key")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("StarId")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Type")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
|
||||||
|
|
||||||
b.ToTable("Servers_StarVariables", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node")
|
|
||||||
.WithMany("Allocations")
|
|
||||||
.HasForeignKey("NodeId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server")
|
|
||||||
.WithMany("Allocations")
|
|
||||||
.HasForeignKey("ServerId");
|
|
||||||
|
|
||||||
b.Navigation("Node");
|
|
||||||
|
|
||||||
b.Navigation("Server");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node")
|
|
||||||
.WithMany("Servers")
|
|
||||||
.HasForeignKey("NodeId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star")
|
|
||||||
.WithMany()
|
|
||||||
.HasForeignKey("StarId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Node");
|
|
||||||
|
|
||||||
b.Navigation("Star");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", null)
|
|
||||||
.WithMany("Backups")
|
|
||||||
.HasForeignKey("ServerId");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server")
|
|
||||||
.WithMany("Variables")
|
|
||||||
.HasForeignKey("ServerId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Server");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star")
|
|
||||||
.WithMany("DockerImages")
|
|
||||||
.HasForeignKey("StarId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Star");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star")
|
|
||||||
.WithMany("Variables")
|
|
||||||
.HasForeignKey("StarId")
|
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("Star");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Allocations");
|
|
||||||
|
|
||||||
b.Navigation("Servers");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Allocations");
|
|
||||||
|
|
||||||
b.Navigation("Backups");
|
|
||||||
|
|
||||||
b.Navigation("Variables");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("DockerImages");
|
|
||||||
|
|
||||||
b.Navigation("Variables");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Database.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class AddedTokenIdField : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.AddColumn<string>(
|
|
||||||
name: "TokenId",
|
|
||||||
table: "Servers_Nodes",
|
|
||||||
type: "text",
|
|
||||||
nullable: false,
|
|
||||||
defaultValue: "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropColumn(
|
|
||||||
name: "TokenId",
|
|
||||||
table: "Servers_Nodes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Database.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class AddedShares : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Servers_ServerShares",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
|
||||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
|
||||||
UserId = table.Column<int>(type: "integer", nullable: false),
|
|
||||||
ServerId = table.Column<int>(type: "integer", nullable: false),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
|
||||||
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
|
||||||
Content = table.Column<string>(type: "jsonb", nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Servers_ServerShares", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Servers_ServerShares_Servers_Servers_ServerId",
|
|
||||||
column: x => x.ServerId,
|
|
||||||
principalTable: "Servers_Servers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Servers_ServerShares_ServerId",
|
|
||||||
table: "Servers_ServerShares",
|
|
||||||
column: "ServerId");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Servers_ServerShares");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -12,15 +12,16 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|||||||
namespace MoonlightServers.ApiServer.Database.Migrations
|
namespace MoonlightServers.ApiServer.Database.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(ServersDataContext))]
|
[DbContext(typeof(ServersDataContext))]
|
||||||
[Migration("20250606121013_AddedShares")]
|
[Migration("20250922091731_RecreatedModelsInNewSchema")]
|
||||||
partial class AddedShares
|
partial class RecreatedModelsInNewSchema
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
#pragma warning disable 612, 618
|
#pragma warning disable 612, 618
|
||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "9.0.5")
|
.HasDefaultSchema("servers")
|
||||||
|
.HasAnnotation("ProductVersion", "9.0.9")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
@@ -52,7 +53,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_Allocations", (string)null);
|
b.ToTable("Allocations", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
||||||
@@ -63,12 +64,6 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<bool>("EnableDynamicFirewall")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<bool>("EnableTransparentMode")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("Fqdn")
|
b.Property<string>("Fqdn")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
@@ -96,7 +91,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.ToTable("Servers_Nodes", (string)null);
|
b.ToTable("Nodes", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
||||||
@@ -107,9 +102,6 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("Bandwidth")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Cpu")
|
b.Property<int>("Cpu")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
@@ -138,16 +130,13 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
b.Property<string>("StartupOverride")
|
b.Property<string>("StartupOverride")
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
|
|
||||||
b.Property<bool>("UseVirtualDisk")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("NodeId");
|
b.HasIndex("NodeId");
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
b.HasIndex("StarId");
|
||||||
|
|
||||||
b.ToTable("Servers_Servers", (string)null);
|
b.ToTable("Servers", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
||||||
@@ -180,7 +169,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_ServerBackups", (string)null);
|
b.ToTable("ServerBackups", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerShare", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerShare", b =>
|
||||||
@@ -207,7 +196,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_ServerShares", (string)null);
|
b.ToTable("ServerShares", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
||||||
@@ -233,7 +222,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_ServerVariables", (string)null);
|
b.ToTable("ServerVariables", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
||||||
@@ -301,7 +290,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.ToTable("Servers_Stars", (string)null);
|
b.ToTable("Stars", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
||||||
@@ -330,7 +319,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("StarId");
|
b.HasIndex("StarId");
|
||||||
|
|
||||||
b.ToTable("Servers_StarDockerImages", (string)null);
|
b.ToTable("StarDockerImages", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
||||||
@@ -376,7 +365,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("StarId");
|
b.HasIndex("StarId");
|
||||||
|
|
||||||
b.ToTable("Servers_StarVariables", (string)null);
|
b.ToTable("StarVariables", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
||||||
@@ -437,14 +426,14 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b1.HasKey("ServerShareId");
|
b1.HasKey("ServerShareId");
|
||||||
|
|
||||||
b1.ToTable("Servers_ServerShares");
|
b1.ToTable("ServerShares", "servers");
|
||||||
|
|
||||||
b1.ToJson("Content");
|
b1.ToJson("Content");
|
||||||
|
|
||||||
b1.WithOwner()
|
b1.WithOwner()
|
||||||
.HasForeignKey("ServerShareId");
|
.HasForeignKey("ServerShareId");
|
||||||
|
|
||||||
b1.OwnsMany("MoonlightServers.ApiServer.Models.ServerSharePermission", "Permissions", b2 =>
|
b1.OwnsMany("MoonlightServers.ApiServer.Models.ServerShareContent+SharePermission", "Permissions", b2 =>
|
||||||
{
|
{
|
||||||
b2.Property<int>("ServerShareContentServerShareId")
|
b2.Property<int>("ServerShareContentServerShareId")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
@@ -453,16 +442,16 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
b2.Property<string>("Name")
|
b2.Property<string>("Identifier")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
|
|
||||||
b2.Property<int>("Type")
|
b2.Property<int>("Level")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
b2.HasKey("ServerShareContentServerShareId", "__synthesizedOrdinal");
|
b2.HasKey("ServerShareContentServerShareId", "__synthesizedOrdinal");
|
||||||
|
|
||||||
b2.ToTable("Servers_ServerShares");
|
b2.ToTable("ServerShares", "servers");
|
||||||
|
|
||||||
b2.WithOwner()
|
b2.WithOwner()
|
||||||
.HasForeignKey("ServerShareContentServerShareId");
|
.HasForeignKey("ServerShareContentServerShareId");
|
||||||
@@ -7,13 +7,17 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|||||||
namespace MoonlightServers.ApiServer.Database.Migrations
|
namespace MoonlightServers.ApiServer.Database.Migrations
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public partial class RecreatedMigrationsForPostgresql : Migration
|
public partial class RecreatedModelsInNewSchema : Migration
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
|
migrationBuilder.EnsureSchema(
|
||||||
|
name: "servers");
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_Nodes",
|
name: "Nodes",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -21,19 +25,19 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
Name = table.Column<string>(type: "text", nullable: false),
|
Name = table.Column<string>(type: "text", nullable: false),
|
||||||
Fqdn = table.Column<string>(type: "text", nullable: false),
|
Fqdn = table.Column<string>(type: "text", nullable: false),
|
||||||
Token = table.Column<string>(type: "text", nullable: false),
|
Token = table.Column<string>(type: "text", nullable: false),
|
||||||
|
TokenId = table.Column<string>(type: "text", nullable: false),
|
||||||
HttpPort = table.Column<int>(type: "integer", nullable: false),
|
HttpPort = table.Column<int>(type: "integer", nullable: false),
|
||||||
FtpPort = table.Column<int>(type: "integer", nullable: false),
|
FtpPort = table.Column<int>(type: "integer", nullable: false),
|
||||||
UseSsl = table.Column<bool>(type: "boolean", nullable: false),
|
UseSsl = table.Column<bool>(type: "boolean", nullable: false)
|
||||||
EnableTransparentMode = table.Column<bool>(type: "boolean", nullable: false),
|
|
||||||
EnableDynamicFirewall = table.Column<bool>(type: "boolean", nullable: false)
|
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_Nodes", x => x.Id);
|
table.PrimaryKey("PK_Nodes", x => x.Id);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_Stars",
|
name: "Stars",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -56,11 +60,12 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_Stars", x => x.Id);
|
table.PrimaryKey("PK_Stars", x => x.Id);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_Servers",
|
name: "Servers",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -73,29 +78,30 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
DockerImageIndex = table.Column<int>(type: "integer", nullable: false),
|
DockerImageIndex = table.Column<int>(type: "integer", nullable: false),
|
||||||
Cpu = table.Column<int>(type: "integer", nullable: false),
|
Cpu = table.Column<int>(type: "integer", nullable: false),
|
||||||
Memory = table.Column<int>(type: "integer", nullable: false),
|
Memory = table.Column<int>(type: "integer", nullable: false),
|
||||||
Disk = table.Column<int>(type: "integer", nullable: false),
|
Disk = table.Column<int>(type: "integer", nullable: false)
|
||||||
UseVirtualDisk = table.Column<bool>(type: "boolean", nullable: false),
|
|
||||||
Bandwidth = table.Column<int>(type: "integer", nullable: false)
|
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_Servers", x => x.Id);
|
table.PrimaryKey("PK_Servers", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_Servers_Servers_Nodes_NodeId",
|
name: "FK_Servers_Nodes_NodeId",
|
||||||
column: x => x.NodeId,
|
column: x => x.NodeId,
|
||||||
principalTable: "Servers_Nodes",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Nodes",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_Servers_Servers_Stars_StarId",
|
name: "FK_Servers_Stars_StarId",
|
||||||
column: x => x.StarId,
|
column: x => x.StarId,
|
||||||
principalTable: "Servers_Stars",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Stars",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_StarDockerImages",
|
name: "StarDockerImages",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -107,17 +113,19 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_StarDockerImages", x => x.Id);
|
table.PrimaryKey("PK_StarDockerImages", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_StarDockerImages_Servers_Stars_StarId",
|
name: "FK_StarDockerImages_Stars_StarId",
|
||||||
column: x => x.StarId,
|
column: x => x.StarId,
|
||||||
principalTable: "Servers_Stars",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Stars",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_StarVariables",
|
name: "StarVariables",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -134,17 +142,19 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_StarVariables", x => x.Id);
|
table.PrimaryKey("PK_StarVariables", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_StarVariables_Servers_Stars_StarId",
|
name: "FK_StarVariables_Stars_StarId",
|
||||||
column: x => x.StarId,
|
column: x => x.StarId,
|
||||||
principalTable: "Servers_Stars",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Stars",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_Allocations",
|
name: "Allocations",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -156,22 +166,25 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_Allocations", x => x.Id);
|
table.PrimaryKey("PK_Allocations", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_Allocations_Servers_Nodes_NodeId",
|
name: "FK_Allocations_Nodes_NodeId",
|
||||||
column: x => x.NodeId,
|
column: x => x.NodeId,
|
||||||
principalTable: "Servers_Nodes",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Nodes",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_Allocations_Servers_Servers_ServerId",
|
name: "FK_Allocations_Servers_ServerId",
|
||||||
column: x => x.ServerId,
|
column: x => x.ServerId,
|
||||||
principalTable: "Servers_Servers",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Servers",
|
||||||
principalColumn: "Id");
|
principalColumn: "Id");
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_ServerBackups",
|
name: "ServerBackups",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -185,16 +198,43 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_ServerBackups", x => x.Id);
|
table.PrimaryKey("PK_ServerBackups", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_ServerBackups_Servers_Servers_ServerId",
|
name: "FK_ServerBackups_Servers_ServerId",
|
||||||
column: x => x.ServerId,
|
column: x => x.ServerId,
|
||||||
principalTable: "Servers_Servers",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Servers",
|
||||||
principalColumn: "Id");
|
principalColumn: "Id");
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Servers_ServerVariables",
|
name: "ServerShares",
|
||||||
|
schema: "servers",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
|
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||||
|
UserId = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
ServerId = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
Content = table.Column<string>(type: "jsonb", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ServerShares", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ServerShares_Servers_ServerId",
|
||||||
|
column: x => x.ServerId,
|
||||||
|
principalSchema: "servers",
|
||||||
|
principalTable: "Servers",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ServerVariables",
|
||||||
|
schema: "servers",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
{
|
{
|
||||||
Id = table.Column<int>(type: "integer", nullable: false)
|
Id = table.Column<int>(type: "integer", nullable: false)
|
||||||
@@ -205,53 +245,68 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Servers_ServerVariables", x => x.Id);
|
table.PrimaryKey("PK_ServerVariables", x => x.Id);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Servers_ServerVariables_Servers_Servers_ServerId",
|
name: "FK_ServerVariables_Servers_ServerId",
|
||||||
column: x => x.ServerId,
|
column: x => x.ServerId,
|
||||||
principalTable: "Servers_Servers",
|
principalSchema: "servers",
|
||||||
|
principalTable: "Servers",
|
||||||
principalColumn: "Id",
|
principalColumn: "Id",
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_Allocations_NodeId",
|
name: "IX_Allocations_NodeId",
|
||||||
table: "Servers_Allocations",
|
schema: "servers",
|
||||||
|
table: "Allocations",
|
||||||
column: "NodeId");
|
column: "NodeId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_Allocations_ServerId",
|
name: "IX_Allocations_ServerId",
|
||||||
table: "Servers_Allocations",
|
schema: "servers",
|
||||||
|
table: "Allocations",
|
||||||
column: "ServerId");
|
column: "ServerId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_ServerBackups_ServerId",
|
name: "IX_ServerBackups_ServerId",
|
||||||
table: "Servers_ServerBackups",
|
schema: "servers",
|
||||||
|
table: "ServerBackups",
|
||||||
column: "ServerId");
|
column: "ServerId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_Servers_NodeId",
|
name: "IX_Servers_NodeId",
|
||||||
table: "Servers_Servers",
|
schema: "servers",
|
||||||
|
table: "Servers",
|
||||||
column: "NodeId");
|
column: "NodeId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_Servers_StarId",
|
name: "IX_Servers_StarId",
|
||||||
table: "Servers_Servers",
|
schema: "servers",
|
||||||
|
table: "Servers",
|
||||||
column: "StarId");
|
column: "StarId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_ServerVariables_ServerId",
|
name: "IX_ServerShares_ServerId",
|
||||||
table: "Servers_ServerVariables",
|
schema: "servers",
|
||||||
|
table: "ServerShares",
|
||||||
column: "ServerId");
|
column: "ServerId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_StarDockerImages_StarId",
|
name: "IX_ServerVariables_ServerId",
|
||||||
table: "Servers_StarDockerImages",
|
schema: "servers",
|
||||||
|
table: "ServerVariables",
|
||||||
|
column: "ServerId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_StarDockerImages_StarId",
|
||||||
|
schema: "servers",
|
||||||
|
table: "StarDockerImages",
|
||||||
column: "StarId");
|
column: "StarId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Servers_StarVariables_StarId",
|
name: "IX_StarVariables_StarId",
|
||||||
table: "Servers_StarVariables",
|
schema: "servers",
|
||||||
|
table: "StarVariables",
|
||||||
column: "StarId");
|
column: "StarId");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,28 +314,40 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_Allocations");
|
name: "Allocations",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_ServerBackups");
|
name: "ServerBackups",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_ServerVariables");
|
name: "ServerShares",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_StarDockerImages");
|
name: "ServerVariables",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_StarVariables");
|
name: "StarDockerImages",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_Servers");
|
name: "StarVariables",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_Nodes");
|
name: "Servers",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Servers_Stars");
|
name: "Nodes",
|
||||||
|
schema: "servers");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Stars",
|
||||||
|
schema: "servers");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,8 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
{
|
{
|
||||||
#pragma warning disable 612, 618
|
#pragma warning disable 612, 618
|
||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "9.0.5")
|
.HasDefaultSchema("servers")
|
||||||
|
.HasAnnotation("ProductVersion", "9.0.9")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
@@ -49,7 +50,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_Allocations", (string)null);
|
b.ToTable("Allocations", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b =>
|
||||||
@@ -60,12 +61,6 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<bool>("EnableDynamicFirewall")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<bool>("EnableTransparentMode")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.Property<string>("Fqdn")
|
b.Property<string>("Fqdn")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
@@ -93,7 +88,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.ToTable("Servers_Nodes", (string)null);
|
b.ToTable("Nodes", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b =>
|
||||||
@@ -104,9 +99,6 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
b.Property<int>("Bandwidth")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int>("Cpu")
|
b.Property<int>("Cpu")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
@@ -135,16 +127,13 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
b.Property<string>("StartupOverride")
|
b.Property<string>("StartupOverride")
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
|
|
||||||
b.Property<bool>("UseVirtualDisk")
|
|
||||||
.HasColumnType("boolean");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("NodeId");
|
b.HasIndex("NodeId");
|
||||||
|
|
||||||
b.HasIndex("StarId");
|
b.HasIndex("StarId");
|
||||||
|
|
||||||
b.ToTable("Servers_Servers", (string)null);
|
b.ToTable("Servers", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerBackup", b =>
|
||||||
@@ -177,7 +166,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_ServerBackups", (string)null);
|
b.ToTable("ServerBackups", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerShare", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerShare", b =>
|
||||||
@@ -204,7 +193,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_ServerShares", (string)null);
|
b.ToTable("ServerShares", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b =>
|
||||||
@@ -230,7 +219,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ServerId");
|
b.HasIndex("ServerId");
|
||||||
|
|
||||||
b.ToTable("Servers_ServerVariables", (string)null);
|
b.ToTable("ServerVariables", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b =>
|
||||||
@@ -298,7 +287,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.ToTable("Servers_Stars", (string)null);
|
b.ToTable("Stars", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b =>
|
||||||
@@ -327,7 +316,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("StarId");
|
b.HasIndex("StarId");
|
||||||
|
|
||||||
b.ToTable("Servers_StarDockerImages", (string)null);
|
b.ToTable("StarDockerImages", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b =>
|
||||||
@@ -373,7 +362,7 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b.HasIndex("StarId");
|
b.HasIndex("StarId");
|
||||||
|
|
||||||
b.ToTable("Servers_StarVariables", (string)null);
|
b.ToTable("StarVariables", "servers");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b =>
|
||||||
@@ -434,14 +423,14 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
|
|
||||||
b1.HasKey("ServerShareId");
|
b1.HasKey("ServerShareId");
|
||||||
|
|
||||||
b1.ToTable("Servers_ServerShares");
|
b1.ToTable("ServerShares", "servers");
|
||||||
|
|
||||||
b1.ToJson("Content");
|
b1.ToJson("Content");
|
||||||
|
|
||||||
b1.WithOwner()
|
b1.WithOwner()
|
||||||
.HasForeignKey("ServerShareId");
|
.HasForeignKey("ServerShareId");
|
||||||
|
|
||||||
b1.OwnsMany("MoonlightServers.ApiServer.Models.ServerSharePermission", "Permissions", b2 =>
|
b1.OwnsMany("MoonlightServers.ApiServer.Models.ServerShareContent+SharePermission", "Permissions", b2 =>
|
||||||
{
|
{
|
||||||
b2.Property<int>("ServerShareContentServerShareId")
|
b2.Property<int>("ServerShareContentServerShareId")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
@@ -450,16 +439,16 @@ namespace MoonlightServers.ApiServer.Database.Migrations
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
b2.Property<string>("Name")
|
b2.Property<string>("Identifier")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
|
|
||||||
b2.Property<int>("Type")
|
b2.Property<int>("Level")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
b2.HasKey("ServerShareContentServerShareId", "__synthesizedOrdinal");
|
b2.HasKey("ServerShareContentServerShareId", "__synthesizedOrdinal");
|
||||||
|
|
||||||
b2.ToTable("Servers_ServerShares");
|
b2.ToTable("ServerShares", "servers");
|
||||||
|
|
||||||
b2.WithOwner()
|
b2.WithOwner()
|
||||||
.HasForeignKey("ServerShareContentServerShareId");
|
.HasForeignKey("ServerShareContentServerShareId");
|
||||||
|
|||||||
@@ -1,17 +1,12 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Extended.SingleDb;
|
|
||||||
using Moonlight.ApiServer.Configuration;
|
using Moonlight.ApiServer.Configuration;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Models;
|
using MoonlightServers.ApiServer.Models;
|
||||||
using MoonlightServers.Shared.Models;
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Database;
|
namespace MoonlightServers.ApiServer.Database;
|
||||||
|
|
||||||
public class ServersDataContext : DatabaseContext
|
public class ServersDataContext : DbContext
|
||||||
{
|
{
|
||||||
public override string Prefix { get; } = "Servers";
|
|
||||||
|
|
||||||
public DbSet<Allocation> Allocations { get; set; }
|
public DbSet<Allocation> Allocations { get; set; }
|
||||||
public DbSet<Node> Nodes { get; set; }
|
public DbSet<Node> Nodes { get; set; }
|
||||||
public DbSet<Server> Servers { get; set; }
|
public DbSet<Server> Servers { get; set; }
|
||||||
@@ -22,20 +17,37 @@ public class ServersDataContext : DatabaseContext
|
|||||||
public DbSet<StarDockerImage> StarDockerImages { get; set; }
|
public DbSet<StarDockerImage> StarDockerImages { get; set; }
|
||||||
public DbSet<StarVariable> StarVariables { get; set; }
|
public DbSet<StarVariable> StarVariables { get; set; }
|
||||||
|
|
||||||
|
private readonly AppConfiguration Configuration;
|
||||||
|
private readonly string Schema = "servers";
|
||||||
|
|
||||||
public ServersDataContext(AppConfiguration configuration)
|
public ServersDataContext(AppConfiguration configuration)
|
||||||
{
|
{
|
||||||
Options = new()
|
Configuration = configuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
{
|
{
|
||||||
Host = configuration.Database.Host,
|
if(optionsBuilder.IsConfigured)
|
||||||
Port = configuration.Database.Port,
|
return;
|
||||||
Username = configuration.Database.Username,
|
|
||||||
Password = configuration.Database.Password,
|
var database = Configuration.Database;
|
||||||
Database = configuration.Database.Database
|
|
||||||
};
|
var connectionString = $"Host={database.Host};" +
|
||||||
|
$"Port={database.Port};" +
|
||||||
|
$"Database={database.Database};" +
|
||||||
|
$"Username={database.Username};" +
|
||||||
|
$"Password={database.Password}";
|
||||||
|
|
||||||
|
optionsBuilder.UseNpgsql(connectionString, builder =>
|
||||||
|
{
|
||||||
|
builder.MigrationsHistoryTable("MigrationsHistory", Schema);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
|
modelBuilder.Model.SetDefaultSchema(Schema);
|
||||||
|
|
||||||
base.OnModelCreating(modelBuilder);
|
base.OnModelCreating(modelBuilder);
|
||||||
|
|
||||||
#region Shares
|
#region Shares
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
using MoonlightServers.DaemonShared.Enums;
|
|
||||||
using MoonlightServers.Shared.Enums;
|
|
||||||
using ServerState = MoonlightServers.Shared.Enums.ServerState;
|
using ServerState = MoonlightServers.Shared.Enums.ServerState;
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Extensions;
|
namespace MoonlightServers.ApiServer.Extensions;
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
@@ -30,38 +28,39 @@ public class NodeAllocationsController : Controller
|
|||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
||||||
public async Task<ActionResult<IPagedData<NodeAllocationResponse>>> Get(
|
public async Task<ActionResult<CountedData<NodeAllocationResponse>>> GetAsync(
|
||||||
[FromRoute] int nodeId,
|
[FromRoute] int nodeId,
|
||||||
[FromQuery] PagedOptions options
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var count = await AllocationRepository
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
|
var totalCount = await AllocationRepository
|
||||||
.Get()
|
.Get()
|
||||||
.CountAsync(x => x.Node.Id == nodeId);
|
.CountAsync(x => x.Node.Id == nodeId);
|
||||||
|
|
||||||
var allocations = await AllocationRepository
|
var allocations = await AllocationRepository
|
||||||
.Get()
|
.Get()
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.Where(x => x.Node.Id == nodeId)
|
.Where(x => x.Node.Id == nodeId)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<NodeAllocationResponse>()
|
return new CountedData<NodeAllocationResponse>()
|
||||||
{
|
{
|
||||||
Items = allocations,
|
Items = allocations,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
||||||
public async Task<ActionResult<NodeAllocationResponse>> GetSingle([FromRoute] int nodeId, [FromRoute] int id)
|
public async Task<ActionResult<NodeAllocationResponse>> GetSingleAsync([FromRoute] int nodeId, [FromRoute] int id)
|
||||||
{
|
{
|
||||||
var allocation = await AllocationRepository
|
var allocation = await AllocationRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -78,7 +77,7 @@ public class NodeAllocationsController : Controller
|
|||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.create")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.create")]
|
||||||
public async Task<ActionResult<NodeAllocationResponse>> Create(
|
public async Task<ActionResult<NodeAllocationResponse>> CreateAsync(
|
||||||
[FromRoute] int nodeId,
|
[FromRoute] int nodeId,
|
||||||
[FromBody] CreateNodeAllocationRequest request
|
[FromBody] CreateNodeAllocationRequest request
|
||||||
)
|
)
|
||||||
@@ -92,13 +91,13 @@ public class NodeAllocationsController : Controller
|
|||||||
|
|
||||||
var allocation = AllocationMapper.ToAllocation(request);
|
var allocation = AllocationMapper.ToAllocation(request);
|
||||||
|
|
||||||
var finalAllocation = await AllocationRepository.Add(allocation);
|
var finalAllocation = await AllocationRepository.AddAsync(allocation);
|
||||||
|
|
||||||
return AllocationMapper.ToNodeAllocation(finalAllocation);
|
return AllocationMapper.ToNodeAllocation(finalAllocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
public async Task<ActionResult<NodeAllocationResponse>> Update(
|
public async Task<ActionResult<NodeAllocationResponse>> UpdateAsync(
|
||||||
[FromRoute] int nodeId,
|
[FromRoute] int nodeId,
|
||||||
[FromRoute] int id,
|
[FromRoute] int id,
|
||||||
[FromBody] UpdateNodeAllocationRequest request
|
[FromBody] UpdateNodeAllocationRequest request
|
||||||
@@ -113,13 +112,13 @@ public class NodeAllocationsController : Controller
|
|||||||
return Problem("No allocation with that id found", statusCode: 404);
|
return Problem("No allocation with that id found", statusCode: 404);
|
||||||
|
|
||||||
AllocationMapper.Merge(request, allocation);
|
AllocationMapper.Merge(request, allocation);
|
||||||
await AllocationRepository.Update(allocation);
|
await AllocationRepository.UpdateAsync(allocation);
|
||||||
|
|
||||||
return AllocationMapper.ToNodeAllocation(allocation);
|
return AllocationMapper.ToNodeAllocation(allocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
public async Task<ActionResult> Delete([FromRoute] int nodeId, [FromRoute] int id)
|
public async Task<ActionResult> DeleteAsync([FromRoute] int nodeId, [FromRoute] int id)
|
||||||
{
|
{
|
||||||
var allocation = await AllocationRepository
|
var allocation = await AllocationRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -129,12 +128,12 @@ public class NodeAllocationsController : Controller
|
|||||||
if (allocation == null)
|
if (allocation == null)
|
||||||
return Problem("No allocation with that id found", statusCode: 404);
|
return Problem("No allocation with that id found", statusCode: 404);
|
||||||
|
|
||||||
await AllocationRepository.Remove(allocation);
|
await AllocationRepository.RemoveAsync(allocation);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("range")]
|
[HttpPost("range")]
|
||||||
public async Task<ActionResult> CreateRange(
|
public async Task<ActionResult> CreateRangeAsync(
|
||||||
[FromRoute] int nodeId,
|
[FromRoute] int nodeId,
|
||||||
[FromBody] CreateNodeAllocationRangeRequest request
|
[FromBody] CreateNodeAllocationRangeRequest request
|
||||||
)
|
)
|
||||||
@@ -179,58 +178,60 @@ public class NodeAllocationsController : Controller
|
|||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
await AllocationRepository.RunTransaction(async set => { await set.AddRangeAsync(allocations); });
|
await AllocationRepository.RunTransactionAsync(async set => { await set.AddRangeAsync(allocations); });
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("all")]
|
[HttpDelete("all")]
|
||||||
public async Task<ActionResult> DeleteAll([FromRoute] int nodeId)
|
public async Task<ActionResult> DeleteAllAsync([FromRoute] int nodeId)
|
||||||
{
|
{
|
||||||
var allocations = AllocationRepository
|
var allocations = AllocationRepository
|
||||||
.Get()
|
.Get()
|
||||||
.Where(x => x.Node.Id == nodeId)
|
.Where(x => x.Node.Id == nodeId)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
await AllocationRepository.RunTransaction(set => { set.RemoveRange(allocations); });
|
await AllocationRepository.RunTransactionAsync(set => { set.RemoveRange(allocations); });
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("free")]
|
[HttpGet("free")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
||||||
public async Task<IPagedData<NodeAllocationResponse>> GetFree(
|
public async Task<ActionResult<CountedData<NodeAllocationResponse>>> GetFreeAsync(
|
||||||
[FromRoute] int nodeId,
|
[FromRoute] int nodeId,
|
||||||
[FromQuery] PagedOptions options,
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count,
|
||||||
[FromQuery] int serverId = -1
|
[FromQuery] int serverId = -1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
var node = NodeRepository
|
var node = NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
.FirstOrDefault(x => x.Id == nodeId);
|
.FirstOrDefault(x => x.Id == nodeId);
|
||||||
|
|
||||||
if (node == null)
|
if (node == null)
|
||||||
throw new HttpApiException("A node with this id could not be found", 404);
|
return Problem("A node with this id could not be found", statusCode: 404);
|
||||||
|
|
||||||
var freeAllocationsQuery = AllocationRepository
|
var freeAllocationsQuery = AllocationRepository
|
||||||
.Get()
|
.Get()
|
||||||
|
.OrderBy(x => x.Id)
|
||||||
.Where(x => x.Node.Id == node.Id)
|
.Where(x => x.Node.Id == node.Id)
|
||||||
.Where(x => x.Server == null || x.Server.Id == serverId);
|
.Where(x => x.Server == null || x.Server.Id == serverId);
|
||||||
|
|
||||||
var count = await freeAllocationsQuery.CountAsync();
|
var totalCount = await freeAllocationsQuery.CountAsync();
|
||||||
|
|
||||||
var allocations = await freeAllocationsQuery
|
var allocations = await freeAllocationsQuery
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<NodeAllocationResponse>()
|
return new CountedData<NodeAllocationResponse>()
|
||||||
{
|
{
|
||||||
Items = allocations,
|
Items = allocations,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
@@ -25,9 +24,9 @@ public class NodeStatusController : Controller
|
|||||||
|
|
||||||
[HttpGet("{nodeId:int}/system/status")]
|
[HttpGet("{nodeId:int}/system/status")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.status")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.status")]
|
||||||
public async Task<ActionResult<NodeSystemStatusResponse>> GetStatus([FromRoute] int nodeId)
|
public async Task<ActionResult<NodeSystemStatusResponse>> GetStatusAsync([FromRoute] int nodeId)
|
||||||
{
|
{
|
||||||
var node = await GetNode(nodeId);
|
var node = await GetNodeAsync(nodeId);
|
||||||
|
|
||||||
if (node.Value == null)
|
if (node.Value == null)
|
||||||
return node.Result ?? Problem("Unable to retrieve node");
|
return node.Result ?? Problem("Unable to retrieve node");
|
||||||
@@ -39,7 +38,7 @@ public class NodeStatusController : Controller
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var statusResponse = await NodeService.GetSystemStatus(node.Value);
|
var statusResponse = await NodeService.GetSystemStatusAsync(node.Value);
|
||||||
|
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
|
|
||||||
@@ -69,7 +68,7 @@ public class NodeStatusController : Controller
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Node>> GetNode(int nodeId)
|
private async Task<ActionResult<Node>> GetNodeAsync(int nodeId)
|
||||||
{
|
{
|
||||||
var result = await NodeRepository
|
var result = await NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Helpers;
|
using MoonCore.Helpers;
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
@@ -27,32 +24,35 @@ public class NodesController : Controller
|
|||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
||||||
public async Task<IPagedData<NodeResponse>> Get([FromQuery] PagedOptions options)
|
public async Task<ActionResult<CountedData<NodeResponse>>> GetAsync(
|
||||||
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
|
)
|
||||||
{
|
{
|
||||||
var count = await NodeRepository.Get().CountAsync();
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
|
var totalCount = await NodeRepository.Get().CountAsync();
|
||||||
|
|
||||||
var items = await NodeRepository
|
var items = await NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<NodeResponse>()
|
return new CountedData<NodeResponse>()
|
||||||
{
|
{
|
||||||
Items = items,
|
Items = items,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.get")]
|
||||||
public async Task<ActionResult<NodeResponse>> GetSingle([FromRoute] int id)
|
public async Task<ActionResult<NodeResponse>> GetSingleAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var node = await NodeRepository
|
var node = await NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -68,21 +68,21 @@ public class NodesController : Controller
|
|||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.create")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.create")]
|
||||||
public async Task<ActionResult<NodeResponse>> Create([FromBody] CreateNodeRequest request)
|
public async Task<ActionResult<NodeResponse>> CreateAsync([FromBody] CreateNodeRequest request)
|
||||||
{
|
{
|
||||||
var node = NodeMapper.ToNode(request);
|
var node = NodeMapper.ToNode(request);
|
||||||
|
|
||||||
node.TokenId = Formatter.GenerateString(6);
|
node.TokenId = Formatter.GenerateString(6);
|
||||||
node.Token = Formatter.GenerateString(32);
|
node.Token = Formatter.GenerateString(32);
|
||||||
|
|
||||||
var finalNode = await NodeRepository.Add(node);
|
var finalNode = await NodeRepository.AddAsync(node);
|
||||||
|
|
||||||
return NodeMapper.ToAdminNodeResponse(finalNode);
|
return NodeMapper.ToAdminNodeResponse(finalNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.update")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.update")]
|
||||||
public async Task<ActionResult<NodeResponse>> Update([FromRoute] int id, [FromBody] UpdateNodeRequest request)
|
public async Task<ActionResult<NodeResponse>> UpdateAsync([FromRoute] int id, [FromBody] UpdateNodeRequest request)
|
||||||
{
|
{
|
||||||
var node = await NodeRepository
|
var node = await NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -92,14 +92,14 @@ public class NodesController : Controller
|
|||||||
return Problem("No node with this id found", statusCode: 404);
|
return Problem("No node with this id found", statusCode: 404);
|
||||||
|
|
||||||
NodeMapper.Merge(request, node);
|
NodeMapper.Merge(request, node);
|
||||||
await NodeRepository.Update(node);
|
await NodeRepository.UpdateAsync(node);
|
||||||
|
|
||||||
return NodeMapper.ToAdminNodeResponse(node);
|
return NodeMapper.ToAdminNodeResponse(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.nodes.delete")]
|
[Authorize(Policy = "permissions:admin.servers.nodes.delete")]
|
||||||
public async Task<ActionResult> Delete([FromRoute] int id)
|
public async Task<ActionResult> DeleteAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var node = await NodeRepository
|
var node = await NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -108,7 +108,7 @@ public class NodesController : Controller
|
|||||||
if (node == null)
|
if (node == null)
|
||||||
return Problem("No node with this id found", statusCode: 404);
|
return Problem("No node with this id found", statusCode: 404);
|
||||||
|
|
||||||
await NodeRepository.Remove(node);
|
await NodeRepository.RemoveAsync(node);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis;
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
@@ -27,14 +26,14 @@ public class StatisticsController : Controller
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
[SuppressMessage("ReSharper.DPA", "DPA0011: High execution time of MVC action", MessageId = "time: 1142ms",
|
[SuppressMessage("ReSharper.DPA", "DPA0011: High execution time of MVC action", MessageId = "time: 1142ms",
|
||||||
Justification = "The daemon has an artificial delay of one second to calculate accurate cpu usage values")]
|
Justification = "The daemon has an artificial delay of one second to calculate accurate cpu usage values")]
|
||||||
public async Task<ActionResult<StatisticsResponse>> Get([FromRoute] int nodeId)
|
public async Task<ActionResult<StatisticsResponse>> GetAsync([FromRoute] int nodeId)
|
||||||
{
|
{
|
||||||
var node = await GetNode(nodeId);
|
var node = await GetNodeAsync(nodeId);
|
||||||
|
|
||||||
if (node.Value == null)
|
if (node.Value == null)
|
||||||
return node.Result ?? Problem("Unable to retrieve node");
|
return node.Result ?? Problem("Unable to retrieve node");
|
||||||
|
|
||||||
var statistics = await NodeService.GetStatistics(node.Value);
|
var statistics = await NodeService.GetStatisticsAsync(node.Value);
|
||||||
|
|
||||||
return new StatisticsResponse()
|
return new StatisticsResponse()
|
||||||
{
|
{
|
||||||
@@ -66,14 +65,14 @@ public class StatisticsController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("docker")]
|
[HttpGet("docker")]
|
||||||
public async Task<ActionResult<DockerStatisticsResponse>> GetDocker([FromRoute] int nodeId)
|
public async Task<ActionResult<DockerStatisticsResponse>> GetDockerAsync([FromRoute] int nodeId)
|
||||||
{
|
{
|
||||||
var node = await GetNode(nodeId);
|
var node = await GetNodeAsync(nodeId);
|
||||||
|
|
||||||
if (node.Value == null)
|
if (node.Value == null)
|
||||||
return node.Result ?? Problem("Unable to retrieve node");
|
return node.Result ?? Problem("Unable to retrieve node");
|
||||||
|
|
||||||
var statistics = await NodeService.GetDockerStatistics(node.Value);
|
var statistics = await NodeService.GetDockerStatisticsAsync(node.Value);
|
||||||
|
|
||||||
return new DockerStatisticsResponse()
|
return new DockerStatisticsResponse()
|
||||||
{
|
{
|
||||||
@@ -87,7 +86,7 @@ public class StatisticsController : Controller
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Node>> GetNode(int nodeId)
|
private async Task<ActionResult<Node>> GetNodeAsync(int nodeId)
|
||||||
{
|
{
|
||||||
var result = await NodeRepository
|
var result = await NodeRepository
|
||||||
.Get()
|
.Get()
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
@@ -30,11 +27,15 @@ public class ServerVariablesController : Controller
|
|||||||
|
|
||||||
[HttpGet("{serverId:int}/variables")]
|
[HttpGet("{serverId:int}/variables")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.read")]
|
[Authorize(Policy = "permissions:admin.servers.read")]
|
||||||
public async Task<ActionResult<PagedData<ServerVariableResponse>>> Get(
|
public async Task<ActionResult<CountedData<ServerVariableResponse>>> GetAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromQuery] PagedOptions options
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
var serverExists = await ServerRepository
|
var serverExists = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
.AnyAsync(x => x.Id == serverId);
|
.AnyAsync(x => x.Id == serverId);
|
||||||
@@ -46,23 +47,20 @@ public class ServerVariablesController : Controller
|
|||||||
.Get()
|
.Get()
|
||||||
.Where(x => x.Server.Id == serverId);
|
.Where(x => x.Server.Id == serverId);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var variables = await query
|
var variables = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<ServerVariableResponse>()
|
return new CountedData<ServerVariableResponse>()
|
||||||
{
|
{
|
||||||
Items = variables,
|
Items = variables,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,8 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Helpers;
|
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Helpers;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
using Moonlight.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
@@ -54,9 +49,15 @@ public class ServersController : Controller
|
|||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Authorize(Policy = "permissions:admin.servers.read")]
|
[Authorize(Policy = "permissions:admin.servers.read")]
|
||||||
public async Task<ActionResult<IPagedData<ServerResponse>>> Get([FromQuery] PagedOptions options)
|
public async Task<ActionResult<CountedData<ServerResponse>>> GetAsync(
|
||||||
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
|
)
|
||||||
{
|
{
|
||||||
var count = await ServerRepository.Get().CountAsync();
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
|
var totalCount = await ServerRepository.Get().CountAsync();
|
||||||
|
|
||||||
var servers = await ServerRepository
|
var servers = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -65,25 +66,22 @@ public class ServersController : Controller
|
|||||||
.Include(x => x.Variables)
|
.Include(x => x.Variables)
|
||||||
.Include(x => x.Star)
|
.Include(x => x.Star)
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<ServerResponse>()
|
return new CountedData<ServerResponse>()
|
||||||
{
|
{
|
||||||
Items = servers,
|
Items = servers,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.read")]
|
[Authorize(Policy = "permissions:admin.servers.read")]
|
||||||
public async Task<ActionResult<ServerResponse>> GetSingle([FromRoute] int id)
|
public async Task<ActionResult<ServerResponse>> GetSingleAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -104,7 +102,7 @@ public class ServersController : Controller
|
|||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize(Policy = "permissions:admin.servers.write")]
|
[Authorize(Policy = "permissions:admin.servers.write")]
|
||||||
public async Task<ActionResult<ServerResponse>> Create([FromBody] CreateServerRequest request)
|
public async Task<ActionResult<ServerResponse>> CreateAsync([FromBody] CreateServerRequest request)
|
||||||
{
|
{
|
||||||
// Check if owner user exist
|
// Check if owner user exist
|
||||||
if (UserRepository.Get().All(x => x.Id != request.OwnerId))
|
if (UserRepository.Get().All(x => x.Id != request.OwnerId))
|
||||||
@@ -192,11 +190,11 @@ public class ServersController : Controller
|
|||||||
server.Node = node;
|
server.Node = node;
|
||||||
server.Star = star;
|
server.Star = star;
|
||||||
|
|
||||||
var finalServer = await ServerRepository.Add(server);
|
var finalServer = await ServerRepository.AddAsync(server);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await ServerService.Sync(finalServer);
|
await ServerService.SyncAsync(finalServer);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -204,7 +202,7 @@ public class ServersController : Controller
|
|||||||
|
|
||||||
// We are deleting the server from the database after the creation has failed
|
// We are deleting the server from the database after the creation has failed
|
||||||
// to ensure we won't have a bugged server in the database which doesn't exist on the node
|
// to ensure we won't have a bugged server in the database which doesn't exist on the node
|
||||||
await ServerRepository.Remove(finalServer);
|
await ServerRepository.RemoveAsync(finalServer);
|
||||||
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -214,7 +212,10 @@ public class ServersController : Controller
|
|||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.write")]
|
[Authorize(Policy = "permissions:admin.servers.write")]
|
||||||
public async Task<ActionResult<ServerResponse>> Update([FromRoute] int id, [FromBody] UpdateServerRequest request)
|
public async Task<ActionResult<ServerResponse>> UpdateAsync(
|
||||||
|
[FromRoute] int id,
|
||||||
|
[FromBody] UpdateServerRequest request
|
||||||
|
)
|
||||||
{
|
{
|
||||||
//TODO: Handle shrinking virtual disk
|
//TODO: Handle shrinking virtual disk
|
||||||
|
|
||||||
@@ -277,16 +278,16 @@ public class ServersController : Controller
|
|||||||
serverVar.Value = variable.Value;
|
serverVar.Value = variable.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
await ServerRepository.Update(server);
|
await ServerRepository.UpdateAsync(server);
|
||||||
|
|
||||||
// Notify the node about the changes
|
// Notify the node about the changes
|
||||||
await ServerService.Sync(server);
|
await ServerService.SyncAsync(server);
|
||||||
|
|
||||||
return ServerMapper.ToAdminServerResponse(server);
|
return ServerMapper.ToAdminServerResponse(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
public async Task<ActionResult> Delete([FromRoute] int id, [FromQuery] bool force = false)
|
public async Task<ActionResult> DeleteAsync([FromRoute] int id, [FromQuery] bool force = false)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -308,7 +309,7 @@ public class ServersController : Controller
|
|||||||
{
|
{
|
||||||
// If the sync fails on the node and we aren't forcing the deletion,
|
// If the sync fails on the node and we aren't forcing the deletion,
|
||||||
// we don't want to delete it from the database yet
|
// we don't want to delete it from the database yet
|
||||||
await ServerService.SyncDelete(server);
|
await ServerService.SyncDeleteAsync(server);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -323,7 +324,7 @@ public class ServersController : Controller
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
await ServerRepository.Remove(server);
|
await ServerRepository.RemoveAsync(server);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,7 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Helpers;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Helpers;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
@@ -33,9 +28,10 @@ public class StarDockerImagesController : Controller
|
|||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
||||||
public async Task<ActionResult<IPagedData<StarDockerImageResponse>>> Get(
|
public async Task<ActionResult<CountedData<StarDockerImageResponse>>> GetAsync(
|
||||||
[FromRoute] int starId,
|
[FromRoute] int starId,
|
||||||
[FromQuery] PagedOptions options
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var starExists = StarRepository
|
var starExists = StarRepository
|
||||||
@@ -49,29 +45,26 @@ public class StarDockerImagesController : Controller
|
|||||||
.Get()
|
.Get()
|
||||||
.Where(x => x.Star.Id == starId);
|
.Where(x => x.Star.Id == starId);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var dockerImages = await query
|
var dockerImages = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<StarDockerImageResponse>()
|
return new CountedData<StarDockerImageResponse>()
|
||||||
{
|
{
|
||||||
Items = dockerImages,
|
Items = dockerImages,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.read")]
|
[Authorize(Policy = "permissions:admin.servers.stars.read")]
|
||||||
public async Task<ActionResult<StarDockerImageResponse>> GetSingle([FromRoute] int starId, [FromRoute] int id)
|
public async Task<ActionResult<StarDockerImageResponse>> GetSingleAsync([FromRoute] int starId, [FromRoute] int id)
|
||||||
{
|
{
|
||||||
var starExists = StarRepository
|
var starExists = StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -94,7 +87,7 @@ public class StarDockerImagesController : Controller
|
|||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.write")]
|
[Authorize(Policy = "permissions:admin.servers.stars.write")]
|
||||||
public async Task<ActionResult<StarDockerImageResponse>> Create(
|
public async Task<ActionResult<StarDockerImageResponse>> CreateAsync(
|
||||||
[FromRoute] int starId,
|
[FromRoute] int starId,
|
||||||
[FromBody] CreateStarDockerImageRequest request
|
[FromBody] CreateStarDockerImageRequest request
|
||||||
)
|
)
|
||||||
@@ -109,14 +102,14 @@ public class StarDockerImagesController : Controller
|
|||||||
var dockerImage = DockerImageMapper.ToDockerImage(request);
|
var dockerImage = DockerImageMapper.ToDockerImage(request);
|
||||||
dockerImage.Star = star;
|
dockerImage.Star = star;
|
||||||
|
|
||||||
var finalDockerImage = await DockerImageRepository.Add(dockerImage);
|
var finalDockerImage = await DockerImageRepository.AddAsync(dockerImage);
|
||||||
|
|
||||||
return DockerImageMapper.ToAdminResponse(finalDockerImage);
|
return DockerImageMapper.ToAdminResponse(finalDockerImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.write")]
|
[Authorize(Policy = "permissions:admin.servers.stars.write")]
|
||||||
public async Task<ActionResult<StarDockerImageResponse>> Update(
|
public async Task<ActionResult<StarDockerImageResponse>> UpdateAsync(
|
||||||
[FromRoute] int starId,
|
[FromRoute] int starId,
|
||||||
[FromRoute] int id,
|
[FromRoute] int id,
|
||||||
[FromBody] UpdateStarDockerImageRequest request
|
[FromBody] UpdateStarDockerImageRequest request
|
||||||
@@ -137,14 +130,14 @@ public class StarDockerImagesController : Controller
|
|||||||
return Problem("No star docker image with this id found", statusCode: 404);
|
return Problem("No star docker image with this id found", statusCode: 404);
|
||||||
|
|
||||||
DockerImageMapper.Merge(request, dockerImage);
|
DockerImageMapper.Merge(request, dockerImage);
|
||||||
await DockerImageRepository.Update(dockerImage);
|
await DockerImageRepository.UpdateAsync(dockerImage);
|
||||||
|
|
||||||
return DockerImageMapper.ToAdminResponse(dockerImage);
|
return DockerImageMapper.ToAdminResponse(dockerImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.write")]
|
[Authorize(Policy = "permissions:admin.servers.stars.write")]
|
||||||
public async Task<ActionResult> Delete([FromRoute] int starId, [FromRoute] int id)
|
public async Task<ActionResult> DeleteAsync([FromRoute] int starId, [FromRoute] int id)
|
||||||
{
|
{
|
||||||
var starExists = StarRepository
|
var starExists = StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -160,7 +153,7 @@ public class StarDockerImagesController : Controller
|
|||||||
if (dockerImage == null)
|
if (dockerImage == null)
|
||||||
return Problem("No star docker image with this id found", statusCode: 404);
|
return Problem("No star docker image with this id found", statusCode: 404);
|
||||||
|
|
||||||
await DockerImageRepository.Remove(dockerImage);
|
await DockerImageRepository.RemoveAsync(dockerImage);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using MoonCore.Exceptions;
|
using MoonCore.Exceptions;
|
||||||
using MoonCore.Helpers;
|
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
using MoonlightServers.Shared.Http.Responses.Admin.Stars;
|
using MoonlightServers.Shared.Http.Responses.Admin.Stars;
|
||||||
@@ -23,15 +21,15 @@ public class StarImportExportController : Controller
|
|||||||
|
|
||||||
[HttpGet("{starId:int}/export")]
|
[HttpGet("{starId:int}/export")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
||||||
public async Task<ActionResult> Export([FromRoute] int starId)
|
public async Task<ActionResult> ExportAsync([FromRoute] int starId)
|
||||||
{
|
{
|
||||||
var exportedStar = await ImportExportService.Export(starId);
|
var exportedStar = await ImportExportService.ExportAsync(starId);
|
||||||
return Content(exportedStar, "application/json");
|
return Content(exportedStar, "application/json");
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("import")]
|
[HttpPost("import")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.create")]
|
[Authorize(Policy = "permissions:admin.servers.stars.create")]
|
||||||
public async Task<StarResponse> Import()
|
public async Task<StarResponse> ImportAsync()
|
||||||
{
|
{
|
||||||
if (Request.Form.Files.Count == 0)
|
if (Request.Form.Files.Count == 0)
|
||||||
throw new HttpApiException("No file to import provided", 400);
|
throw new HttpApiException("No file to import provided", 400);
|
||||||
@@ -44,7 +42,7 @@ public class StarImportExportController : Controller
|
|||||||
using var sr = new StreamReader(stream, Encoding.UTF8);
|
using var sr = new StreamReader(stream, Encoding.UTF8);
|
||||||
var content = await sr.ReadToEndAsync();
|
var content = await sr.ReadToEndAsync();
|
||||||
|
|
||||||
var star = await ImportExportService.Import(content);
|
var star = await ImportExportService.ImportAsync(content);
|
||||||
|
|
||||||
return StarMapper.ToAdminResponse(star);
|
return StarMapper.ToAdminResponse(star);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using MoonCore.Exceptions;
|
using MoonCore.Exceptions;
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
@@ -30,11 +28,15 @@ public class StarVariablesController : Controller
|
|||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
||||||
public async Task<ActionResult<IPagedData<StarVariableResponse>>> Get(
|
public async Task<ActionResult<CountedData<StarVariableResponse>>> GetAsync(
|
||||||
[FromRoute] int starId,
|
[FromRoute] int starId,
|
||||||
[FromQuery] PagedOptions options
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
var starExists = StarRepository
|
var starExists = StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
.Any(x => x.Id == starId);
|
.Any(x => x.Id == starId);
|
||||||
@@ -46,29 +48,26 @@ public class StarVariablesController : Controller
|
|||||||
.Get()
|
.Get()
|
||||||
.Where(x => x.Star.Id == starId);
|
.Where(x => x.Star.Id == starId);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var variables = await query
|
var variables = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<StarVariableResponse>()
|
return new CountedData<StarVariableResponse>()
|
||||||
{
|
{
|
||||||
Items = variables,
|
Items = variables,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
[Authorize(Policy = "permissions:admin.servers.stars.get")]
|
||||||
public async Task<StarVariableResponse> GetSingle(
|
public async Task<StarVariableResponse> GetSingleAsync(
|
||||||
[FromRoute] int starId,
|
[FromRoute] int starId,
|
||||||
[FromRoute] int id
|
[FromRoute] int id
|
||||||
)
|
)
|
||||||
@@ -92,7 +91,7 @@ public class StarVariablesController : Controller
|
|||||||
|
|
||||||
[HttpPost("")]
|
[HttpPost("")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.create")]
|
[Authorize(Policy = "permissions:admin.servers.stars.create")]
|
||||||
public async Task<StarVariableResponse> Create([FromRoute] int starId,
|
public async Task<StarVariableResponse> CreateAsync([FromRoute] int starId,
|
||||||
[FromBody] CreateStarVariableRequest request)
|
[FromBody] CreateStarVariableRequest request)
|
||||||
{
|
{
|
||||||
var star = StarRepository
|
var star = StarRepository
|
||||||
@@ -105,14 +104,14 @@ public class StarVariablesController : Controller
|
|||||||
var starVariable = StarVariableMapper.ToStarVariable(request);
|
var starVariable = StarVariableMapper.ToStarVariable(request);
|
||||||
starVariable.Star = star;
|
starVariable.Star = star;
|
||||||
|
|
||||||
await VariableRepository.Add(starVariable);
|
await VariableRepository.AddAsync(starVariable);
|
||||||
|
|
||||||
return StarVariableMapper.ToAdminResponse(starVariable);
|
return StarVariableMapper.ToAdminResponse(starVariable);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.update")]
|
[Authorize(Policy = "permissions:admin.servers.stars.update")]
|
||||||
public async Task<StarVariableResponse> Update(
|
public async Task<StarVariableResponse> UpdateAsync(
|
||||||
[FromRoute] int starId,
|
[FromRoute] int starId,
|
||||||
[FromRoute] int id,
|
[FromRoute] int id,
|
||||||
[FromBody] UpdateStarVariableRequest request
|
[FromBody] UpdateStarVariableRequest request
|
||||||
@@ -133,14 +132,14 @@ public class StarVariablesController : Controller
|
|||||||
throw new HttpApiException("No variable with this id found", 404);
|
throw new HttpApiException("No variable with this id found", 404);
|
||||||
|
|
||||||
StarVariableMapper.Merge(request, starVariable);
|
StarVariableMapper.Merge(request, starVariable);
|
||||||
await VariableRepository.Update(starVariable);
|
await VariableRepository.UpdateAsync(starVariable);
|
||||||
|
|
||||||
return StarVariableMapper.ToAdminResponse(starVariable);
|
return StarVariableMapper.ToAdminResponse(starVariable);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.delete")]
|
[Authorize(Policy = "permissions:admin.servers.stars.delete")]
|
||||||
public async Task Delete([FromRoute] int starId, [FromRoute] int id)
|
public async Task DeleteAsync([FromRoute] int starId, [FromRoute] int id)
|
||||||
{
|
{
|
||||||
var starExists = StarRepository
|
var starExists = StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -156,6 +155,6 @@ public class StarVariablesController : Controller
|
|||||||
if (starVariable == null)
|
if (starVariable == null)
|
||||||
throw new HttpApiException("No variable with this id found", 404);
|
throw new HttpApiException("No variable with this id found", 404);
|
||||||
|
|
||||||
await VariableRepository.Remove(starVariable);
|
await VariableRepository.RemoveAsync(starVariable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,7 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
@@ -26,32 +23,35 @@ public class StarsController : Controller
|
|||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.read")]
|
[Authorize(Policy = "permissions:admin.servers.stars.read")]
|
||||||
public async Task<ActionResult<IPagedData<StarResponse>>> Get([FromQuery] PagedOptions options)
|
public async Task<ActionResult<CountedData<StarResponse>>> GetAsync(
|
||||||
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
|
)
|
||||||
{
|
{
|
||||||
var count = await StarRepository.Get().CountAsync();
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
|
var totalCount = await StarRepository.Get().CountAsync();
|
||||||
|
|
||||||
var stars = await StarRepository
|
var stars = await StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ProjectToAdminResponse()
|
.ProjectToAdminResponse()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
return new PagedData<StarResponse>()
|
return new CountedData<StarResponse>()
|
||||||
{
|
{
|
||||||
CurrentPage = options.Page,
|
|
||||||
Items = stars,
|
Items = stars,
|
||||||
PageSize = options.PageSize,
|
TotalCount = totalCount
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.read")]
|
[Authorize(Policy = "permissions:admin.servers.stars.read")]
|
||||||
public async Task<ActionResult<StarResponse>> GetSingle([FromRoute] int id)
|
public async Task<ActionResult<StarResponse>> GetSingleAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var star = await StarRepository
|
var star = await StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -67,7 +67,7 @@ public class StarsController : Controller
|
|||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.create")]
|
[Authorize(Policy = "permissions:admin.servers.stars.create")]
|
||||||
public async Task<ActionResult<StarResponse>> Create([FromBody] CreateStarRequest request)
|
public async Task<ActionResult<StarResponse>> CreateAsync([FromBody] CreateStarRequest request)
|
||||||
{
|
{
|
||||||
var star = StarMapper.ToStar(request);
|
var star = StarMapper.ToStar(request);
|
||||||
|
|
||||||
@@ -86,14 +86,14 @@ public class StarsController : Controller
|
|||||||
star.DefaultDockerImage = -1;
|
star.DefaultDockerImage = -1;
|
||||||
star.ParseConfiguration = "[]";
|
star.ParseConfiguration = "[]";
|
||||||
|
|
||||||
var finalStar = await StarRepository.Add(star);
|
var finalStar = await StarRepository.AddAsync(star);
|
||||||
|
|
||||||
return StarMapper.ToAdminResponse(finalStar);
|
return StarMapper.ToAdminResponse(finalStar);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.update")]
|
[Authorize(Policy = "permissions:admin.servers.stars.update")]
|
||||||
public async Task<ActionResult<StarResponse>> Update(
|
public async Task<ActionResult<StarResponse>> UpdateAsync(
|
||||||
[FromRoute] int id,
|
[FromRoute] int id,
|
||||||
[FromBody] UpdateStarRequest request
|
[FromBody] UpdateStarRequest request
|
||||||
)
|
)
|
||||||
@@ -106,14 +106,14 @@ public class StarsController : Controller
|
|||||||
return Problem("No star with that id found", statusCode: 404);
|
return Problem("No star with that id found", statusCode: 404);
|
||||||
|
|
||||||
StarMapper.Merge(request, star);
|
StarMapper.Merge(request, star);
|
||||||
await StarRepository.Update(star);
|
await StarRepository.UpdateAsync(star);
|
||||||
|
|
||||||
return StarMapper.ToAdminResponse(star);
|
return StarMapper.ToAdminResponse(star);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
[Authorize(Policy = "permissions:admin.servers.stars.delete")]
|
[Authorize(Policy = "permissions:admin.servers.stars.delete")]
|
||||||
public async Task<ActionResult> Delete([FromRoute] int id)
|
public async Task<ActionResult> DeleteAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var star = await StarRepository
|
var star = await StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -122,7 +122,7 @@ public class StarsController : Controller
|
|||||||
if (star == null)
|
if (star == null)
|
||||||
return Problem("No star with that id found", statusCode: 404);
|
return Problem("No star with that id found", statusCode: 404);
|
||||||
|
|
||||||
await StarRepository.Remove(star);
|
await StarRepository.RemoveAsync(star);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
@@ -37,14 +36,14 @@ public class FilesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("list")]
|
[HttpGet("list")]
|
||||||
public async Task<ActionResult<ServerFilesEntryResponse[]>> List([FromRoute] int serverId, [FromQuery] string path)
|
public async Task<ActionResult<ServerFilesEntryResponse[]>> ListAsync([FromRoute] int serverId, [FromQuery] string path)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.Read);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.Read);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
var entries = await ServerFileSystemService.List(server.Value, path);
|
var entries = await ServerFileSystemService.ListAsync(server.Value, path);
|
||||||
|
|
||||||
return entries.Select(x => new ServerFilesEntryResponse()
|
return entries.Select(x => new ServerFilesEntryResponse()
|
||||||
{
|
{
|
||||||
@@ -57,57 +56,57 @@ public class FilesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("move")]
|
[HttpPost("move")]
|
||||||
public async Task<ActionResult> Move([FromRoute] int serverId, [FromQuery] string oldPath, [FromQuery] string newPath)
|
public async Task<ActionResult> MoveAsync([FromRoute] int serverId, [FromQuery] string oldPath, [FromQuery] string newPath)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerFileSystemService.Move(server.Value, oldPath, newPath);
|
await ServerFileSystemService.MoveAsync(server.Value, oldPath, newPath);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("delete")]
|
[HttpDelete("delete")]
|
||||||
public async Task<ActionResult> Delete([FromRoute] int serverId, [FromQuery] string path)
|
public async Task<ActionResult> DeleteAsync([FromRoute] int serverId, [FromQuery] string path)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerFileSystemService.Delete(server.Value, path);
|
await ServerFileSystemService.DeleteAsync(server.Value, path);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("mkdir")]
|
[HttpPost("mkdir")]
|
||||||
public async Task<ActionResult> Mkdir([FromRoute] int serverId, [FromQuery] string path)
|
public async Task<ActionResult> MkdirAsync([FromRoute] int serverId, [FromQuery] string path)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerFileSystemService.Mkdir(server.Value, path);
|
await ServerFileSystemService.MkdirAsync(server.Value, path);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("touch")]
|
[HttpPost("touch")]
|
||||||
public async Task<ActionResult> Touch([FromRoute] int serverId, [FromQuery] string path)
|
public async Task<ActionResult> TouchAsync([FromRoute] int serverId, [FromQuery] string path)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerFileSystemService.Mkdir(server.Value, path);
|
await ServerFileSystemService.MkdirAsync(server.Value, path);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("upload")]
|
[HttpGet("upload")]
|
||||||
public async Task<ActionResult<ServerFilesUploadResponse>> Upload([FromRoute] int serverId)
|
public async Task<ActionResult<ServerFilesUploadResponse>> UploadAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var serverResult = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var serverResult = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (serverResult.Value == null)
|
if (serverResult.Value == null)
|
||||||
return serverResult.Result ?? Problem("Unable to retrieve server");
|
return serverResult.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -137,9 +136,9 @@ public class FilesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("download")]
|
[HttpGet("download")]
|
||||||
public async Task<ActionResult<ServerFilesDownloadResponse>> Download([FromRoute] int serverId, [FromQuery] string path)
|
public async Task<ActionResult<ServerFilesDownloadResponse>> DownloadAsync([FromRoute] int serverId, [FromQuery] string path)
|
||||||
{
|
{
|
||||||
var serverResult = await GetServerById(serverId, ServerPermissionLevel.Read);
|
var serverResult = await GetServerByIdAsync(serverId, ServerPermissionLevel.Read);
|
||||||
|
|
||||||
if (serverResult.Value == null)
|
if (serverResult.Value == null)
|
||||||
return serverResult.Result ?? Problem("Unable to retrieve server");
|
return serverResult.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -170,9 +169,9 @@ public class FilesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("compress")]
|
[HttpPost("compress")]
|
||||||
public async Task<ActionResult> Compress([FromRoute] int serverId, [FromBody] ServerFilesCompressRequest request)
|
public async Task<ActionResult> CompressAsync([FromRoute] int serverId, [FromBody] ServerFilesCompressRequest request)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -180,14 +179,14 @@ public class FilesController : Controller
|
|||||||
if (!Enum.TryParse(request.Type, true, out CompressType type))
|
if (!Enum.TryParse(request.Type, true, out CompressType type))
|
||||||
return Problem("Invalid compress type provided", statusCode: 400);
|
return Problem("Invalid compress type provided", statusCode: 400);
|
||||||
|
|
||||||
await ServerFileSystemService.Compress(server.Value, type, request.Items, request.Destination);
|
await ServerFileSystemService.CompressAsync(server.Value, type, request.Items, request.Destination);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("decompress")]
|
[HttpPost("decompress")]
|
||||||
public async Task<ActionResult> Decompress([FromRoute] int serverId, [FromBody] ServerFilesDecompressRequest request)
|
public async Task<ActionResult> DecompressAsync([FromRoute] int serverId, [FromBody] ServerFilesDecompressRequest request)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -195,11 +194,11 @@ public class FilesController : Controller
|
|||||||
if (!Enum.TryParse(request.Type, true, out CompressType type))
|
if (!Enum.TryParse(request.Type, true, out CompressType type))
|
||||||
return Problem("Invalid decompress type provided", statusCode: 400);
|
return Problem("Invalid decompress type provided", statusCode: 400);
|
||||||
|
|
||||||
await ServerFileSystemService.Decompress(server.Value, type, request.Path, request.Destination);
|
await ServerFileSystemService.DecompressAsync(server.Value, type, request.Path, request.Destination);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Server>> GetServerById(int serverId, ServerPermissionLevel level)
|
private async Task<ActionResult<Server>> GetServerByIdAsync(int serverId, ServerPermissionLevel level)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -209,7 +208,7 @@ public class FilesController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizeResult = await AuthorizeService.Authorize(
|
var authorizeResult = await AuthorizeService.AuthorizeAsync(
|
||||||
User, server,
|
User, server,
|
||||||
ServerPermissionConstants.Files,
|
ServerPermissionConstants.Files,
|
||||||
level
|
level
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Helpers;
|
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
using MoonlightServers.Shared.Constants;
|
using MoonlightServers.Shared.Constants;
|
||||||
@@ -34,44 +31,44 @@ public class PowerController : Controller
|
|||||||
|
|
||||||
[HttpPost("start")]
|
[HttpPost("start")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public async Task<ActionResult> Start([FromRoute] int serverId)
|
public async Task<ActionResult> StartAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerService.Start(server.Value);
|
await ServerService.StartAsync(server.Value);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("stop")]
|
[HttpPost("stop")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public async Task<ActionResult> Stop([FromRoute] int serverId)
|
public async Task<ActionResult> StopAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerService.Stop(server.Value);
|
await ServerService.StopAsync(server.Value);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("kill")]
|
[HttpPost("kill")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public async Task<ActionResult> Kill([FromRoute] int serverId)
|
public async Task<ActionResult> KillAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerService.Kill(server.Value);
|
await ServerService.KillAsync(server.Value);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Server>> GetServerById(int serverId)
|
private async Task<ActionResult<Server>> GetServerByIdAsync(int serverId)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -81,7 +78,7 @@ public class PowerController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizeResult = await AuthorizeService.Authorize(
|
var authorizeResult = await AuthorizeService.AuthorizeAsync(
|
||||||
User, server,
|
User, server,
|
||||||
ServerPermissionConstants.Power,
|
ServerPermissionConstants.Power,
|
||||||
ServerPermissionLevel.ReadWrite
|
ServerPermissionLevel.ReadWrite
|
||||||
|
|||||||
@@ -1,24 +1,19 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
using Moonlight.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Extensions;
|
using MoonlightServers.ApiServer.Extensions;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
using MoonlightServers.ApiServer.Models;
|
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
using MoonlightServers.Shared.Constants;
|
using MoonlightServers.Shared.Constants;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
using MoonlightServers.Shared.Http.Requests.Client.Servers;
|
using MoonlightServers.Shared.Http.Requests.Client.Servers;
|
||||||
using MoonlightServers.Shared.Http.Responses.Client.Servers;
|
using MoonlightServers.Shared.Http.Responses.Client.Servers;
|
||||||
using MoonlightServers.Shared.Http.Responses.Client.Servers.Allocations;
|
using MoonlightServers.Shared.Http.Responses.Client.Servers.Allocations;
|
||||||
using MoonlightServers.Shared.Models;
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Http.Controllers.Client;
|
namespace MoonlightServers.ApiServer.Http.Controllers.Client;
|
||||||
|
|
||||||
@@ -52,8 +47,14 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<ActionResult<PagedData<ServerDetailResponse>>> GetAll([FromQuery] PagedOptions options)
|
public async Task<ActionResult<CountedData<ServerDetailResponse>>> GetAllAsync(
|
||||||
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
var userIdClaim = User.FindFirstValue("UserId");
|
var userIdClaim = User.FindFirstValue("UserId");
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(userIdClaim))
|
if (string.IsNullOrEmpty(userIdClaim))
|
||||||
@@ -68,12 +69,12 @@ public class ServersController : Controller
|
|||||||
.Include(x => x.Node)
|
.Include(x => x.Node)
|
||||||
.Where(x => x.OwnerId == userId);
|
.Where(x => x.OwnerId == userId);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var items = await query
|
var items = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
@@ -94,19 +95,22 @@ public class ServersController : Controller
|
|||||||
}).ToArray()
|
}).ToArray()
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
return new PagedData<ServerDetailResponse>()
|
return new CountedData<ServerDetailResponse>()
|
||||||
{
|
{
|
||||||
Items = mappedItems,
|
Items = mappedItems,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
TotalItems = count,
|
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("shared")]
|
[HttpGet("shared")]
|
||||||
public async Task<ActionResult<PagedData<ServerDetailResponse>>> GetAllShared([FromQuery] PagedOptions options)
|
public async Task<ActionResult<CountedData<ServerDetailResponse>>> GetAllSharedAsync(
|
||||||
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
var userIdClaim = User.FindFirstValue("UserId");
|
var userIdClaim = User.FindFirstValue("UserId");
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(userIdClaim))
|
if (string.IsNullOrEmpty(userIdClaim))
|
||||||
@@ -124,12 +128,12 @@ public class ServersController : Controller
|
|||||||
.ThenInclude(x => x.Allocations)
|
.ThenInclude(x => x.Allocations)
|
||||||
.Where(x => x.UserId == userId);
|
.Where(x => x.UserId == userId);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var items = await query
|
var items = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
var ownerIds = items
|
var ownerIds = items
|
||||||
@@ -164,18 +168,15 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
return new PagedData<ServerDetailResponse>()
|
return new CountedData<ServerDetailResponse>()
|
||||||
{
|
{
|
||||||
Items = mappedItems,
|
Items = mappedItems,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
TotalItems = count,
|
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{serverId:int}")]
|
[HttpGet("{serverId:int}")]
|
||||||
public async Task<ActionResult<ServerDetailResponse>> Get([FromRoute] int serverId)
|
public async Task<ActionResult<ServerDetailResponse>> GetAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -187,7 +188,7 @@ public class ServersController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizationResult = await AuthorizeService.Authorize(
|
var authorizationResult = await AuthorizeService.AuthorizeAsync(
|
||||||
User,
|
User,
|
||||||
server,
|
server,
|
||||||
String.Empty,
|
String.Empty,
|
||||||
@@ -238,9 +239,9 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{serverId:int}/status")]
|
[HttpGet("{serverId:int}/status")]
|
||||||
public async Task<ActionResult<ServerStatusResponse>> GetStatus([FromRoute] int serverId)
|
public async Task<ActionResult<ServerStatusResponse>> GetStatusAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(
|
var server = await GetServerByIdAsync(
|
||||||
serverId,
|
serverId,
|
||||||
ServerPermissionConstants.Console,
|
ServerPermissionConstants.Console,
|
||||||
ServerPermissionLevel.None
|
ServerPermissionLevel.None
|
||||||
@@ -249,7 +250,7 @@ public class ServersController : Controller
|
|||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
var status = await ServerService.GetStatus(server.Value);
|
var status = await ServerService.GetStatusAsync(server.Value);
|
||||||
|
|
||||||
return new ServerStatusResponse()
|
return new ServerStatusResponse()
|
||||||
{
|
{
|
||||||
@@ -258,9 +259,9 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{serverId:int}/ws")]
|
[HttpGet("{serverId:int}/ws")]
|
||||||
public async Task<ActionResult<ServerWebSocketResponse>> GetWebSocket([FromRoute] int serverId)
|
public async Task<ActionResult<ServerWebSocketResponse>> GetWebSocketAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var serverResult = await GetServerById(
|
var serverResult = await GetServerByIdAsync(
|
||||||
serverId,
|
serverId,
|
||||||
ServerPermissionConstants.Console,
|
ServerPermissionConstants.Console,
|
||||||
ServerPermissionLevel.Read
|
ServerPermissionLevel.Read
|
||||||
@@ -292,9 +293,9 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{serverId:int}/logs")]
|
[HttpGet("{serverId:int}/logs")]
|
||||||
public async Task<ActionResult<ServerLogsResponse>> GetLogs([FromRoute] int serverId)
|
public async Task<ActionResult<ServerLogsResponse>> GetLogsAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(
|
var server = await GetServerByIdAsync(
|
||||||
serverId,
|
serverId,
|
||||||
ServerPermissionConstants.Console,
|
ServerPermissionConstants.Console,
|
||||||
ServerPermissionLevel.Read
|
ServerPermissionLevel.Read
|
||||||
@@ -303,7 +304,7 @@ public class ServersController : Controller
|
|||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
var logs = await ServerService.GetLogs(server.Value);
|
var logs = await ServerService.GetLogsAsync(server.Value);
|
||||||
|
|
||||||
return new ServerLogsResponse()
|
return new ServerLogsResponse()
|
||||||
{
|
{
|
||||||
@@ -312,9 +313,9 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{serverId:int}/stats")]
|
[HttpGet("{serverId:int}/stats")]
|
||||||
public async Task<ActionResult<ServerStatsResponse>> GetStats([FromRoute] int serverId)
|
public async Task<ActionResult<ServerStatsResponse>> GetStatsAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(
|
var server = await GetServerByIdAsync(
|
||||||
serverId,
|
serverId,
|
||||||
ServerPermissionConstants.Console,
|
ServerPermissionConstants.Console,
|
||||||
ServerPermissionLevel.Read
|
ServerPermissionLevel.Read
|
||||||
@@ -323,7 +324,7 @@ public class ServersController : Controller
|
|||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
var stats = await ServerService.GetStats(server.Value);
|
var stats = await ServerService.GetStatsAsync(server.Value);
|
||||||
|
|
||||||
return new ServerStatsResponse()
|
return new ServerStatsResponse()
|
||||||
{
|
{
|
||||||
@@ -337,9 +338,9 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("{serverId:int}/command")]
|
[HttpPost("{serverId:int}/command")]
|
||||||
public async Task<ActionResult> Command([FromRoute] int serverId, [FromBody] ServerCommandRequest request)
|
public async Task<ActionResult> CommandAsync([FromRoute] int serverId, [FromBody] ServerCommandRequest request)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(
|
var server = await GetServerByIdAsync(
|
||||||
serverId,
|
serverId,
|
||||||
ServerPermissionConstants.Console,
|
ServerPermissionConstants.Console,
|
||||||
ServerPermissionLevel.ReadWrite
|
ServerPermissionLevel.ReadWrite
|
||||||
@@ -348,12 +349,13 @@ public class ServersController : Controller
|
|||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerService.RunCommand(server.Value, request.Command);
|
await ServerService.RunCommandAsync(server.Value, request.Command);
|
||||||
|
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Server>> GetServerById(int serverId, string permissionId, ServerPermissionLevel level)
|
private async Task<ActionResult<Server>> GetServerByIdAsync(int serverId, string permissionId,
|
||||||
|
ServerPermissionLevel level)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -363,7 +365,7 @@ public class ServersController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizeResult = await AuthorizeService.Authorize(User, server, permissionId, level);
|
var authorizeResult = await AuthorizeService.AuthorizeAsync(User, server, permissionId, level);
|
||||||
|
|
||||||
if (!authorizeResult.Succeeded)
|
if (!authorizeResult.Succeeded)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
@@ -32,18 +31,18 @@ public class SettingsController : Controller
|
|||||||
|
|
||||||
[HttpPost("{serverId:int}/install")]
|
[HttpPost("{serverId:int}/install")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public async Task<ActionResult> Install([FromRoute] int serverId)
|
public async Task<ActionResult> InstallAsync([FromRoute] int serverId)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
|
|
||||||
await ServerService.Install(server.Value);
|
await ServerService.InstallAsync(server.Value);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Server>> GetServerById(int serverId)
|
private async Task<ActionResult<Server>> GetServerByIdAsync(int serverId)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -53,7 +52,7 @@ public class SettingsController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizeResult = await AuthorizeService.Authorize(
|
var authorizeResult = await AuthorizeService.AuthorizeAsync(
|
||||||
User, server,
|
User, server,
|
||||||
ServerPermissionConstants.Settings,
|
ServerPermissionConstants.Settings,
|
||||||
ServerPermissionLevel.ReadWrite
|
ServerPermissionLevel.ReadWrite
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
using Moonlight.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Mappers;
|
using MoonlightServers.ApiServer.Mappers;
|
||||||
using MoonlightServers.ApiServer.Models;
|
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
using MoonlightServers.Shared.Constants;
|
using MoonlightServers.Shared.Constants;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
@@ -42,12 +38,16 @@ public class SharesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<ActionResult<IPagedData<ServerShareResponse>>> GetAll(
|
public async Task<ActionResult<CountedData<ServerShareResponse>>> GetAllAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromQuery] PagedOptions options
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -56,12 +56,12 @@ public class SharesController : Controller
|
|||||||
.Get()
|
.Get()
|
||||||
.Where(x => x.Server.Id == server.Value.Id);
|
.Where(x => x.Server.Id == server.Value.Id);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var items = await query
|
var items = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
var userIds = items
|
var userIds = items
|
||||||
@@ -81,23 +81,20 @@ public class SharesController : Controller
|
|||||||
Permissions = ShareMapper.MapToPermissionLevels(x.Content)
|
Permissions = ShareMapper.MapToPermissionLevels(x.Content)
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
return new PagedData<ServerShareResponse>()
|
return new CountedData<ServerShareResponse>()
|
||||||
{
|
{
|
||||||
Items = mappedItems,
|
Items = mappedItems,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
public async Task<ActionResult<ServerShareResponse>> Get(
|
public async Task<ActionResult<ServerShareResponse>> GetAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromRoute] int id
|
[FromRoute] int id
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -124,12 +121,12 @@ public class SharesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<ActionResult<ServerShareResponse>> Create(
|
public async Task<ActionResult<ServerShareResponse>> CreateAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromBody] CreateShareRequest request
|
[FromBody] CreateShareRequest request
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -150,7 +147,7 @@ public class SharesController : Controller
|
|||||||
UserId = user.Id
|
UserId = user.Id
|
||||||
};
|
};
|
||||||
|
|
||||||
var finalShare = await ShareRepository.Add(share);
|
var finalShare = await ShareRepository.AddAsync(share);
|
||||||
|
|
||||||
var mappedItem = new ServerShareResponse()
|
var mappedItem = new ServerShareResponse()
|
||||||
{
|
{
|
||||||
@@ -163,13 +160,13 @@ public class SharesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("{id:int}")]
|
[HttpPatch("{id:int}")]
|
||||||
public async Task<ActionResult<ServerShareResponse>> Update(
|
public async Task<ActionResult<ServerShareResponse>> UpdateAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromRoute] int id,
|
[FromRoute] int id,
|
||||||
[FromBody] UpdateShareRequest request
|
[FromBody] UpdateShareRequest request
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -185,7 +182,7 @@ public class SharesController : Controller
|
|||||||
|
|
||||||
share.UpdatedAt = DateTime.UtcNow;
|
share.UpdatedAt = DateTime.UtcNow;
|
||||||
|
|
||||||
await ShareRepository.Update(share);
|
await ShareRepository.UpdateAsync(share);
|
||||||
|
|
||||||
var user = await UserRepository
|
var user = await UserRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -205,12 +202,12 @@ public class SharesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{id:int}")]
|
[HttpDelete("{id:int}")]
|
||||||
public async Task<ActionResult> Delete(
|
public async Task<ActionResult> DeleteAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromRoute] int id
|
[FromRoute] int id
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId);
|
var server = await GetServerByIdAsync(serverId);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -222,11 +219,11 @@ public class SharesController : Controller
|
|||||||
if (share == null)
|
if (share == null)
|
||||||
return Problem("A share with that id cannot be found", statusCode: 404);
|
return Problem("A share with that id cannot be found", statusCode: 404);
|
||||||
|
|
||||||
await ShareRepository.Remove(share);
|
await ShareRepository.RemoveAsync(share);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Server>> GetServerById(int serverId)
|
private async Task<ActionResult<Server>> GetServerByIdAsync(int serverId)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -235,7 +232,7 @@ public class SharesController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizeResult = await AuthorizeService.Authorize(
|
var authorizeResult = await AuthorizeService.AuthorizeAsync(
|
||||||
User, server,
|
User, server,
|
||||||
ServerPermissionConstants.Shares,
|
ServerPermissionConstants.Shares,
|
||||||
ServerPermissionLevel.ReadWrite
|
ServerPermissionLevel.ReadWrite
|
||||||
|
|||||||
@@ -1,18 +1,14 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Exceptions;
|
using MoonCore.Exceptions;
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonCore.Extended.Models;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using Moonlight.ApiServer.Database.Entities;
|
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Services;
|
using MoonlightServers.ApiServer.Services;
|
||||||
using MoonlightServers.Shared.Constants;
|
using MoonlightServers.Shared.Constants;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
using MoonlightServers.Shared.Http.Requests.Client.Servers.Variables;
|
using MoonlightServers.Shared.Http.Requests.Client.Servers.Variables;
|
||||||
using MoonlightServers.Shared.Http.Responses.Client.Servers.Shares;
|
|
||||||
using MoonlightServers.Shared.Http.Responses.Client.Servers.Variables;
|
using MoonlightServers.Shared.Http.Responses.Client.Servers.Variables;
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Http.Controllers.Client;
|
namespace MoonlightServers.ApiServer.Http.Controllers.Client;
|
||||||
@@ -41,12 +37,16 @@ public class VariablesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<ActionResult<PagedData<ServerVariableDetailResponse>>> Get(
|
public async Task<ActionResult<CountedData<ServerVariableDetailResponse>>> GetAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromQuery] PagedOptions options
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var server = await GetServerById(serverId, ServerPermissionLevel.Read);
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
|
var server = await GetServerByIdAsync(serverId, ServerPermissionLevel.Read);
|
||||||
|
|
||||||
if (server.Value == null)
|
if (server.Value == null)
|
||||||
return server.Result ?? Problem("Unable to retrieve server");
|
return server.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -55,12 +55,12 @@ public class VariablesController : Controller
|
|||||||
.Get()
|
.Get()
|
||||||
.Where(x => x.Star.Id == server.Value.Star.Id);
|
.Where(x => x.Star.Id == server.Value.Star.Id);
|
||||||
|
|
||||||
var count = await query.CountAsync();
|
var totalCount = await query.CountAsync();
|
||||||
|
|
||||||
var starVariables = await query
|
var starVariables = await query
|
||||||
.OrderBy(x => x.Id)
|
.OrderBy(x => x.Id)
|
||||||
.Skip(options.Page * options.PageSize)
|
.Skip(startIndex)
|
||||||
.Take(options.PageSize)
|
.Take(count)
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
var starVariableKeys = starVariables
|
var starVariableKeys = starVariables
|
||||||
@@ -87,25 +87,22 @@ public class VariablesController : Controller
|
|||||||
};
|
};
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
return new PagedData<ServerVariableDetailResponse>()
|
return new CountedData<ServerVariableDetailResponse>()
|
||||||
{
|
{
|
||||||
Items = responses,
|
Items = responses,
|
||||||
CurrentPage = options.Page,
|
TotalCount = totalCount
|
||||||
PageSize = options.PageSize,
|
|
||||||
TotalItems = count,
|
|
||||||
TotalPages = (int)Math.Ceiling(Math.Max(0, count) / (double)options.PageSize)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPut]
|
[HttpPut]
|
||||||
public async Task<ActionResult<ServerVariableDetailResponse>> UpdateSingle(
|
public async Task<ActionResult<ServerVariableDetailResponse>> UpdateSingleAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromBody] UpdateServerVariableRequest request
|
[FromBody] UpdateServerVariableRequest request
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// TODO: Handle filter
|
// TODO: Handle filter
|
||||||
|
|
||||||
var serverResult = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var serverResult = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (serverResult.Value == null)
|
if (serverResult.Value == null)
|
||||||
return serverResult.Result ?? Problem("Unable to retrieve server");
|
return serverResult.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -119,7 +116,7 @@ public class VariablesController : Controller
|
|||||||
throw new HttpApiException($"No variable with the key found: {request.Key}", 400);
|
throw new HttpApiException($"No variable with the key found: {request.Key}", 400);
|
||||||
|
|
||||||
serverVariable.Value = request.Value;
|
serverVariable.Value = request.Value;
|
||||||
await ServerRepository.Update(server);
|
await ServerRepository.UpdateAsync(server);
|
||||||
|
|
||||||
return new ServerVariableDetailResponse()
|
return new ServerVariableDetailResponse()
|
||||||
{
|
{
|
||||||
@@ -133,12 +130,12 @@ public class VariablesController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch]
|
[HttpPatch]
|
||||||
public async Task<ActionResult<ServerVariableDetailResponse[]>> Update(
|
public async Task<ActionResult<ServerVariableDetailResponse[]>> UpdateAsync(
|
||||||
[FromRoute] int serverId,
|
[FromRoute] int serverId,
|
||||||
[FromBody] UpdateServerVariableRangeRequest request
|
[FromBody] UpdateServerVariableRangeRequest request
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var serverResult = await GetServerById(serverId, ServerPermissionLevel.ReadWrite);
|
var serverResult = await GetServerByIdAsync(serverId, ServerPermissionLevel.ReadWrite);
|
||||||
|
|
||||||
if (serverResult.Value == null)
|
if (serverResult.Value == null)
|
||||||
return serverResult.Result ?? Problem("Unable to retrieve server");
|
return serverResult.Result ?? Problem("Unable to retrieve server");
|
||||||
@@ -158,7 +155,7 @@ public class VariablesController : Controller
|
|||||||
serverVariable.Value = variable.Value;
|
serverVariable.Value = variable.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
await ServerRepository.Update(server);
|
await ServerRepository.UpdateAsync(server);
|
||||||
|
|
||||||
return request.Variables.Select(requestVariable =>
|
return request.Variables.Select(requestVariable =>
|
||||||
{
|
{
|
||||||
@@ -177,7 +174,7 @@ public class VariablesController : Controller
|
|||||||
}).ToArray();
|
}).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ActionResult<Server>> GetServerById(int serverId, ServerPermissionLevel level)
|
private async Task<ActionResult<Server>> GetServerByIdAsync(int serverId, ServerPermissionLevel level)
|
||||||
{
|
{
|
||||||
var server = await ServerRepository
|
var server = await ServerRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -189,7 +186,7 @@ public class VariablesController : Controller
|
|||||||
if (server == null)
|
if (server == null)
|
||||||
return Problem("No server with this id found", statusCode: 404);
|
return Problem("No server with this id found", statusCode: 404);
|
||||||
|
|
||||||
var authorizeResult = await AuthorizeService.Authorize(
|
var authorizeResult = await AuthorizeService.AuthorizeAsync(
|
||||||
User, server,
|
User, server,
|
||||||
ServerPermissionConstants.Variables,
|
ServerPermissionConstants.Variables,
|
||||||
level
|
level
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ namespace MoonlightServers.ApiServer.Http.Controllers.Remote.Nodes;
|
|||||||
public class NodeTripController : Controller
|
public class NodeTripController : Controller
|
||||||
{
|
{
|
||||||
[HttpGet("trip")]
|
[HttpGet("trip")]
|
||||||
public Task Get() => Task.CompletedTask;
|
public Task GetAsync() => Task.CompletedTask;
|
||||||
}
|
}
|
||||||
@@ -31,8 +31,14 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<PagedData<ServerDataResponse>> Get([FromQuery] int page, [FromQuery] int pageSize)
|
public async Task<ActionResult<CountedData<ServerDataResponse>>> GetAsync(
|
||||||
|
[FromQuery] int startIndex,
|
||||||
|
[FromQuery] int count
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
if (count > 100)
|
||||||
|
return Problem("Only 100 items can be fetched at a time", statusCode: 400);
|
||||||
|
|
||||||
// Load the node via the id
|
// Load the node via the id
|
||||||
var nodeId = int.Parse(User.Claims.First(x => x.Type == "nodeId").Value);
|
var nodeId = int.Parse(User.Claims.First(x => x.Type == "nodeId").Value);
|
||||||
|
|
||||||
@@ -52,8 +58,8 @@ public class ServersController : Controller
|
|||||||
.ThenInclude(x => x.DockerImages)
|
.ThenInclude(x => x.DockerImages)
|
||||||
.Include(x => x.Variables)
|
.Include(x => x.Variables)
|
||||||
.Include(x => x.Allocations)
|
.Include(x => x.Allocations)
|
||||||
.Skip(page * pageSize)
|
.Skip(startIndex)
|
||||||
.Take(pageSize)
|
.Take(count)
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
|
||||||
var serverData = new List<ServerDataResponse>();
|
var serverData = new List<ServerDataResponse>();
|
||||||
@@ -68,18 +74,15 @@ public class ServersController : Controller
|
|||||||
serverData.Add(convertedData);
|
serverData.Add(convertedData);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new PagedData<ServerDataResponse>()
|
return new CountedData<ServerDataResponse>()
|
||||||
{
|
{
|
||||||
Items = serverData.ToArray(),
|
Items = serverData.ToArray(),
|
||||||
CurrentPage = page,
|
TotalCount = total
|
||||||
PageSize = pageSize,
|
|
||||||
TotalItems = total,
|
|
||||||
TotalPages = total == 0 ? 0 : total / pageSize
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}")]
|
[HttpGet("{id:int}")]
|
||||||
public async Task<ServerDataResponse> Get([FromRoute] int id)
|
public async Task<ServerDataResponse> GetAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
// Load the node via the id
|
// Load the node via the id
|
||||||
var nodeId = int.Parse(User.Claims.First(x => x.Type == "nodeId").Value);
|
var nodeId = int.Parse(User.Claims.First(x => x.Type == "nodeId").Value);
|
||||||
@@ -111,7 +114,7 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id:int}/install")]
|
[HttpGet("{id:int}/install")]
|
||||||
public async Task<ServerInstallDataResponse> GetInstall([FromRoute] int id)
|
public async Task<ServerInstallDataResponse> GetInstallAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
// Load the node via the id
|
// Load the node via the id
|
||||||
var nodeId = int.Parse(User.Claims.First(x => x.Type == "nodeId").Value);
|
var nodeId = int.Parse(User.Claims.First(x => x.Type == "nodeId").Value);
|
||||||
@@ -180,7 +183,6 @@ public class ServersController : Controller
|
|||||||
Port = x.Port
|
Port = x.Port
|
||||||
}).ToArray(),
|
}).ToArray(),
|
||||||
Variables = server.Variables.ToDictionary(x => x.Key, x => x.Value),
|
Variables = server.Variables.ToDictionary(x => x.Key, x => x.Value),
|
||||||
Bandwidth = server.Bandwidth,
|
|
||||||
Cpu = server.Cpu,
|
Cpu = server.Cpu,
|
||||||
Disk = server.Disk,
|
Disk = server.Disk,
|
||||||
Memory = server.Memory,
|
Memory = server.Memory,
|
||||||
@@ -189,7 +191,6 @@ public class ServersController : Controller
|
|||||||
PullDockerImage = dockerImage.AutoPulling,
|
PullDockerImage = dockerImage.AutoPulling,
|
||||||
ParseConiguration = server.Star.ParseConfiguration,
|
ParseConiguration = server.Star.ParseConfiguration,
|
||||||
StopCommand = server.Star.StopCommand,
|
StopCommand = server.Star.StopCommand,
|
||||||
UseVirtualDisk = server.UseVirtualDisk
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,9 @@
|
|||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using MoonCore.Attributes;
|
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Interfaces;
|
using MoonlightServers.ApiServer.Interfaces;
|
||||||
using MoonlightServers.ApiServer.Models;
|
using MoonlightServers.ApiServer.Models;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
using MoonlightServers.Shared.Models;
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Implementations.ServerAuthFilters;
|
namespace MoonlightServers.ApiServer.Implementations.ServerAuthFilters;
|
||||||
|
|
||||||
@@ -20,7 +18,7 @@ public class AdminAuthFilter : IServerAuthorizationFilter
|
|||||||
AuthorizationService = authorizationService;
|
AuthorizationService = authorizationService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerAuthorizationResult?> Process(
|
public async Task<ServerAuthorizationResult?> ProcessAsync(
|
||||||
ClaimsPrincipal user,
|
ClaimsPrincipal user,
|
||||||
Server server,
|
Server server,
|
||||||
string permissionId,
|
string permissionId,
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using MoonCore.Attributes;
|
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Interfaces;
|
using MoonlightServers.ApiServer.Interfaces;
|
||||||
using MoonlightServers.ApiServer.Models;
|
using MoonlightServers.ApiServer.Models;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
using MoonlightServers.Shared.Models;
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Implementations.ServerAuthFilters;
|
namespace MoonlightServers.ApiServer.Implementations.ServerAuthFilters;
|
||||||
|
|
||||||
@@ -12,7 +10,7 @@ public class OwnerAuthFilter : IServerAuthorizationFilter
|
|||||||
{
|
{
|
||||||
public int Priority => 0;
|
public int Priority => 0;
|
||||||
|
|
||||||
public Task<ServerAuthorizationResult?> Process(
|
public Task<ServerAuthorizationResult?> ProcessAsync(
|
||||||
ClaimsPrincipal user,
|
ClaimsPrincipal user,
|
||||||
Server server,
|
Server server,
|
||||||
string permissionId,
|
string permissionId,
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Attributes;
|
|
||||||
using MoonCore.Extended.Abstractions;
|
using MoonCore.Extended.Abstractions;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.ApiServer.Interfaces;
|
using MoonlightServers.ApiServer.Interfaces;
|
||||||
using MoonlightServers.ApiServer.Models;
|
using MoonlightServers.ApiServer.Models;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
using MoonlightServers.Shared.Models;
|
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Implementations.ServerAuthFilters;
|
namespace MoonlightServers.ApiServer.Implementations.ServerAuthFilters;
|
||||||
|
|
||||||
@@ -21,7 +19,7 @@ public class ShareAuthFilter : IServerAuthorizationFilter
|
|||||||
|
|
||||||
public int Priority => 0;
|
public int Priority => 0;
|
||||||
|
|
||||||
public async Task<ServerAuthorizationResult?> Process(
|
public async Task<ServerAuthorizationResult?> ProcessAsync(
|
||||||
ClaimsPrincipal user,
|
ClaimsPrincipal user,
|
||||||
Server server,
|
Server server,
|
||||||
string permissionId,
|
string permissionId,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public interface IServerAuthorizationFilter
|
|||||||
|
|
||||||
public int Priority { get; }
|
public int Priority { get; }
|
||||||
|
|
||||||
public Task<ServerAuthorizationResult?> Process(
|
public Task<ServerAuthorizationResult?> ProcessAsync(
|
||||||
ClaimsPrincipal user,
|
ClaimsPrincipal user,
|
||||||
Server server,
|
Server server,
|
||||||
string permissionId,
|
string permissionId,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.Shared.Http.Requests.Admin.Servers;
|
using MoonlightServers.Shared.Http.Requests.Admin.Servers;
|
||||||
using MoonlightServers.Shared.Http.Responses.Admin.Servers;
|
using MoonlightServers.Shared.Http.Responses.Admin.Servers;
|
||||||
using MoonlightServers.Shared.Http.Responses.Client.Servers;
|
|
||||||
using Riok.Mapperly.Abstractions;
|
using Riok.Mapperly.Abstractions;
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Mappers;
|
namespace MoonlightServers.ApiServer.Mappers;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.Shared.Http.Requests.Admin.StarDockerImages;
|
|
||||||
using MoonlightServers.Shared.Http.Requests.Admin.Stars;
|
using MoonlightServers.Shared.Http.Requests.Admin.Stars;
|
||||||
using MoonlightServers.Shared.Http.Responses.Admin.Stars;
|
using MoonlightServers.Shared.Http.Responses.Admin.Stars;
|
||||||
using Riok.Mapperly.Abstractions;
|
using Riok.Mapperly.Abstractions;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Moonlight.ApiServer" Version="2.1.*" />
|
<PackageReference Include="Moonlight.ApiServer" Version="2.1.*" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.7"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.9"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using System.IdentityModel.Tokens.Jwt;
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using MoonCore.Attributes;
|
using MoonCore.Attributes;
|
||||||
using MoonCore.Extended.Helpers;
|
|
||||||
using MoonCore.Helpers;
|
using MoonCore.Helpers;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
|
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Statistics;
|
||||||
@@ -41,7 +39,7 @@ public class NodeService
|
|||||||
return jwtSecurityTokenHandler.WriteToken(securityToken);
|
return jwtSecurityTokenHandler.WriteToken(securityToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SystemStatusResponse> GetSystemStatus(Node node)
|
public async Task<SystemStatusResponse> GetSystemStatusAsync(Node node)
|
||||||
{
|
{
|
||||||
using var apiClient = CreateApiClient(node);
|
using var apiClient = CreateApiClient(node);
|
||||||
return await apiClient.GetJson<SystemStatusResponse>("api/system/status");
|
return await apiClient.GetJson<SystemStatusResponse>("api/system/status");
|
||||||
@@ -49,13 +47,13 @@ public class NodeService
|
|||||||
|
|
||||||
#region Statistics
|
#region Statistics
|
||||||
|
|
||||||
public async Task<StatisticsResponse> GetStatistics(Node node)
|
public async Task<StatisticsResponse> GetStatisticsAsync(Node node)
|
||||||
{
|
{
|
||||||
using var apiClient = CreateApiClient(node);
|
using var apiClient = CreateApiClient(node);
|
||||||
return await apiClient.GetJson<StatisticsResponse>("api/statistics");
|
return await apiClient.GetJson<StatisticsResponse>("api/statistics");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<StatisticsDockerResponse> GetDockerStatistics(Node node)
|
public async Task<StatisticsDockerResponse> GetDockerStatisticsAsync(Node node)
|
||||||
{
|
{
|
||||||
using var apiClient = CreateApiClient(node);
|
using var apiClient = CreateApiClient(node);
|
||||||
return await apiClient.GetJson<StatisticsDockerResponse>("api/statistics/docker");
|
return await apiClient.GetJson<StatisticsDockerResponse>("api/statistics/docker");
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class ServerAuthorizeService
|
|||||||
AuthorizationFilters = authorizationFilters.ToArray();
|
AuthorizationFilters = authorizationFilters.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerAuthorizationResult> Authorize(
|
public async Task<ServerAuthorizationResult> AuthorizeAsync(
|
||||||
ClaimsPrincipal user,
|
ClaimsPrincipal user,
|
||||||
Server server,
|
Server server,
|
||||||
string permissionIdentifier,
|
string permissionIdentifier,
|
||||||
@@ -28,7 +28,7 @@ public class ServerAuthorizeService
|
|||||||
{
|
{
|
||||||
foreach (var authorizationFilter in AuthorizationFilters)
|
foreach (var authorizationFilter in AuthorizationFilters)
|
||||||
{
|
{
|
||||||
var result = await authorizationFilter.Process(
|
var result = await authorizationFilter.ProcessAsync(
|
||||||
user,
|
user,
|
||||||
server,
|
server,
|
||||||
permissionIdentifier,
|
permissionIdentifier,
|
||||||
|
|||||||
@@ -24,54 +24,54 @@ public class ServerFileSystemService
|
|||||||
ServerRepository = serverRepository;
|
ServerRepository = serverRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerFileSystemResponse[]> List(Server server, string path)
|
public async Task<ServerFileSystemResponse[]> ListAsync(Server server, string path)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
return await apiClient.GetJson<ServerFileSystemResponse[]>(
|
return await apiClient.GetJson<ServerFileSystemResponse[]>(
|
||||||
$"api/servers/{server.Id}/files/list?path={path}"
|
$"api/servers/{server.Id}/files/list?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Move(Server server, string oldPath, string newPath)
|
public async Task MoveAsync(Server server, string oldPath, string newPath)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Post(
|
await apiClient.Post(
|
||||||
$"api/servers/{server.Id}/files/move?oldPath={oldPath}&newPath={newPath}"
|
$"api/servers/{server.Id}/files/move?oldPath={oldPath}&newPath={newPath}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Delete(Server server, string path)
|
public async Task DeleteAsync(Server server, string path)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Delete(
|
await apiClient.Delete(
|
||||||
$"api/servers/{server.Id}/files/delete?path={path}"
|
$"api/servers/{server.Id}/files/delete?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Mkdir(Server server, string path)
|
public async Task MkdirAsync(Server server, string path)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Post(
|
await apiClient.Post(
|
||||||
$"api/servers/{server.Id}/files/mkdir?path={path}"
|
$"api/servers/{server.Id}/files/mkdir?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Touch(Server server, string path)
|
public async Task TouchAsync(Server server, string path)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Post(
|
await apiClient.Post(
|
||||||
$"api/servers/{server.Id}/files/touch?path={path}"
|
$"api/servers/{server.Id}/files/touch?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Compress(Server server, CompressType type, string[] items, string destination)
|
public async Task CompressAsync(Server server, CompressType type, string[] items, string destination)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Post(
|
await apiClient.Post(
|
||||||
$"api/servers/{server.Id}/files/compress",
|
$"api/servers/{server.Id}/files/compress",
|
||||||
@@ -84,9 +84,9 @@ public class ServerFileSystemService
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Decompress(Server server, CompressType type, string path, string destination)
|
public async Task DecompressAsync(Server server, CompressType type, string path, string destination)
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Post(
|
await apiClient.Post(
|
||||||
$"api/servers/{server.Id}/files/decompress",
|
$"api/servers/{server.Id}/files/decompress",
|
||||||
@@ -101,7 +101,7 @@ public class ServerFileSystemService
|
|||||||
|
|
||||||
#region Helpers
|
#region Helpers
|
||||||
|
|
||||||
private async Task<HttpApiClient> GetApiClient(Server server)
|
private async Task<HttpApiClient> GetApiClientAsync(Server server)
|
||||||
{
|
{
|
||||||
var serverWithNode = server;
|
var serverWithNode = server;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using MoonCore.Attributes;
|
using MoonCore.Attributes;
|
||||||
using MoonCore.Exceptions;
|
using MoonCore.Exceptions;
|
||||||
@@ -25,11 +24,11 @@ public class ServerService
|
|||||||
|
|
||||||
#region Power Actions
|
#region Power Actions
|
||||||
|
|
||||||
public async Task Start(Server server)
|
public async Task StartAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
await apiClient.Post($"api/servers/{server.Id}/start");
|
await apiClient.Post($"api/servers/{server.Id}/start");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -38,11 +37,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Stop(Server server)
|
public async Task StopAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
await apiClient.Post($"api/servers/{server.Id}/stop");
|
await apiClient.Post($"api/servers/{server.Id}/stop");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -51,11 +50,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Kill(Server server)
|
public async Task KillAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
await apiClient.Post($"api/servers/{server.Id}/kill");
|
await apiClient.Post($"api/servers/{server.Id}/kill");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -66,11 +65,11 @@ public class ServerService
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public async Task Install(Server server)
|
public async Task InstallAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
await apiClient.Post($"api/servers/{server.Id}/install");
|
await apiClient.Post($"api/servers/{server.Id}/install");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -79,11 +78,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Sync(Server server)
|
public async Task SyncAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
await apiClient.Post($"api/servers/{server.Id}/sync");
|
await apiClient.Post($"api/servers/{server.Id}/sync");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -92,11 +91,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SyncDelete(Server server)
|
public async Task SyncDeleteAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
await apiClient.Delete($"api/servers/{server.Id}");
|
await apiClient.Delete($"api/servers/{server.Id}");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -105,11 +104,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerStatusResponse> GetStatus(Server server)
|
public async Task<ServerStatusResponse> GetStatusAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
return await apiClient.GetJson<ServerStatusResponse>($"api/servers/{server.Id}/status");
|
return await apiClient.GetJson<ServerStatusResponse>($"api/servers/{server.Id}/status");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -118,11 +117,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerLogsResponse> GetLogs(Server server)
|
public async Task<ServerLogsResponse> GetLogsAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
return await apiClient.GetJson<ServerLogsResponse>($"api/servers/{server.Id}/logs");
|
return await apiClient.GetJson<ServerLogsResponse>($"api/servers/{server.Id}/logs");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
@@ -131,11 +130,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerStatsResponse> GetStats(Server server)
|
public async Task<ServerStatsResponse> GetStatsAsync(Server server)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
return await apiClient.GetJson<ServerStatsResponse>($"api/servers/{server.Id}/stats");
|
return await apiClient.GetJson<ServerStatsResponse>($"api/servers/{server.Id}/stats");
|
||||||
}
|
}
|
||||||
catch (HttpRequestException)
|
catch (HttpRequestException)
|
||||||
@@ -144,11 +143,11 @@ public class ServerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task RunCommand(Server server, string command)
|
public async Task RunCommandAsync(Server server, string command)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using var apiClient = await GetApiClient(server);
|
using var apiClient = await GetApiClientAsync(server);
|
||||||
|
|
||||||
await apiClient.Post(
|
await apiClient.Post(
|
||||||
$"api/servers/{server.Id}/command",
|
$"api/servers/{server.Id}/command",
|
||||||
@@ -174,7 +173,7 @@ public class ServerService
|
|||||||
return PermissionHelper.HasPermission(user.Permissions, "admin.servers.get");
|
return PermissionHelper.HasPermission(user.Permissions, "admin.servers.get");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<HttpApiClient> GetApiClient(Server server)
|
private async Task<HttpApiClient> GetApiClientAsync(Server server)
|
||||||
{
|
{
|
||||||
var serverWithNode = server;
|
var serverWithNode = server;
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class StarImportExportService
|
|||||||
Logger = logger;
|
Logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> Export(int id)
|
public async Task<string> ExportAsync(int id)
|
||||||
{
|
{
|
||||||
var star = StarRepository
|
var star = StarRepository
|
||||||
.Get()
|
.Get()
|
||||||
@@ -78,20 +78,20 @@ public class StarImportExportService
|
|||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Star> Import(string json)
|
public async Task<Star> ImportAsync(string json)
|
||||||
{
|
{
|
||||||
// Determine which importer to use based on simple patterns
|
// Determine which importer to use based on simple patterns
|
||||||
if (json.Contains("RequiredAllocations"))
|
if (json.Contains("RequiredAllocations"))
|
||||||
return await ImportStar(json);
|
return await ImportStarAsync(json);
|
||||||
else if (json.Contains("AllocationsNeeded"))
|
else if (json.Contains("AllocationsNeeded"))
|
||||||
return await ImportImage(json);
|
return await ImportImageAsync(json);
|
||||||
else if (json.Contains("_comment"))
|
else if (json.Contains("_comment"))
|
||||||
return await ImportEgg(json);
|
return await ImportEggAsync(json);
|
||||||
else
|
else
|
||||||
throw new HttpApiException("Unable to determine the format of the imported star/image/egg", 400);
|
throw new HttpApiException("Unable to determine the format of the imported star/image/egg", 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Star> ImportStar(string json)
|
public async Task<Star> ImportStarAsync(string json)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -138,7 +138,7 @@ public class StarImportExportService
|
|||||||
}).ToList()
|
}).ToList()
|
||||||
};
|
};
|
||||||
|
|
||||||
var finalStar = await StarRepository.Add(star);
|
var finalStar = await StarRepository.AddAsync(star);
|
||||||
|
|
||||||
return finalStar;
|
return finalStar;
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ public class StarImportExportService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Star> ImportImage(string json)
|
public async Task<Star> ImportImageAsync(string json)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -235,7 +235,7 @@ public class StarImportExportService
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
var finalStar = await StarRepository.Add(star);
|
var finalStar = await StarRepository.AddAsync(star);
|
||||||
|
|
||||||
return finalStar;
|
return finalStar;
|
||||||
}
|
}
|
||||||
@@ -246,7 +246,7 @@ public class StarImportExportService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Star> ImportEgg(string json)
|
public async Task<Star> ImportEggAsync(string json)
|
||||||
{
|
{
|
||||||
// Create result
|
// Create result
|
||||||
var star = new Star();
|
var star = new Star();
|
||||||
@@ -403,7 +403,7 @@ public class StarImportExportService
|
|||||||
star.AllowDockerImageChange = true;
|
star.AllowDockerImageChange = true;
|
||||||
|
|
||||||
// Finally save it to the db
|
// Finally save it to the db
|
||||||
var finalStar = await StarRepository.Add(star);
|
var finalStar = await StarRepository.AddAsync(star);
|
||||||
|
|
||||||
return finalStar;
|
return finalStar;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace MoonlightServers.ApiServer.Startup;
|
|||||||
|
|
||||||
public class PluginStartup : IPluginStartup
|
public class PluginStartup : IPluginStartup
|
||||||
{
|
{
|
||||||
public Task BuildApplication(IServiceProvider serviceProvider, IHostApplicationBuilder builder)
|
public Task BuildApplicationAsync(IServiceProvider serviceProvider, IHostApplicationBuilder builder)
|
||||||
{
|
{
|
||||||
// Scan the current plugin assembly for di services
|
// Scan the current plugin assembly for di services
|
||||||
builder.Services.AutoAddServices<PluginStartup>();
|
builder.Services.AutoAddServices<PluginStartup>();
|
||||||
@@ -51,9 +51,9 @@ public class PluginStartup : IPluginStartup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task ConfigureApplication(IServiceProvider serviceProvider, IApplicationBuilder app)
|
public Task ConfigureApplicationAsync(IServiceProvider serviceProvider, IApplicationBuilder app)
|
||||||
=> Task.CompletedTask;
|
=> Task.CompletedTask;
|
||||||
|
|
||||||
public Task ConfigureEndpoints(IServiceProvider serviceProvider, IEndpointRouteBuilder routeBuilder)
|
public Task ConfigureEndpointsAsync(IServiceProvider serviceProvider, IEndpointRouteBuilder routeBuilder)
|
||||||
=> Task.CompletedTask;
|
=> Task.CompletedTask;
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
using MoonCore.Helpers;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.Configuration;
|
namespace MoonlightServers.Daemon.Configuration;
|
||||||
|
|
||||||
public class AppConfiguration
|
public class AppConfiguration
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ public static class ServerConfigurationExtensions
|
|||||||
Variables = response.Variables,
|
Variables = response.Variables,
|
||||||
OnlineDetection = response.OnlineDetection,
|
OnlineDetection = response.OnlineDetection,
|
||||||
DockerImage = response.DockerImage,
|
DockerImage = response.DockerImage,
|
||||||
UseVirtualDisk = response.UseVirtualDisk,
|
|
||||||
Bandwidth = response.Bandwidth,
|
|
||||||
Cpu = response.Cpu,
|
Cpu = response.Cpu,
|
||||||
Disk = response.Disk,
|
Disk = response.Disk,
|
||||||
Memory = response.Memory,
|
Memory = response.Memory,
|
||||||
|
|||||||
@@ -57,18 +57,18 @@ public class HostSystemHelper
|
|||||||
|
|
||||||
#region CPU Usage
|
#region CPU Usage
|
||||||
|
|
||||||
public async Task<CpuUsageDetails> GetCpuUsage()
|
public async Task<CpuUsageDetails> GetCpuUsageAsync()
|
||||||
{
|
{
|
||||||
var result = new CpuUsageDetails();
|
var result = new CpuUsageDetails();
|
||||||
var perCoreUsages = new List<double>();
|
var perCoreUsages = new List<double>();
|
||||||
|
|
||||||
// Initial read
|
// Initial read
|
||||||
var (cpuLastStats, cpuLastSums) = await ReadAllCpuStats();
|
var (cpuLastStats, cpuLastSums) = await ReadAllCpuStatsAsync();
|
||||||
|
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
|
|
||||||
// Second read
|
// Second read
|
||||||
var (cpuNowStats, cpuNowSums) = await ReadAllCpuStats();
|
var (cpuNowStats, cpuNowSums) = await ReadAllCpuStatsAsync();
|
||||||
|
|
||||||
for (var i = 0; i < cpuNowStats.Length; i++)
|
for (var i = 0; i < cpuNowStats.Length; i++)
|
||||||
{
|
{
|
||||||
@@ -94,7 +94,7 @@ public class HostSystemHelper
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<(long[][] cpuStatsList, long[] cpuSums)> ReadAllCpuStats()
|
private async Task<(long[][] cpuStatsList, long[] cpuSums)> ReadAllCpuStatsAsync()
|
||||||
{
|
{
|
||||||
var lines = await File.ReadAllLinesAsync("/proc/stat");
|
var lines = await File.ReadAllLinesAsync("/proc/stat");
|
||||||
|
|
||||||
@@ -128,12 +128,12 @@ public class HostSystemHelper
|
|||||||
|
|
||||||
#region Memory
|
#region Memory
|
||||||
|
|
||||||
public async Task ClearCachedMemory()
|
public async Task ClearCachedMemoryAsync()
|
||||||
{
|
{
|
||||||
await File.WriteAllTextAsync("/proc/sys/vm/drop_caches", "3");
|
await File.WriteAllTextAsync("/proc/sys/vm/drop_caches", "3");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<MemoryUsageDetails> GetMemoryUsage()
|
public async Task<MemoryUsageDetails> GetMemoryUsageAsync()
|
||||||
{
|
{
|
||||||
var details = new MemoryUsageDetails();
|
var details = new MemoryUsageDetails();
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ public class HostSystemHelper
|
|||||||
|
|
||||||
#region Disks
|
#region Disks
|
||||||
|
|
||||||
public async Task<DiskUsageDetails[]> GetDiskUsages()
|
public async Task<DiskUsageDetails[]> GetDiskUsagesAsync()
|
||||||
{
|
{
|
||||||
var details = new List<DiskUsageDetails>();
|
var details = new List<DiskUsageDetails>();
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ using ICSharpCode.SharpZipLib.GZip;
|
|||||||
using ICSharpCode.SharpZipLib.Tar;
|
using ICSharpCode.SharpZipLib.Tar;
|
||||||
using ICSharpCode.SharpZipLib.Zip;
|
using ICSharpCode.SharpZipLib.Zip;
|
||||||
using Mono.Unix.Native;
|
using Mono.Unix.Native;
|
||||||
using MoonCore.Unix.Exceptions;
|
|
||||||
using MoonCore.Unix.SecureFs;
|
using MoonCore.Unix.SecureFs;
|
||||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Servers;
|
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Servers;
|
||||||
using MoonlightServers.DaemonShared.Enums;
|
using MoonlightServers.DaemonShared.Enums;
|
||||||
@@ -19,7 +18,7 @@ public class ServerFileSystem
|
|||||||
FileSystem = fileSystem;
|
FileSystem = fileSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<ServerFileSystemResponse[]> List(string inputPath)
|
public Task<ServerFileSystemResponse[]> ListAsync(string inputPath)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
var entries = FileSystem.ReadDir(path);
|
var entries = FileSystem.ReadDir(path);
|
||||||
@@ -45,7 +44,7 @@ public class ServerFileSystem
|
|||||||
return Task.FromResult(result);
|
return Task.FromResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Move(string inputOldPath, string inputNewPath)
|
public Task MoveAsync(string inputOldPath, string inputNewPath)
|
||||||
{
|
{
|
||||||
var oldPath = Normalize(inputOldPath);
|
var oldPath = Normalize(inputOldPath);
|
||||||
var newPath = Normalize(inputNewPath);
|
var newPath = Normalize(inputNewPath);
|
||||||
@@ -55,7 +54,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Delete(string inputPath)
|
public Task DeleteAsync(string inputPath)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
|
|
||||||
@@ -64,7 +63,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Mkdir(string inputPath)
|
public Task MkdirAsync(string inputPath)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
|
|
||||||
@@ -73,7 +72,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Touch(string inputPath)
|
public Task TouchAsync(string inputPath)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
|
|
||||||
@@ -91,7 +90,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task CreateChunk(string inputPath, long totalSize, long positionToSkip, Stream chunkStream)
|
public Task CreateChunkAsync(string inputPath, long totalSize, long positionToSkip, Stream chunkStream)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
|
|
||||||
@@ -114,7 +113,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Create(string inputPath, Stream dataStream)
|
public Task CreateAsync(string inputPath, Stream dataStream)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
|
|
||||||
@@ -134,7 +133,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Read(string inputPath, Func<Stream, Task> onHandle)
|
public Task ReadAsync(string inputPath, Func<Stream, Task> onHandle)
|
||||||
{
|
{
|
||||||
var path = Normalize(inputPath);
|
var path = Normalize(inputPath);
|
||||||
|
|
||||||
@@ -149,7 +148,7 @@ public class ServerFileSystem
|
|||||||
|
|
||||||
#region Compression
|
#region Compression
|
||||||
|
|
||||||
public Task Compress(string[] itemsInput, string destinationInput, CompressType type)
|
public Task CompressAsync(string[] itemsInput, string destinationInput, CompressType type)
|
||||||
{
|
{
|
||||||
var destination = Normalize(destinationInput);
|
var destination = Normalize(destinationInput);
|
||||||
var items = itemsInput.Select(Normalize);
|
var items = itemsInput.Select(Normalize);
|
||||||
@@ -191,7 +190,7 @@ public class ServerFileSystem
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Decompress(string pathInput, string destinationInput, CompressType type)
|
public Task DecompressAsync(string pathInput, string destinationInput, CompressType type)
|
||||||
{
|
{
|
||||||
var path = Normalize(pathInput);
|
var path = Normalize(pathInput);
|
||||||
var destination = Normalize(destinationInput);
|
var destination = Normalize(destinationInput);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class UnsafeDockerClient
|
|||||||
Configuration = configuration;
|
Configuration = configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<HttpClient> CreateHttpClient()
|
public Task<HttpClient> CreateHttpClientAsync()
|
||||||
{
|
{
|
||||||
var client = new HttpClient(new SocketsHttpHandler()
|
var client = new HttpClient(new SocketsHttpHandler()
|
||||||
{
|
{
|
||||||
@@ -35,9 +35,9 @@ public class UnsafeDockerClient
|
|||||||
return Task.FromResult(client);
|
return Task.FromResult(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DataUsageResponse> GetDataUsage()
|
public async Task<DataUsageResponse> GetDataUsageAsync()
|
||||||
{
|
{
|
||||||
using var client = await CreateHttpClient();
|
using var client = await CreateHttpClientAsync();
|
||||||
var responseJson = await client.GetStringAsync("http://some.random.domain/v1.47/system/df");
|
var responseJson = await client.GetStringAsync("http://some.random.domain/v1.47/system/df");
|
||||||
var response = JsonSerializer.Deserialize<DataUsageResponse>(responseJson)!;
|
var response = JsonSerializer.Deserialize<DataUsageResponse>(responseJson)!;
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public class PowerController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("start")]
|
[HttpPost("start")]
|
||||||
public async Task<ActionResult> Start([FromRoute] int id)
|
public async Task<ActionResult> StartAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = ServerService.GetById(id);
|
var server = ServerService.GetById(id);
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ public class PowerController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("stop")]
|
[HttpPost("stop")]
|
||||||
public async Task<ActionResult> Stop([FromRoute] int id)
|
public async Task<ActionResult> StopAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = ServerService.GetById(id);
|
var server = ServerService.GetById(id);
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ public class PowerController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("kill")]
|
[HttpPost("kill")]
|
||||||
public async Task<ActionResult> Kill([FromRoute] int id)
|
public async Task<ActionResult> KillAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = ServerService.GetById(id);
|
var server = ServerService.GetById(id);
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ public class PowerController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("install")]
|
[HttpPost("install")]
|
||||||
public async Task<ActionResult> Install([FromRoute] int id)
|
public async Task<ActionResult> InstallAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = ServerService.GetById(id);
|
var server = ServerService.GetById(id);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ using MoonlightServers.Daemon.Mappers;
|
|||||||
using MoonlightServers.Daemon.Services;
|
using MoonlightServers.Daemon.Services;
|
||||||
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Servers;
|
using MoonlightServers.DaemonShared.DaemonSide.Http.Responses.Servers;
|
||||||
using MoonlightServers.DaemonShared.Enums;
|
using MoonlightServers.DaemonShared.Enums;
|
||||||
using MoonlightServers.DaemonShared.PanelSide.Http.Responses;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
namespace MoonlightServers.Daemon.Http.Controllers.Servers;
|
||||||
|
|
||||||
@@ -21,14 +20,14 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("sync")]
|
[HttpPost("sync")]
|
||||||
public async Task<ActionResult> Sync([FromRoute] int id)
|
public async Task<ActionResult> SyncAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
await ServerService.InitializeById(id);
|
await ServerService.InitializeByIdAsync(id);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("status")]
|
[HttpGet("status")]
|
||||||
public async Task<ActionResult<ServerStatusResponse>> Status([FromRoute] int id)
|
public async Task<ActionResult<ServerStatusResponse>> StatusAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = ServerService.GetById(id);
|
var server = ServerService.GetById(id);
|
||||||
|
|
||||||
@@ -42,7 +41,7 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("logs")]
|
[HttpGet("logs")]
|
||||||
public async Task<ActionResult<ServerLogsResponse>> Logs([FromRoute] int id)
|
public async Task<ActionResult<ServerLogsResponse>> LogsAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
var server = ServerService.GetById(id);
|
var server = ServerService.GetById(id);
|
||||||
|
|
||||||
@@ -58,7 +57,7 @@ public class ServersController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("stats")]
|
[HttpGet("stats")]
|
||||||
public async Task<ServerStatsResponse> GetStats([FromRoute] int id)
|
public async Task<ServerStatsResponse> GetStatsAsync([FromRoute] int id)
|
||||||
{
|
{
|
||||||
return new ServerStatsResponse()
|
return new ServerStatsResponse()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,17 +18,17 @@ public class StatisticsController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<StatisticsResponse> Get()
|
public async Task<StatisticsResponse> GetAsync()
|
||||||
{
|
{
|
||||||
var response = new StatisticsResponse();
|
var response = new StatisticsResponse();
|
||||||
|
|
||||||
var cpuUsage = await HostSystemHelper.GetCpuUsage();
|
var cpuUsage = await HostSystemHelper.GetCpuUsageAsync();
|
||||||
|
|
||||||
response.Cpu.Model = cpuUsage.Model;
|
response.Cpu.Model = cpuUsage.Model;
|
||||||
response.Cpu.Usage = cpuUsage.OverallUsage;
|
response.Cpu.Usage = cpuUsage.OverallUsage;
|
||||||
response.Cpu.UsagePerCore = cpuUsage.PerCoreUsage;
|
response.Cpu.UsagePerCore = cpuUsage.PerCoreUsage;
|
||||||
|
|
||||||
var memoryUsage = await HostSystemHelper.GetMemoryUsage();
|
var memoryUsage = await HostSystemHelper.GetMemoryUsageAsync();
|
||||||
|
|
||||||
response.Memory.Available = memoryUsage.Available;
|
response.Memory.Available = memoryUsage.Available;
|
||||||
response.Memory.Cached = memoryUsage.Cached;
|
response.Memory.Cached = memoryUsage.Cached;
|
||||||
@@ -37,7 +37,7 @@ public class StatisticsController : Controller
|
|||||||
response.Memory.SwapTotal = memoryUsage.SwapTotal;
|
response.Memory.SwapTotal = memoryUsage.SwapTotal;
|
||||||
response.Memory.SwapFree = memoryUsage.SwapFree;
|
response.Memory.SwapFree = memoryUsage.SwapFree;
|
||||||
|
|
||||||
var diskDetails = await HostSystemHelper.GetDiskUsages();
|
var diskDetails = await HostSystemHelper.GetDiskUsagesAsync();
|
||||||
|
|
||||||
response.Disks = diskDetails.Select(x => new StatisticsResponse.DiskData()
|
response.Disks = diskDetails.Select(x => new StatisticsResponse.DiskData()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ public class StatisticsDockerController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<StatisticsDockerResponse> Get()
|
public async Task<StatisticsDockerResponse> GetAsync()
|
||||||
{
|
{
|
||||||
var usage = await DockerInfoService.GetDataUsage();
|
var usage = await DockerInfoService.GetDataUsageAsync();
|
||||||
|
|
||||||
return new StatisticsDockerResponse
|
return new StatisticsDockerResponse
|
||||||
{
|
{
|
||||||
Version = await DockerInfoService.GetDockerVersion(),
|
Version = await DockerInfoService.GetDockerVersionAsync(),
|
||||||
ContainersReclaimable = usage.Containers.Reclaimable,
|
ContainersReclaimable = usage.Containers.Reclaimable,
|
||||||
ContainersUsed = usage.Containers.Used,
|
ContainersUsed = usage.Containers.Used,
|
||||||
BuildCacheReclaimable = usage.BuildCache.Reclaimable,
|
BuildCacheReclaimable = usage.BuildCache.Reclaimable,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class SystemStatusController : Controller
|
|||||||
RemoteService = remoteService;
|
RemoteService = remoteService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SystemStatusResponse> Get()
|
public async Task<SystemStatusResponse> GetAsync()
|
||||||
{
|
{
|
||||||
SystemStatusResponse response;
|
SystemStatusResponse response;
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ public class SystemStatusController : Controller
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await RemoteService.GetStatus();
|
await RemoteService.GetStatusAsync();
|
||||||
|
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ public class ServerConfigurationMapper
|
|||||||
Variables = response.Variables,
|
Variables = response.Variables,
|
||||||
OnlineDetection = response.OnlineDetection,
|
OnlineDetection = response.OnlineDetection,
|
||||||
DockerImage = response.DockerImage,
|
DockerImage = response.DockerImage,
|
||||||
UseVirtualDisk = response.UseVirtualDisk,
|
|
||||||
Bandwidth = response.Bandwidth,
|
|
||||||
Cpu = response.Cpu,
|
Cpu = response.Cpu,
|
||||||
Disk = response.Disk,
|
Disk = response.Disk,
|
||||||
Memory = response.Memory,
|
Memory = response.Memory,
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ public class ServerConfiguration
|
|||||||
public int Cpu { get; set; }
|
public int Cpu { get; set; }
|
||||||
public int Memory { get; set; }
|
public int Memory { get; set; }
|
||||||
public int Disk { get; set; }
|
public int Disk { get; set; }
|
||||||
public int Bandwidth { get; set; }
|
|
||||||
public bool UseVirtualDisk { get; set; }
|
|
||||||
|
|
||||||
// Start, Stop & Status
|
// Start, Stop & Status
|
||||||
public string StartupCommand { get; set; }
|
public string StartupCommand { get; set; }
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public class ServerConsole
|
|||||||
MaxMessagesInCache = maxMessagesInCache;
|
MaxMessagesInCache = maxMessagesInCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task WriteToOutput(string content)
|
public async Task WriteToOutputAsync(string content)
|
||||||
{
|
{
|
||||||
lock (MessageCache)
|
lock (MessageCache)
|
||||||
{
|
{
|
||||||
@@ -32,7 +32,7 @@ public class ServerConsole
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task WriteToInput(string content)
|
public async Task WriteToInputAsync(string content)
|
||||||
{
|
{
|
||||||
if (OnInput != null)
|
if (OnInput != null)
|
||||||
await OnInput.Invoke(content);
|
await OnInput.Invoke(content);
|
||||||
|
|||||||
@@ -8,9 +8,10 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Docker.DotNet" Version="3.125.15" />
|
<PackageReference Include="Docker.DotNet" Version="3.125.15" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.9" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0" />
|
||||||
<PackageReference Include="MoonCore" Version="1.9.7" />
|
<PackageReference Include="MoonCore" Version="2.0.1" />
|
||||||
<PackageReference Include="MoonCore.Extended" Version="1.3.7" />
|
<PackageReference Include="MoonCore.Extended" Version="1.4.0" />
|
||||||
<PackageReference Include="MoonCore.Unix" Version="1.0.8" />
|
<PackageReference Include="MoonCore.Unix" Version="1.0.8" />
|
||||||
<PackageReference Include="SharpZipLib" Version="1.4.2" />
|
<PackageReference Include="SharpZipLib" Version="1.4.2" />
|
||||||
<PackageReference Include="Stateless" Version="5.19.0" />
|
<PackageReference Include="Stateless" Version="5.19.0" />
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ using MoonlightServers.Daemon;
|
|||||||
|
|
||||||
var startup = new Startup();
|
var startup = new Startup();
|
||||||
|
|
||||||
await startup.Run(args);
|
await startup.RunAsync(args);
|
||||||
@@ -57,17 +57,17 @@ public class DockerConsole : IConsole
|
|||||||
{
|
{
|
||||||
var containerName = string.Format(DockerConstants.RuntimeNameTemplate, Context.Configuration.Id);
|
var containerName = string.Format(DockerConstants.RuntimeNameTemplate, Context.Configuration.Id);
|
||||||
|
|
||||||
await AttachToContainer(containerName);
|
await AttachToContainerAsync(containerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task AttachInstallationAsync()
|
public async Task AttachInstallationAsync()
|
||||||
{
|
{
|
||||||
var containerName = string.Format(DockerConstants.InstallationNameTemplate, Context.Configuration.Id);
|
var containerName = string.Format(DockerConstants.InstallationNameTemplate, Context.Configuration.Id);
|
||||||
|
|
||||||
await AttachToContainer(containerName);
|
await AttachToContainerAsync(containerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AttachToContainer(string containerName)
|
private async Task AttachToContainerAsync(string containerName)
|
||||||
{
|
{
|
||||||
var cts = new CancellationTokenSource();
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
@@ -171,17 +171,17 @@ public class DockerConsole : IConsole
|
|||||||
{
|
{
|
||||||
var containerName = string.Format(DockerConstants.RuntimeNameTemplate, Context.Configuration.Id);
|
var containerName = string.Format(DockerConstants.RuntimeNameTemplate, Context.Configuration.Id);
|
||||||
|
|
||||||
await FetchFromContainer(containerName);
|
await FetchFromContainerAsync(containerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task FetchInstallationAsync()
|
public async Task FetchInstallationAsync()
|
||||||
{
|
{
|
||||||
var containerName = string.Format(DockerConstants.InstallationNameTemplate, Context.Configuration.Id);
|
var containerName = string.Format(DockerConstants.InstallationNameTemplate, Context.Configuration.Id);
|
||||||
|
|
||||||
await FetchFromContainer(containerName);
|
await FetchFromContainerAsync(containerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task FetchFromContainer(string containerName)
|
private async Task FetchFromContainerAsync(string containerName)
|
||||||
{
|
{
|
||||||
var logStream = await DockerClient.Containers.GetContainerLogsAsync(containerName, true, new()
|
var logStream = await DockerClient.Containers.GetContainerLogsAsync(containerName, true, new()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class DockerInstallation : IInstallation
|
|||||||
// Docker image
|
// Docker image
|
||||||
await Reporter.StatusAsync("Downloading docker image");
|
await Reporter.StatusAsync("Downloading docker image");
|
||||||
|
|
||||||
await ImageService.Download(data.DockerImage, async status => { await Reporter.StatusAsync(status); });
|
await ImageService.DownloadAsync(data.DockerImage, async status => { await Reporter.StatusAsync(status); });
|
||||||
|
|
||||||
await Reporter.StatusAsync("Downloaded docker image");
|
await Reporter.StatusAsync("Downloaded docker image");
|
||||||
|
|
||||||
@@ -159,7 +159,7 @@ public class DockerInstallation : IInstallation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IAsyncDisposable> SubscribeExited(Func<int, ValueTask> callback)
|
public async Task<IAsyncDisposable> SubscribeExitedAsync(Func<int, ValueTask> callback)
|
||||||
=> await ExitEventSource.SubscribeAsync(callback);
|
=> await ExitEventSource.SubscribeAsync(callback);
|
||||||
|
|
||||||
public async Task RestoreAsync()
|
public async Task RestoreAsync()
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public class DockerRuntime : IRuntime
|
|||||||
// Docker image
|
// Docker image
|
||||||
await Reporter.StatusAsync("Downloading docker image");
|
await Reporter.StatusAsync("Downloading docker image");
|
||||||
|
|
||||||
await ImageService.Download(
|
await ImageService.DownloadAsync(
|
||||||
Context.Configuration.DockerImage,
|
Context.Configuration.DockerImage,
|
||||||
async status => { await Reporter.StatusAsync(status); }
|
async status => { await Reporter.StatusAsync(status); }
|
||||||
);
|
);
|
||||||
@@ -152,7 +152,7 @@ public class DockerRuntime : IRuntime
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IAsyncDisposable> SubscribeExited(Func<int, ValueTask> callback)
|
public async Task<IAsyncDisposable> SubscribeExitedAsync(Func<int, ValueTask> callback)
|
||||||
=> await ExitEventSource.SubscribeAsync(callback);
|
=> await ExitEventSource.SubscribeAsync(callback);
|
||||||
|
|
||||||
public async Task RestoreAsync()
|
public async Task RestoreAsync()
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class InstallationHandler : IServerStateHandler
|
|||||||
await Server.Installation.CreateAsync(runtimePath, installationPath, installData);
|
await Server.Installation.CreateAsync(runtimePath, installationPath, installData);
|
||||||
|
|
||||||
if (ExitSubscription == null)
|
if (ExitSubscription == null)
|
||||||
ExitSubscription = await Server.Installation.SubscribeExited(OnInstallationExited);
|
ExitSubscription = await Server.Installation.SubscribeExitedAsync(OnInstallationExited);
|
||||||
|
|
||||||
// 6. Attach console
|
// 6. Attach console
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public class StartupHandler : IServerStateHandler
|
|||||||
await Server.Runtime.CreateAsync(hostPath);
|
await Server.Runtime.CreateAsync(hostPath);
|
||||||
|
|
||||||
if (ExitSubscription == null)
|
if (ExitSubscription == null)
|
||||||
ExitSubscription = await Server.Runtime.SubscribeExited(OnRuntimeExited);
|
ExitSubscription = await Server.Runtime.SubscribeExitedAsync(OnRuntimeExited);
|
||||||
|
|
||||||
// 6. Attach console
|
// 6. Attach console
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public interface IInstallation : IServerComponent
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">Callback to invoke whenever the installation exists</param>
|
/// <param name="callback">Callback to invoke whenever the installation exists</param>
|
||||||
/// <returns>Subscription disposable to unsubscribe from the event</returns>
|
/// <returns>Subscription disposable to unsubscribe from the event</returns>
|
||||||
public Task<IAsyncDisposable> SubscribeExited(Func<int, ValueTask> callback);
|
public Task<IAsyncDisposable> SubscribeExitedAsync(Func<int, ValueTask> callback);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Connects an existing installation to this abstraction in order to restore it.
|
/// Connects an existing installation to this abstraction in order to restore it.
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public interface IRuntime : IServerComponent
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">Callback gets invoked whenever the runtime exites</param>
|
/// <param name="callback">Callback gets invoked whenever the runtime exites</param>
|
||||||
/// <returns>Subscription disposable to unsubscribe from the event</returns>
|
/// <returns>Subscription disposable to unsubscribe from the event</returns>
|
||||||
public Task<IAsyncDisposable> SubscribeExited(Func<int, ValueTask> callback);
|
public Task<IAsyncDisposable> SubscribeExitedAsync(Func<int, ValueTask> callback);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Connects an existing runtime to this abstraction in order to restore it.
|
/// Connects an existing runtime to this abstraction in order to restore it.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using MoonlightServers.Daemon.Models.Cache;
|
using MoonlightServers.Daemon.Models.Cache;
|
||||||
using MoonlightServers.Daemon.ServerSystem.Interfaces;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.ServerSystem.Models;
|
namespace MoonlightServers.Daemon.ServerSystem.Models;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Collections;
|
|
||||||
using MoonlightServers.Daemon.ServerSystem.Enums;
|
using MoonlightServers.Daemon.ServerSystem.Enums;
|
||||||
using MoonlightServers.Daemon.ServerSystem.Interfaces;
|
using MoonlightServers.Daemon.ServerSystem.Interfaces;
|
||||||
using MoonlightServers.Daemon.ServerSystem.Models;
|
using MoonlightServers.Daemon.ServerSystem.Models;
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
using System.Reactive.Concurrency;
|
|
||||||
using System.Reactive.Linq;
|
|
||||||
using System.Reactive.Subjects;
|
|
||||||
using Docker.DotNet;
|
using Docker.DotNet;
|
||||||
using Docker.DotNet.Models;
|
using Docker.DotNet.Models;
|
||||||
using MoonCore.Events;
|
using MoonCore.Events;
|
||||||
using MoonCore.Observability;
|
|
||||||
using MoonlightServers.Daemon.Helpers;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.Services;
|
namespace MoonlightServers.Daemon.Services;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class DockerImageService
|
|||||||
Logger = logger;
|
Logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Download(string name, Action<string>? onProgressUpdated = null)
|
public async Task DownloadAsync(string name, Action<string>? onProgressUpdated = null)
|
||||||
{
|
{
|
||||||
// If there is already a download for this image occuring, we want to wait for this to complete instead
|
// If there is already a download for this image occuring, we want to wait for this to complete instead
|
||||||
// of calling docker to download it again
|
// of calling docker to download it again
|
||||||
|
|||||||
@@ -17,16 +17,16 @@ public class DockerInfoService
|
|||||||
UnsafeDockerClient = unsafeDockerClient;
|
UnsafeDockerClient = unsafeDockerClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> GetDockerVersion()
|
public async Task<string> GetDockerVersionAsync()
|
||||||
{
|
{
|
||||||
var version = await DockerClient.System.GetVersionAsync();
|
var version = await DockerClient.System.GetVersionAsync();
|
||||||
|
|
||||||
return $"{version.Version} commit {version.GitCommit} ({version.APIVersion})";
|
return $"{version.Version} commit {version.GitCommit} ({version.APIVersion})";
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<UsageDataReport> GetDataUsage()
|
public async Task<UsageDataReport> GetDataUsageAsync()
|
||||||
{
|
{
|
||||||
var response = await UnsafeDockerClient.GetDataUsage();
|
var response = await UnsafeDockerClient.GetDataUsageAsync();
|
||||||
|
|
||||||
var report = new UsageDataReport()
|
var report = new UsageDataReport()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
using System.IdentityModel.Tokens.Jwt;
|
|
||||||
using System.Text;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using MoonCore.Attributes;
|
using MoonCore.Attributes;
|
||||||
using MoonCore.Helpers;
|
using MoonCore.Helpers;
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
@@ -19,26 +16,26 @@ public class RemoteService
|
|||||||
ApiClient = CreateHttpClient(configuration);
|
ApiClient = CreateHttpClient(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task GetStatus()
|
public async Task GetStatusAsync()
|
||||||
{
|
{
|
||||||
await ApiClient.Get("api/remote/servers/node/trip");
|
await ApiClient.Get("api/remote/servers/node/trip");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagedData<ServerDataResponse>> GetServers(int page, int perPage)
|
public async Task<CountedData<ServerDataResponse>> GetServersAsync(int startIndex, int count)
|
||||||
{
|
{
|
||||||
return await ApiClient.GetJson<PagedData<ServerDataResponse>>(
|
return await ApiClient.GetJson<CountedData<ServerDataResponse>>(
|
||||||
$"api/remote/servers?page={page}&pageSize={perPage}"
|
$"api/remote/servers?startIndex={startIndex}&count={count}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerDataResponse> GetServer(int serverId)
|
public async Task<ServerDataResponse> GetServerAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await ApiClient.GetJson<ServerDataResponse>(
|
return await ApiClient.GetJson<ServerDataResponse>(
|
||||||
$"api/remote/servers/{serverId}"
|
$"api/remote/servers/{serverId}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerInstallDataResponse> GetServerInstallation(int serverId)
|
public async Task<ServerInstallDataResponse> GetServerInstallationAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await ApiClient.GetJson<ServerInstallDataResponse>(
|
return await ApiClient.GetJson<ServerInstallDataResponse>(
|
||||||
$"api/remote/servers/{serverId}/install"
|
$"api/remote/servers/{serverId}/install"
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using MoonCore.Helpers;
|
|
||||||
using MoonCore.Models;
|
using MoonCore.Models;
|
||||||
using MoonlightServers.Daemon.Mappers;
|
using MoonlightServers.Daemon.Mappers;
|
||||||
using MoonlightServers.Daemon.Models.Cache;
|
using MoonlightServers.Daemon.Models.Cache;
|
||||||
@@ -32,7 +31,7 @@ public class ServerService : IHostedLifecycleService
|
|||||||
public Server? GetById(int id)
|
public Server? GetById(int id)
|
||||||
=> Servers.GetValueOrDefault(id);
|
=> Servers.GetValueOrDefault(id);
|
||||||
|
|
||||||
public async Task Initialize(ServerConfiguration configuration)
|
public async Task InitializeAsync(ServerConfiguration configuration)
|
||||||
{
|
{
|
||||||
var existingServer = Servers.GetValueOrDefault(configuration.Id);
|
var existingServer = Servers.GetValueOrDefault(configuration.Id);
|
||||||
|
|
||||||
@@ -50,20 +49,20 @@ public class ServerService : IHostedLifecycleService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task InitializeById(int id)
|
public async Task InitializeByIdAsync(int id)
|
||||||
{
|
{
|
||||||
var serverData = await RemoteService.GetServer(id);
|
var serverData = await RemoteService.GetServerAsync(id);
|
||||||
var config = ConfigurationMapper.FromServerDataResponse(serverData);
|
var config = ConfigurationMapper.FromServerDataResponse(serverData);
|
||||||
|
|
||||||
await Initialize(config);
|
await InitializeAsync(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task InitializeAll()
|
private async Task InitializeAllAsync()
|
||||||
{
|
{
|
||||||
Logger.LogDebug("Initialing servers from panel");
|
Logger.LogDebug("Initialing servers from panel");
|
||||||
|
|
||||||
var servers = await PagedData<ServerDataResponse>.All(async (page, pageSize) =>
|
var servers = await CountedData<ServerDataResponse>.LoadAllAsync(async (startIndex, count) =>
|
||||||
await RemoteService.GetServers(page, pageSize)
|
await RemoteService.GetServersAsync(startIndex, count)
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach (var serverData in servers)
|
foreach (var serverData in servers)
|
||||||
@@ -72,7 +71,7 @@ public class ServerService : IHostedLifecycleService
|
|||||||
{
|
{
|
||||||
var config = ConfigurationMapper.FromServerDataResponse(serverData);
|
var config = ConfigurationMapper.FromServerDataResponse(serverData);
|
||||||
|
|
||||||
await Initialize(config);
|
await InitializeAsync(config);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -91,7 +90,7 @@ public class ServerService : IHostedLifecycleService
|
|||||||
|
|
||||||
public async Task StartedAsync(CancellationToken cancellationToken)
|
public async Task StartedAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await InitializeAll();
|
await InitializeAllAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StartingAsync(CancellationToken cancellationToken)
|
public Task StartingAsync(CancellationToken cancellationToken)
|
||||||
|
|||||||
@@ -14,11 +14,7 @@ using MoonlightServers.Daemon.Http.Hubs;
|
|||||||
using MoonlightServers.Daemon.Mappers;
|
using MoonlightServers.Daemon.Mappers;
|
||||||
using MoonlightServers.Daemon.Models.Cache;
|
using MoonlightServers.Daemon.Models.Cache;
|
||||||
using MoonlightServers.Daemon.ServerSystem;
|
using MoonlightServers.Daemon.ServerSystem;
|
||||||
using MoonlightServers.Daemon.ServerSystem.Docker;
|
|
||||||
using MoonlightServers.Daemon.ServerSystem.Enums;
|
using MoonlightServers.Daemon.ServerSystem.Enums;
|
||||||
using MoonlightServers.Daemon.ServerSystem.FileSystems;
|
|
||||||
using MoonlightServers.Daemon.ServerSystem.Handlers;
|
|
||||||
using MoonlightServers.Daemon.ServerSystem.Implementations;
|
|
||||||
using MoonlightServers.Daemon.ServerSystem.Models;
|
using MoonlightServers.Daemon.ServerSystem.Models;
|
||||||
using MoonlightServers.Daemon.Services;
|
using MoonlightServers.Daemon.Services;
|
||||||
|
|
||||||
@@ -40,35 +36,35 @@ public class Startup
|
|||||||
private WebApplication WebApplication;
|
private WebApplication WebApplication;
|
||||||
private WebApplicationBuilder WebApplicationBuilder;
|
private WebApplicationBuilder WebApplicationBuilder;
|
||||||
|
|
||||||
public async Task Run(string[] args)
|
public async Task RunAsync(string[] args)
|
||||||
{
|
{
|
||||||
Args = args;
|
Args = args;
|
||||||
|
|
||||||
await SetupStorage();
|
await SetupStorageAsync();
|
||||||
await SetupAppConfiguration();
|
await SetupAppConfigurationAsync();
|
||||||
await SetupLogging();
|
await SetupLoggingAsync();
|
||||||
|
|
||||||
await CreateWebApplicationBuilder();
|
await CreateWebApplicationBuilderAsync();
|
||||||
|
|
||||||
await ConfigureKestrel();
|
await ConfigureKestrelAsync();
|
||||||
await RegisterAppConfiguration();
|
await RegisterAppConfigurationAsync();
|
||||||
await RegisterLogging();
|
await RegisterLoggingAsync();
|
||||||
await RegisterBase();
|
await RegisterBaseAsync();
|
||||||
await RegisterAuth();
|
await RegisterAuthAsync();
|
||||||
await RegisterDocker();
|
await RegisterDockerAsync();
|
||||||
await RegisterServers();
|
await RegisterServersAsync();
|
||||||
await RegisterSignalR();
|
await RegisterSignalRAsync();
|
||||||
await RegisterCors();
|
await RegisterCorsAsync();
|
||||||
|
|
||||||
await BuildWebApplication();
|
await BuildWebApplicationAsync();
|
||||||
|
|
||||||
await UseBase();
|
await UseBaseAsync();
|
||||||
await UseCors();
|
await UseCorsAsync();
|
||||||
await UseAuth();
|
await UseAuthAsync();
|
||||||
await UseBaseMiddleware();
|
await UseBaseMiddlewareAsync();
|
||||||
|
|
||||||
await MapBase();
|
await MapBaseAsync();
|
||||||
await MapHubs();
|
await MapHubsAsync();
|
||||||
|
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
@@ -93,8 +89,6 @@ public class Startup
|
|||||||
"java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}",
|
"java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}",
|
||||||
DockerImage = "ghcr.io/nexocrew-hq/moonlightdockerimages:java21",
|
DockerImage = "ghcr.io/nexocrew-hq/moonlightdockerimages:java21",
|
||||||
StopCommand = "stop",
|
StopCommand = "stop",
|
||||||
UseVirtualDisk = false,
|
|
||||||
Bandwidth = 0,
|
|
||||||
Variables = new Dictionary<string, string>()
|
Variables = new Dictionary<string, string>()
|
||||||
{
|
{
|
||||||
{ "SERVER_JARFILE", "server.jar" },
|
{ "SERVER_JARFILE", "server.jar" },
|
||||||
@@ -139,7 +133,7 @@ public class Startup
|
|||||||
await WebApplication.RunAsync();
|
await WebApplication.RunAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task SetupStorage()
|
private Task SetupStorageAsync()
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory("storage");
|
Directory.CreateDirectory("storage");
|
||||||
Directory.CreateDirectory(Path.Combine("storage", "logs"));
|
Directory.CreateDirectory(Path.Combine("storage", "logs"));
|
||||||
@@ -149,7 +143,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Base
|
#region Base
|
||||||
|
|
||||||
private Task RegisterBase()
|
private Task RegisterBaseAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder.Services.AutoAddServices<Startup>();
|
WebApplicationBuilder.Services.AutoAddServices<Startup>();
|
||||||
WebApplicationBuilder.Services.AddControllers();
|
WebApplicationBuilder.Services.AddControllers();
|
||||||
@@ -159,7 +153,7 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task ConfigureKestrel()
|
private Task ConfigureKestrelAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder.WebHost.ConfigureKestrel(options =>
|
WebApplicationBuilder.WebHost.ConfigureKestrel(options =>
|
||||||
{
|
{
|
||||||
@@ -170,7 +164,7 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task UseBase()
|
private Task UseBaseAsync()
|
||||||
{
|
{
|
||||||
WebApplication.UseRouting();
|
WebApplication.UseRouting();
|
||||||
WebApplication.UseExceptionHandler();
|
WebApplication.UseExceptionHandler();
|
||||||
@@ -178,12 +172,12 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task UseBaseMiddleware()
|
private Task UseBaseMiddlewareAsync()
|
||||||
{
|
{
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task MapBase()
|
private Task MapBaseAsync()
|
||||||
{
|
{
|
||||||
WebApplication.MapControllers();
|
WebApplication.MapControllers();
|
||||||
|
|
||||||
@@ -194,7 +188,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Docker
|
#region Docker
|
||||||
|
|
||||||
private Task RegisterDocker()
|
private Task RegisterDockerAsync()
|
||||||
{
|
{
|
||||||
var dockerClient = new DockerClientConfiguration(
|
var dockerClient = new DockerClientConfiguration(
|
||||||
new Uri(Configuration.Docker.Uri)
|
new Uri(Configuration.Docker.Uri)
|
||||||
@@ -213,7 +207,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Configurations
|
#region Configurations
|
||||||
|
|
||||||
private async Task SetupAppConfiguration()
|
private async Task SetupAppConfigurationAsync()
|
||||||
{
|
{
|
||||||
var configurationBuilder = new ConfigurationBuilder();
|
var configurationBuilder = new ConfigurationBuilder();
|
||||||
|
|
||||||
@@ -235,7 +229,7 @@ public class Startup
|
|||||||
Configuration = configurationRoot.Get<AppConfiguration>()!;
|
Configuration = configurationRoot.Get<AppConfiguration>()!;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task RegisterAppConfiguration()
|
private Task RegisterAppConfigurationAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder.Services.AddSingleton(Configuration);
|
WebApplicationBuilder.Services.AddSingleton(Configuration);
|
||||||
|
|
||||||
@@ -246,13 +240,13 @@ public class Startup
|
|||||||
|
|
||||||
#region Web Application
|
#region Web Application
|
||||||
|
|
||||||
private Task CreateWebApplicationBuilder()
|
private Task CreateWebApplicationBuilderAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder = WebApplication.CreateBuilder(Args);
|
WebApplicationBuilder = WebApplication.CreateBuilder(Args);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task BuildWebApplication()
|
private Task BuildWebApplicationAsync()
|
||||||
{
|
{
|
||||||
WebApplication = WebApplicationBuilder.Build();
|
WebApplication = WebApplicationBuilder.Build();
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
@@ -262,7 +256,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Logging
|
#region Logging
|
||||||
|
|
||||||
private Task SetupLogging()
|
private Task SetupLoggingAsync()
|
||||||
{
|
{
|
||||||
LoggerFactory = new LoggerFactory();
|
LoggerFactory = new LoggerFactory();
|
||||||
LoggerFactory.AddAnsiConsole();
|
LoggerFactory.AddAnsiConsole();
|
||||||
@@ -272,7 +266,7 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RegisterLogging()
|
private async Task RegisterLoggingAsync()
|
||||||
{
|
{
|
||||||
// Configure application logging
|
// Configure application logging
|
||||||
WebApplicationBuilder.Logging.ClearProviders();
|
WebApplicationBuilder.Logging.ClearProviders();
|
||||||
@@ -323,7 +317,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Servers
|
#region Servers
|
||||||
|
|
||||||
private Task RegisterServers()
|
private Task RegisterServersAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder.Services.AddScoped<ServerContext>();
|
WebApplicationBuilder.Services.AddScoped<ServerContext>();
|
||||||
WebApplicationBuilder.Services.AddSingleton<ServerFactory>();
|
WebApplicationBuilder.Services.AddSingleton<ServerFactory>();
|
||||||
@@ -335,7 +329,7 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task UseServers()
|
private Task UseServersAsync()
|
||||||
{
|
{
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
@@ -344,13 +338,13 @@ public class Startup
|
|||||||
|
|
||||||
#region Hubs
|
#region Hubs
|
||||||
|
|
||||||
private Task RegisterSignalR()
|
private Task RegisterSignalRAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder.Services.AddSignalR();
|
WebApplicationBuilder.Services.AddSignalR();
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task MapHubs()
|
private Task MapHubsAsync()
|
||||||
{
|
{
|
||||||
WebApplication.MapHub<ServerWebSocketHub>("api/servers/ws", options =>
|
WebApplication.MapHub<ServerWebSocketHub>("api/servers/ws", options =>
|
||||||
{
|
{
|
||||||
@@ -365,7 +359,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Cors
|
#region Cors
|
||||||
|
|
||||||
private Task RegisterCors()
|
private Task RegisterCorsAsync()
|
||||||
{
|
{
|
||||||
//TODO: IMPORTANT: CHANGE !!!
|
//TODO: IMPORTANT: CHANGE !!!
|
||||||
WebApplicationBuilder.Services.AddCors(x =>
|
WebApplicationBuilder.Services.AddCors(x =>
|
||||||
@@ -380,7 +374,7 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task UseCors()
|
private Task UseCorsAsync()
|
||||||
{
|
{
|
||||||
WebApplication.UseCors();
|
WebApplication.UseCors();
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
@@ -390,7 +384,7 @@ public class Startup
|
|||||||
|
|
||||||
#region Authentication
|
#region Authentication
|
||||||
|
|
||||||
private Task RegisterAuth()
|
private Task RegisterAuthAsync()
|
||||||
{
|
{
|
||||||
WebApplicationBuilder.Services
|
WebApplicationBuilder.Services
|
||||||
.AddAuthentication("token")
|
.AddAuthentication("token")
|
||||||
@@ -461,7 +455,7 @@ public class Startup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task UseAuth()
|
private Task UseAuthAsync()
|
||||||
{
|
{
|
||||||
WebApplication.UseAuthentication();
|
WebApplication.UseAuthentication();
|
||||||
WebApplication.UseAuthorization();
|
WebApplication.UseAuthorization();
|
||||||
|
|||||||
@@ -14,9 +14,6 @@ public class ServerDataResponse
|
|||||||
public int Memory { get; set; }
|
public int Memory { get; set; }
|
||||||
public int Disk { get; set; }
|
public int Disk { get; set; }
|
||||||
|
|
||||||
public bool UseVirtualDisk { get; set; }
|
|
||||||
public int Bandwidth { get; set; }
|
|
||||||
|
|
||||||
public AllocationDataResponse[] Allocations { get; set; }
|
public AllocationDataResponse[] Allocations { get; set; }
|
||||||
public Dictionary<string, string> Variables { get; set; }
|
public Dictionary<string, string> Variables { get; set; }
|
||||||
}
|
}
|
||||||
@@ -7,8 +7,8 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.5"/>
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.9"/>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.5" PrivateAssets="all"/>
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.9" PrivateAssets="all"/>
|
||||||
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.8" />
|
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.8" />
|
||||||
<PackageReference Include="MoonCore.PluginFramework.Generator" Version="1.0.2" />
|
<PackageReference Include="MoonCore.PluginFramework.Generator" Version="1.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ pluginLoader.Initialize();
|
|||||||
|
|
||||||
var startup = new Startup();
|
var startup = new Startup();
|
||||||
|
|
||||||
await startup.Initialize(pluginLoader.Instances);
|
await startup.InitializeAsync(pluginLoader.Instances);
|
||||||
|
|
||||||
var wasmHostBuilder = WebAssemblyHostBuilder.CreateDefault(args);
|
var wasmHostBuilder = WebAssemblyHostBuilder.CreateDefault(args);
|
||||||
|
|
||||||
await startup.AddMoonlight(wasmHostBuilder);
|
await startup.AddMoonlightAsync(wasmHostBuilder);
|
||||||
|
|
||||||
var wasmApp = wasmHostBuilder.Build();
|
var wasmApp = wasmHostBuilder.Build();
|
||||||
|
|
||||||
await startup.AddMoonlight(wasmApp);
|
await startup.AddMoonlightAsync(wasmApp);
|
||||||
|
|
||||||
await wasmApp.RunAsync();
|
await wasmApp.RunAsync();
|
||||||
@@ -21,8 +21,8 @@ module.exports = (opts = {}) => {
|
|||||||
fs.mkdirSync("../../MoonlightServers.Frontend/Styles/mappings");
|
fs.mkdirSync("../../MoonlightServers.Frontend/Styles/mappings");
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.writeFileSync('../../MoonlightServers.Frontend/mappings/classes.map', classArray.join('\n'));
|
fs.writeFileSync('../../MoonlightServers.Frontend/Styles/mappings/classes.map', classArray.join('\n'));
|
||||||
console.log(`✅ Extracted ${classArray.length} Tailwind classes to tailwind-classes.txt`);
|
console.log(`Extracted ${classArray.length} Tailwind classes`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -114,4 +114,24 @@
|
|||||||
.dropdown-menu {
|
.dropdown-menu {
|
||||||
@apply bg-base-150;
|
@apply bg-base-150;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.advance-select-menu {
|
||||||
|
@apply !border-base-content/20 border-2 ring-0! outline-0! bg-base-200/50 !px-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.advance-select-option {
|
||||||
|
@apply !rounded-none hover:!bg-primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
.advance-select-option.selected {
|
||||||
|
@apply !bg-primary !text-primary-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
.advance-select-toggle {
|
||||||
|
@apply !border-base-content/20 border-2 ring-0! outline-0! focus:border-primary! focus-within:border-primary! bg-base-200/50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table thead {
|
||||||
|
@apply !normal-case;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -15,15 +15,15 @@ public class ServerFsAccess : IFsAccess
|
|||||||
FileSystemService = fileSystemService;
|
FileSystemService = fileSystemService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task CreateFile(string path)
|
public Task CreateFileAsync(string path)
|
||||||
=> FileSystemService.Touch(Id, path);
|
=> FileSystemService.TouchAsync(Id, path);
|
||||||
|
|
||||||
public Task CreateDirectory(string path)
|
public Task CreateDirectoryAsync(string path)
|
||||||
=> FileSystemService.Mkdir(Id, path);
|
=> FileSystemService.MkdirAsync(Id, path);
|
||||||
|
|
||||||
public async Task<FsEntry[]> List(string path)
|
public async Task<FsEntry[]> ListAsync(string path)
|
||||||
{
|
{
|
||||||
var entries = await FileSystemService.List(Id, path);
|
var entries = await FileSystemService.ListAsync(Id, path);
|
||||||
|
|
||||||
return entries.Select(x => new FsEntry()
|
return entries.Select(x => new FsEntry()
|
||||||
{
|
{
|
||||||
@@ -35,28 +35,28 @@ public class ServerFsAccess : IFsAccess
|
|||||||
}).ToArray();
|
}).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Move(string oldPath, string newPath)
|
public Task MoveAsync(string oldPath, string newPath)
|
||||||
=> FileSystemService.Move(Id, oldPath, newPath);
|
=> FileSystemService.MoveAsync(Id, oldPath, newPath);
|
||||||
|
|
||||||
public Task Read(string path, Func<Stream, Task> onHandleData)
|
public Task ReadAsync(string path, Func<Stream, Task> onHandleData)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Write(string path, Stream dataStream)
|
public Task WriteAsync(string path, Stream dataStream)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Delete(string path)
|
public Task DeleteAsync(string path)
|
||||||
=> FileSystemService.Delete(Id, path);
|
=> FileSystemService.DeleteAsync(Id, path);
|
||||||
|
|
||||||
public Task UploadChunk(string path, int chunkId, long chunkSize, long totalSize, byte[] data)
|
public Task UploadChunkAsync(string path, int chunkId, long chunkSize, long totalSize, byte[] data)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<byte[]> DownloadChunk(string path, int chunkId, long chunkSize)
|
public Task<byte[]> DownloadChunkAsync(string path, int chunkId, long chunkSize)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace MoonlightServers.Frontend.Implementations;
|
|||||||
|
|
||||||
public class DefaultPermissionProvider : IServerPermissionProvider
|
public class DefaultPermissionProvider : IServerPermissionProvider
|
||||||
{
|
{
|
||||||
public Task<ServerPermission[]> GetPermissions(ServerDetailResponse server)
|
public Task<ServerPermission[]> GetPermissionsAsync(ServerDetailResponse server)
|
||||||
{
|
{
|
||||||
ServerPermission[] permissions = [
|
ServerPermission[] permissions = [
|
||||||
new()
|
new()
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace MoonlightServers.Frontend.Implementations;
|
|||||||
|
|
||||||
public class DefaultServerTabProvider : IServerTabProvider
|
public class DefaultServerTabProvider : IServerTabProvider
|
||||||
{
|
{
|
||||||
public Task<ServerTab[]> GetTabs(ServerDetailResponse server)
|
public Task<ServerTab[]> GetTabsAsync(ServerDetailResponse server)
|
||||||
{
|
{
|
||||||
ServerTab[] tabs =
|
ServerTab[] tabs =
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ namespace MoonlightServers.Frontend.Interfaces;
|
|||||||
|
|
||||||
public interface IServerPermissionProvider
|
public interface IServerPermissionProvider
|
||||||
{
|
{
|
||||||
public Task<ServerPermission[]> GetPermissions(ServerDetailResponse server);
|
public Task<ServerPermission[]> GetPermissionsAsync(ServerDetailResponse server);
|
||||||
}
|
}
|
||||||
@@ -5,5 +5,5 @@ namespace MoonlightServers.Frontend.Interfaces;
|
|||||||
|
|
||||||
public interface IServerTabProvider
|
public interface IServerTabProvider
|
||||||
{
|
{
|
||||||
public Task<ServerTab[]> GetTabs(ServerDetailResponse server);
|
public Task<ServerTab[]> GetTabsAsync(ServerDetailResponse server);
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using MoonlightServers.Frontend.UI.Components.Servers.ServerTabs;
|
using MoonlightServers.Frontend.UI.Components.Servers.ServerTabs;
|
||||||
using MoonlightServers.Shared.Enums;
|
using MoonlightServers.Shared.Enums;
|
||||||
using MoonlightServers.Shared.Models;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Frontend.Models;
|
namespace MoonlightServers.Frontend.Models;
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.5" />
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.9" />
|
||||||
<PackageReference Include="Moonlight.Client" Version="2.1.*"/>
|
<PackageReference Include="Moonlight.Client" Version="2.1.*"/>
|
||||||
<PackageReference Include="XtermBlazor" Version="2.1.2" />
|
<PackageReference Include="XtermBlazor" Version="2.1.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -31,7 +31,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Styles\" />
|
<None Include="Styles/mappings/*.map" Pack="true" PackagePath="Styles/" />
|
||||||
|
<None Include="MoonlightServers.Frontend.targets" Pack="true" PackagePath="build/MoonlightServers.Frontend.targets" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<Project>
|
||||||
|
<ItemGroup>
|
||||||
|
<StylesFilesToCopy Include="$(MSBuildThisFileDirectory)../Styles/**/*.*"/>
|
||||||
|
</ItemGroup>
|
||||||
|
<Target Name="CopyContent" BeforeTargets="Build">
|
||||||
|
<Copy SourceFiles="@(StylesFilesToCopy)" DestinationFolder="$(ProjectDir)Styles/MoonlightServers.Frontend/%(RecursiveDir)" SkipUnchangedFiles="true" />
|
||||||
|
</Target>
|
||||||
|
</Project>
|
||||||
@@ -15,19 +15,19 @@ public class NodeService
|
|||||||
HttpApiClient = httpApiClient;
|
HttpApiClient = httpApiClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<NodeSystemStatusResponse> GetSystemStatus(int nodeId)
|
public async Task<NodeSystemStatusResponse> GetSystemStatusAsync(int nodeId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<NodeSystemStatusResponse>($"api/admin/servers/nodes/{nodeId}/system/status");
|
return await HttpApiClient.GetJson<NodeSystemStatusResponse>($"api/admin/servers/nodes/{nodeId}/system/status");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<StatisticsResponse> GetStatistics(int nodeId)
|
public async Task<StatisticsResponse> GetStatisticsAsync(int nodeId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<StatisticsResponse>(
|
return await HttpApiClient.GetJson<StatisticsResponse>(
|
||||||
$"api/admin/servers/nodes/{nodeId}/statistics"
|
$"api/admin/servers/nodes/{nodeId}/statistics"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DockerStatisticsResponse> GetDockerStatistics(int nodeId)
|
public async Task<DockerStatisticsResponse> GetDockerStatisticsAsync(int nodeId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<DockerStatisticsResponse>(
|
return await HttpApiClient.GetJson<DockerStatisticsResponse>(
|
||||||
$"api/admin/servers/nodes/{nodeId}/statistics/docker"
|
$"api/admin/servers/nodes/{nodeId}/statistics/docker"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Net;
|
|
||||||
using MoonCore.Attributes;
|
using MoonCore.Attributes;
|
||||||
using MoonCore.Helpers;
|
using MoonCore.Helpers;
|
||||||
using MoonlightServers.Shared.Http.Requests.Client.Servers.Files;
|
using MoonlightServers.Shared.Http.Requests.Client.Servers.Files;
|
||||||
@@ -16,56 +15,56 @@ public class ServerFileSystemService
|
|||||||
ApiClient = apiClient;
|
ApiClient = apiClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerFilesEntryResponse[]> List(int serverId, string path)
|
public async Task<ServerFilesEntryResponse[]> ListAsync(int serverId, string path)
|
||||||
{
|
{
|
||||||
return await ApiClient.GetJson<ServerFilesEntryResponse[]>(
|
return await ApiClient.GetJson<ServerFilesEntryResponse[]>(
|
||||||
$"api/client/servers/{serverId}/files/list?path={path}"
|
$"api/client/servers/{serverId}/files/list?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Move(int serverId, string oldPath, string newPath)
|
public async Task MoveAsync(int serverId, string oldPath, string newPath)
|
||||||
{
|
{
|
||||||
await ApiClient.Post(
|
await ApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/files/move?oldPath={oldPath}&newPath={newPath}"
|
$"api/client/servers/{serverId}/files/move?oldPath={oldPath}&newPath={newPath}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Delete(int serverId, string path)
|
public async Task DeleteAsync(int serverId, string path)
|
||||||
{
|
{
|
||||||
await ApiClient.Delete(
|
await ApiClient.Delete(
|
||||||
$"api/client/servers/{serverId}/files/delete?path={path}"
|
$"api/client/servers/{serverId}/files/delete?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Mkdir(int serverId, string path)
|
public async Task MkdirAsync(int serverId, string path)
|
||||||
{
|
{
|
||||||
await ApiClient.Post(
|
await ApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/files/mkdir?path={path}"
|
$"api/client/servers/{serverId}/files/mkdir?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Touch(int serverId, string path)
|
public async Task TouchAsync(int serverId, string path)
|
||||||
{
|
{
|
||||||
await ApiClient.Post(
|
await ApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/files/touch?path={path}"
|
$"api/client/servers/{serverId}/files/touch?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerFilesUploadResponse> Upload(int serverId)
|
public async Task<ServerFilesUploadResponse> UploadAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await ApiClient.GetJson<ServerFilesUploadResponse>(
|
return await ApiClient.GetJson<ServerFilesUploadResponse>(
|
||||||
$"api/client/servers/{serverId}/files/upload"
|
$"api/client/servers/{serverId}/files/upload"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerFilesDownloadResponse> Download(int serverId, string path)
|
public async Task<ServerFilesDownloadResponse> DownloadAsync(int serverId, string path)
|
||||||
{
|
{
|
||||||
return await ApiClient.GetJson<ServerFilesDownloadResponse>(
|
return await ApiClient.GetJson<ServerFilesDownloadResponse>(
|
||||||
$"api/client/servers/{serverId}/files/download?path={path}"
|
$"api/client/servers/{serverId}/files/download?path={path}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Compress(int serverId, string type, string[] items, string destination)
|
public async Task CompressAsync(int serverId, string type, string[] items, string destination)
|
||||||
{
|
{
|
||||||
await ApiClient.Post(
|
await ApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/files/compress",
|
$"api/client/servers/{serverId}/files/compress",
|
||||||
@@ -78,7 +77,7 @@ public class ServerFileSystemService
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Decompress(int serverId, string type, string path, string destination)
|
public async Task DecompressAsync(int serverId, string type, string path, string destination)
|
||||||
{
|
{
|
||||||
await ApiClient.Post(
|
await ApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/files/decompress",
|
$"api/client/servers/{serverId}/files/decompress",
|
||||||
|
|||||||
@@ -18,49 +18,49 @@ public class ServerService
|
|||||||
HttpApiClient = httpApiClient;
|
HttpApiClient = httpApiClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagedData<ServerDetailResponse>> GetServers(int page, int perPage)
|
public async Task<CountedData<ServerDetailResponse>> GetServersAsync(int startIndex, int count)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<PagedData<ServerDetailResponse>>(
|
return await HttpApiClient.GetJson<CountedData<ServerDetailResponse>>(
|
||||||
$"api/client/servers?page={page}&pageSize={perPage}"
|
$"api/client/servers?startIndex={startIndex}&count={count}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagedData<ServerDetailResponse>> GetSharedServers(int page, int perPage)
|
public async Task<CountedData<ServerDetailResponse>> GetSharedServersAsync(int startIndex, int count)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<PagedData<ServerDetailResponse>>(
|
return await HttpApiClient.GetJson<CountedData<ServerDetailResponse>>(
|
||||||
$"api/client/servers/shared?page={page}&pageSize={perPage}"
|
$"api/client/servers/shared?startIndex={startIndex}&count={count}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerDetailResponse> GetServer(int serverId)
|
public async Task<ServerDetailResponse> GetServerAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<ServerDetailResponse>(
|
return await HttpApiClient.GetJson<ServerDetailResponse>(
|
||||||
$"api/client/servers/{serverId}"
|
$"api/client/servers/{serverId}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerStatusResponse> GetStatus(int serverId)
|
public async Task<ServerStatusResponse> GetStatusAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<ServerStatusResponse>(
|
return await HttpApiClient.GetJson<ServerStatusResponse>(
|
||||||
$"api/client/servers/{serverId}/status"
|
$"api/client/servers/{serverId}/status"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerLogsResponse> GetLogs(int serverId)
|
public async Task<ServerLogsResponse> GetLogsAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<ServerLogsResponse>(
|
return await HttpApiClient.GetJson<ServerLogsResponse>(
|
||||||
$"api/client/servers/{serverId}/logs"
|
$"api/client/servers/{serverId}/logs"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerStatsResponse> GetStats(int serverId)
|
public async Task<ServerStatsResponse> GetStatsAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<ServerStatsResponse>(
|
return await HttpApiClient.GetJson<ServerStatsResponse>(
|
||||||
$"api/client/servers/{serverId}/stats"
|
$"api/client/servers/{serverId}/stats"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task RunCommand(int serverId, string command)
|
public async Task RunCommandAsync(int serverId, string command)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Post(
|
await HttpApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/command",
|
$"api/client/servers/{serverId}/command",
|
||||||
@@ -71,14 +71,14 @@ public class ServerService
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ServerWebSocketResponse> GetWebSocket(int serverId)
|
public async Task<ServerWebSocketResponse> GetWebSocketAsync(int serverId)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<ServerWebSocketResponse>(
|
return await HttpApiClient.GetJson<ServerWebSocketResponse>(
|
||||||
$"api/client/servers/{serverId}/ws"
|
$"api/client/servers/{serverId}/ws"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Install(int serverId)
|
public async Task InstallAsync(int serverId)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Post(
|
await HttpApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/install"
|
$"api/client/servers/{serverId}/install"
|
||||||
@@ -87,21 +87,21 @@ public class ServerService
|
|||||||
|
|
||||||
#region Power actions
|
#region Power actions
|
||||||
|
|
||||||
public async Task Start(int serverId)
|
public async Task StartAsync(int serverId)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Post(
|
await HttpApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/start"
|
$"api/client/servers/{serverId}/start"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Stop(int serverId)
|
public async Task StopAsync(int serverId)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Post(
|
await HttpApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/stop"
|
$"api/client/servers/{serverId}/stop"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Kill(int serverId)
|
public async Task KillAsync(int serverId)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Post(
|
await HttpApiClient.Post(
|
||||||
$"api/client/servers/{serverId}/kill"
|
$"api/client/servers/{serverId}/kill"
|
||||||
@@ -112,14 +112,14 @@ public class ServerService
|
|||||||
|
|
||||||
#region Variables
|
#region Variables
|
||||||
|
|
||||||
public async Task<PagedData<ServerVariableDetailResponse>> GetVariables(int serverId, int page, int pageSize)
|
public async Task<CountedData<ServerVariableDetailResponse>> GetVariablesAsync(int serverId, int startIndex, int count)
|
||||||
{
|
{
|
||||||
return await HttpApiClient.GetJson<PagedData<ServerVariableDetailResponse>>(
|
return await HttpApiClient.GetJson<CountedData<ServerVariableDetailResponse>>(
|
||||||
$"api/client/servers/{serverId}/variables?page={page}&pageSize={pageSize}"
|
$"api/client/servers/{serverId}/variables?startIndex={startIndex}&count={count}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateVariables(int serverId, UpdateServerVariableRangeRequest request)
|
public async Task UpdateVariablesAsync(int serverId, UpdateServerVariableRangeRequest request)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Patch(
|
await HttpApiClient.Patch(
|
||||||
$"api/client/servers/{serverId}/variables",
|
$"api/client/servers/{serverId}/variables",
|
||||||
@@ -127,7 +127,7 @@ public class ServerService
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateVariable(int serverId, UpdateServerVariableRequest request)
|
public async Task UpdateVariableAsync(int serverId, UpdateServerVariableRequest request)
|
||||||
{
|
{
|
||||||
await HttpApiClient.Put(
|
await HttpApiClient.Put(
|
||||||
$"api/client/servers/{serverId}/variables",
|
$"api/client/servers/{serverId}/variables",
|
||||||
|
|||||||
@@ -16,19 +16,19 @@ public class ServerShareService
|
|||||||
ApiClient = apiClient;
|
ApiClient = apiClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagedData<ServerShareResponse>> Get(int id, int page, int pageSize)
|
public async Task<CountedData<ServerShareResponse>> GetAsync(int id, int startIndex, int count)
|
||||||
=> await ApiClient.GetJson<PagedData<ServerShareResponse>>(
|
=> await ApiClient.GetJson<CountedData<ServerShareResponse>>(
|
||||||
$"api/client/servers/{id}/shares?page={page}&pageSize={pageSize}");
|
$"api/client/servers/{id}/shares?startIndex={startIndex}&count={count}");
|
||||||
|
|
||||||
public async Task<ServerShareResponse> Get(int id, int shareId)
|
public async Task<ServerShareResponse> GetAsync(int id, int shareId)
|
||||||
=> await ApiClient.GetJson<ServerShareResponse>($"api/client/servers/{id}/shares/{shareId}");
|
=> await ApiClient.GetJson<ServerShareResponse>($"api/client/servers/{id}/shares/{shareId}");
|
||||||
|
|
||||||
public async Task<ServerShareResponse> Create(int id, CreateShareRequest request)
|
public async Task<ServerShareResponse> CreateAsync(int id, CreateShareRequest request)
|
||||||
=> await ApiClient.PostJson<ServerShareResponse>($"api/client/servers/{id}/shares", request);
|
=> await ApiClient.PostJson<ServerShareResponse>($"api/client/servers/{id}/shares", request);
|
||||||
|
|
||||||
public async Task<ServerShareResponse> Update(int id, int shareId, UpdateShareRequest request)
|
public async Task<ServerShareResponse> UpdateAsync(int id, int shareId, UpdateShareRequest request)
|
||||||
=> await ApiClient.PatchJson<ServerShareResponse>($"api/client/servers/{id}/shares/{shareId}", request);
|
=> await ApiClient.PatchJson<ServerShareResponse>($"api/client/servers/{id}/shares/{shareId}", request);
|
||||||
|
|
||||||
public async Task Delete(int id, int shareId)
|
public async Task DeleteAsync(int id, int shareId)
|
||||||
=> await ApiClient.Delete($"api/client/servers/{id}/shares/{shareId}");
|
=> await ApiClient.Delete($"api/client/servers/{id}/shares/{shareId}");
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@ namespace MoonlightServers.Frontend.Startup;
|
|||||||
|
|
||||||
public class PluginStartup : IPluginStartup
|
public class PluginStartup : IPluginStartup
|
||||||
{
|
{
|
||||||
public Task BuildApplication(IServiceProvider serviceProvider, WebAssemblyHostBuilder builder)
|
public Task BuildApplicationAsync(IServiceProvider serviceProvider, WebAssemblyHostBuilder builder)
|
||||||
{
|
{
|
||||||
builder.Services.AddSingleton<ISidebarItemProvider, SidebarImplementation>();
|
builder.Services.AddSingleton<ISidebarItemProvider, SidebarImplementation>();
|
||||||
builder.Services.AddSingleton<IServerTabProvider, DefaultServerTabProvider>();
|
builder.Services.AddSingleton<IServerTabProvider, DefaultServerTabProvider>();
|
||||||
@@ -21,7 +21,7 @@ public class PluginStartup : IPluginStartup
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task ConfigureApplication(IServiceProvider serviceProvider, WebAssemblyHost app)
|
public Task ConfigureApplicationAsync(IServiceProvider serviceProvider, WebAssemblyHost app)
|
||||||
{
|
{
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,9 @@
|
|||||||
!me-1.5
|
!me-1.5
|
||||||
!ms-auto
|
!ms-auto
|
||||||
!px-2.5
|
!px-2.5
|
||||||
|
!py-0.5
|
||||||
!rounded-full
|
!rounded-full
|
||||||
|
!rounded-xs
|
||||||
!text-sm
|
!text-sm
|
||||||
!w-2.5
|
!w-2.5
|
||||||
*:[grid-area:1/1]
|
*:[grid-area:1/1]
|
||||||
@@ -19,13 +21,17 @@
|
|||||||
-ml-4
|
-ml-4
|
||||||
-translate-x-full
|
-translate-x-full
|
||||||
-translate-y-1/2
|
-translate-y-1/2
|
||||||
|
[animation-duration:0.8s]
|
||||||
|
[animation-timing-function:ease]
|
||||||
absolute
|
absolute
|
||||||
accordion
|
accordion
|
||||||
accordion-bordered
|
accordion-bordered
|
||||||
accordion-toggle
|
accordion-toggle
|
||||||
active
|
active
|
||||||
active-tab:bg-primary
|
active-tab:bg-primary
|
||||||
|
active-tab:hover:text-primary-content
|
||||||
active-tab:text-base-content
|
active-tab:text-base-content
|
||||||
|
active-tab:text-primary-content
|
||||||
advance-select-menu
|
advance-select-menu
|
||||||
advance-select-option
|
advance-select-option
|
||||||
advance-select-tag
|
advance-select-tag
|
||||||
@@ -39,6 +45,7 @@ align-bottom
|
|||||||
align-middle
|
align-middle
|
||||||
animate-bounce
|
animate-bounce
|
||||||
animate-ping
|
animate-ping
|
||||||
|
animate-spin
|
||||||
aria-[current='page']:text-bg-soft-primary
|
aria-[current='page']:text-bg-soft-primary
|
||||||
avatar
|
avatar
|
||||||
avatar-away-bottom
|
avatar-away-bottom
|
||||||
@@ -62,6 +69,7 @@ bg-background/60
|
|||||||
bg-base-100
|
bg-base-100
|
||||||
bg-base-150
|
bg-base-150
|
||||||
bg-base-200
|
bg-base-200
|
||||||
|
bg-base-200!
|
||||||
bg-base-200/50
|
bg-base-200/50
|
||||||
bg-base-300
|
bg-base-300
|
||||||
bg-base-300/45
|
bg-base-300/45
|
||||||
@@ -85,9 +93,14 @@ block
|
|||||||
blur
|
blur
|
||||||
border
|
border
|
||||||
border-0
|
border-0
|
||||||
|
border-1
|
||||||
border-2
|
border-2
|
||||||
|
border-3
|
||||||
border-accent
|
border-accent
|
||||||
border-b
|
border-b
|
||||||
|
border-b-2
|
||||||
|
border-b-base-content/20
|
||||||
|
border-b-primary
|
||||||
border-base-content
|
border-base-content
|
||||||
border-base-content/20
|
border-base-content/20
|
||||||
border-base-content/25
|
border-base-content/25
|
||||||
@@ -96,15 +109,26 @@ border-base-content/5
|
|||||||
border-base-content/60
|
border-base-content/60
|
||||||
border-base-content/70
|
border-base-content/70
|
||||||
border-dashed
|
border-dashed
|
||||||
|
border-dotted
|
||||||
border-e-2
|
border-e-2
|
||||||
|
border-error/30
|
||||||
|
border-info/30
|
||||||
border-l-4
|
border-l-4
|
||||||
|
border-l-transparent
|
||||||
border-primary
|
border-primary
|
||||||
|
border-r-transparent
|
||||||
|
border-solid
|
||||||
border-success
|
border-success
|
||||||
|
border-success/30
|
||||||
border-t
|
border-t
|
||||||
border-t-2
|
border-t-2
|
||||||
|
border-t-transparent
|
||||||
border-transparent
|
border-transparent
|
||||||
|
border-warning/30
|
||||||
bottom-0
|
bottom-0
|
||||||
bottom-full
|
bottom-full
|
||||||
|
breadcrumbs
|
||||||
|
breadcrumbs-separator
|
||||||
break-words
|
break-words
|
||||||
btn
|
btn
|
||||||
btn-accent
|
btn-accent
|
||||||
@@ -164,8 +188,10 @@ diff
|
|||||||
disabled
|
disabled
|
||||||
divide-base-150/60
|
divide-base-150/60
|
||||||
divide-y
|
divide-y
|
||||||
|
divider
|
||||||
drop-shadow
|
drop-shadow
|
||||||
dropdown
|
dropdown
|
||||||
|
dropdown-active
|
||||||
dropdown-disabled
|
dropdown-disabled
|
||||||
dropdown-item
|
dropdown-item
|
||||||
dropdown-menu
|
dropdown-menu
|
||||||
@@ -179,7 +205,9 @@ ease-linear
|
|||||||
end-3
|
end-3
|
||||||
error-message
|
error-message
|
||||||
file-upload-complete:progress-success
|
file-upload-complete:progress-success
|
||||||
|
fill-base-content
|
||||||
fill-black
|
fill-black
|
||||||
|
fill-gray-200
|
||||||
filter
|
filter
|
||||||
filter-reset
|
filter-reset
|
||||||
fixed
|
fixed
|
||||||
@@ -210,6 +238,8 @@ font-inter
|
|||||||
font-medium
|
font-medium
|
||||||
font-normal
|
font-normal
|
||||||
font-semibold
|
font-semibold
|
||||||
|
footer
|
||||||
|
footer-center
|
||||||
from-violet-400
|
from-violet-400
|
||||||
gap-0.5
|
gap-0.5
|
||||||
gap-1
|
gap-1
|
||||||
@@ -226,6 +256,7 @@ gap-x-6
|
|||||||
gap-y-1
|
gap-y-1
|
||||||
gap-y-1.5
|
gap-y-1.5
|
||||||
gap-y-2
|
gap-y-2
|
||||||
|
gap-y-2.5
|
||||||
gap-y-3
|
gap-y-3
|
||||||
gap-y-8
|
gap-y-8
|
||||||
grid
|
grid
|
||||||
@@ -233,10 +264,12 @@ grid-cols-1
|
|||||||
grid-cols-12
|
grid-cols-12
|
||||||
grid-cols-2
|
grid-cols-2
|
||||||
grid-cols-3
|
grid-cols-3
|
||||||
|
grid-cols-4
|
||||||
grid-flow-col
|
grid-flow-col
|
||||||
grow
|
grow
|
||||||
grow-0
|
grow-0
|
||||||
h-0
|
h-0
|
||||||
|
h-10
|
||||||
h-12
|
h-12
|
||||||
h-14
|
h-14
|
||||||
h-2
|
h-2
|
||||||
@@ -253,11 +286,14 @@ hidden
|
|||||||
hover:bg-indigo-500
|
hover:bg-indigo-500
|
||||||
hover:bg-primary/5
|
hover:bg-primary/5
|
||||||
hover:bg-transparent
|
hover:bg-transparent
|
||||||
|
hover:cursor-pointer
|
||||||
hover:text-base-content
|
hover:text-base-content
|
||||||
hover:text-base-content/60
|
hover:text-base-content/60
|
||||||
hover:text-indigo-500
|
hover:text-indigo-500
|
||||||
hover:text-primary
|
hover:text-primary
|
||||||
image-full
|
image-full
|
||||||
|
indicator
|
||||||
|
indicator-item
|
||||||
inline
|
inline
|
||||||
inline-block
|
inline-block
|
||||||
inline-flex
|
inline-flex
|
||||||
@@ -294,6 +330,7 @@ leading-3.5
|
|||||||
leading-6
|
leading-6
|
||||||
leading-9
|
leading-9
|
||||||
leading-[1.1]
|
leading-[1.1]
|
||||||
|
leading-none
|
||||||
left-0
|
left-0
|
||||||
lg:bg-base-100/20
|
lg:bg-base-100/20
|
||||||
lg:flex
|
lg:flex
|
||||||
@@ -320,6 +357,7 @@ link-hover
|
|||||||
link-primary
|
link-primary
|
||||||
list-disc
|
list-disc
|
||||||
list-inside
|
list-inside
|
||||||
|
list-none
|
||||||
loading
|
loading
|
||||||
loading-lg
|
loading-lg
|
||||||
loading-sm
|
loading-sm
|
||||||
@@ -332,7 +370,11 @@ mask
|
|||||||
max-h-52
|
max-h-52
|
||||||
max-lg:flex-col
|
max-lg:flex-col
|
||||||
max-lg:hidden
|
max-lg:hidden
|
||||||
|
max-md:flex-wrap
|
||||||
|
max-md:justify-center
|
||||||
|
max-sm:hidden
|
||||||
max-w-7xl
|
max-w-7xl
|
||||||
|
max-w-8
|
||||||
max-w-80
|
max-w-80
|
||||||
max-w-full
|
max-w-full
|
||||||
max-w-lg
|
max-w-lg
|
||||||
@@ -376,6 +418,7 @@ min-w-28
|
|||||||
min-w-48
|
min-w-48
|
||||||
min-w-60
|
min-w-60
|
||||||
min-w-[100px]
|
min-w-[100px]
|
||||||
|
min-w-full
|
||||||
min-w-sm
|
min-w-sm
|
||||||
mix-blend-exclusion
|
mix-blend-exclusion
|
||||||
ml-3
|
ml-3
|
||||||
@@ -387,10 +430,13 @@ modal-middle
|
|||||||
modal-title
|
modal-title
|
||||||
mr-2
|
mr-2
|
||||||
mr-4
|
mr-4
|
||||||
|
ms-0.5
|
||||||
ms-1
|
ms-1
|
||||||
|
ms-1.5
|
||||||
ms-2
|
ms-2
|
||||||
ms-2.5
|
ms-2.5
|
||||||
ms-3
|
ms-3
|
||||||
|
ms-auto
|
||||||
mt-1
|
mt-1
|
||||||
mt-1.5
|
mt-1.5
|
||||||
mt-10
|
mt-10
|
||||||
@@ -398,6 +444,7 @@ mt-12
|
|||||||
mt-2
|
mt-2
|
||||||
mt-2.5
|
mt-2.5
|
||||||
mt-3
|
mt-3
|
||||||
|
mt-3.5
|
||||||
mt-4
|
mt-4
|
||||||
mt-5
|
mt-5
|
||||||
mt-6
|
mt-6
|
||||||
@@ -407,9 +454,12 @@ mx-auto
|
|||||||
my-2.5
|
my-2.5
|
||||||
my-3
|
my-3
|
||||||
my-5
|
my-5
|
||||||
|
my-8
|
||||||
my-auto
|
my-auto
|
||||||
|
object-cover
|
||||||
opacity-0
|
opacity-0
|
||||||
opacity-100
|
opacity-100
|
||||||
|
opacity-75
|
||||||
open
|
open
|
||||||
origin-top-left
|
origin-top-left
|
||||||
outline
|
outline
|
||||||
@@ -430,6 +480,7 @@ p-4
|
|||||||
p-5
|
p-5
|
||||||
p-6
|
p-6
|
||||||
p-8
|
p-8
|
||||||
|
pb-1
|
||||||
pe-1.5
|
pe-1.5
|
||||||
pin-input
|
pin-input
|
||||||
pin-input-underline
|
pin-input-underline
|
||||||
@@ -444,6 +495,7 @@ progress-primary
|
|||||||
pt-0
|
pt-0
|
||||||
pt-0.5
|
pt-0.5
|
||||||
pt-1.5
|
pt-1.5
|
||||||
|
pt-2
|
||||||
pt-3
|
pt-3
|
||||||
px-1.5
|
px-1.5
|
||||||
px-2
|
px-2
|
||||||
@@ -459,10 +511,12 @@ py-12
|
|||||||
py-2
|
py-2
|
||||||
py-2.5
|
py-2.5
|
||||||
py-6
|
py-6
|
||||||
|
radial-progress
|
||||||
radio
|
radio
|
||||||
range
|
range
|
||||||
relative
|
relative
|
||||||
resize
|
resize
|
||||||
|
ring
|
||||||
ring-0
|
ring-0
|
||||||
ring-1
|
ring-1
|
||||||
ring-gray-700
|
ring-gray-700
|
||||||
@@ -543,10 +597,12 @@ sm:text-sm/5
|
|||||||
sm:w-1/2
|
sm:w-1/2
|
||||||
sm:w-full
|
sm:w-full
|
||||||
space-x-1
|
space-x-1
|
||||||
|
space-x-2.5
|
||||||
space-y-1
|
space-y-1
|
||||||
space-y-4
|
space-y-4
|
||||||
space-y-6
|
space-y-6
|
||||||
sr-only
|
sr-only
|
||||||
|
stack
|
||||||
stat
|
stat
|
||||||
stat-actions
|
stat-actions
|
||||||
stat-desc
|
stat-desc
|
||||||
@@ -602,6 +658,7 @@ text-left
|
|||||||
text-lg
|
text-lg
|
||||||
text-primary
|
text-primary
|
||||||
text-primary-content
|
text-primary-content
|
||||||
|
text-right
|
||||||
text-slate-100
|
text-slate-100
|
||||||
text-sm
|
text-sm
|
||||||
text-sm/5
|
text-sm/5
|
||||||
@@ -645,6 +702,7 @@ via-sky-400
|
|||||||
w-0
|
w-0
|
||||||
w-0.5
|
w-0.5
|
||||||
w-12
|
w-12
|
||||||
|
w-13
|
||||||
w-32
|
w-32
|
||||||
w-4
|
w-4
|
||||||
w-56
|
w-56
|
||||||
|
|||||||
790
MoonlightServers.Frontend/Styles/mappings/classes.map
Normal file
790
MoonlightServers.Frontend/Styles/mappings/classes.map
Normal file
@@ -0,0 +1,790 @@
|
|||||||
|
!bg-base-100
|
||||||
|
!border-base-content/40
|
||||||
|
!border-none
|
||||||
|
!flex
|
||||||
|
!font-medium
|
||||||
|
!font-semibold
|
||||||
|
!h-2.5
|
||||||
|
!justify-between
|
||||||
|
!me-1.5
|
||||||
|
!ms-auto
|
||||||
|
!px-2.5
|
||||||
|
!py-0.5
|
||||||
|
!rounded-full
|
||||||
|
!rounded-xs
|
||||||
|
!text-sm
|
||||||
|
!w-2.5
|
||||||
|
*:[grid-area:1/1]
|
||||||
|
*:first:rounded-tl-lg
|
||||||
|
*:last:rounded-tr-lg
|
||||||
|
-left-4
|
||||||
|
-mb-3
|
||||||
|
-ml-4
|
||||||
|
-translate-x-full
|
||||||
|
-translate-y-1/2
|
||||||
|
2xl:col-span-1
|
||||||
|
2xl:col-span-2
|
||||||
|
2xl:col-span-3
|
||||||
|
2xl:flex
|
||||||
|
[animation-duration:0.8s]
|
||||||
|
[animation-timing-function:ease]
|
||||||
|
absolute
|
||||||
|
accordion
|
||||||
|
accordion-bordered
|
||||||
|
accordion-toggle
|
||||||
|
active
|
||||||
|
active-tab:bg-primary
|
||||||
|
active-tab:hover:text-primary-content
|
||||||
|
active-tab:text-base-content
|
||||||
|
active-tab:text-primary-content
|
||||||
|
advance-select-menu
|
||||||
|
advance-select-option
|
||||||
|
advance-select-tag
|
||||||
|
advance-select-toggle
|
||||||
|
alert
|
||||||
|
alert-error
|
||||||
|
alert-outline
|
||||||
|
alert-primary
|
||||||
|
alert-soft
|
||||||
|
align-bottom
|
||||||
|
align-middle
|
||||||
|
animate-bounce
|
||||||
|
animate-ping
|
||||||
|
animate-spin
|
||||||
|
aria-[current='page']:text-bg-soft-primary
|
||||||
|
avatar
|
||||||
|
avatar-away-bottom
|
||||||
|
avatar-away-top
|
||||||
|
avatar-busy-bottom
|
||||||
|
avatar-busy-top
|
||||||
|
avatar-offline-bottom
|
||||||
|
avatar-offline-top
|
||||||
|
avatar-online-bottom
|
||||||
|
avatar-online-top
|
||||||
|
avatar-placeholder
|
||||||
|
badge
|
||||||
|
badge-error
|
||||||
|
badge-info
|
||||||
|
badge-outline
|
||||||
|
badge-primary
|
||||||
|
badge-soft
|
||||||
|
badge-success
|
||||||
|
bg-background
|
||||||
|
bg-background/60
|
||||||
|
bg-base-100
|
||||||
|
bg-base-150
|
||||||
|
bg-base-200
|
||||||
|
bg-base-200!
|
||||||
|
bg-base-200/50
|
||||||
|
bg-base-200/75
|
||||||
|
bg-base-300
|
||||||
|
bg-base-300/45
|
||||||
|
bg-base-300/50
|
||||||
|
bg-base-300/60
|
||||||
|
bg-base-content/10
|
||||||
|
bg-black
|
||||||
|
bg-clip-text
|
||||||
|
bg-error
|
||||||
|
bg-gradient-to-r
|
||||||
|
bg-gray-800
|
||||||
|
bg-gray-900
|
||||||
|
bg-indigo-600
|
||||||
|
bg-info
|
||||||
|
bg-primary
|
||||||
|
bg-primary/5
|
||||||
|
bg-red-500
|
||||||
|
bg-success
|
||||||
|
bg-transparent
|
||||||
|
bg-warning
|
||||||
|
bg-white/5
|
||||||
|
block
|
||||||
|
blur
|
||||||
|
border
|
||||||
|
border-0
|
||||||
|
border-1
|
||||||
|
border-2
|
||||||
|
border-3
|
||||||
|
border-accent
|
||||||
|
border-b
|
||||||
|
border-b-2
|
||||||
|
border-b-base-content/20
|
||||||
|
border-b-primary
|
||||||
|
border-base-content
|
||||||
|
border-base-content/10
|
||||||
|
border-base-content/20
|
||||||
|
border-base-content/25
|
||||||
|
border-base-content/40
|
||||||
|
border-base-content/5
|
||||||
|
border-base-content/60
|
||||||
|
border-base-content/70
|
||||||
|
border-base-content/80
|
||||||
|
border-dashed
|
||||||
|
border-dotted
|
||||||
|
border-e-2
|
||||||
|
border-error
|
||||||
|
border-error/30
|
||||||
|
border-gray-600
|
||||||
|
border-info/30
|
||||||
|
border-l-4
|
||||||
|
border-l-8
|
||||||
|
border-l-transparent
|
||||||
|
border-primary
|
||||||
|
border-r-transparent
|
||||||
|
border-solid
|
||||||
|
border-success
|
||||||
|
border-success/30
|
||||||
|
border-t
|
||||||
|
border-t-2
|
||||||
|
border-t-transparent
|
||||||
|
border-transparent
|
||||||
|
border-warning
|
||||||
|
border-warning/30
|
||||||
|
bottom-0
|
||||||
|
bottom-full
|
||||||
|
breadcrumbs
|
||||||
|
breadcrumbs-separator
|
||||||
|
break-words
|
||||||
|
btn
|
||||||
|
btn-accent
|
||||||
|
btn-active
|
||||||
|
btn-block
|
||||||
|
btn-circle
|
||||||
|
btn-disabled
|
||||||
|
btn-error
|
||||||
|
btn-gradient
|
||||||
|
btn-info
|
||||||
|
btn-lg
|
||||||
|
btn-outline
|
||||||
|
btn-primary
|
||||||
|
btn-secondary
|
||||||
|
btn-sm
|
||||||
|
btn-soft
|
||||||
|
btn-square
|
||||||
|
btn-success
|
||||||
|
btn-text
|
||||||
|
btn-warning
|
||||||
|
card
|
||||||
|
card-alert
|
||||||
|
card-body
|
||||||
|
card-border
|
||||||
|
card-footer
|
||||||
|
card-header
|
||||||
|
card-sm
|
||||||
|
card-title
|
||||||
|
carousel
|
||||||
|
carousel-body
|
||||||
|
carousel-next
|
||||||
|
carousel-prev
|
||||||
|
carousel-slide
|
||||||
|
chat
|
||||||
|
chat-avatar
|
||||||
|
chat-bubble
|
||||||
|
chat-footer
|
||||||
|
chat-header
|
||||||
|
chat-receiver
|
||||||
|
chat-sender
|
||||||
|
checkbox
|
||||||
|
checkbox-primary
|
||||||
|
checkbox-xs
|
||||||
|
col-span-1
|
||||||
|
col-span-12
|
||||||
|
col-span-2
|
||||||
|
col-span-6
|
||||||
|
collapse
|
||||||
|
combo-box-selected:block
|
||||||
|
combo-box-selected:dropdown-active
|
||||||
|
complete
|
||||||
|
container
|
||||||
|
contents
|
||||||
|
cursor-default
|
||||||
|
cursor-not-allowed
|
||||||
|
cursor-pointer
|
||||||
|
custom-option
|
||||||
|
diff
|
||||||
|
disabled
|
||||||
|
divide-base-150/60
|
||||||
|
divide-y
|
||||||
|
divider
|
||||||
|
drop-shadow
|
||||||
|
dropdown
|
||||||
|
dropdown-active
|
||||||
|
dropdown-disabled
|
||||||
|
dropdown-item
|
||||||
|
dropdown-menu
|
||||||
|
dropdown-open:opacity-100
|
||||||
|
dropdown-open:rotate-180
|
||||||
|
dropdown-toggle
|
||||||
|
duration-300
|
||||||
|
duration-500
|
||||||
|
ease-in-out
|
||||||
|
ease-linear
|
||||||
|
end-3
|
||||||
|
error-message
|
||||||
|
file-upload-complete:progress-success
|
||||||
|
fill-base-content
|
||||||
|
fill-black
|
||||||
|
fill-gray-200
|
||||||
|
filter
|
||||||
|
filter-reset
|
||||||
|
fixed
|
||||||
|
flex
|
||||||
|
flex-1
|
||||||
|
flex-col
|
||||||
|
flex-grow
|
||||||
|
flex-nowrap
|
||||||
|
flex-row
|
||||||
|
flex-shrink-0
|
||||||
|
flex-wrap
|
||||||
|
focus-visible:outline
|
||||||
|
focus-visible:outline-2
|
||||||
|
focus-visible:outline-indigo-600
|
||||||
|
focus-visible:outline-none
|
||||||
|
focus-visible:outline-offset-2
|
||||||
|
focus-within:border-primary
|
||||||
|
focus:border-primary
|
||||||
|
focus:outline-1
|
||||||
|
focus:outline-none
|
||||||
|
focus:outline-primary
|
||||||
|
focus:ring-0
|
||||||
|
focus:ring-2
|
||||||
|
focus:ring-indigo-600
|
||||||
|
focus:ring-inset
|
||||||
|
font-bold
|
||||||
|
font-inter
|
||||||
|
font-medium
|
||||||
|
font-normal
|
||||||
|
font-semibold
|
||||||
|
footer
|
||||||
|
footer-center
|
||||||
|
from-base-100
|
||||||
|
from-base-100/20
|
||||||
|
from-error/20
|
||||||
|
from-gray-600/20
|
||||||
|
from-primary/20
|
||||||
|
from-success/20
|
||||||
|
from-violet-400
|
||||||
|
from-warning/20
|
||||||
|
gap-0.5
|
||||||
|
gap-1
|
||||||
|
gap-1.5
|
||||||
|
gap-2
|
||||||
|
gap-3
|
||||||
|
gap-4
|
||||||
|
gap-5
|
||||||
|
gap-6
|
||||||
|
gap-x-1
|
||||||
|
gap-x-1.5
|
||||||
|
gap-x-2
|
||||||
|
gap-x-3
|
||||||
|
gap-x-5
|
||||||
|
gap-x-6
|
||||||
|
gap-y-1
|
||||||
|
gap-y-1.5
|
||||||
|
gap-y-2
|
||||||
|
gap-y-2.5
|
||||||
|
gap-y-3
|
||||||
|
gap-y-4
|
||||||
|
gap-y-5
|
||||||
|
gap-y-8
|
||||||
|
grid
|
||||||
|
grid-cols-1
|
||||||
|
grid-cols-12
|
||||||
|
grid-cols-2
|
||||||
|
grid-cols-3
|
||||||
|
grid-cols-4
|
||||||
|
grid-cols-6
|
||||||
|
grid-flow-col
|
||||||
|
grow
|
||||||
|
grow-0
|
||||||
|
h-0
|
||||||
|
h-10
|
||||||
|
h-12
|
||||||
|
h-14
|
||||||
|
h-2
|
||||||
|
h-3
|
||||||
|
h-32
|
||||||
|
h-44
|
||||||
|
h-6
|
||||||
|
h-64
|
||||||
|
h-8
|
||||||
|
h-[90vh]
|
||||||
|
h-auto
|
||||||
|
h-full
|
||||||
|
h-screen
|
||||||
|
helper-text
|
||||||
|
hidden
|
||||||
|
hover:bg-indigo-500
|
||||||
|
hover:bg-primary/20
|
||||||
|
hover:bg-primary/5
|
||||||
|
hover:bg-transparent
|
||||||
|
hover:cursor-pointer
|
||||||
|
hover:text-base-content
|
||||||
|
hover:text-base-content/60
|
||||||
|
hover:text-indigo-500
|
||||||
|
hover:text-primary
|
||||||
|
image-full
|
||||||
|
indicator
|
||||||
|
indicator-item
|
||||||
|
inline
|
||||||
|
inline-block
|
||||||
|
inline-flex
|
||||||
|
inline-grid
|
||||||
|
input
|
||||||
|
input-floating
|
||||||
|
input-floating-label
|
||||||
|
input-lg
|
||||||
|
input-md
|
||||||
|
input-sm
|
||||||
|
input-xl
|
||||||
|
input-xs
|
||||||
|
inset-0
|
||||||
|
inset-y-0
|
||||||
|
inset-y-2
|
||||||
|
invisible
|
||||||
|
is-invalid
|
||||||
|
is-valid
|
||||||
|
isolate
|
||||||
|
italic
|
||||||
|
items-center
|
||||||
|
items-end
|
||||||
|
items-start
|
||||||
|
join
|
||||||
|
join-item
|
||||||
|
justify-between
|
||||||
|
justify-center
|
||||||
|
justify-end
|
||||||
|
justify-start
|
||||||
|
justify-stretch
|
||||||
|
label-text
|
||||||
|
leading-3
|
||||||
|
leading-3.5
|
||||||
|
leading-6
|
||||||
|
leading-7
|
||||||
|
leading-9
|
||||||
|
leading-[1.1]
|
||||||
|
leading-none
|
||||||
|
left-0
|
||||||
|
lg:bg-base-100/20
|
||||||
|
lg:flex
|
||||||
|
lg:gap-y-0
|
||||||
|
lg:grid-cols-2
|
||||||
|
lg:grid-cols-3
|
||||||
|
lg:hidden
|
||||||
|
lg:justify-end
|
||||||
|
lg:justify-start
|
||||||
|
lg:mb-0
|
||||||
|
lg:min-w-0
|
||||||
|
lg:p-10
|
||||||
|
lg:p-8
|
||||||
|
lg:pb-5
|
||||||
|
lg:pl-64
|
||||||
|
lg:pr-3.5
|
||||||
|
lg:pt-5
|
||||||
|
lg:px-8
|
||||||
|
lg:ring-1
|
||||||
|
lg:ring-base-content/10
|
||||||
|
lg:rounded-lg
|
||||||
|
lg:shadow-xs
|
||||||
|
link
|
||||||
|
link-animated
|
||||||
|
link-hover
|
||||||
|
link-primary
|
||||||
|
list-disc
|
||||||
|
list-inside
|
||||||
|
list-none
|
||||||
|
loading
|
||||||
|
loading-lg
|
||||||
|
loading-sm
|
||||||
|
loading-spinner
|
||||||
|
loading-xl
|
||||||
|
loading-xs
|
||||||
|
lowercase
|
||||||
|
m-10
|
||||||
|
mask
|
||||||
|
max-h-52
|
||||||
|
max-lg:flex-col
|
||||||
|
max-lg:hidden
|
||||||
|
max-md:flex-wrap
|
||||||
|
max-md:justify-center
|
||||||
|
max-sm:hidden
|
||||||
|
max-w-2xl
|
||||||
|
max-w-7xl
|
||||||
|
max-w-8
|
||||||
|
max-w-80
|
||||||
|
max-w-full
|
||||||
|
max-w-lg
|
||||||
|
max-w-md
|
||||||
|
max-w-none
|
||||||
|
max-w-sm
|
||||||
|
max-w-xl
|
||||||
|
mb-0.5
|
||||||
|
mb-1
|
||||||
|
mb-1.5
|
||||||
|
mb-2
|
||||||
|
mb-2.5
|
||||||
|
mb-3
|
||||||
|
mb-4
|
||||||
|
mb-5
|
||||||
|
mb-8
|
||||||
|
md:col-span-1
|
||||||
|
md:col-span-2
|
||||||
|
md:col-span-6
|
||||||
|
md:flex
|
||||||
|
md:gap-x-5
|
||||||
|
md:grid-cols-2
|
||||||
|
md:grid-cols-3
|
||||||
|
md:min-w-md
|
||||||
|
md:table-cell
|
||||||
|
md:text-3xl
|
||||||
|
me-0.5
|
||||||
|
me-1
|
||||||
|
me-1.5
|
||||||
|
me-2
|
||||||
|
me-2.5
|
||||||
|
me-3
|
||||||
|
me-4
|
||||||
|
me-5
|
||||||
|
menu
|
||||||
|
menu-active
|
||||||
|
menu-disabled
|
||||||
|
menu-dropdown
|
||||||
|
menu-dropdown-show
|
||||||
|
menu-focus
|
||||||
|
menu-horizontal
|
||||||
|
menu-title
|
||||||
|
min-h-0
|
||||||
|
min-h-full
|
||||||
|
min-h-screen
|
||||||
|
min-h-svh
|
||||||
|
min-w-0
|
||||||
|
min-w-28
|
||||||
|
min-w-48
|
||||||
|
min-w-60
|
||||||
|
min-w-[100px]
|
||||||
|
min-w-full
|
||||||
|
min-w-sm
|
||||||
|
mix-blend-exclusion
|
||||||
|
ml-3
|
||||||
|
ml-4
|
||||||
|
modal
|
||||||
|
modal-content
|
||||||
|
modal-dialog
|
||||||
|
modal-middle
|
||||||
|
modal-title
|
||||||
|
mr-2
|
||||||
|
mr-3
|
||||||
|
mr-4
|
||||||
|
ms-0.5
|
||||||
|
ms-1
|
||||||
|
ms-1.5
|
||||||
|
ms-2
|
||||||
|
ms-2.5
|
||||||
|
ms-3
|
||||||
|
ms-5
|
||||||
|
ms-auto
|
||||||
|
mt-1
|
||||||
|
mt-1.5
|
||||||
|
mt-10
|
||||||
|
mt-12
|
||||||
|
mt-2
|
||||||
|
mt-2.5
|
||||||
|
mt-3
|
||||||
|
mt-3.5
|
||||||
|
mt-4
|
||||||
|
mt-5
|
||||||
|
mt-6
|
||||||
|
mt-8
|
||||||
|
mt-auto
|
||||||
|
mx-1
|
||||||
|
mx-auto
|
||||||
|
my-2.5
|
||||||
|
my-3
|
||||||
|
my-5
|
||||||
|
my-8
|
||||||
|
my-auto
|
||||||
|
object-cover
|
||||||
|
opacity-0
|
||||||
|
opacity-100
|
||||||
|
opacity-75
|
||||||
|
open
|
||||||
|
origin-top-left
|
||||||
|
outline
|
||||||
|
outline-0
|
||||||
|
overflow-hidden
|
||||||
|
overflow-x-auto
|
||||||
|
overflow-x-hidden
|
||||||
|
overflow-y-auto
|
||||||
|
overlay-open:duration-50
|
||||||
|
overlay-open:opacity-100
|
||||||
|
p-0.5
|
||||||
|
p-1
|
||||||
|
p-1.5
|
||||||
|
p-2
|
||||||
|
p-2.5
|
||||||
|
p-3
|
||||||
|
p-4
|
||||||
|
p-5
|
||||||
|
p-6
|
||||||
|
p-8
|
||||||
|
pb-1
|
||||||
|
pe-1.5
|
||||||
|
pin-input
|
||||||
|
pin-input-underline
|
||||||
|
placeholder-base-content/50
|
||||||
|
placeholder-base-content/60
|
||||||
|
placeholder:text-gray-600
|
||||||
|
pointer-events-auto
|
||||||
|
pointer-events-none
|
||||||
|
progress
|
||||||
|
progress-bar
|
||||||
|
progress-indeterminate
|
||||||
|
progress-primary
|
||||||
|
pt-0
|
||||||
|
pt-0.5
|
||||||
|
pt-1.5
|
||||||
|
pt-2
|
||||||
|
pt-3
|
||||||
|
pt-6
|
||||||
|
px-1.5
|
||||||
|
px-2
|
||||||
|
px-2.5
|
||||||
|
px-3
|
||||||
|
px-4
|
||||||
|
px-5
|
||||||
|
px-6
|
||||||
|
py-0.5
|
||||||
|
py-1
|
||||||
|
py-1.5
|
||||||
|
py-10
|
||||||
|
py-12
|
||||||
|
py-2
|
||||||
|
py-2.5
|
||||||
|
py-3
|
||||||
|
py-3.5
|
||||||
|
py-6
|
||||||
|
radial-progress
|
||||||
|
radio
|
||||||
|
range
|
||||||
|
relative
|
||||||
|
resize
|
||||||
|
right-4
|
||||||
|
ring
|
||||||
|
ring-0
|
||||||
|
ring-1
|
||||||
|
ring-gray-700
|
||||||
|
ring-inset
|
||||||
|
ring-white/10
|
||||||
|
rounded-box
|
||||||
|
rounded-field
|
||||||
|
rounded-full
|
||||||
|
rounded-l-none
|
||||||
|
rounded-lg
|
||||||
|
rounded-md
|
||||||
|
rounded-none
|
||||||
|
rounded-r-none
|
||||||
|
rounded-t-lg
|
||||||
|
rounded-xl
|
||||||
|
row-active
|
||||||
|
row-hover
|
||||||
|
rtl:!mr-0
|
||||||
|
select
|
||||||
|
select-disabled:opacity-40
|
||||||
|
select-disabled:pointer-events-none
|
||||||
|
select-floating
|
||||||
|
select-floating-label
|
||||||
|
select-lg
|
||||||
|
select-md
|
||||||
|
select-sm
|
||||||
|
select-xl
|
||||||
|
select-xs
|
||||||
|
selected
|
||||||
|
selected:select-active
|
||||||
|
shadow
|
||||||
|
shadow-base-300/20
|
||||||
|
shadow-lg
|
||||||
|
shadow-md
|
||||||
|
shadow-sm
|
||||||
|
shadow-xs
|
||||||
|
shrink-0
|
||||||
|
size-10
|
||||||
|
size-12
|
||||||
|
size-4
|
||||||
|
size-5
|
||||||
|
size-7
|
||||||
|
size-8
|
||||||
|
skeleton
|
||||||
|
skeleton-animated
|
||||||
|
sm:auto-cols-max
|
||||||
|
sm:col-span-2
|
||||||
|
sm:col-span-3
|
||||||
|
sm:col-span-4
|
||||||
|
sm:col-span-6
|
||||||
|
sm:flex
|
||||||
|
sm:flex-nowrap
|
||||||
|
sm:gap-y-0
|
||||||
|
sm:grid-cols-2
|
||||||
|
sm:grid-cols-3
|
||||||
|
sm:grid-cols-6
|
||||||
|
sm:items-center
|
||||||
|
sm:items-end
|
||||||
|
sm:justify-between
|
||||||
|
sm:justify-end
|
||||||
|
sm:leading-6
|
||||||
|
sm:max-w-2xl
|
||||||
|
sm:max-w-3xl
|
||||||
|
sm:max-w-4xl
|
||||||
|
sm:max-w-5xl
|
||||||
|
sm:max-w-6xl
|
||||||
|
sm:max-w-7xl
|
||||||
|
sm:max-w-[480px]
|
||||||
|
sm:max-w-lg
|
||||||
|
sm:max-w-md
|
||||||
|
sm:max-w-xl
|
||||||
|
sm:mb-0
|
||||||
|
sm:min-w-md
|
||||||
|
sm:mr-3
|
||||||
|
sm:mt-5
|
||||||
|
sm:mt-6
|
||||||
|
sm:mx-auto
|
||||||
|
sm:p-6
|
||||||
|
sm:px-12
|
||||||
|
sm:px-6
|
||||||
|
sm:py-2
|
||||||
|
sm:rounded-lg
|
||||||
|
sm:text-sm
|
||||||
|
sm:text-sm/5
|
||||||
|
sm:w-1/2
|
||||||
|
sm:w-full
|
||||||
|
space-x-1
|
||||||
|
space-x-2
|
||||||
|
space-x-2.5
|
||||||
|
space-y-1
|
||||||
|
space-y-4
|
||||||
|
space-y-6
|
||||||
|
sr-only
|
||||||
|
stack
|
||||||
|
stat
|
||||||
|
stat-actions
|
||||||
|
stat-desc
|
||||||
|
stat-figure
|
||||||
|
stat-title
|
||||||
|
stat-value
|
||||||
|
static
|
||||||
|
stats
|
||||||
|
stats-border
|
||||||
|
status
|
||||||
|
status-error
|
||||||
|
status-primary
|
||||||
|
status-secondary
|
||||||
|
status-success
|
||||||
|
status-warning
|
||||||
|
status-xl
|
||||||
|
sticky
|
||||||
|
success-message
|
||||||
|
switch
|
||||||
|
switch-primary
|
||||||
|
tab
|
||||||
|
tab-active
|
||||||
|
tab-content
|
||||||
|
table
|
||||||
|
table-pin-cols
|
||||||
|
table-pin-rows
|
||||||
|
tabs
|
||||||
|
tabs-bordered
|
||||||
|
tabs-lg
|
||||||
|
tabs-lifted
|
||||||
|
tabs-md
|
||||||
|
tabs-sm
|
||||||
|
tabs-vertical
|
||||||
|
tabs-xl
|
||||||
|
tabs-xs
|
||||||
|
text-2xl
|
||||||
|
text-3xl
|
||||||
|
text-4xl
|
||||||
|
text-accent
|
||||||
|
text-base
|
||||||
|
text-base-content
|
||||||
|
text-base-content/40
|
||||||
|
text-base-content/50
|
||||||
|
text-base-content/60
|
||||||
|
text-base-content/70
|
||||||
|
text-base-content/80
|
||||||
|
text-base-content/90
|
||||||
|
text-base/6
|
||||||
|
text-center
|
||||||
|
text-error
|
||||||
|
text-error-content
|
||||||
|
text-gray-100
|
||||||
|
text-gray-400
|
||||||
|
text-gray-500
|
||||||
|
text-gray-700
|
||||||
|
text-indigo-600
|
||||||
|
text-info
|
||||||
|
text-info-content
|
||||||
|
text-left
|
||||||
|
text-lg
|
||||||
|
text-primary
|
||||||
|
text-primary-content
|
||||||
|
text-right
|
||||||
|
text-slate-100
|
||||||
|
text-sm
|
||||||
|
text-sm/5
|
||||||
|
text-success
|
||||||
|
text-success-content
|
||||||
|
text-transparent
|
||||||
|
text-warning
|
||||||
|
text-warning-content
|
||||||
|
text-white
|
||||||
|
text-xl
|
||||||
|
text-xl!
|
||||||
|
text-xs
|
||||||
|
text-xs/5
|
||||||
|
textarea
|
||||||
|
textarea-floating
|
||||||
|
textarea-floating-label
|
||||||
|
textarea-lg
|
||||||
|
textarea-md
|
||||||
|
textarea-sm
|
||||||
|
textarea-xl
|
||||||
|
textarea-xs
|
||||||
|
theme-controller
|
||||||
|
to-25%
|
||||||
|
to-base-100/75
|
||||||
|
to-purple-400
|
||||||
|
tooltip
|
||||||
|
tooltip-content
|
||||||
|
top-0
|
||||||
|
top-1/2
|
||||||
|
top-4
|
||||||
|
top-full
|
||||||
|
tracking-tight
|
||||||
|
tracking-wide
|
||||||
|
transform
|
||||||
|
transition
|
||||||
|
transition-all
|
||||||
|
transition-opacity
|
||||||
|
translate-x-0
|
||||||
|
truncate
|
||||||
|
underline
|
||||||
|
uppercase
|
||||||
|
validate
|
||||||
|
via-sky-400
|
||||||
|
w-0
|
||||||
|
w-0.5
|
||||||
|
w-12
|
||||||
|
w-13
|
||||||
|
w-32
|
||||||
|
w-4
|
||||||
|
w-56
|
||||||
|
w-64
|
||||||
|
w-8
|
||||||
|
w-auto
|
||||||
|
w-fit
|
||||||
|
w-full
|
||||||
|
whitespace-nowrap
|
||||||
|
xl:grid-cols-3
|
||||||
|
xl:grid-cols-4
|
||||||
|
z-1
|
||||||
|
z-10
|
||||||
|
z-40
|
||||||
|
z-50
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
@using System.Diagnostics.CodeAnalysis
|
@using System.Diagnostics.CodeAnalysis
|
||||||
@using Microsoft.AspNetCore.Components
|
|
||||||
|
|
||||||
@* TODO: Extract to mooncore? *@
|
@* TODO: Extract to mooncore? *@
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
@using System.Text.Json.Serialization
|
|
||||||
@using Microsoft.Extensions.Logging
|
@using Microsoft.Extensions.Logging
|
||||||
@using XtermBlazor
|
@using XtermBlazor
|
||||||
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
||||||
@@ -15,11 +14,11 @@
|
|||||||
Addons="Parent.Addons"
|
Addons="Parent.Addons"
|
||||||
Options="Parent.Options"
|
Options="Parent.Options"
|
||||||
Class="h-full w-full"
|
Class="h-full w-full"
|
||||||
OnFirstRender="HandleFirstRender"/>
|
OnFirstRender="HandleFirstRenderAsync"/>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="absolute top-4 right-4">
|
<div class="absolute top-4 right-4">
|
||||||
<button @onclick="Hide" class="btn btn-error btn-square">
|
<button @onclick="HideAsync" class="btn btn-error btn-square">
|
||||||
<i class="icon-x text-lg"></i>
|
<i class="icon-x text-lg"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -50,13 +49,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Subscribe to parent events
|
// Subscribe to parent events
|
||||||
Parent.OnWrite += HandleWrite;
|
Parent.OnWrite += HandleWriteAsync;
|
||||||
|
|
||||||
IsInitialized = true;
|
IsInitialized = true;
|
||||||
await InvokeAsync(StateHasChanged);
|
await InvokeAsync(StateHasChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task HandleFirstRender()
|
private async Task HandleFirstRenderAsync()
|
||||||
{
|
{
|
||||||
IsReadyToWrite = true;
|
IsReadyToWrite = true;
|
||||||
|
|
||||||
@@ -73,7 +72,7 @@
|
|||||||
await Terminal.Write(outputToWrite);
|
await Terminal.Write(outputToWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task HandleWrite(string content)
|
private async Task HandleWriteAsync(string content)
|
||||||
{
|
{
|
||||||
if (!IsReadyToWrite)
|
if (!IsReadyToWrite)
|
||||||
return;
|
return;
|
||||||
@@ -83,7 +82,7 @@
|
|||||||
|
|
||||||
public async ValueTask DisposeAsync()
|
public async ValueTask DisposeAsync()
|
||||||
{
|
{
|
||||||
Parent.OnWrite -= HandleWrite;
|
Parent.OnWrite -= HandleWriteAsync;
|
||||||
await Terminal.DisposeAsync();
|
await Terminal.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,25 +3,38 @@
|
|||||||
|
|
||||||
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
||||||
|
|
||||||
<h1 class="mb-5 font-semibold text-xl">Add a new allocation</h1>
|
<div class="p-5">
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<div class="avatar avatar-placeholder max-sm:hidden">
|
||||||
|
<div class="border-base-content/20 rounded-box w-13 border-1">
|
||||||
|
<span class="icon-ethernet-port text-xl"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-1">
|
||||||
|
<h3 class="text-base-content text-2xl font-semibold">Add a new allocation</h3>
|
||||||
|
<p class="text-base-content/80">Add a new allocation to the selected node</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-5">
|
||||||
<HandleForm @ref="HandleForm" Model="Form" OnValidSubmit="OnValidSubmit">
|
<HandleForm @ref="HandleForm" Model="Form" OnValidSubmit="OnValidSubmit">
|
||||||
<div class="grid grid-cols-1 gap-2">
|
<div class="mt-2">
|
||||||
<div class="col-span-1">
|
<label class="label-text">IP Address</label>
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">IP Address</label>
|
<input class="input" @bind="Form.IpAddress" type="text"/>
|
||||||
<input @bind="Form.IpAddress" type="text" class="input w-full"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-span-1">
|
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">Port</label>
|
|
||||||
<input @bind="Form.Port" type="text" class="input w-full"/>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mt-2">
|
||||||
|
<label class="label-text">Port</label>
|
||||||
|
<input class="input" @bind="Form.Port" type="number"/>
|
||||||
</div>
|
</div>
|
||||||
</HandleForm>
|
</HandleForm>
|
||||||
|
</div>
|
||||||
<div class="mt-5 flex space-x-2">
|
<div class="mt-5 flex justify-end">
|
||||||
<WButton OnClick="_ => Hide()" CssClasses="btn btn-secondary grow">Cancel</WButton>
|
<button @onclick="HideAsync" type="button" class="btn btn-secondary me-2">
|
||||||
<WButton OnClick="_ => Submit()" CssClasses="btn btn-primary grow">Create</WButton>
|
Cancel
|
||||||
|
</button>
|
||||||
|
<WButton OnClick="SubmitAsync">
|
||||||
|
Create
|
||||||
|
</WButton>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code
|
@code
|
||||||
@@ -42,8 +55,8 @@
|
|||||||
private async Task OnValidSubmit()
|
private async Task OnValidSubmit()
|
||||||
{
|
{
|
||||||
await OnSubmit.Invoke(Form);
|
await OnSubmit.Invoke(Form);
|
||||||
await Hide();
|
await HideAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Submit() => HandleForm.Submit();
|
private Task SubmitAsync() => HandleForm.SubmitAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,30 +3,42 @@
|
|||||||
|
|
||||||
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
||||||
|
|
||||||
<h1 class="mb-5 font-semibold text-xl">Add a range of new allocations</h1>
|
<div class="p-5">
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<div class="avatar avatar-placeholder max-sm:hidden">
|
||||||
|
<div class="border-base-content/20 rounded-box w-13 border-1">
|
||||||
|
<span class="icon-ethernet-port text-xl"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-1">
|
||||||
|
<h3 class="text-base-content text-2xl font-semibold">Add multiple allocations</h3>
|
||||||
|
<p class="text-base-content/80">Add a range of new allocations to the selected node</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-5">
|
||||||
<HandleForm @ref="HandleForm" Model="Form" OnValidSubmit="OnValidSubmit">
|
<HandleForm @ref="HandleForm" Model="Form" OnValidSubmit="OnValidSubmit">
|
||||||
<div class="grid grid-cols-1 gap-2">
|
<div class="mt-2">
|
||||||
<div class="col-span-1">
|
<label class="label-text">IP Address</label>
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">IP Address</label>
|
<input class="input" @bind="Form.IpAddress" type="text"/>
|
||||||
<input @bind="Form.IpAddress" type="text" class="input w-full"/>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mt-2">
|
||||||
<div class="col-span-1">
|
<label class="label-text">Start Port</label>
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">Start Port</label>
|
<input class="input" @bind="Form.Start" type="number"/>
|
||||||
<input @bind="Form.Start" type="text" class="input w-full"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-span-1">
|
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">End Port</label>
|
|
||||||
<input @bind="Form.End" type="text" class="input w-full"/>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mt-2">
|
||||||
|
<label class="label-text">End Port</label>
|
||||||
|
<input class="input" @bind="Form.End" type="number"/>
|
||||||
</div>
|
</div>
|
||||||
</HandleForm>
|
</HandleForm>
|
||||||
|
</div>
|
||||||
<div class="mt-5 flex space-x-2">
|
<div class="mt-5 flex justify-end">
|
||||||
<WButton OnClick="_ => Hide()" CssClasses="btn btn-secondary grow">Cancel</WButton>
|
<button @onclick="HideAsync" type="button" class="btn btn-secondary me-2">
|
||||||
<WButton OnClick="_ => Submit()" CssClasses="btn btn-primary grow">Create</WButton>
|
Cancel
|
||||||
|
</button>
|
||||||
|
<WButton OnClick="SubmitAsync">
|
||||||
|
Create
|
||||||
|
</WButton>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code
|
@code
|
||||||
@@ -49,8 +61,8 @@
|
|||||||
private async Task OnValidSubmit()
|
private async Task OnValidSubmit()
|
||||||
{
|
{
|
||||||
await OnSubmit.Invoke(Form);
|
await OnSubmit.Invoke(Form);
|
||||||
await Hide();
|
await HideAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Submit() => HandleForm.Submit();
|
private Task SubmitAsync() => HandleForm.SubmitAsync();
|
||||||
}
|
}
|
||||||
@@ -4,25 +4,38 @@
|
|||||||
|
|
||||||
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
||||||
|
|
||||||
<h1 class="mb-5 font-semibold text-xl">Update allocation</h1>
|
<div class="p-5">
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<div class="avatar avatar-placeholder max-sm:hidden">
|
||||||
|
<div class="border-base-content/20 rounded-box w-13 border-1">
|
||||||
|
<span class="icon-ethernet-port text-xl"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-1">
|
||||||
|
<h3 class="text-base-content text-2xl font-semibold">Update allocation</h3>
|
||||||
|
<p class="text-base-content/80">Update an existing allocation</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-5">
|
||||||
<HandleForm @ref="HandleForm" Model="Form" OnValidSubmit="OnValidSubmit">
|
<HandleForm @ref="HandleForm" Model="Form" OnValidSubmit="OnValidSubmit">
|
||||||
<div class="grid grid-cols-1 gap-2">
|
<div class="mt-2">
|
||||||
<div class="col-span-1">
|
<label class="label-text">IP Address</label>
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">IP Address</label>
|
<input class="input" @bind="Form.IpAddress" type="text"/>
|
||||||
<input @bind="Form.IpAddress" type="text" class="input w-full"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-span-1">
|
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">Port</label>
|
|
||||||
<input @bind="Form.Port" type="text" class="input w-full"/>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mt-2">
|
||||||
|
<label class="label-text">Port</label>
|
||||||
|
<input class="input" @bind="Form.Port" type="number"/>
|
||||||
</div>
|
</div>
|
||||||
</HandleForm>
|
</HandleForm>
|
||||||
|
</div>
|
||||||
<div class="mt-5 flex space-x-2">
|
<div class="mt-5 flex justify-end">
|
||||||
<WButton OnClick="_ => Hide()" CssClasses="btn btn-secondary grow">Cancel</WButton>
|
<button @onclick="HideAsync" type="button" class="btn btn-secondary me-2">
|
||||||
<WButton OnClick="_ => Submit()" CssClasses="btn btn-primary grow">Update</WButton>
|
Cancel
|
||||||
|
</button>
|
||||||
|
<WButton OnClick="SubmitAsync">
|
||||||
|
Update
|
||||||
|
</WButton>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code
|
@code
|
||||||
@@ -45,8 +58,8 @@
|
|||||||
private async Task OnValidSubmit()
|
private async Task OnValidSubmit()
|
||||||
{
|
{
|
||||||
await OnSubmit.Invoke(Form);
|
await OnSubmit.Invoke(Form);
|
||||||
await Hide();
|
await HideAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Submit() => HandleForm.Submit();
|
private Task SubmitAsync() => HandleForm.SubmitAsync();
|
||||||
}
|
}
|
||||||
@@ -2,26 +2,7 @@
|
|||||||
@using MoonlightServers.Shared.Http.Requests.Admin.Nodes
|
@using MoonlightServers.Shared.Http.Requests.Admin.Nodes
|
||||||
|
|
||||||
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
|
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
|
||||||
<div class="sm:col-span-2">
|
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">Enable Transparent
|
|
||||||
Mode
|
|
||||||
</label>
|
|
||||||
<div class="mt-2">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<Switch @bind-Value="Request.EnableTransparentMode"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="sm:col-span-2">
|
|
||||||
<label class="block text-sm font-medium leading-6 text-base-content">
|
|
||||||
Enable Dynamic Firewall
|
|
||||||
</label>
|
|
||||||
<div class="mt-2">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<Switch @bind-Value="Request.EnableDynamicFirewall"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user