Recreated solution with web app template. Improved theme. Switched to ShadcnBlazor library

This commit is contained in:
2025-12-25 19:16:53 +01:00
parent 0cc35300f1
commit a2d4edc0e5
272 changed files with 2441 additions and 14449 deletions

View File

@@ -1,15 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.ApiKeys;
public class CreateApiKeyRequest
{
[Required(ErrorMessage = "You need to specify a description")]
public string Description { get; set; }
[Required(ErrorMessage = "You need to specify permissions for the api key")]
public string[] Permissions { get; set; } = [];
[Required(ErrorMessage = "You need to specify an expire date")]
public DateTime ExpiresAt { get; set; } = DateTime.UtcNow.AddDays(30);
}

View File

@@ -1,9 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.ApiKeys;
public class UpdateApiKeyRequest
{
[Required(ErrorMessage = "You need to specify a description")]
public string Description { get; set; }
}

View File

@@ -1,12 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.Sys.Files;
public class CombineRequest
{
[Required(ErrorMessage = "Destination is required")]
public string Destination { get; set; }
[Required(ErrorMessage = "Files are required")]
public string[] Files { get; set; }
}

View File

@@ -1,18 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.Sys.Files;
public class CompressRequest
{
[Required(ErrorMessage = "Format is required")]
public string Format { get; set; }
[Required(ErrorMessage = "Destination is required")]
public string Destination { get; set; }
[Required(ErrorMessage = "Root is required")]
public string Root { get; set; }
[Required(ErrorMessage = "Items are required")]
public string[] Items { get; set; }
}

View File

@@ -1,15 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.Sys.Files;
public class DecompressRequest
{
[Required(ErrorMessage = "You need to provide a format")]
public string Format { get; set; }
[Required(ErrorMessage = "You need to provide a path")]
public string Path { get; set; }
[Required(ErrorMessage = "You need to provide a destination")]
public string Destination { get; set; }
}

View File

@@ -1,9 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.Sys;
public class GenerateDiagnoseRequest
{
[Required(ErrorMessage = "You need to define providers")]
public string[] Providers { get; set; } = [];
}

View File

@@ -1,21 +0,0 @@
using System.ComponentModel.DataAnnotations;
using Moonlight.Shared.Misc;
namespace Moonlight.Shared.Http.Requests.Admin.Sys.Theme;
public class CreateThemeRequest
{
[Required(ErrorMessage = "You need to provide a name")]
public string Name { get; set; }
[Required(ErrorMessage = "You need to provide an author")]
public string Author { get; set; }
[Required(ErrorMessage = "You need to provide a version")]
public string Version { get; set; }
public string? UpdateUrl { get; set; }
public string? DonateUrl { get; set; }
public ApplicationTheme Content { get; set; } = new();
}

View File

@@ -1,23 +0,0 @@
using System.ComponentModel.DataAnnotations;
using Moonlight.Shared.Misc;
namespace Moonlight.Shared.Http.Requests.Admin.Sys.Theme;
public class UpdateThemeRequest
{
public bool IsEnabled { get; set; }
[Required(ErrorMessage = "You need to provide a name")]
public string Name { get; set; }
[Required(ErrorMessage = "You need to provide an author")]
public string Author { get; set; }
[Required(ErrorMessage = "You need to provide a version")]
public string Version { get; set; }
public string? UpdateUrl { get; set; }
public string? DonateUrl { get; set; }
public ApplicationTheme Content { get; set; }
}

View File

@@ -1,22 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.Users;
public class CreateUserRequest
{
[Required(ErrorMessage = "You need to provide an email address")]
[EmailAddress(ErrorMessage = "You need to provide a valid email address")]
public string Email { get; set; }
[Required(ErrorMessage = "You need to provide a username")]
[RegularExpression("^[a-z][a-z0-9]*$", ErrorMessage = "Usernames can only contain lowercase characters and numbers and should not start with a number")]
public string Username { get; set; }
[Required(ErrorMessage = "You need to provide a password")]
[MinLength(8, ErrorMessage = "Your password needs to be at least 8 characters long")]
[MaxLength(256, ErrorMessage = "Your password should not exceed the length of 256 characters")]
public string Password { get; set; }
[Required(ErrorMessage = "You need to provide permissions")]
public string[] Permissions { get; set; } = [];
}

View File

@@ -1,19 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Admin.Users;
public class UpdateUserRequest
{
[Required(ErrorMessage = "You need to provide an email address")]
[EmailAddress(ErrorMessage = "You need to provide a valid email address")]
public string Email { get; set; }
[Required(ErrorMessage = "You need to provide a username")]
[RegularExpression("^[a-z][a-z0-9]*$", ErrorMessage = "Usernames can only contain lowercase characters and numbers and should not start with a number")]
public string Username { get; set; }
public string? Password { get; set; }
[Required(ErrorMessage = "You need to provide permissions")]
public string[] Permissions { get; set; } = [];
}

View File

@@ -0,0 +1,62 @@
using System.Diagnostics.CodeAnalysis;
namespace Moonlight.Shared.Http.Requests;
public class FilterOptions : IParsable<FilterOptions>
{
public Dictionary<string, string> Filters { get; set; }
public FilterOptions()
{
Filters = new();
}
public FilterOptions(Dictionary<string, string> filters)
{
Filters = filters;
}
public static FilterOptions Parse(string s, IFormatProvider? provider)
{
if (!TryParse(s, provider, out var result))
throw new AggregateException("Unable to parse filter options");
return result;
}
public static bool TryParse(
[NotNullWhen(true)] string? input,
IFormatProvider? provider,
[MaybeNullWhen(false)] out FilterOptions result
)
{
result = new();
if (string.IsNullOrEmpty(input))
return true;
var filters = input.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
foreach (var part in filters)
{
var filterParts = part.Split('$', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (filterParts.Length != 2)
continue;
result.Filters.Add(filterParts[0], filterParts[1]);
}
return true;
}
public override string ToString()
{
var result = "";
foreach (var filter in Filters)
result += $"{filter.Key}${filter.Value};";
return result;
}
}

View File

@@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Users;
public class CreateUserRequest
{
[Required]
[MinLength(3)]
[MaxLength(32)]
public string Username { get; set; }
[Required] [EmailAddress] public string Email { get; set; }
}

View File

@@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.Shared.Http.Requests.Users;
public class UpdateUserRequest
{
[Required]
[MinLength(3)]
[MaxLength(32)]
public string Username { get; set; }
[Required] [EmailAddress] public string Email { get; set; }
}