diff --git a/MareSynchronosServer/.editorconfig b/MareSynchronosServer/.editorconfig deleted file mode 100644 index 6cf5454..0000000 --- a/MareSynchronosServer/.editorconfig +++ /dev/null @@ -1,4 +0,0 @@ -[*.cs] - -# MA0048: File name must match type name -dotnet_diagnostic.MA0048.severity = suggestion diff --git a/MareSynchronosServer/MareSynchronosAuthService/Authentication/SecretKeyAuthReply.cs b/MareSynchronosServer/MareSynchronosAuthService/Authentication/SecretKeyAuthReply.cs deleted file mode 100644 index f6ef7cf..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Authentication/SecretKeyAuthReply.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace MareSynchronosAuthService.Authentication; - -public record SecretKeyAuthReply(bool Success, string Uid, string Alias, bool TempBan, bool Permaban); diff --git a/MareSynchronosServer/MareSynchronosAuthService/Authentication/SecretKeyFailedAuthorization.cs b/MareSynchronosServer/MareSynchronosAuthService/Authentication/SecretKeyFailedAuthorization.cs deleted file mode 100644 index fcf6581..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Authentication/SecretKeyFailedAuthorization.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MareSynchronosAuthService.Authentication; - -internal record SecretKeyFailedAuthorization -{ - private int failedAttempts = 1; - public int FailedAttempts => failedAttempts; - public Task ResetTask { get; set; } - public void IncreaseFailedAttempts() - { - Interlocked.Increment(ref failedAttempts); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Controllers/DiscoveryController.cs b/MareSynchronosServer/MareSynchronosAuthService/Controllers/DiscoveryController.cs deleted file mode 100644 index 7ef5742..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Controllers/DiscoveryController.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System.Text.Json.Serialization; -using MareSynchronosAuthService.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; - -namespace MareSynchronosAuthService.Controllers; - -[Authorize] -[ApiController] -[Route("discovery")] -public class DiscoveryController : Controller -{ - private readonly DiscoveryWellKnownProvider _provider; - private readonly DiscoveryPresenceService _presence; - - public DiscoveryController(DiscoveryWellKnownProvider provider, DiscoveryPresenceService presence) - { - _provider = provider; - _presence = presence; - } - - public sealed class QueryRequest - { - [JsonPropertyName("hashes")] public string[] Hashes { get; set; } = Array.Empty(); - [JsonPropertyName("salt")] public string SaltB64 { get; set; } = string.Empty; - } - - public sealed class QueryResponseEntry - { - [JsonPropertyName("hash")] public string Hash { get; set; } = string.Empty; - [JsonPropertyName("token")] public string? Token { get; set; } - [JsonPropertyName("uid")] public string Uid { get; set; } = string.Empty; - [JsonPropertyName("displayName")] public string? DisplayName { get; set; } - } - - [HttpPost("query")] - public IActionResult Query([FromBody] QueryRequest req) - { - if (_provider.IsExpired(req.SaltB64)) - { - return BadRequest(new { code = "DISCOVERY_SALT_EXPIRED" }); - } - - var uid = User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Uid)?.Value ?? string.Empty; - if (string.IsNullOrEmpty(uid) || req?.Hashes == null || req.Hashes.Length == 0) - return Json(Array.Empty()); - - List matches = new(); - foreach (var h in req.Hashes.Distinct(StringComparer.Ordinal)) - { - var (found, token, targetUid, displayName) = _presence.TryMatchAndIssueToken(uid, h); - if (found) - { - matches.Add(new QueryResponseEntry { Hash = h, Token = token, Uid = targetUid, DisplayName = displayName }); - } - } - - return Json(matches); - } - - public sealed class RequestDto - { - [JsonPropertyName("token")] public string Token { get; set; } = string.Empty; - [JsonPropertyName("displayName")] public string? DisplayName { get; set; } - } - - [HttpPost("request")] - public async Task RequestPair([FromBody] RequestDto req) - { - if (string.IsNullOrEmpty(req.Token)) return BadRequest(); - if (_presence.ValidateToken(req.Token, out var targetUid)) - { - // Phase 3 (minimal): notify target via mare-server internal controller - try - { - var fromUid = User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Uid)?.Value ?? string.Empty; - var fromAlias = string.IsNullOrEmpty(req.DisplayName) - ? (User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Alias)?.Value ?? string.Empty) - : req.DisplayName; - - using var http = new HttpClient(); - // Use same host as public (goes through nginx) - var baseUrl = $"{Request.Scheme}://{Request.Host.Value}"; - var url = new Uri(new Uri(baseUrl), "/main/discovery/notifyRequest"); - - // Generate internal JWT - var serverToken = HttpContext.RequestServices.GetRequiredService().Token; - http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", serverToken); - var payload = System.Text.Json.JsonSerializer.Serialize(new { targetUid, fromUid, fromAlias }); - var resp = await http.PostAsync(url, new StringContent(payload, System.Text.Encoding.UTF8, "application/json")); - if (!resp.IsSuccessStatusCode) - { - var txt = await resp.Content.ReadAsStringAsync(); - HttpContext.RequestServices.GetRequiredService>() - .LogWarning("notifyRequest failed: {code} {reason} {body}", (int)resp.StatusCode, resp.ReasonPhrase, txt); - } - } - catch { /* ignore */ } - - return Accepted(); - } - return BadRequest(new { code = "INVALID_TOKEN" }); - } - - public sealed class AcceptNotifyDto - { - [JsonPropertyName("targetUid")] public string TargetUid { get; set; } = string.Empty; - [JsonPropertyName("displayName")] public string? DisplayName { get; set; } - } - - // Accept notification relay (sender -> auth -> main) - [HttpPost("acceptNotify")] - public async Task AcceptNotify([FromBody] AcceptNotifyDto req) - { - if (string.IsNullOrEmpty(req.TargetUid)) return BadRequest(); - try - { - var fromUid = User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Uid)?.Value ?? string.Empty; - var fromAlias = string.IsNullOrEmpty(req.DisplayName) - ? (User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Alias)?.Value ?? string.Empty) - : req.DisplayName; - - using var http = new HttpClient(); - var baseUrl = $"{Request.Scheme}://{Request.Host.Value}"; - var url = new Uri(new Uri(baseUrl), "/main/discovery/notifyAccept"); - var serverToken = HttpContext.RequestServices.GetRequiredService().Token; - http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", serverToken); - var payload = System.Text.Json.JsonSerializer.Serialize(new { targetUid = req.TargetUid, fromUid, fromAlias }); - var resp = await http.PostAsync(url, new StringContent(payload, System.Text.Encoding.UTF8, "application/json")); - if (!resp.IsSuccessStatusCode) - { - var txt = await resp.Content.ReadAsStringAsync(); - HttpContext.RequestServices.GetRequiredService>() - .LogWarning("notifyAccept failed: {code} {reason} {body}", (int)resp.StatusCode, resp.ReasonPhrase, txt); - } - } - catch { /* ignore */ } - - return Accepted(); - } - - public sealed class PublishRequest - { - [JsonPropertyName("hashes")] public string[] Hashes { get; set; } = Array.Empty(); - [JsonPropertyName("displayName")] public string? DisplayName { get; set; } - [JsonPropertyName("salt")] public string SaltB64 { get; set; } = string.Empty; - [JsonPropertyName("allowRequests")] public bool AllowRequests { get; set; } = true; - } - - [HttpPost("disable")] - public IActionResult Disable() - { - var uid = User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Uid)?.Value ?? string.Empty; - if (string.IsNullOrEmpty(uid)) return Accepted(); - _presence.Unpublish(uid); - return Accepted(); - } - - [HttpPost("publish")] - public IActionResult Publish([FromBody] PublishRequest req) - { - if (_provider.IsExpired(req.SaltB64)) - { - return BadRequest(new { code = "DISCOVERY_SALT_EXPIRED" }); - } - var uid = User?.Claims?.FirstOrDefault(c => c.Type == MareSynchronosShared.Utils.MareClaimTypes.Uid)?.Value ?? string.Empty; - if (string.IsNullOrEmpty(uid) || req?.Hashes == null || req.Hashes.Length == 0) - return Accepted(); - - _presence.Publish(uid, req.Hashes, req.DisplayName, req.AllowRequests); - return Accepted(); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Controllers/JwtController.cs b/MareSynchronosServer/MareSynchronosAuthService/Controllers/JwtController.cs deleted file mode 100644 index a43c76e..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Controllers/JwtController.cs +++ /dev/null @@ -1,196 +0,0 @@ -using MareSynchronos.API.Dto; -using MareSynchronos.API.Dto.Account; -using MareSynchronos.API.Routes; -using MareSynchronosAuthService.Services; -using MareSynchronosShared; -using MareSynchronosShared.Data; -using MareSynchronosShared.Models; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; -using StackExchange.Redis.Extensions.Core.Abstractions; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Text; - -namespace MareSynchronosAuthService.Controllers; - -[AllowAnonymous] -[Route(MareAuth.Auth)] -public class JwtController : Controller -{ - private readonly IHttpContextAccessor _accessor; - private readonly IRedisDatabase _redis; - private readonly IDbContextFactory _mareDbContextFactory; - private readonly GeoIPService _geoIPProvider; - private readonly SecretKeyAuthenticatorService _secretKeyAuthenticatorService; - private readonly AccountRegistrationService _accountRegistrationService; - private readonly IConfigurationService _configuration; - - public JwtController(ILogger logger, - IHttpContextAccessor accessor, IDbContextFactory mareDbContextFactory, - SecretKeyAuthenticatorService secretKeyAuthenticatorService, - AccountRegistrationService accountRegistrationService, - IConfigurationService configuration, - IRedisDatabase redisDb, GeoIPService geoIPProvider) - { - _accessor = accessor; - _redis = redisDb; - _geoIPProvider = geoIPProvider; - _mareDbContextFactory = mareDbContextFactory; - _secretKeyAuthenticatorService = secretKeyAuthenticatorService; - _accountRegistrationService = accountRegistrationService; - _configuration = configuration; - } - - [AllowAnonymous] - [HttpPost(MareAuth.Auth_CreateIdent)] - public async Task CreateToken(string auth, string charaIdent) - { - if (string.IsNullOrEmpty(auth)) return BadRequest("No Authkey"); - if (string.IsNullOrEmpty(charaIdent)) return BadRequest("No CharaIdent"); - - using var dbContext = await _mareDbContextFactory.CreateDbContextAsync(); - var ip = _accessor.GetIpAddress(); - - var authResult = await _secretKeyAuthenticatorService.AuthorizeAsync(ip, auth); - - var isBanned = await dbContext.BannedUsers.AsNoTracking().AnyAsync(u => u.CharacterIdentification == charaIdent).ConfigureAwait(false); - if (isBanned) - { - var authToBan = dbContext.Auth.SingleOrDefault(a => a.UserUID == authResult.Uid); - if (authToBan != null) - { - authToBan.IsBanned = true; - await dbContext.SaveChangesAsync().ConfigureAwait(false); - } - - return Unauthorized("Your character is banned from using the service."); - } - - if (!authResult.Success && !authResult.TempBan) return Unauthorized("The provided secret key is invalid. Verify your accounts existence and/or recover the secret key."); - if (!authResult.Success && authResult.TempBan) return Unauthorized("Due to an excessive amount of failed authentication attempts you are temporarily banned. Check your Secret Key configuration and try connecting again in 5 minutes."); - if (authResult.Permaban) - { - if (!dbContext.BannedUsers.Any(c => c.CharacterIdentification == charaIdent)) - { - dbContext.BannedUsers.Add(new Banned() - { - CharacterIdentification = charaIdent, - Reason = "Autobanned CharacterIdent (" + authResult.Uid + ")", - }); - - await dbContext.SaveChangesAsync(); - } - - var lodestone = await dbContext.LodeStoneAuth.Include(a => a.User).FirstOrDefaultAsync(c => c.User.UID == authResult.Uid); - - if (lodestone != null) - { - if (!dbContext.BannedRegistrations.Any(c => c.DiscordIdOrLodestoneAuth == lodestone.HashedLodestoneId)) - { - dbContext.BannedRegistrations.Add(new BannedRegistrations() - { - DiscordIdOrLodestoneAuth = lodestone.HashedLodestoneId, - }); - } - if (!dbContext.BannedRegistrations.Any(c => c.DiscordIdOrLodestoneAuth == lodestone.DiscordId.ToString())) - { - dbContext.BannedRegistrations.Add(new BannedRegistrations() - { - DiscordIdOrLodestoneAuth = lodestone.DiscordId.ToString(), - }); - } - - await dbContext.SaveChangesAsync(); - } - - return Unauthorized("You are permanently banned."); - } - - var existingIdent = await _redis.GetAsync("UID:" + authResult.Uid); - if (!string.IsNullOrEmpty(existingIdent) && !string.Equals(existingIdent, charaIdent, StringComparison.Ordinal)) - return Unauthorized("Already logged in to this account. Reconnect in 60 seconds. If you keep seeing this issue, restart your game."); - - var token = CreateToken(new List() - { - new Claim(MareClaimTypes.Uid, authResult.Uid), - new Claim(MareClaimTypes.CharaIdent, charaIdent), - new Claim(MareClaimTypes.Alias, authResult.Alias), - new Claim(MareClaimTypes.Continent, await _geoIPProvider.GetCountryFromIP(_accessor)), - }); - - return Content(token.RawData); - } - - [AllowAnonymous] - [HttpPost(MareAuth.Auth_CreateIdentV2)] - public async Task CreateTokenV2(string auth, string charaIdent) - { - var tokenResponse = await CreateToken(auth, charaIdent); - var tokenContent = tokenResponse as ContentResult; - if (tokenContent == null) - return tokenResponse; - var provider = HttpContext.RequestServices.GetService(); - var wk = provider?.GetWellKnownJson(Request.Scheme, Request.Host.Value) - ?? _configuration.GetValueOrDefault(nameof(AuthServiceConfiguration.WellKnown), string.Empty); - return Json(new AuthReplyDto - { - Token = tokenContent.Content, - WellKnown = wk, - }); - } - - [AllowAnonymous] - [HttpPost(MareAuth.Auth_Register)] - public async Task Register() - { - var ua = HttpContext.Request.Headers["User-Agent"][0] ?? "-"; - var ip = _accessor.GetIpAddress(); - - // Legacy endpoint: generate a secret key for the user - var computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - var hashedKey = StringUtils.Sha256String(computedHash); - - var dto = await _accountRegistrationService.RegisterAccountAsync(ua, ip, hashedKey); - - return Json(new RegisterReplyDto() - { - Success = dto.Success, - ErrorMessage = dto.ErrorMessage, - UID = dto.UID, - SecretKey = computedHash - }); - } - - [AllowAnonymous] - [HttpPost(MareAuth.Auth_RegisterV2)] - public async Task RegisterV2(string hashedSecretKey) - { - if (string.IsNullOrEmpty(hashedSecretKey)) return BadRequest("No HashedSecretKey"); - if (hashedSecretKey.Length != 64) return BadRequest("Bad HashedSecretKey"); - if (!hashedSecretKey.All(char.IsAsciiHexDigitUpper)) return BadRequest("Bad HashedSecretKey"); - - var ua = HttpContext.Request.Headers["User-Agent"][0] ?? "-"; - var ip = _accessor.GetIpAddress(); - return Json(await _accountRegistrationService.RegisterAccountAsync(ua, ip, hashedSecretKey)); - } - - private JwtSecurityToken CreateToken(IEnumerable authClaims) - { - var authSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_configuration.GetValue(nameof(MareConfigurationBase.Jwt)))); - - var token = new SecurityTokenDescriptor() - { - Subject = new ClaimsIdentity(authClaims), - SigningCredentials = new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256Signature), - }; - - var handler = new JwtSecurityTokenHandler(); - return handler.CreateJwtSecurityToken(token); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Controllers/WellKnownController.cs b/MareSynchronosServer/MareSynchronosAuthService/Controllers/WellKnownController.cs deleted file mode 100644 index 060eeaf..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Controllers/WellKnownController.cs +++ /dev/null @@ -1,25 +0,0 @@ -using MareSynchronosAuthService.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MareSynchronosAuthService.Controllers; - -[AllowAnonymous] -[ApiController] -public class WellKnownController : Controller -{ - private readonly DiscoveryWellKnownProvider _provider; - - public WellKnownController(DiscoveryWellKnownProvider provider) - { - _provider = provider; - } - - [HttpGet("/.well-known/Umbra/client")] - public IActionResult Get() - { - var json = _provider.GetWellKnownJson(Request.Scheme, Request.Host.Value); - return Content(json, "application/json"); - } -} - diff --git a/MareSynchronosServer/MareSynchronosAuthService/MareSynchronosAuthService.csproj b/MareSynchronosServer/MareSynchronosAuthService/MareSynchronosAuthService.csproj deleted file mode 100644 index 0bea862..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/MareSynchronosAuthService.csproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - net9.0 - enable - enable - false - - - - - Always - - - Always - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - diff --git a/MareSynchronosServer/MareSynchronosAuthService/Program.cs b/MareSynchronosServer/MareSynchronosAuthService/Program.cs deleted file mode 100644 index 5bebfd8..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Program.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace MareSynchronosAuthService; - -public class Program -{ - public static void Main(string[] args) - { - var hostBuilder = CreateHostBuilder(args); - using var host = hostBuilder.Build(); - try - { - host.Run(); - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } - - public static IHostBuilder CreateHostBuilder(string[] args) - { - using var loggerFactory = LoggerFactory.Create(builder => - { - builder.ClearProviders(); - builder.AddConsole(); - }); - var logger = loggerFactory.CreateLogger(); - return Host.CreateDefaultBuilder(args) - .UseSystemd() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseContentRoot(AppContext.BaseDirectory); - webBuilder.ConfigureLogging((ctx, builder) => - { - builder.AddConfiguration(ctx.Configuration.GetSection("Logging")); - builder.AddFile(o => o.RootPath = AppContext.BaseDirectory); - }); - webBuilder.UseStartup(ctx => new Startup(ctx.Configuration, logger)); - }); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Properties/launchSettings.json b/MareSynchronosServer/MareSynchronosAuthService/Properties/launchSettings.json deleted file mode 100644 index db41dc1..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Properties/launchSettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:37726", - "sslPort": 0 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5056", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/AccountRegistrationService.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/AccountRegistrationService.cs deleted file mode 100644 index 2b0a1b0..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/AccountRegistrationService.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System.Collections.Concurrent; -using MareSynchronos.API.Dto.Account; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.EntityFrameworkCore; -using System.Text.RegularExpressions; -using MareSynchronosShared.Models; - -namespace MareSynchronosAuthService.Services; - -internal record IpRegistrationCount -{ - private int count = 1; - public int Count => count; - public Task ResetTask { get; set; } - public CancellationTokenSource ResetTaskCts { get; set; } - public void IncreaseCount() - { - Interlocked.Increment(ref count); - } -} - -public class AccountRegistrationService -{ - private readonly MareMetrics _metrics; - private readonly MareDbContext _mareDbContext; - private readonly IServiceScopeFactory _serviceScopeFactory; - private readonly IConfigurationService _configurationService; - private readonly ILogger _logger; - private readonly ConcurrentDictionary _registrationsPerIp = new(StringComparer.Ordinal); - - private Regex _registrationUserAgentRegex = new Regex(@"^MareSynchronos/", RegexOptions.Compiled); - - public AccountRegistrationService(MareMetrics metrics, MareDbContext mareDbContext, - IServiceScopeFactory serviceScopeFactory, IConfigurationService configuration, - ILogger logger) - { - _mareDbContext = mareDbContext; - _logger = logger; - _configurationService = configuration; - _metrics = metrics; - _serviceScopeFactory = serviceScopeFactory; - } - - public async Task RegisterAccountAsync(string ua, string ip, string hashedSecretKey) - { - var reply = new RegisterReplyV2Dto(); - - if (!_registrationUserAgentRegex.Match(ua).Success) - { - reply.ErrorMessage = "User-Agent not allowed"; - return reply; - } - - if (_registrationsPerIp.TryGetValue(ip, out var registrationCount) - && registrationCount.Count >= _configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.RegisterIpLimit), 3)) - { - _logger.LogWarning("Rejecting {ip} for registration spam", ip); - - if (registrationCount.ResetTask == null) - { - registrationCount.ResetTaskCts = new CancellationTokenSource(); - - if (registrationCount.ResetTaskCts != null) - registrationCount.ResetTaskCts.Cancel(); - - registrationCount.ResetTask = Task.Run(async () => - { - await Task.Delay(TimeSpan.FromMinutes(_configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.RegisterIpDurationInMinutes), 10))).ConfigureAwait(false); - - }).ContinueWith((t) => - { - _registrationsPerIp.Remove(ip, out _); - }, registrationCount.ResetTaskCts.Token); - } - reply.ErrorMessage = "Too many registrations from this IP. Please try again later."; - return reply; - } - - var user = new User(); - - var hasValidUid = false; - while (!hasValidUid) - { - var uid = StringUtils.GenerateRandomString(7); - if (_mareDbContext.Users.Any(u => u.UID == uid || u.Alias == uid)) continue; - user.UID = uid; - hasValidUid = true; - } - - // make the first registered user on the service to admin - if (!await _mareDbContext.Users.AnyAsync().ConfigureAwait(false)) - { - user.IsAdmin = true; - } - - user.LastLoggedIn = DateTime.UtcNow; - - var auth = new Auth() - { - HashedKey = hashedSecretKey, - User = user, - }; - - await _mareDbContext.Users.AddAsync(user).ConfigureAwait(false); - await _mareDbContext.Auth.AddAsync(auth).ConfigureAwait(false); - await _mareDbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogInformation("User registered: {userUID} from IP {ip}", user.UID, ip); - _metrics.IncCounter(MetricsAPI.CounterAccountsCreated); - - reply.Success = true; - reply.UID = user.UID; - - RecordIpRegistration(ip); - - return reply; - } - - private void RecordIpRegistration(string ip) - { - var whitelisted = _configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.WhitelistedIps), new List()); - if (!whitelisted.Any(w => ip.Contains(w, StringComparison.OrdinalIgnoreCase))) - { - if (_registrationsPerIp.TryGetValue(ip, out var count)) - { - count.IncreaseCount(); - } - else - { - count = _registrationsPerIp[ip] = new IpRegistrationCount(); - - if (count.ResetTaskCts != null) - count.ResetTaskCts.Cancel(); - - count.ResetTaskCts = new CancellationTokenSource(); - - count.ResetTask = Task.Run(async () => - { - await Task.Delay(TimeSpan.FromMinutes(_configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.RegisterIpDurationInMinutes), 10))).ConfigureAwait(false); - - }).ContinueWith((t) => - { - _registrationsPerIp.Remove(ip, out _); - }, count.ResetTaskCts.Token); - } - } - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/IDiscoveryPresenceStore.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/IDiscoveryPresenceStore.cs deleted file mode 100644 index aed958c..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/IDiscoveryPresenceStore.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Concurrent; - -namespace MareSynchronosAuthService.Services.Discovery; - -public interface IDiscoveryPresenceStore : IDisposable -{ - void Publish(string uid, IEnumerable hashes, string? displayName = null, bool allowRequests = true); - void Unpublish(string uid); - (bool Found, string? Token, string TargetUid, string? DisplayName) TryMatchAndIssueToken(string requesterUid, string hash); - bool ValidateToken(string token, out string targetUid); -} - diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs deleted file mode 100644 index 8c36233..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.Collections.Concurrent; - -namespace MareSynchronosAuthService.Services.Discovery; - -public sealed class InMemoryPresenceStore : IDiscoveryPresenceStore -{ - private readonly ConcurrentDictionary _presence = new(StringComparer.Ordinal); - private readonly ConcurrentDictionary _tokens = new(StringComparer.Ordinal); - private readonly TimeSpan _presenceTtl; - private readonly TimeSpan _tokenTtl; - private readonly Timer _cleanupTimer; - - public InMemoryPresenceStore(TimeSpan presenceTtl, TimeSpan tokenTtl) - { - _presenceTtl = presenceTtl; - _tokenTtl = tokenTtl; - _cleanupTimer = new Timer(_ => Cleanup(), null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1)); - } - - public void Dispose() - { - _cleanupTimer.Dispose(); - } - - private void Cleanup() - { - var now = DateTimeOffset.UtcNow; - foreach (var kv in _presence.ToArray()) - { - if (kv.Value.ExpiresAt <= now) _presence.TryRemove(kv.Key, out _); - } - foreach (var kv in _tokens.ToArray()) - { - if (kv.Value.ExpiresAt <= now) _tokens.TryRemove(kv.Key, out _); - } - } - - public void Publish(string uid, IEnumerable hashes, string? displayName = null, bool allowRequests = true) - { - var exp = DateTimeOffset.UtcNow.Add(_presenceTtl); - foreach (var h in hashes.Distinct(StringComparer.Ordinal)) - { - _presence[h] = (uid, exp, displayName, allowRequests); - } - } - - public void Unpublish(string uid) - { - // Remove all presence hashes owned by this uid - foreach (var kv in _presence.ToArray()) - { - if (string.Equals(kv.Value.Uid, uid, StringComparison.Ordinal)) - { - _presence.TryRemove(kv.Key, out _); - } - } - } - -public (bool Found, string? Token, string TargetUid, string? DisplayName) TryMatchAndIssueToken(string requesterUid, string hash) -{ - if (_presence.TryGetValue(hash, out var entry)) - { - // Refresh TTL for this presence whenever it is matched (regardless of AllowRequests) - var refreshed = (entry.Uid, DateTimeOffset.UtcNow.Add(_presenceTtl), entry.DisplayName, entry.AllowRequests); - _presence[hash] = refreshed; - - if (string.Equals(entry.Uid, requesterUid, StringComparison.Ordinal)) - return (false, null, string.Empty, null); - - // Visible but requests disabled → no token - if (!entry.AllowRequests) - return (true, null, entry.Uid, entry.DisplayName); - - var token = Guid.NewGuid().ToString("N"); - _tokens[token] = (entry.Uid, DateTimeOffset.UtcNow.Add(_tokenTtl)); - return (true, token, entry.Uid, entry.DisplayName); - } - return (false, null, string.Empty, null); -} - - public bool ValidateToken(string token, out string targetUid) - { - targetUid = string.Empty; - if (_tokens.TryGetValue(token, out var info)) - { - if (info.ExpiresAt > DateTimeOffset.UtcNow) - { - targetUid = info.TargetUid; - - // Optional robustness: refresh TTL for all presence entries of this target - var newExp = DateTimeOffset.UtcNow.Add(_presenceTtl); - foreach (var kv in _presence.ToArray()) - { - if (string.Equals(kv.Value.Uid, targetUid, StringComparison.Ordinal)) - { - var v = kv.Value; - _presence[kv.Key] = (v.Uid, newExp, v.DisplayName, v.AllowRequests); - } - } - - return true; - } - _tokens.TryRemove(token, out _); - } - return false; - } -} - diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs deleted file mode 100644 index 658ca7f..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System.Text.Json; -using Microsoft.Extensions.Logging; -using StackExchange.Redis; - -namespace MareSynchronosAuthService.Services.Discovery; - -public sealed class RedisPresenceStore : IDiscoveryPresenceStore -{ - private readonly ILogger _logger; - private readonly IDatabase _db; - private readonly TimeSpan _presenceTtl; - private readonly TimeSpan _tokenTtl; - private readonly JsonSerializerOptions _jsonOpts = new() { DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull }; - - public RedisPresenceStore(ILogger logger, IConnectionMultiplexer mux, TimeSpan presenceTtl, TimeSpan tokenTtl) - { - _logger = logger; - _db = mux.GetDatabase(); - _presenceTtl = presenceTtl; - _tokenTtl = tokenTtl; - } - - public void Dispose() { } - - private static string KeyForHash(string hash) => $"nd:hash:{hash}"; - private static string KeyForToken(string token) => $"nd:token:{token}"; - private static string KeyForUidSet(string uid) => $"nd:uid:{uid}"; - - public void Publish(string uid, IEnumerable hashes, string? displayName = null, bool allowRequests = true) - { - var entries = hashes.Distinct(StringComparer.Ordinal).ToArray(); - if (entries.Length == 0) return; - var batch = _db.CreateBatch(); - foreach (var h in entries) - { - var key = KeyForHash(h); - var payload = JsonSerializer.Serialize(new Presence(uid, displayName, allowRequests), _jsonOpts); - batch.StringSetAsync(key, payload, _presenceTtl); - // Index this hash under the publisher uid for fast unpublish - batch.SetAddAsync(KeyForUidSet(uid), h); - batch.KeyExpireAsync(KeyForUidSet(uid), _presenceTtl); - } - batch.Execute(); - _logger.LogDebug("RedisPresenceStore: published {count} hashes", entries.Length); - } - - public void Unpublish(string uid) - { - try - { - var setKey = KeyForUidSet(uid); - var members = _db.SetMembers(setKey); - if (members is { Length: > 0 }) - { - var batch = _db.CreateBatch(); - foreach (var m in members) - { - var hash = (string)m; - var key = KeyForHash(hash); - // Defensive: only delete if the hash is still owned by this uid - var val = _db.StringGet(key); - if (val.HasValue) - { - try - { - var p = JsonSerializer.Deserialize(val!); - if (p != null && string.Equals(p.Uid, uid, StringComparison.Ordinal)) - { - batch.KeyDeleteAsync(key); - } - } - catch { /* ignore corrupted */ } - } - } - // Remove the uid index set itself - batch.KeyDeleteAsync(setKey); - batch.Execute(); - } - else - { - // No index set: best-effort, just delete the set key in case it exists - _db.KeyDelete(setKey); - } - _logger.LogDebug("RedisPresenceStore: unpublished all hashes for uid {uid}", uid); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "RedisPresenceStore: Unpublish failed for uid {uid}", uid); - } - } - - public (bool Found, string? Token, string TargetUid, string? DisplayName) TryMatchAndIssueToken(string requesterUid, string hash) - { - var key = KeyForHash(hash); - var val = _db.StringGet(key); - if (!val.HasValue) return (false, null, string.Empty, null); - try - { - var p = JsonSerializer.Deserialize(val!); - if (p == null || string.IsNullOrEmpty(p.Uid)) return (false, null, string.Empty, null); - if (string.Equals(p.Uid, requesterUid, StringComparison.Ordinal)) return (false, null, string.Empty, null); - - // Refresh TTLs for this presence whenever it is matched - _db.KeyExpire(KeyForHash(hash), _presenceTtl); - _db.KeyExpire(KeyForUidSet(p.Uid), _presenceTtl); - - // Visible but requests disabled → return without token - if (!p.AllowRequests) - { - return (true, null, p.Uid, p.DisplayName); - } - - var token = Guid.NewGuid().ToString("N"); - _db.StringSet(KeyForToken(token), p.Uid, _tokenTtl); - return (true, token, p.Uid, p.DisplayName); - } - catch - { - return (false, null, string.Empty, null); - } - } - - public bool ValidateToken(string token, out string targetUid) - { - targetUid = string.Empty; - var key = KeyForToken(token); - var val = _db.StringGet(key); - if (!val.HasValue) return false; - targetUid = val!; - try - { - var setKey = KeyForUidSet(targetUid); - var members = _db.SetMembers(setKey); - if (members is { Length: > 0 }) - { - var batch = _db.CreateBatch(); - foreach (var m in members) - { - var h = (string)m; - batch.KeyExpireAsync(KeyForHash(h), _presenceTtl); - } - batch.KeyExpireAsync(setKey, _presenceTtl); - batch.Execute(); - } - else - { - // Still try to extend the set TTL even if empty - _db.KeyExpire(setKey, _presenceTtl); - } - } - catch { /* ignore TTL refresh issues */ } - return true; - } - - private sealed record Presence(string Uid, string? DisplayName, bool AllowRequests); -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/DiscoveryPresenceService.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/DiscoveryPresenceService.cs deleted file mode 100644 index 54ac0f6..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/DiscoveryPresenceService.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using MareSynchronosAuthService.Services.Discovery; - -namespace MareSynchronosAuthService.Services; - -public class DiscoveryPresenceService : IHostedService, IDisposable -{ - private readonly ILogger _logger; - private readonly IDiscoveryPresenceStore _store; - private readonly TimeSpan _presenceTtl = TimeSpan.FromMinutes(5); - private readonly TimeSpan _tokenTtl = TimeSpan.FromMinutes(2); - - public DiscoveryPresenceService(ILogger logger, IDiscoveryPresenceStore store) - { - _logger = logger; - _store = store; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - - public void Publish(string uid, IEnumerable hashes, string? displayName = null, bool allowRequests = true) - { - _store.Publish(uid, hashes, displayName, allowRequests); - _logger.LogDebug("Discovery presence published for {uid} with {n} hashes", uid, hashes.Count()); - } - - public void Unpublish(string uid) - { - _store.Unpublish(uid); - _logger.LogDebug("Discovery presence unpublished for {uid}", uid); - } - - public (bool Found, string? Token, string TargetUid, string? DisplayName) TryMatchAndIssueToken(string requesterUid, string hash) - { - var res = _store.TryMatchAndIssueToken(requesterUid, hash); - return (res.Found, res.Token, res.TargetUid, res.DisplayName); - } - - public bool ValidateToken(string token, out string targetUid) - { - return _store.ValidateToken(token, out targetUid); - } - - public void Dispose() - { - (_store as IDisposable)?.Dispose(); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/DiscoveryWellKnownProvider.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/DiscoveryWellKnownProvider.cs deleted file mode 100644 index 1b2cd2d..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/DiscoveryWellKnownProvider.cs +++ /dev/null @@ -1,170 +0,0 @@ -using System.Security.Cryptography; -using System.Text.Json; -using System.Text.Json.Serialization; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace MareSynchronosAuthService.Services; - -public class DiscoveryWellKnownProvider : IHostedService -{ - private readonly ILogger _logger; - private readonly object _lock = new(); - private byte[] _currentSalt = Array.Empty(); - private DateTimeOffset _currentSaltExpiresAt; - private byte[] _previousSalt = Array.Empty(); - private DateTimeOffset _previousSaltExpiresAt; - private readonly TimeSpan _gracePeriod = TimeSpan.FromMinutes(5); - private Timer? _rotationTimer; - private readonly TimeSpan _saltTtl = TimeSpan.FromDays(30 * 6); - private readonly int _refreshSec = 86400; // 24h - - public DiscoveryWellKnownProvider(ILogger logger) - { - _logger = logger; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - RotateSalt(); - var period = _saltTtl; - if (period.TotalMilliseconds > uint.MaxValue - 1) - { - _logger.LogInformation("DiscoveryWellKnownProvider: salt TTL {ttl} exceeds timer limit, skipping rotation timer in beta", period); - _rotationTimer = new Timer(_ => { }, null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan); - } - else - { - _rotationTimer = new Timer(_ => RotateSalt(), null, period, period); - } - _logger.LogInformation("DiscoveryWellKnownProvider started. Salt expires at {exp}", _currentSaltExpiresAt); - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _rotationTimer?.Dispose(); - return Task.CompletedTask; - } - - private void RotateSalt() - { - lock (_lock) - { - if (_currentSalt.Length > 0) - { - _previousSalt = _currentSalt; - _previousSaltExpiresAt = DateTimeOffset.UtcNow.Add(_gracePeriod); - } - _currentSalt = RandomNumberGenerator.GetBytes(32); - _currentSaltExpiresAt = DateTimeOffset.UtcNow.Add(_saltTtl); - } - } - - public bool IsExpired(string providedSaltB64) - { - lock (_lock) - { - var now = DateTimeOffset.UtcNow; - var provided = Convert.FromBase64String(providedSaltB64); - - if (_currentSalt.SequenceEqual(provided) && now <= _currentSaltExpiresAt) - return false; - - if (_previousSalt.Length > 0 && _previousSalt.SequenceEqual(provided) && now <= _previousSaltExpiresAt) - return false; - - return true; - } - } - - public string GetWellKnownJson(string scheme, string host) - { - var isHttps = string.Equals(scheme, "https", StringComparison.OrdinalIgnoreCase); - var wsScheme = isHttps ? "wss" : "ws"; - var httpScheme = isHttps ? "https" : "http"; - - byte[] salt; - DateTimeOffset exp; - lock (_lock) - { - salt = _currentSalt.ToArray(); - exp = _currentSaltExpiresAt; - } - - var root = new WellKnownRoot - { - ApiUrl = $"{wsScheme}://{host}", - HubUrl = $"{wsScheme}://{host}/mare", - Features = new() { NearbyDiscovery = true }, - NearbyDiscovery = new() - { - Enabled = true, - HashAlgo = "sha256", - SaltB64 = Convert.ToBase64String(salt), - SaltExpiresAt = exp, - RefreshSec = _refreshSec, - GraceSec = (int)_gracePeriod.TotalSeconds, - Endpoints = new() - { - Publish = $"{httpScheme}://{host}/discovery/publish", - Query = $"{httpScheme}://{host}/discovery/query", - Request = $"{httpScheme}://{host}/discovery/request", - Accept = $"{httpScheme}://{host}/discovery/acceptNotify" - }, - Policies = new() - { - MaxQueryBatch = 100, - MinQueryIntervalMs = 2000, - RateLimitPerMin = 30, - TokenTtlSec = 120 - } - } - }; - - return JsonSerializer.Serialize(root, new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }); - } - - private sealed class WellKnownRoot - { - [JsonPropertyName("api_url")] public string ApiUrl { get; set; } = string.Empty; - [JsonPropertyName("hub_url")] public string HubUrl { get; set; } = string.Empty; - [JsonPropertyName("skip_negotiation")] public bool SkipNegotiation { get; set; } = true; - [JsonPropertyName("transports")] public string[] Transports { get; set; } = new[] { "websockets" }; - [JsonPropertyName("features")] public Features Features { get; set; } = new(); - [JsonPropertyName("nearby_discovery")] public Nearby NearbyDiscovery { get; set; } = new(); - } - - private sealed class Features - { - [JsonPropertyName("nearby_discovery")] public bool NearbyDiscovery { get; set; } - } - - private sealed class Nearby - { - [JsonPropertyName("enabled")] public bool Enabled { get; set; } - [JsonPropertyName("hash_algo")] public string HashAlgo { get; set; } = "sha256"; - [JsonPropertyName("salt_b64")] public string SaltB64 { get; set; } = string.Empty; - [JsonPropertyName("salt_expires_at")] public DateTimeOffset SaltExpiresAt { get; set; } - [JsonPropertyName("refresh_sec")] public int RefreshSec { get; set; } - [JsonPropertyName("grace_sec")] public int GraceSec { get; set; } - [JsonPropertyName("endpoints")] public Endpoints Endpoints { get; set; } = new(); - [JsonPropertyName("policies")] public Policies Policies { get; set; } = new(); - } - - private sealed class Endpoints - { - [JsonPropertyName("publish")] public string? Publish { get; set; } - [JsonPropertyName("query")] public string? Query { get; set; } - [JsonPropertyName("request")] public string? Request { get; set; } - [JsonPropertyName("accept")] public string? Accept { get; set; } - } - - private sealed class Policies - { - [JsonPropertyName("max_query_batch")] public int MaxQueryBatch { get; set; } - [JsonPropertyName("min_query_interval_ms")] public int MinQueryIntervalMs { get; set; } - [JsonPropertyName("rate_limit_per_min")] public int RateLimitPerMin { get; set; } - [JsonPropertyName("token_ttl_sec")] public int TokenTtlSec { get; set; } - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/GeoIPService.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/GeoIPService.cs deleted file mode 100644 index dbebf35..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/GeoIPService.cs +++ /dev/null @@ -1,138 +0,0 @@ -using MareSynchronosShared; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MaxMind.GeoIP2; - -namespace MareSynchronosAuthService.Services; - -public class GeoIPService : IHostedService -{ - private readonly ILogger _logger; - private readonly IConfigurationService _mareConfiguration; - private bool _useGeoIP = false; - private string _cityFile = string.Empty; - private DatabaseReader? _dbReader; - private DateTime _dbLastWriteTime = DateTime.Now; - private CancellationTokenSource _fileWriteTimeCheckCts = new(); - private bool _processingReload = false; - - public GeoIPService(ILogger logger, - IConfigurationService mareConfiguration) - { - _logger = logger; - _mareConfiguration = mareConfiguration; - } - - public async Task GetCountryFromIP(IHttpContextAccessor httpContextAccessor) - { - if (!_useGeoIP) - { - return "*"; - } - - try - { - var ip = httpContextAccessor.GetIpAddress(); - - using CancellationTokenSource waitCts = new(); - waitCts.CancelAfter(TimeSpan.FromSeconds(5)); - while (_processingReload) await Task.Delay(100, waitCts.Token).ConfigureAwait(false); - - if (_dbReader!.TryCity(ip, out var response)) - { - string? continent = response?.Continent.Code; - if (!string.IsNullOrEmpty(continent) && - string.Equals(continent, "NA", StringComparison.Ordinal) - && response?.Location.Longitude != null) - { - if (response.Location.Longitude < -102) - { - continent = "NA-W"; - } - else - { - continent = "NA-E"; - } - } - - return continent ?? "*"; - } - - return "*"; - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error handling Geo IP country in request"); - return "*"; - } - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("GeoIP module starting update task"); - - var token = _fileWriteTimeCheckCts.Token; - _ = PeriodicReloadTask(token); - - return Task.CompletedTask; - } - - private async Task PeriodicReloadTask(CancellationToken token) - { - while (!token.IsCancellationRequested) - { - try - { - _processingReload = true; - - var useGeoIP = _mareConfiguration.GetValueOrDefault(nameof(AuthServiceConfiguration.UseGeoIP), false); - var cityFile = _mareConfiguration.GetValueOrDefault(nameof(AuthServiceConfiguration.GeoIPDbCityFile), string.Empty); - var lastWriteTime = new FileInfo(cityFile).LastWriteTimeUtc; - if (useGeoIP && (!string.Equals(cityFile, _cityFile, StringComparison.OrdinalIgnoreCase) || lastWriteTime != _dbLastWriteTime)) - { - _cityFile = cityFile; - if (!File.Exists(_cityFile)) throw new FileNotFoundException($"Could not open GeoIP City Database, path does not exist: {_cityFile}"); - _dbReader?.Dispose(); - _dbReader = null; - _dbReader = new DatabaseReader(_cityFile); - _dbLastWriteTime = lastWriteTime; - - _ = _dbReader.City("8.8.8.8").Continent; - - _logger.LogInformation($"Loaded GeoIP city file from {_cityFile}"); - - if (_useGeoIP != useGeoIP) - { - _logger.LogInformation("GeoIP module is now enabled"); - _useGeoIP = useGeoIP; - } - } - - if (_useGeoIP != useGeoIP && !useGeoIP) - { - _logger.LogInformation("GeoIP module is now disabled"); - _useGeoIP = useGeoIP; - } - } - catch (Exception e) - { - _logger.LogWarning(e, "Error during periodic GeoIP module reload task, disabling GeoIP"); - _useGeoIP = false; - } - finally - { - _processingReload = false; - } - - await Task.Delay(TimeSpan.FromMinutes(1)).ConfigureAwait(false); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _fileWriteTimeCheckCts.Cancel(); - _fileWriteTimeCheckCts.Dispose(); - _dbReader?.Dispose(); - return Task.CompletedTask; - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/SecretKeyAuthenticatorService.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/SecretKeyAuthenticatorService.cs deleted file mode 100644 index bf246f2..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/SecretKeyAuthenticatorService.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Collections.Concurrent; -using MareSynchronosAuthService.Authentication; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.EntityFrameworkCore; - -namespace MareSynchronosAuthService.Services; - -public class SecretKeyAuthenticatorService -{ - private readonly MareMetrics _metrics; - private readonly MareDbContext _mareDbContext; - private readonly IConfigurationService _configurationService; - private readonly ILogger _logger; - private readonly ConcurrentDictionary _failedAuthorizations = new(StringComparer.Ordinal); - - public SecretKeyAuthenticatorService(MareMetrics metrics, MareDbContext mareDbContext, - IConfigurationService configuration, ILogger logger) - { - _logger = logger; - _configurationService = configuration; - _metrics = metrics; - _mareDbContext = mareDbContext; - } - - public async Task AuthorizeAsync(string ip, string hashedSecretKey) - { - _metrics.IncCounter(MetricsAPI.CounterAuthenticationRequests); - - if (_failedAuthorizations.TryGetValue(ip, out var existingFailedAuthorization) - && existingFailedAuthorization.FailedAttempts > _configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.FailedAuthForTempBan), 5)) - { - if (existingFailedAuthorization.ResetTask == null) - { - _logger.LogWarning("TempBan {ip} for authorization spam", ip); - - existingFailedAuthorization.ResetTask = Task.Run(async () => - { - await Task.Delay(TimeSpan.FromMinutes(_configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.TempBanDurationInMinutes), 5))).ConfigureAwait(false); - - }).ContinueWith((t) => - { - _failedAuthorizations.Remove(ip, out _); - }); - } - return new(Success: false, Uid: null, TempBan: true, Alias: null, Permaban: false); - } - - var authReply = await _mareDbContext.Auth.Include(a => a.User).AsNoTracking() - .SingleOrDefaultAsync(u => u.HashedKey == hashedSecretKey).ConfigureAwait(false); - - SecretKeyAuthReply reply = new(authReply != null, authReply?.UserUID, authReply?.User?.Alias ?? string.Empty, TempBan: false, authReply?.IsBanned ?? false); - - if (reply.Success) - { - _metrics.IncCounter(MetricsAPI.CounterAuthenticationSuccesses); - } - else - { - return AuthenticationFailure(ip); - } - - return reply; - } - - private SecretKeyAuthReply AuthenticationFailure(string ip) - { - _metrics.IncCounter(MetricsAPI.CounterAuthenticationFailures); - - _logger.LogWarning("Failed authorization from {ip}", ip); - var whitelisted = _configurationService.GetValueOrDefault(nameof(AuthServiceConfiguration.WhitelistedIps), new List()); - if (!whitelisted.Any(w => ip.Contains(w, StringComparison.OrdinalIgnoreCase))) - { - if (_failedAuthorizations.TryGetValue(ip, out var auth)) - { - auth.IncreaseFailedAttempts(); - } - else - { - _failedAuthorizations[ip] = new SecretKeyFailedAuthorization(); - } - } - - return new(Success: false, Uid: null, Alias: null, TempBan: false, Permaban: false); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/Startup.cs b/MareSynchronosServer/MareSynchronosAuthService/Startup.cs deleted file mode 100644 index 5e6c401..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/Startup.cs +++ /dev/null @@ -1,263 +0,0 @@ -using MareSynchronosAuthService.Controllers; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Mvc.Controllers; -using StackExchange.Redis.Extensions.Core.Configuration; -using StackExchange.Redis.Extensions.System.Text.Json; -using StackExchange.Redis; -using System.Net; -using MareSynchronosAuthService.Services; -using MareSynchronosShared.RequirementHandlers; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.IdentityModel.Tokens; -using System.Text; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Prometheus; -using Microsoft.AspNetCore.HttpOverrides; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosAuthService; - -public class Startup -{ - private readonly IConfiguration _configuration; - private ILogger _logger; - - public Startup(IConfiguration configuration, ILogger logger) - { - _configuration = configuration; - _logger = logger; - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger logger) - { - var config = app.ApplicationServices.GetRequiredService>(); - - // Respect X-Forwarded-* headers from the reverse proxy so generated links use the public scheme/host - app.UseForwardedHeaders(new ForwardedHeadersOptions - { - ForwardedHeaders = ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedFor - }); - - app.UseRouting(); - - app.UseHttpMetrics(); - - app.UseAuthentication(); - app.UseAuthorization(); - - KestrelMetricServer metricServer = new KestrelMetricServer(config.GetValueOrDefault(nameof(MareConfigurationBase.MetricsPort), 4985)); - metricServer.Start(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - endpoints.MapHealthChecks("/healthz").WithMetadata(new AllowAnonymousAttribute()); - - foreach (var source in endpoints.DataSources.SelectMany(e => e.Endpoints).Cast()) - { - if (source == null) continue; - _logger.LogInformation("Endpoint: {url} ", source.RoutePattern.RawText); - } - }); - } - - public void ConfigureServices(IServiceCollection services) - { - var mareConfig = _configuration.GetRequiredSection("MareSynchronos"); - - services.AddHttpContextAccessor(); - - ConfigureRedis(services, mareConfig); - - services.AddScoped(); - services.AddScoped(); - services.AddSingleton(); - - services.AddHostedService(provider => provider.GetRequiredService()); - - services.Configure(_configuration.GetRequiredSection("MareSynchronos")); - services.Configure(_configuration.GetRequiredSection("MareSynchronos")); - - services.AddSingleton(); - // Nearby discovery services (well-known + presence) - services.AddSingleton(); - services.AddHostedService(p => p.GetRequiredService()); - - // Presence store selection - var discoveryStore = _configuration.GetValue("NearbyDiscovery:Store") ?? "memory"; - TimeSpan presenceTtl = TimeSpan.FromMinutes(_configuration.GetValue("NearbyDiscovery:PresenceTtlMinutes", 5)); - TimeSpan tokenTtl = TimeSpan.FromSeconds(_configuration.GetValue("NearbyDiscovery:TokenTtlSeconds", 120)); - if (string.Equals(discoveryStore, "redis", StringComparison.OrdinalIgnoreCase)) - { - services.AddSingleton(sp => - { - var logger = sp.GetRequiredService>(); - var mux = sp.GetRequiredService(); - return new MareSynchronosAuthService.Services.Discovery.RedisPresenceStore(logger, mux, presenceTtl, tokenTtl); - }); - } - else - { - services.AddSingleton(sp => new MareSynchronosAuthService.Services.Discovery.InMemoryPresenceStore(presenceTtl, tokenTtl)); - } - - services.AddSingleton(); - services.AddHostedService(p => p.GetRequiredService()); - - ConfigureAuthorization(services); - - ConfigureDatabase(services, mareConfig); - - ConfigureConfigServices(services); - - ConfigureMetrics(services); - - services.AddHealthChecks(); - services.AddControllers().ConfigureApplicationPartManager(a => - { - a.FeatureProviders.Remove(a.FeatureProviders.OfType().First()); - a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(JwtController), typeof(WellKnownController), typeof(DiscoveryController))); - }); - - services.AddSingleton(); - services.AddHostedService(p => p.GetRequiredService()); - } - - private static void ConfigureAuthorization(IServiceCollection services) - { - services.AddTransient(); - - services.AddOptions(JwtBearerDefaults.AuthenticationScheme) - .Configure>((options, config) => - { - options.TokenValidationParameters = new() - { - ValidateIssuer = false, - ValidateLifetime = true, - ValidateAudience = false, - ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(config.GetValue(nameof(MareConfigurationBase.Jwt)))), - }; - }); - - services.AddAuthentication(o => - { - o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddJwtBearer(); - - services.AddAuthorization(options => - { - options.DefaultPolicy = new AuthorizationPolicyBuilder() - .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) - .RequireAuthenticatedUser().Build(); - options.AddPolicy("Authenticated", policy => - { - policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); - policy.RequireAuthenticatedUser(); - }); - options.AddPolicy("Identified", policy => - { - policy.AddRequirements(new UserRequirement(UserRequirements.Identified)); - - }); - options.AddPolicy("Admin", policy => - { - policy.AddRequirements(new UserRequirement(UserRequirements.Identified | UserRequirements.Administrator)); - - }); - options.AddPolicy("Moderator", policy => - { - policy.AddRequirements(new UserRequirement(UserRequirements.Identified | UserRequirements.Moderator | UserRequirements.Administrator)); - }); - options.AddPolicy("Internal", new AuthorizationPolicyBuilder().RequireClaim(MareClaimTypes.Internal, "true").Build()); - }); - } - - private static void ConfigureMetrics(IServiceCollection services) - { - services.AddSingleton(m => new MareMetrics(m.GetService>(), new List - { - MetricsAPI.CounterAuthenticationCacheHits, - MetricsAPI.CounterAuthenticationFailures, - MetricsAPI.CounterAuthenticationRequests, - MetricsAPI.CounterAuthenticationSuccesses, - MetricsAPI.CounterAccountsCreated, - }, new List - { - })); - } - - private static void ConfigureRedis(IServiceCollection services, IConfigurationSection mareConfig) - { - // configure redis for SignalR - var redisConnection = mareConfig.GetValue(nameof(ServerConfiguration.RedisConnectionString), string.Empty); - - var options = ConfigurationOptions.Parse(redisConnection); - - var endpoint = options.EndPoints[0]; - string address = ""; - int port = 0; - if (endpoint is DnsEndPoint dnsEndPoint) { address = dnsEndPoint.Host; port = dnsEndPoint.Port; } - if (endpoint is IPEndPoint ipEndPoint) { address = ipEndPoint.Address.ToString(); port = ipEndPoint.Port; } - var redisConfiguration = new RedisConfiguration() - { - AbortOnConnectFail = true, - KeyPrefix = "", - Hosts = new RedisHost[] - { - new RedisHost(){ Host = address, Port = port }, - }, - AllowAdmin = true, - ConnectTimeout = options.ConnectTimeout, - Database = 0, - Ssl = false, - Password = options.Password, - ServerEnumerationStrategy = new ServerEnumerationStrategy() - { - Mode = ServerEnumerationStrategy.ModeOptions.All, - TargetRole = ServerEnumerationStrategy.TargetRoleOptions.Any, - UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.Throw, - }, - MaxValueLength = 1024, - PoolSize = mareConfig.GetValue(nameof(ServerConfiguration.RedisPool), 50), - SyncTimeout = options.SyncTimeout, - }; - - services.AddStackExchangeRedisExtensions(redisConfiguration); - // Also expose raw multiplexer for custom Redis usage (discovery presence) - services.AddSingleton(_ => ConnectionMultiplexer.Connect(options)); - } - private void ConfigureConfigServices(IServiceCollection services) - { - services.AddSingleton, MareConfigurationServiceServer>(); - services.AddSingleton, MareConfigurationServiceServer>(); - } - - private void ConfigureDatabase(IServiceCollection services, IConfigurationSection mareConfig) - { - services.AddDbContextPool(options => - { - options.UseNpgsql(_configuration.GetConnectionString("DefaultConnection"), builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - builder.MigrationsAssembly("MareSynchronosShared"); - }).UseSnakeCaseNamingConvention(); - options.EnableThreadSafetyChecks(false); - }, mareConfig.GetValue(nameof(MareConfigurationBase.DbContextPoolSize), 1024)); - services.AddDbContextFactory(options => - { - options.UseNpgsql(_configuration.GetConnectionString("DefaultConnection"), builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - builder.MigrationsAssembly("MareSynchronosShared"); - }).UseSnakeCaseNamingConvention(); - options.EnableThreadSafetyChecks(false); - }); - } -} diff --git a/MareSynchronosServer/MareSynchronosAuthService/appsettings.Development.json b/MareSynchronosServer/MareSynchronosAuthService/appsettings.Development.json deleted file mode 100644 index 226edb3..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/appsettings.Development.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*", - "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Port=5432;Username=postgres;Password=postgres;Database=umbra_dev" - }, - "MareSynchronos": { - "Jwt": "dev-secret-umbra-abcdefghijklmnopqrstuvwxyz123456", - "RedisConnectionString": "localhost:6379,connectTimeout=5000,syncTimeout=5000", - "MetricsPort": 4985 - } -} - diff --git a/MareSynchronosServer/MareSynchronosAuthService/appsettings.json b/MareSynchronosServer/MareSynchronosAuthService/appsettings.json deleted file mode 100644 index 10f68b8..0000000 --- a/MareSynchronosServer/MareSynchronosAuthService/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/MareSynchronosServer/MareSynchronosServer.sln b/MareSynchronosServer/MareSynchronosServer.sln deleted file mode 100644 index 84f8d6f..0000000 --- a/MareSynchronosServer/MareSynchronosServer.sln +++ /dev/null @@ -1,60 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32602.215 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronosServer", "MareSynchronosServer\MareSynchronosServer.csproj", "{029CA97F-E0BA-4172-A191-EA21FB61AD0F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronos.API", "..\MareAPI\MareSynchronosAPI\MareSynchronos.API.csproj", "{326BFB1B-5571-47A6-8513-1FFDB32D53B0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronosShared", "MareSynchronosShared\MareSynchronosShared.csproj", "{67B1461D-E215-4BA8-A64D-E1836724D5E6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronosStaticFilesServer", "MareSynchronosStaticFilesServer\MareSynchronosStaticFilesServer.csproj", "{3C7F43BB-FE4C-48BC-BF42-D24E70E8FCB7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronosServices", "MareSynchronosServices\MareSynchronosServices.csproj", "{E29C8677-AB44-4950-9EB1-D8E70B710A56}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7D5C2B87-5CC9-4FE7-AD13-4C13F6600683}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MareSynchronosAuthService", "MareSynchronosAuthService\MareSynchronosAuthService.csproj", "{D7D4041C-DCD9-4B7A-B423-0F458DFFF3D6}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {029CA97F-E0BA-4172-A191-EA21FB61AD0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {029CA97F-E0BA-4172-A191-EA21FB61AD0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {029CA97F-E0BA-4172-A191-EA21FB61AD0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {029CA97F-E0BA-4172-A191-EA21FB61AD0F}.Release|Any CPU.Build.0 = Release|Any CPU - {326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Release|Any CPU.Build.0 = Release|Any CPU - {67B1461D-E215-4BA8-A64D-E1836724D5E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67B1461D-E215-4BA8-A64D-E1836724D5E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67B1461D-E215-4BA8-A64D-E1836724D5E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67B1461D-E215-4BA8-A64D-E1836724D5E6}.Release|Any CPU.Build.0 = Release|Any CPU - {3C7F43BB-FE4C-48BC-BF42-D24E70E8FCB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C7F43BB-FE4C-48BC-BF42-D24E70E8FCB7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3C7F43BB-FE4C-48BC-BF42-D24E70E8FCB7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C7F43BB-FE4C-48BC-BF42-D24E70E8FCB7}.Release|Any CPU.Build.0 = Release|Any CPU - {E29C8677-AB44-4950-9EB1-D8E70B710A56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E29C8677-AB44-4950-9EB1-D8E70B710A56}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E29C8677-AB44-4950-9EB1-D8E70B710A56}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E29C8677-AB44-4950-9EB1-D8E70B710A56}.Release|Any CPU.Build.0 = Release|Any CPU - {D7D4041C-DCD9-4B7A-B423-0F458DFFF3D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D7D4041C-DCD9-4B7A-B423-0F458DFFF3D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D7D4041C-DCD9-4B7A-B423-0F458DFFF3D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D7D4041C-DCD9-4B7A-B423-0F458DFFF3D6}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {78C476A5-6E88-449B-828D-A2465D9D3295} - EndGlobalSection -EndGlobal diff --git a/MareSynchronosServer/MareSynchronosServer/.config/dotnet-tools.json b/MareSynchronosServer/MareSynchronosServer/.config/dotnet-tools.json deleted file mode 100644 index b8c6c1f..0000000 --- a/MareSynchronosServer/MareSynchronosServer/.config/dotnet-tools.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "dotnet-ef": { - "version": "6.0.9", - "commands": [ - "dotnet-ef" - ] - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Controllers/ClientMessageController.cs b/MareSynchronosServer/MareSynchronosServer/Controllers/ClientMessageController.cs deleted file mode 100644 index c68a3be..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Controllers/ClientMessageController.cs +++ /dev/null @@ -1,42 +0,0 @@ -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.SignalR; - -namespace MareSynchronosServer.Controllers; - -[Route("/msgc")] -[Authorize(Policy = "Internal")] -public class ClientMessageController : Controller -{ - private ILogger _logger; - private IHubContext _hubContext; - - public ClientMessageController(ILogger logger, IHubContext hubContext) - { - _logger = logger; - _hubContext = hubContext; - } - - [Route("sendMessage")] - [HttpPost] - public async Task SendMessage([FromBody] ClientMessage msg) - { - bool hasUid = !string.IsNullOrEmpty(msg.UID); - - if (!hasUid) - { - _logger.LogInformation("Sending Message of severity {severity} to all online users: {message}", msg.Severity, msg.Message); - await _hubContext.Clients.All.Client_ReceiveServerMessage(msg.Severity, msg.Message).ConfigureAwait(false); - } - else - { - _logger.LogInformation("Sending Message of severity {severity} to user {uid}: {message}", msg.Severity, msg.UID, msg.Message); - await _hubContext.Clients.User(msg.UID).Client_ReceiveServerMessage(msg.Severity, msg.Message).ConfigureAwait(false); - } - - return Empty; - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Controllers/DiscoveryNotifyController.cs b/MareSynchronosServer/MareSynchronosServer/Controllers/DiscoveryNotifyController.cs deleted file mode 100644 index d798c4d..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Controllers/DiscoveryNotifyController.cs +++ /dev/null @@ -1,58 +0,0 @@ -using MareSynchronos.API.SignalR; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.SignalR; -using System.Text.Json.Serialization; - -namespace MareSynchronosServer.Controllers; - -[Route("/main/discovery")] -[Authorize(Policy = "Internal")] -public class DiscoveryNotifyController : Controller -{ - private readonly ILogger _logger; - private readonly IHubContext _hub; - - public DiscoveryNotifyController(ILogger logger, IHubContext hub) - { - _logger = logger; - _hub = hub; - } - - public sealed class NotifyRequestDto - { - [JsonPropertyName("targetUid")] public string TargetUid { get; set; } = string.Empty; - [JsonPropertyName("fromUid")] public string FromUid { get; set; } = string.Empty; - [JsonPropertyName("fromAlias")] public string? FromAlias { get; set; } - } - - [HttpPost("notifyRequest")] - public async Task NotifyRequest([FromBody] NotifyRequestDto dto) - { - if (string.IsNullOrEmpty(dto.TargetUid)) return BadRequest(); - var name = string.IsNullOrEmpty(dto.FromAlias) ? dto.FromUid : dto.FromAlias; - var msg = $"Nearby Request: {name} [{dto.FromUid}]"; - _logger.LogInformation("Discovery notify request to {target} from {from}", dto.TargetUid, name); - await _hub.Clients.User(dto.TargetUid).Client_ReceiveServerMessage(MareSynchronos.API.Data.Enum.MessageSeverity.Information, msg); - return Accepted(); - } - - public sealed class NotifyAcceptDto - { - [JsonPropertyName("targetUid")] public string TargetUid { get; set; } = string.Empty; - [JsonPropertyName("fromUid")] public string FromUid { get; set; } = string.Empty; - [JsonPropertyName("fromAlias")] public string? FromAlias { get; set; } - } - - [HttpPost("notifyAccept")] - public async Task NotifyAccept([FromBody] NotifyAcceptDto dto) - { - if (string.IsNullOrEmpty(dto.TargetUid)) return BadRequest(); - var name = string.IsNullOrEmpty(dto.FromAlias) ? dto.FromUid : dto.FromAlias; - var msg = $"Nearby Accept: {name} [{dto.FromUid}]"; - _logger.LogInformation("Discovery notify accept to {target} from {from}", dto.TargetUid, name); - await _hub.Clients.User(dto.TargetUid).Client_ReceiveServerMessage(MareSynchronos.API.Data.Enum.MessageSeverity.Information, msg); - return Accepted(); - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Controllers/MainController.cs b/MareSynchronosServer/MareSynchronosServer/Controllers/MainController.cs deleted file mode 100644 index add64a4..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Controllers/MainController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; -using MareSynchronosServer.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.SignalR; - -namespace MareSynchronosServer.Controllers; - -[Route(MareFiles.Main)] -public class MainController : Controller -{ - private IHubContext _hubContext; - - public MainController(ILogger logger, IHubContext hubContext) - { - _hubContext = hubContext; - } - - [HttpGet(MareFiles.Main_SendReady)] - [Authorize(Policy = "Internal")] - public IActionResult SendReadyToClients(string uid, Guid requestId) - { - _ = Task.Run(async () => - { - await _hubContext.Clients.User(uid).Client_DownloadReady(requestId); - }); - return Ok(); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs deleted file mode 100644 index 4c67ac6..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs +++ /dev/null @@ -1,638 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Dto.CharaData; -using MareSynchronosServer.Utils; -using MareSynchronosShared.Models; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Authorization; -using Microsoft.EntityFrameworkCore; -using System.Text.Json; - -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - [Authorize(Policy = "Identified")] - public async Task CharaDataCreate() - { - _logger.LogCallInfo(); - - int uploadCount = DbContext.CharaData.Count(c => c.UploaderUID == UserUID); - User user = DbContext.Users.Single(u => u.UID == UserUID); - int maximumUploads = _maxCharaDataByUser; - if (uploadCount >= maximumUploads) - { - return null; - } - - string charaDataId = null; - while (charaDataId == null) - { - charaDataId = StringUtils.GenerateRandomString(10, "abcdefghijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYZ"); - bool idExists = await DbContext.CharaData.AnyAsync(c => c.UploaderUID == UserUID && c.Id == charaDataId).ConfigureAwait(false); - if (idExists) - { - charaDataId = null; - } - } - - DateTime createdDate = DateTime.UtcNow; - CharaData charaData = new() - { - Id = charaDataId, - UploaderUID = UserUID, - CreatedDate = createdDate, - UpdatedDate = createdDate, - AccessType = CharaDataAccess.Individuals, - ShareType = CharaDataShare.Private, - CustomizeData = string.Empty, - GlamourerData = string.Empty, - ExpiryDate = DateTime.MaxValue, - Description = string.Empty, - }; - - await DbContext.CharaData.AddAsync(charaData).ConfigureAwait(false); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS", charaDataId)); - - return GetCharaDataFullDto(charaData); - } - - [Authorize(Policy = "Identified")] - public async Task CharaDataDelete(string id) - { - var existingData = await DbContext.CharaData.SingleOrDefaultAsync(u => u.Id == id && u.UploaderUID == UserUID).ConfigureAwait(false); - if (existingData == null) - return false; - - try - { - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS", id)); - - DbContext.Remove(existingData); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - return true; - } - catch (Exception ex) - { - _logger.LogCallWarning(MareHubLogger.Args("FAILURE", id, ex.Message)); - return false; - } - } - - [Authorize(Policy = "Identified")] - public async Task CharaDataDownload(string id) - { - CharaData charaData = await GetCharaDataById(id, nameof(CharaDataDownload)).ConfigureAwait(false); - - if (!string.Equals(charaData.UploaderUID, UserUID, StringComparison.Ordinal)) - { - charaData.DownloadCount++; - await DbContext.SaveChangesAsync().ConfigureAwait(false); - } - - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS", id)); - - return GetCharaDataDownloadDto(charaData); - } - - [Authorize(Policy = "Identified")] - public async Task CharaDataGetMetainfo(string id) - { - var charaData = await GetCharaDataById(id, nameof(CharaDataGetMetainfo)).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS", id)); - - return GetCharaDataMetaInfoDto(charaData); - } - - [Authorize(Policy = "Identified")] - public async Task> CharaDataGetOwn() - { - var ownCharaData = await DbContext.CharaData - .Include(u => u.Files) - .Include(u => u.FileSwaps) - .Include(u => u.OriginalFiles) - .Include(u => u.AllowedIndividiuals) - .ThenInclude(u => u.AllowedUser) - .Include(u => u.AllowedIndividiuals) - .ThenInclude(u => u.AllowedGroup) - .Include(u => u.Poses) - .AsSplitQuery() - .Where(c => c.UploaderUID == UserUID).ToListAsync().ConfigureAwait(false); - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS")); - return [.. ownCharaData.Select(GetCharaDataFullDto)]; - } - - [Authorize(Policy = "Identified")] - public async Task CharaDataAttemptRestore(string id) - { - _logger.LogCallInfo(MareHubLogger.Args(id)); - var charaData = await DbContext.CharaData - .Include(u => u.Files) - .Include(u => u.FileSwaps) - .Include(u => u.OriginalFiles) - .Include(u => u.AllowedIndividiuals) - .ThenInclude(u => u.AllowedUser) - .Include(u => u.AllowedIndividiuals) - .ThenInclude(u => u.AllowedGroup) - .Include(u => u.Poses) - .AsSplitQuery() - .SingleOrDefaultAsync(s => s.Id == id && s.UploaderUID == UserUID) - .ConfigureAwait(false); - if (charaData == null) - return null; - - var currentHashes = charaData.Files.Select(f => f.FileCacheHash).ToList(); - var missingFiles = charaData.OriginalFiles.Where(c => !currentHashes.Contains(c.Hash, StringComparer.Ordinal)).ToList(); - - // now let's see what's on the db still - var existingDbFiles = await DbContext.Files - .Where(f => missingFiles.Select(k => k.Hash).Distinct().Contains(f.Hash)) - .ToListAsync() - .ConfigureAwait(false); - - // now shove it all back into the db - foreach (var dbFile in existingDbFiles) - { - var missingFileEntry = missingFiles.First(f => string.Equals(f.Hash, dbFile.Hash, StringComparison.Ordinal)); - charaData.Files.Add(new CharaDataFile() - { - FileCache = dbFile, - GamePath = missingFileEntry.GamePath, - Parent = charaData - }); - missingFiles.Remove(missingFileEntry); - } - - if (existingDbFiles.Any()) - { - await DbContext.SaveChangesAsync().ConfigureAwait(false); - } - - return GetCharaDataFullDto(charaData); - } - - [Authorize(Policy = "Identified")] - public async Task> CharaDataGetShared() - { - _logger.LogCallInfo(); - - List sharedCharaData = []; - var groups = await DbContext.GroupPairs - .Where(u => u.GroupUserUID == UserUID) - .Select(k => k.GroupGID) - .AsNoTracking() - .ToListAsync() - .ConfigureAwait(false); - - var individualPairs = await GetDirectPairedUnpausedUsers().ConfigureAwait(false); - var allPairs = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - - var allSharedDataByPair = await DbContext.CharaData - .Include(u => u.Files) - .Include(u => u.OriginalFiles) - .Include(u => u.AllowedIndividiuals) - .Include(u => u.Poses) - .Include(u => u.Uploader) - .Where(p => p.UploaderUID != UserUID && p.ShareType == CharaDataShare.Shared) - .Where(p => - (individualPairs.Contains(p.UploaderUID) && p.AccessType == CharaDataAccess.ClosePairs) - || (allPairs.Contains(p.UploaderUID) && p.AccessType == CharaDataAccess.AllPairs) - || (p.AllowedIndividiuals.Any(u => u.AllowedUserUID == UserUID || (u.AllowedGroupGID != null && groups.Contains(u.AllowedGroupGID))))) - .AsSplitQuery() - .AsNoTracking() - .ToListAsync() - .ConfigureAwait(false); - - - foreach (var charaData in allSharedDataByPair) - { - sharedCharaData.Add(charaData); - } - - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS", sharedCharaData.Count)); - - return [.. sharedCharaData.Select(GetCharaDataMetaInfoDto)]; - } - - [Authorize(Policy = "Identified")] - public async Task CharaDataUpdate(CharaDataUpdateDto updateDto) - { - var charaData = await DbContext.CharaData - .Include(u => u.Files) - .Include(u => u.OriginalFiles) - .Include(u => u.AllowedIndividiuals) - .ThenInclude(u => u.AllowedUser) - .Include(u => u.AllowedIndividiuals) - .ThenInclude(u => u.AllowedGroup) - .Include(u => u.FileSwaps) - .Include(u => u.Poses) - .AsSplitQuery() - .SingleOrDefaultAsync(u => u.Id == updateDto.Id && u.UploaderUID == UserUID).ConfigureAwait(false); - - if (charaData == null) - return null; - - bool anyChanges = false; - - if (updateDto.Description != null) - { - charaData.Description = updateDto.Description; - anyChanges = true; - } - - if (updateDto.ExpiryDate != null) - { - charaData.ExpiryDate = updateDto.ExpiryDate; - anyChanges = true; - } - - if (updateDto.GlamourerData != null) - { - charaData.GlamourerData = updateDto.GlamourerData; - anyChanges = true; - } - - if (updateDto.CustomizeData != null) - { - charaData.CustomizeData = updateDto.CustomizeData; - anyChanges = true; - } - - if (updateDto.ManipulationData != null) - { - charaData.ManipulationData = updateDto.ManipulationData; - anyChanges = true; - } - - if (updateDto.AccessType != null) - { - charaData.AccessType = GetAccessType(updateDto.AccessType.Value); - anyChanges = true; - } - - if (updateDto.ShareType != null) - { - charaData.ShareType = GetShareType(updateDto.ShareType.Value); - anyChanges = true; - } - - if (updateDto.AllowedUsers != null) - { - var individuals = charaData.AllowedIndividiuals.Where(k => k.AllowedGroup == null).ToList(); - var allowedUserList = updateDto.AllowedUsers.ToList(); - foreach (var user in updateDto.AllowedUsers) - { - if (charaData.AllowedIndividiuals.Any(k => k.AllowedUser != null && (string.Equals(k.AllowedUser.UID, user, StringComparison.Ordinal) || string.Equals(k.AllowedUser.Alias, user, StringComparison.Ordinal)))) - { - continue; - } - else - { - var dbUser = await DbContext.Users.SingleOrDefaultAsync(u => u.UID == user || u.Alias == user).ConfigureAwait(false); - if (dbUser != null) - { - charaData.AllowedIndividiuals.Add(new CharaDataAllowance() - { - AllowedUser = dbUser, - Parent = charaData - }); - } - } - } - - foreach (var dataUser in individuals.Where(k => !updateDto.AllowedUsers.Contains(k.AllowedUser.UID, StringComparer.Ordinal) && !updateDto.AllowedUsers.Contains(k.AllowedUser.Alias, StringComparer.Ordinal))) - { - DbContext.Remove(dataUser); - charaData.AllowedIndividiuals.Remove(dataUser); - } - - anyChanges = true; - } - - if (updateDto.AllowedGroups != null) - { - var individualGroups = charaData.AllowedIndividiuals.Where(k => k.AllowedUser == null).ToList(); - var allowedGroups = updateDto.AllowedGroups.ToList(); - foreach (var group in updateDto.AllowedGroups) - { - if (charaData.AllowedIndividiuals.Any(k => k.AllowedGroup != null && (string.Equals(k.AllowedGroup.GID, group, StringComparison.Ordinal) || string.Equals(k.AllowedGroup.Alias, group, StringComparison.Ordinal)))) - { - continue; - } - else - { - var groupUser = await DbContext.GroupPairs.Include(u => u.Group).SingleOrDefaultAsync(u => (u.Group.GID == group || u.Group.Alias == group) && u.GroupUserUID == UserUID).ConfigureAwait(false); - if (groupUser != null) - { - charaData.AllowedIndividiuals.Add(new CharaDataAllowance() - { - AllowedGroup = groupUser.Group, - Parent = charaData - }); - } - } - } - - foreach (var dataGroup in individualGroups.Where(k => !updateDto.AllowedGroups.Contains(k.AllowedGroup.GID, StringComparer.Ordinal) && !updateDto.AllowedGroups.Contains(k.AllowedGroup.Alias, StringComparer.Ordinal))) - { - DbContext.Remove(dataGroup); - charaData.AllowedIndividiuals.Remove(dataGroup); - } - - anyChanges = true; - } - - if (updateDto.FileGamePaths != null) - { - var originalFiles = charaData.OriginalFiles.ToList(); - charaData.OriginalFiles.Clear(); - DbContext.RemoveRange(originalFiles); - var files = charaData.Files.ToList(); - charaData.Files.Clear(); - DbContext.RemoveRange(files); - foreach (var file in updateDto.FileGamePaths) - { - charaData.Files.Add(new CharaDataFile() - { - FileCacheHash = file.HashOrFileSwap, - GamePath = file.GamePath, - Parent = charaData - }); - - charaData.OriginalFiles.Add(new CharaDataOriginalFile() - { - Hash = file.HashOrFileSwap, - Parent = charaData, - GamePath = file.GamePath - }); - } - - anyChanges = true; - } - - if (updateDto.FileSwaps != null) - { - var fileSwaps = charaData.FileSwaps.ToList(); - charaData.FileSwaps.Clear(); - DbContext.RemoveRange(fileSwaps); - foreach (var file in updateDto.FileSwaps) - { - charaData.FileSwaps.Add(new CharaDataFileSwap() - { - FilePath = file.HashOrFileSwap, - GamePath = file.GamePath, - Parent = charaData - }); - } - - anyChanges = true; - } - - if (updateDto.Poses != null) - { - foreach (var pose in updateDto.Poses) - { - if (pose.Id == null) - { - charaData.Poses.Add(new CharaDataPose() - { - Description = pose.Description, - Parent = charaData, - ParentUploaderUID = UserUID, - PoseData = pose.PoseData, - WorldData = pose.WorldData == null ? string.Empty : JsonSerializer.Serialize(pose.WorldData), - }); - - anyChanges = true; - } - else - { - var associatedPose = charaData.Poses.FirstOrDefault(p => p.Id == pose.Id); - if (associatedPose == null) - continue; - - if (pose.Description == null && pose.PoseData == null && pose.WorldData == null) - { - charaData.Poses.Remove(associatedPose); - DbContext.Remove(associatedPose); - } - else - { - if (pose.Description != null) - associatedPose.Description = pose.Description; - if (pose.WorldData != null) - { - if (pose.WorldData.Value == default) associatedPose.WorldData = string.Empty; - else associatedPose.WorldData = JsonSerializer.Serialize(pose.WorldData.Value); - } - if (pose.PoseData != null) - associatedPose.PoseData = pose.PoseData; - } - - anyChanges = true; - } - - var overflowingPoses = charaData.Poses.Skip(10).ToList(); - foreach (var overflowing in overflowingPoses) - { - charaData.Poses.Remove(overflowing); - DbContext.Remove(overflowing); - } - } - } - - if (anyChanges) - { - charaData.UpdatedDate = DateTime.UtcNow; - await DbContext.SaveChangesAsync().ConfigureAwait(false); - _logger.LogCallInfo(MareHubLogger.Args("SUCCESS", anyChanges)); - } - - return GetCharaDataFullDto(charaData); - } - - private static CharaDataAccess GetAccessType(AccessTypeDto dataAccess) => dataAccess switch - { - AccessTypeDto.Public => CharaDataAccess.Public, - AccessTypeDto.AllPairs => CharaDataAccess.AllPairs, - AccessTypeDto.ClosePairs => CharaDataAccess.ClosePairs, - AccessTypeDto.Individuals => CharaDataAccess.Individuals, - _ => throw new NotSupportedException(), - }; - - private static AccessTypeDto GetAccessTypeDto(CharaDataAccess dataAccess) => dataAccess switch - { - CharaDataAccess.Public => AccessTypeDto.Public, - CharaDataAccess.AllPairs => AccessTypeDto.AllPairs, - CharaDataAccess.ClosePairs => AccessTypeDto.ClosePairs, - CharaDataAccess.Individuals => AccessTypeDto.Individuals, - _ => throw new NotSupportedException(), - }; - - private static CharaDataDownloadDto GetCharaDataDownloadDto(CharaData charaData) - { - return new CharaDataDownloadDto(charaData.Id, charaData.Uploader.ToUserData()) - { - CustomizeData = charaData.CustomizeData, - Description = charaData.Description, - FileGamePaths = charaData.Files.Select(k => new GamePathEntry(k.FileCacheHash, k.GamePath)).ToList(), - GlamourerData = charaData.GlamourerData, - FileSwaps = charaData.FileSwaps.Select(k => new GamePathEntry(k.FilePath, k.GamePath)).ToList(), - ManipulationData = charaData.ManipulationData, - }; - } - - private CharaDataFullDto GetCharaDataFullDto(CharaData charaData) - { - return new CharaDataFullDto(charaData.Id, new(UserUID)) - { - AccessType = GetAccessTypeDto(charaData.AccessType), - ShareType = GetShareTypeDto(charaData.ShareType), - AllowedUsers = [.. charaData.AllowedIndividiuals.Where(k => !string.IsNullOrEmpty(k.AllowedUserUID)).Select(u => new UserData(u.AllowedUser.UID, u.AllowedUser.Alias))], - AllowedGroups = [.. charaData.AllowedIndividiuals.Where(k => !string.IsNullOrEmpty(k.AllowedGroupGID)).Select(k => new GroupData(k.AllowedGroup.GID, k.AllowedGroup.Alias))], - CustomizeData = charaData.CustomizeData, - Description = charaData.Description, - ExpiryDate = charaData.ExpiryDate ?? DateTime.MaxValue, - OriginalFiles = charaData.OriginalFiles.Select(k => new GamePathEntry(k.Hash, k.GamePath)).ToList(), - FileGamePaths = charaData.Files.Select(k => new GamePathEntry(k.FileCacheHash, k.GamePath)).ToList(), - FileSwaps = charaData.FileSwaps.Select(k => new GamePathEntry(k.FilePath, k.GamePath)).ToList(), - GlamourerData = charaData.GlamourerData, - CreatedDate = charaData.CreatedDate, - UpdatedDate = charaData.UpdatedDate, - ManipulationData = charaData.ManipulationData, - DownloadCount = charaData.DownloadCount, - PoseData = [.. charaData.Poses.OrderBy(p => p.Id).Select(k => - { - WorldData data = default; - - if(!string.IsNullOrEmpty(k.WorldData)) data = JsonSerializer.Deserialize(k.WorldData); - return new PoseEntry(k.Id) - { - Description = k.Description, - PoseData = k.PoseData, - WorldData = data - }; - })], - }; - } - - private static CharaDataMetaInfoDto GetCharaDataMetaInfoDto(CharaData charaData) - { - var allOrigHashes = charaData.OriginalFiles.Select(k => k.Hash).ToList(); - var allFileHashes = charaData.Files.Select(f => f.FileCacheHash).ToList(); - var allHashesPresent = allOrigHashes.TrueForAll(h => allFileHashes.Contains(h, StringComparer.Ordinal)); - var canBeDownloaded = allHashesPresent &= !string.IsNullOrEmpty(charaData.GlamourerData); - return new CharaDataMetaInfoDto(charaData.Id, charaData.Uploader.ToUserData()) - { - CanBeDownloaded = canBeDownloaded, - Description = charaData.Description, - UpdatedDate = charaData.UpdatedDate, - PoseData = [.. charaData.Poses.OrderBy(p => p.Id).Select(k => - { - WorldData data = default; - if(!string.IsNullOrEmpty(k.WorldData)) data = JsonSerializer.Deserialize(k.WorldData); - return new PoseEntry(k.Id) - { - Description = k.Description, - PoseData = k.PoseData, - WorldData = data - }; - })], - }; - } - - private static CharaDataShare GetShareType(ShareTypeDto dataShare) => dataShare switch - { - ShareTypeDto.Shared => CharaDataShare.Shared, - ShareTypeDto.Private => CharaDataShare.Private, - _ => throw new NotSupportedException(), - }; - - private static ShareTypeDto GetShareTypeDto(CharaDataShare dataShare) => dataShare switch - { - CharaDataShare.Shared => ShareTypeDto.Shared, - CharaDataShare.Private => ShareTypeDto.Private, - _ => throw new NotSupportedException(), - }; - - private async Task CheckCharaDataAllowance(CharaData charaData, List joinedGroups) - { - // check for self - if (string.Equals(charaData.UploaderUID, UserUID, StringComparison.Ordinal)) - return true; - - // check for public access - if (charaData.AccessType == CharaDataAccess.Public) - return true; - - // check for individuals - if (charaData.AllowedIndividiuals.Any(u => string.Equals(u.AllowedUserUID, UserUID, StringComparison.Ordinal))) - return true; - - var pairInfoUploader = await GetAllPairedUnpausedUsers(charaData.UploaderUID).ConfigureAwait(false); - - // check for all pairs - if (charaData.AccessType == CharaDataAccess.AllPairs) - { - if (pairInfoUploader.Any(pair => string.Equals(pair, UserUID, StringComparison.Ordinal))) - return true; - - return false; - } - - // check for individual pairs - if (charaData.AccessType == CharaDataAccess.ClosePairs) - { - if (pairInfoUploader.Any(pair => string.Equals(pair, UserUID, StringComparison.Ordinal))) - { - ClientPair callerPair = - await DbContext.ClientPairs.AsNoTracking().SingleOrDefaultAsync(w => w.UserUID == UserUID && w.OtherUserUID == charaData.UploaderUID).ConfigureAwait(false); - ClientPair uploaderPair = - await DbContext.ClientPairs.AsNoTracking().SingleOrDefaultAsync(w => w.UserUID == charaData.UploaderUID && w.OtherUserUID == UserUID).ConfigureAwait(false); - return (callerPair != null && uploaderPair != null); - } - - return false; - } - - return false; - } - - private async Task GetCharaDataById(string id, string methodName) - { - var splitid = id.Split(":", StringSplitOptions.None); - if (splitid.Length != 2) - { - _logger.LogCallWarning(MareHubLogger.Args("INVALID", id)); - throw new InvalidOperationException($"Id {id} not in expected format"); - } - - var charaData = await DbContext.CharaData - .Include(u => u.Files) - .Include(u => u.FileSwaps) - .Include(u => u.AllowedIndividiuals) - .Include(u => u.Poses) - .Include(u => u.Uploader) - .AsSplitQuery() - .SingleOrDefaultAsync(c => c.Id == splitid[1] && c.UploaderUID == splitid[0]).ConfigureAwait(false); - - if (charaData == null) - { - _logger.LogCallWarning(MareHubLogger.Args("NOT FOUND", id)); - throw new InvalidDataException($"No chara data with {id} found"); - } - - var groups = await DbContext.GroupPairs.Where(u => u.GroupUserUID == UserUID).Select(k => k.GroupGID).ToListAsync() - .ConfigureAwait(false); - - if (!await CheckCharaDataAllowance(charaData, groups).ConfigureAwait(false)) - { - _logger.LogCallWarning(MareHubLogger.Args("UNAUTHORIZED", id)); - throw new UnauthorizedAccessException($"User is not allowed to download {id}"); - } - - return charaData; - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs deleted file mode 100644 index 4e9b7ed..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Chat.cs +++ /dev/null @@ -1,52 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Dto.Group; -using MareSynchronos.API.Dto.User; -using MareSynchronosServer.Utils; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; - -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - [Authorize(Policy = "Identified")] - public Task UserChatSendMsg(UserDto dto, ChatMessage message) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - // TODO - return Task.CompletedTask; - } - - [Authorize(Policy = "Identified")] - public async Task GroupChatSendMsg(GroupDto dto, ChatMessage message) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (userExists, groupPair) = await TryValidateUserInGroup(dto.GID, UserUID).ConfigureAwait(false); - if (!userExists) return; - - var group = await DbContext.Groups.AsNoTracking().SingleAsync(g => g.GID == dto.GID).ConfigureAwait(false); - var sender = await DbContext.Users.AsNoTracking().SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - var groupPairs = await DbContext.GroupPairs.AsNoTracking().Include(p => p.GroupUser).Where(p => p.GroupGID == dto.Group.GID).ToListAsync().ConfigureAwait(false); - - if (group == null || sender == null) return; - - // TODO: Add and check chat permissions - if (group.Alias?.Equals("Umbra", StringComparison.Ordinal) ?? false) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, $"Chat is disabled for syncshell '{dto.GroupAliasOrGID}'.").ConfigureAwait(false); - return; - } - - // TOOO: Sign the message - var signedMessage = new SignedChatMessage(message, sender.ToUserData()) - { - Timestamp = 0, - Signature = "", - }; - - await Clients.Users(groupPairs.Select(p => p.GroupUserUID)).Client_GroupChatMsg(new(new(group.ToGroupData()), signedMessage)).ConfigureAwait(false); - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs deleted file mode 100644 index 29d64e5..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.ClientStubs.cs +++ /dev/null @@ -1,63 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Dto; -using MareSynchronos.API.Dto.CharaData; -using MareSynchronos.API.Dto.Chat; -using MareSynchronos.API.Dto.Group; -using MareSynchronos.API.Dto.User; - -namespace MareSynchronosServer.Hubs -{ - public partial class MareHub - { - public Task Client_DownloadReady(Guid requestId) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupChangePermissions(GroupPermissionDto groupPermission) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupChatMsg(GroupChatMsgDto groupChatMsgDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupDelete(GroupDto groupDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupPairChangePermissions(GroupPairUserPermissionDto permissionDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupPairChangeUserInfo(GroupPairUserInfoDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupPairJoined(GroupPairFullInfoDto groupPairInfoDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupPairLeft(GroupPairDto groupPairDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupSendFullInfo(GroupFullInfoDto groupInfo) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GroupSendInfo(GroupInfoDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_ReceiveServerMessage(MessageSeverity messageSeverity, string message) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UpdateSystemInfo(SystemInfoDto systemInfo) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserAddClientPair(UserPairDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserChatMsg(UserChatMsgDto userChatMsgDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserReceiveCharacterData(OnlineUserCharaDataDto dataDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserReceiveUploadStatus(UserDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserRemoveClientPair(UserDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserSendOffline(UserDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserSendOnline(OnlineUserIdentDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserUpdateOtherPairPermissions(UserPermissionsDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserUpdateProfile(UserDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_UserUpdateSelfPairPermissions(UserPermissionsDto dto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - - public Task Client_GposeLobbyJoin(UserData userData) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - public Task Client_GposeLobbyLeave(UserData userData) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - public Task Client_GposeLobbyPushCharacterData(CharaDataDownloadDto charaDownloadDto) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - public Task Client_GposeLobbyPushPoseData(UserData userData, PoseData poseData) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - public Task Client_GposeLobbyPushWorldData(UserData userData, WorldData worldData) => throw new PlatformNotSupportedException("Calling clientside method on server not supported"); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs deleted file mode 100644 index 5872bc5..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Functions.cs +++ /dev/null @@ -1,299 +0,0 @@ -using MareSynchronosShared.Models; -using Microsoft.EntityFrameworkCore; -using MareSynchronosServer.Utils; -using MareSynchronosShared.Utils; -using MareSynchronos.API.Data; -using MareSynchronos.API.Dto.Group; -using MareSynchronosShared.Metrics; -using Microsoft.AspNetCore.SignalR; - -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - public string UserCharaIdent => Context.User?.Claims?.SingleOrDefault(c => string.Equals(c.Type, MareClaimTypes.CharaIdent, StringComparison.Ordinal))?.Value ?? throw new Exception("No Chara Ident in Claims"); - - public string UserUID => Context.User?.Claims?.SingleOrDefault(c => string.Equals(c.Type, MareClaimTypes.Uid, StringComparison.Ordinal))?.Value ?? throw new Exception("No UID in Claims"); - - public string Continent => Context.User?.Claims?.SingleOrDefault(c => string.Equals(c.Type, MareClaimTypes.Continent, StringComparison.Ordinal))?.Value ?? "UNK"; - - private async Task DeleteUser(User user) - { - var ownPairData = await DbContext.ClientPairs.Where(u => u.User.UID == user.UID).ToListAsync().ConfigureAwait(false); - var auth = await DbContext.Auth.SingleAsync(u => u.UserUID == user.UID).ConfigureAwait(false); - var lodestone = await DbContext.LodeStoneAuth.SingleOrDefaultAsync(a => a.User.UID == user.UID).ConfigureAwait(false); - var groupPairs = await DbContext.GroupPairs.Where(g => g.GroupUserUID == user.UID).ToListAsync().ConfigureAwait(false); - var userProfileData = await DbContext.UserProfileData.SingleOrDefaultAsync(u => u.UserUID == user.UID).ConfigureAwait(false); - var bannedEntries = await DbContext.GroupBans.Where(u => u.BannedUserUID == user.UID).ToListAsync().ConfigureAwait(false); - - if (lodestone != null) - { - DbContext.Remove(lodestone); - } - - if (userProfileData != null) - { - DbContext.Remove(userProfileData); - } - - DbContext.ClientPairs.RemoveRange(ownPairData); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - var otherPairData = await DbContext.ClientPairs.Include(u => u.User) - .Where(u => u.OtherUser.UID == user.UID).AsNoTracking().ToListAsync().ConfigureAwait(false); - foreach (var pair in otherPairData) - { - await Clients.User(pair.UserUID).Client_UserRemoveClientPair(new(user.ToUserData())).ConfigureAwait(false); - } - - foreach (var pair in groupPairs) - { - await UserLeaveGroup(new GroupDto(new GroupData(pair.GroupGID)), user.UID).ConfigureAwait(false); - } - - _mareMetrics.IncCounter(MetricsAPI.CounterUsersRegisteredDeleted, 1); - - DbContext.GroupBans.RemoveRange(bannedEntries); - DbContext.ClientPairs.RemoveRange(otherPairData); - DbContext.Users.Remove(user); - DbContext.Auth.Remove(auth); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - } - - private async Task> GetAllPairedClientsWithPauseState(string? uid = null) - { - uid ??= UserUID; - - var query = await (from userPair in DbContext.ClientPairs - join otherUserPair in DbContext.ClientPairs on userPair.OtherUserUID equals otherUserPair.UserUID - where otherUserPair.OtherUserUID == uid && userPair.UserUID == uid - select new - { - UID = Convert.ToString(userPair.OtherUserUID), - GID = "DIRECT", - PauseStateSelf = userPair.IsPaused, - PauseStateOther = otherUserPair.IsPaused, - }) - .Union( - (from userGroupPair in DbContext.GroupPairs - join otherGroupPair in DbContext.GroupPairs on userGroupPair.GroupGID equals otherGroupPair.GroupGID - where - userGroupPair.GroupUserUID == uid - && otherGroupPair.GroupUserUID != uid - select new - { - UID = Convert.ToString(otherGroupPair.GroupUserUID), - GID = Convert.ToString(otherGroupPair.GroupGID), - PauseStateSelf = userGroupPair.IsPaused, - PauseStateOther = otherGroupPair.IsPaused, - }) - ).AsNoTracking().ToListAsync().ConfigureAwait(false); - - return query.GroupBy(g => g.UID, g => (g.GID, g.PauseStateSelf, g.PauseStateOther), - (key, g) => new PausedEntry - { - UID = key, - PauseStates = g.Select(p => new PauseState() { GID = string.Equals(p.GID, "DIRECT", StringComparison.Ordinal) ? null : p.GID, IsSelfPaused = p.PauseStateSelf, IsOtherPaused = p.PauseStateOther }) - .ToList(), - }, StringComparer.Ordinal).ToList(); - } - - private async Task> GetAllPairedUnpausedUsers(string? uid = null) - { - uid ??= UserUID; - var ret = await GetAllPairedClientsWithPauseState(uid).ConfigureAwait(false); - return ret.Where(k => !k.IsPaused).Select(k => k.UID).ToList(); - } - - private async Task> GetDirectPairedUnpausedUsers(string? uid = null) - { - uid ??= UserUID; - - var query = await (from userPair in DbContext.ClientPairs - join otherUserPair in DbContext.ClientPairs on userPair.OtherUserUID equals otherUserPair.UserUID - where otherUserPair.OtherUserUID == uid && userPair.UserUID == uid && !userPair.IsPaused && !otherUserPair.IsPaused - select Convert.ToString(userPair.OtherUserUID)).AsNoTracking().ToListAsync().ConfigureAwait(false); - - return query; - } - - private async Task> GetOnlineUsers(List uids) - { - var result = await _redis.GetAllAsync(uids.Select(u => "UID:" + u).ToHashSet(StringComparer.Ordinal)).ConfigureAwait(false); - return uids.Where(u => result.TryGetValue("UID:" + u, out var ident) && !string.IsNullOrEmpty(ident)).ToDictionary(u => u, u => result["UID:" + u], StringComparer.Ordinal); - } - - private async Task GetUserIdent(string uid) - { - if (string.IsNullOrEmpty(uid)) return string.Empty; - return await _redis.GetAsync("UID:" + uid).ConfigureAwait(false); - } - - private async Task RemoveUserFromRedis() - { - await _redis.RemoveAsync("UID:" + UserUID, StackExchange.Redis.CommandFlags.FireAndForget).ConfigureAwait(false); - } - - private async Task SendGroupDeletedToAll(List groupUsers) - { - foreach (var pair in groupUsers) - { - var pairIdent = await GetUserIdent(pair.GroupUserUID).ConfigureAwait(false); - if (string.IsNullOrEmpty(pairIdent)) continue; - - var pairs = await GetAllPairedClientsWithPauseState(pair.GroupUserUID).ConfigureAwait(false); - - foreach (var groupUserPair in groupUsers.Where(g => !string.Equals(g.GroupUserUID, pair.GroupUserUID, StringComparison.Ordinal))) - { - await UserGroupLeave(groupUserPair, pairs, pairIdent, pair.GroupUserUID).ConfigureAwait(false); - } - } - } - - private async Task> SendOfflineToAllPairedUsers() - { - var usersToSendDataTo = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - var self = await DbContext.Users.AsNoTracking().SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - await Clients.Users(usersToSendDataTo).Client_UserSendOffline(new(self.ToUserData())).ConfigureAwait(false); - - return usersToSendDataTo; - } - - private async Task> SendOnlineToAllPairedUsers() - { - var usersToSendDataTo = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - var self = await DbContext.Users.AsNoTracking().SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - await Clients.Users(usersToSendDataTo).Client_UserSendOnline(new(self.ToUserData(), UserCharaIdent)).ConfigureAwait(false); - - return usersToSendDataTo; - } - - private async Task<(bool IsValid, Group ReferredGroup)> TryValidateGroupModeratorOrOwner(string gid) - { - var isOwnerResult = await TryValidateOwner(gid).ConfigureAwait(false); - if (isOwnerResult.isValid) return (true, isOwnerResult.ReferredGroup); - - if (isOwnerResult.ReferredGroup == null) return (false, null); - - var groupPairSelf = await DbContext.GroupPairs.SingleOrDefaultAsync(g => g.GroupGID == gid && g.GroupUserUID == UserUID).ConfigureAwait(false); - if (groupPairSelf == null || !groupPairSelf.IsModerator) return (false, null); - - return (true, isOwnerResult.ReferredGroup); - } - - private async Task<(bool isValid, Group ReferredGroup)> TryValidateOwner(string gid) - { - var group = await DbContext.Groups.SingleOrDefaultAsync(g => g.GID == gid).ConfigureAwait(false); - if (group == null) return (false, null); - - return (string.Equals(group.OwnerUID, UserUID, StringComparison.Ordinal), group); - } - - private async Task<(bool IsValid, GroupPair ReferredPair)> TryValidateUserInGroup(string gid, string? uid = null) - { - uid ??= UserUID; - - var groupPair = await DbContext.GroupPairs.Include(c => c.GroupUser) - .SingleOrDefaultAsync(g => g.GroupGID == gid && (g.GroupUserUID == uid || g.GroupUser.Alias == uid)).ConfigureAwait(false); - if (groupPair == null) return (false, null); - - return (true, groupPair); - } - - private async Task UpdateUserOnRedis() - { - await _redis.AddAsync("UID:" + UserUID, UserCharaIdent, TimeSpan.FromSeconds(60), StackExchange.Redis.When.Always, StackExchange.Redis.CommandFlags.FireAndForget).ConfigureAwait(false); - } - - private async Task UserGroupLeave(GroupPair groupUserPair, List allUserPairs, string userIdent, string? uid = null) - { - uid ??= UserUID; - var userPair = allUserPairs.SingleOrDefault(p => string.Equals(p.UID, groupUserPair.GroupUserUID, StringComparison.Ordinal)); - if (userPair != null) - { - if (userPair.IsDirectlyPaused != PauseInfo.NoConnection) return; - if (userPair.IsPausedPerGroup is PauseInfo.Unpaused) return; - } - - var groupUserIdent = await GetUserIdent(groupUserPair.GroupUserUID).ConfigureAwait(false); - if (!string.IsNullOrEmpty(groupUserIdent)) - { - await Clients.User(uid).Client_UserSendOffline(new(new(groupUserPair.GroupUserUID))).ConfigureAwait(false); - await Clients.User(groupUserPair.GroupUserUID).Client_UserSendOffline(new(new(uid))).ConfigureAwait(false); - } - } - - private async Task UserLeaveGroup(GroupDto dto, string userUid) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (exists, groupPair) = await TryValidateUserInGroup(dto.Group.GID, userUid).ConfigureAwait(false); - if (!exists) return; - - var group = await DbContext.Groups.SingleOrDefaultAsync(g => g.GID == dto.Group.GID).ConfigureAwait(false); - - var groupPairs = await DbContext.GroupPairs.Where(p => p.GroupGID == group.GID).ToListAsync().ConfigureAwait(false); - var groupPairsWithoutSelf = groupPairs.Where(p => !string.Equals(p.GroupUserUID, userUid, StringComparison.Ordinal)).ToList(); - - DbContext.GroupPairs.Remove(groupPair); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - await Clients.User(userUid).Client_GroupDelete(new GroupDto(group.ToGroupData())).ConfigureAwait(false); - - bool ownerHasLeft = string.Equals(group.OwnerUID, userUid, StringComparison.Ordinal); - if (ownerHasLeft) - { - if (!groupPairsWithoutSelf.Any()) - { - _logger.LogCallInfo(MareHubLogger.Args(dto, "Deleted")); - - DbContext.Groups.Remove(group); - } - else - { - var groupHasMigrated = await SharedDbFunctions.MigrateOrDeleteGroup(DbContext, group, groupPairsWithoutSelf, _maxExistingGroupsByUser).ConfigureAwait(false); - - if (groupHasMigrated.Item1) - { - _logger.LogCallInfo(MareHubLogger.Args(dto, "Migrated", groupHasMigrated.Item2)); - - var user = await DbContext.Users.SingleAsync(u => u.UID == groupHasMigrated.Item2).ConfigureAwait(false); - - await Clients.Users(groupPairsWithoutSelf.Select(p => p.GroupUserUID)).Client_GroupSendInfo(new GroupInfoDto(group.ToGroupData(), - user.ToUserData(), group.GetGroupPermissions()) - { - IsTemporary = group.IsTemporary, - ExpiresAt = group.ExpiresAt, - }).ConfigureAwait(false); - } - else - { - _logger.LogCallInfo(MareHubLogger.Args(dto, "Deleted")); - - await Clients.Users(groupPairsWithoutSelf.Select(p => p.GroupUserUID)).Client_GroupDelete(dto).ConfigureAwait(false); - - await SendGroupDeletedToAll(groupPairs).ConfigureAwait(false); - - return; - } - } - } - - var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == userUid).ToListAsync().ConfigureAwait(false); - DbContext.CharaDataAllowances.RemoveRange(sharedData); - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - await Clients.Users(groupPairsWithoutSelf.Select(p => p.GroupUserUID)).Client_GroupPairLeft(new GroupPairDto(dto.Group, groupPair.GroupUser.ToUserData())).ConfigureAwait(false); - - var allUserPairs = await GetAllPairedClientsWithPauseState().ConfigureAwait(false); - - var ident = await GetUserIdent(userUid).ConfigureAwait(false); - - foreach (var groupUserPair in groupPairsWithoutSelf) - { - await UserGroupLeave(groupUserPair, allUserPairs, ident, userUid).ConfigureAwait(false); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.GposeLobby.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.GposeLobby.cs deleted file mode 100644 index b6f0f1a..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.GposeLobby.cs +++ /dev/null @@ -1,155 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Dto.CharaData; -using MareSynchronosServer.Utils; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; - -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - private async Task GetUserGposeLobby() - { - return await _redis.GetAsync(GposeLobbyUser).ConfigureAwait(false); - } - - private async Task> GetUsersInLobby(string lobbyId, bool includeSelf = false) - { - var users = await _redis.GetAsync>($"GposeLobby:{lobbyId}").ConfigureAwait(false); - return users?.Where(u => includeSelf || !string.Equals(u, UserUID, StringComparison.Ordinal)).ToList() ?? []; - } - - private async Task AddUserToLobby(string lobbyId, List priorUsers) - { - _mareMetrics.IncGauge(MetricsAPI.GaugeGposeLobbyUsers); - if (priorUsers.Count == 0) - _mareMetrics.IncGauge(MetricsAPI.GaugeGposeLobbies); - - await _redis.AddAsync(GposeLobbyUser, lobbyId).ConfigureAwait(false); - await _redis.AddAsync($"GposeLobby:{lobbyId}", priorUsers.Concat([UserUID])).ConfigureAwait(false); - } - - private async Task RemoveUserFromLobby(string lobbyId, List priorUsers) - { - await _redis.RemoveAsync(GposeLobbyUser).ConfigureAwait(false); - - _mareMetrics.DecGauge(MetricsAPI.GaugeGposeLobbyUsers); - - if (priorUsers.Count == 1) - { - await _redis.RemoveAsync($"GposeLobby:{lobbyId}").ConfigureAwait(false); - _mareMetrics.DecGauge(MetricsAPI.GaugeGposeLobbies); - } - else - { - priorUsers.Remove(UserUID); - await _redis.AddAsync($"GposeLobby:{lobbyId}", priorUsers).ConfigureAwait(false); - await Clients.Users(priorUsers).Client_GposeLobbyLeave(new(UserUID)).ConfigureAwait(false); - } - } - - private string GposeLobbyUser => $"GposeLobbyUser:{UserUID}"; - - - [Authorize(Policy = "Identified")] - public async Task GposeLobbyCreate() - { - _logger.LogCallInfo(); - var alreadyInLobby = await GetUserGposeLobby().ConfigureAwait(false); - if (!string.IsNullOrEmpty(alreadyInLobby)) - { - throw new HubException("Already in GPose Lobby, cannot join another"); - } - - string lobbyId = string.Empty; - while (string.IsNullOrEmpty(lobbyId)) - { - lobbyId = StringUtils.GenerateRandomString(30, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); - var result = await _redis.GetAsync>($"GposeLobby:{lobbyId}").ConfigureAwait(false); - if (result != null) - lobbyId = string.Empty; - } - - await AddUserToLobby(lobbyId, []).ConfigureAwait(false); - - return lobbyId; - } - - [Authorize(Policy = "Identified")] - public async Task> GposeLobbyJoin(string lobbyId) - { - _logger.LogCallInfo(); - var existingLobbyId = await GetUserGposeLobby().ConfigureAwait(false); - if (!string.IsNullOrEmpty(existingLobbyId)) - await GposeLobbyLeave().ConfigureAwait(false); - - var lobbyUsers = await GetUsersInLobby(lobbyId).ConfigureAwait(false); - if (!lobbyUsers.Any()) - return []; - - await AddUserToLobby(lobbyId, lobbyUsers).ConfigureAwait(false); - - var user = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - await Clients.Users(lobbyUsers.Where(u => !string.Equals(u, UserUID, StringComparison.Ordinal))) - .Client_GposeLobbyJoin(user.ToUserData()).ConfigureAwait(false); - - var users = await DbContext.Users.Where(u => lobbyUsers.Contains(u.UID)) - .Select(u => u.ToUserData()) - .ToListAsync() - .ConfigureAwait(false); - - return users; - } - - [Authorize(Policy = "Identified")] - public async Task GposeLobbyLeave() - { - var lobbyId = await GetUserGposeLobby().ConfigureAwait(false); - if (string.IsNullOrEmpty(lobbyId)) - return true; - - _logger.LogCallInfo(); - - var lobbyUsers = await GetUsersInLobby(lobbyId, true).ConfigureAwait(false); - await RemoveUserFromLobby(lobbyId, lobbyUsers).ConfigureAwait(false); - - return true; - } - - [Authorize(Policy = "Identified")] - public async Task GposeLobbyPushCharacterData(CharaDataDownloadDto charaDataDownloadDto) - { - _logger.LogCallInfo(); - var lobbyId = await GetUserGposeLobby().ConfigureAwait(false); - if (string.IsNullOrEmpty(lobbyId)) - return; - - var lobbyUsers = await GetUsersInLobby(lobbyId).ConfigureAwait(false); - await Clients.Users(lobbyUsers).Client_GposeLobbyPushCharacterData(charaDataDownloadDto).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task GposeLobbyPushPoseData(PoseData poseData) - { - _logger.LogCallInfo(); - var lobbyId = await GetUserGposeLobby().ConfigureAwait(false); - if (string.IsNullOrEmpty(lobbyId)) - return; - - await _gPoseLobbyDistributionService.PushPoseData(lobbyId, UserUID, poseData).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task GposeLobbyPushWorldData(WorldData worldData) - { - _logger.LogCallInfo(); - var lobbyId = await GetUserGposeLobby().ConfigureAwait(false); - if (string.IsNullOrEmpty(lobbyId)) - return; - - await _gPoseLobbyDistributionService.PushWorldData(lobbyId, UserUID, worldData).ConfigureAwait(false); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs deleted file mode 100644 index 19228b8..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs +++ /dev/null @@ -1,681 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Data.Extensions; -using MareSynchronos.API.Dto.Chat; -using MareSynchronos.API.Dto.Group; -using MareSynchronosServer.Utils; -using MareSynchronosShared.Models; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using System.Security.Cryptography; - -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - [Authorize(Policy = "Identified")] - public async Task GroupBanUser(GroupPairDto dto, string reason) - { - _logger.LogCallInfo(MareHubLogger.Args(dto, reason)); - - var (userHasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!userHasRights) return; - - var (userExists, groupPair) = await TryValidateUserInGroup(dto.Group.GID, dto.User.UID).ConfigureAwait(false); - if (!userExists) return; - - if (groupPair.IsModerator || string.Equals(group.OwnerUID, dto.User.UID, StringComparison.Ordinal)) return; - - var alias = string.IsNullOrEmpty(groupPair.GroupUser.Alias) ? "-" : groupPair.GroupUser.Alias; - var ban = new GroupBan() - { - BannedByUID = UserUID, - BannedReason = $"{reason} (Alias at time of ban: {alias})", - BannedOn = DateTime.UtcNow, - BannedUserUID = dto.User.UID, - GroupGID = dto.Group.GID, - }; - - DbContext.Add(ban); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - await GroupRemoveUser(dto).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - } - - [Authorize(Policy = "Identified")] - public async Task GroupChangeGroupPermissionState(GroupPermissionDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!hasRights) return; - - group.InvitesEnabled = !dto.Permissions.HasFlag(GroupPermissions.DisableInvites); - group.DisableSounds = dto.Permissions.HasFlag(GroupPermissions.DisableSounds); - group.DisableAnimations = dto.Permissions.HasFlag(GroupPermissions.DisableAnimations); - group.DisableVFX = dto.Permissions.HasFlag(GroupPermissions.DisableVFX); - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var groupPairs = DbContext.GroupPairs.Where(p => p.GroupGID == dto.Group.GID).Select(p => p.GroupUserUID).ToList(); - await Clients.Users(groupPairs).Client_GroupChangePermissions(new GroupPermissionDto(dto.Group, dto.Permissions)).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task GroupChangeIndividualPermissionState(GroupPairUserPermissionDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (inGroup, groupPair) = await TryValidateUserInGroup(dto.Group.GID).ConfigureAwait(false); - if (!inGroup) return; - - var wasPaused = groupPair.IsPaused; - groupPair.DisableSounds = dto.GroupPairPermissions.IsDisableSounds(); - groupPair.DisableAnimations = dto.GroupPairPermissions.IsDisableAnimations(); - groupPair.IsPaused = dto.GroupPairPermissions.IsPaused(); - groupPair.DisableVFX = dto.GroupPairPermissions.IsDisableVFX(); - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var groupPairs = DbContext.GroupPairs.Include(p => p.GroupUser).Where(p => p.GroupGID == dto.Group.GID).ToList(); - await Clients.Users(groupPairs.Select(p => p.GroupUserUID)).Client_GroupPairChangePermissions(dto).ConfigureAwait(false); - - var allUserPairs = await GetAllPairedClientsWithPauseState().ConfigureAwait(false); - var self = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - - if (wasPaused == groupPair.IsPaused) return; - - foreach (var groupUserPair in groupPairs.Where(u => !string.Equals(u.GroupUserUID, UserUID, StringComparison.Ordinal)).ToList()) - { - var userPair = allUserPairs.SingleOrDefault(p => string.Equals(p.UID, groupUserPair.GroupUserUID, StringComparison.Ordinal)); - if (userPair != null) - { - if (userPair.IsDirectlyPaused != PauseInfo.NoConnection) continue; - if (userPair.IsPausedExcludingGroup(dto.Group.GID) is PauseInfo.Unpaused) continue; - if (userPair.IsOtherPausedForSpecificGroup(dto.Group.GID) is PauseInfo.Paused) continue; - } - - var groupUserIdent = await GetUserIdent(groupUserPair.GroupUserUID).ConfigureAwait(false); - if (!string.IsNullOrEmpty(groupUserIdent)) - { - if (!groupPair.IsPaused) - { - await Clients.User(UserUID).Client_UserSendOnline(new(groupUserPair.ToUserData(), groupUserIdent)).ConfigureAwait(false); - await Clients.User(groupUserPair.GroupUserUID) - .Client_UserSendOnline(new(self.ToUserData(), UserCharaIdent)).ConfigureAwait(false); - } - else - { - await Clients.User(UserUID).Client_UserSendOffline(new(groupUserPair.ToUserData())).ConfigureAwait(false); - await Clients.User(groupUserPair.GroupUserUID) - .Client_UserSendOffline(new(self.ToUserData())).ConfigureAwait(false); - } - } - } - } - - [Authorize(Policy = "Identified")] - public async Task GroupChangeOwnership(GroupPairDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (isOwner, group) = await TryValidateOwner(dto.Group.GID).ConfigureAwait(false); - if (!isOwner) return; - - var (isInGroup, newOwnerPair) = await TryValidateUserInGroup(dto.Group.GID, dto.User.UID).ConfigureAwait(false); - if (!isInGroup) return; - - var ownedShells = await DbContext.Groups.CountAsync(g => g.OwnerUID == dto.User.UID).ConfigureAwait(false); - if (ownedShells >= _maxExistingGroupsByUser) return; - - var prevOwner = await DbContext.GroupPairs.SingleOrDefaultAsync(g => g.GroupGID == dto.Group.GID && g.GroupUserUID == UserUID).ConfigureAwait(false); - prevOwner.IsPinned = false; - group.Owner = newOwnerPair.GroupUser; - group.Alias = null; - newOwnerPair.IsPinned = true; - newOwnerPair.IsModerator = false; - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - var groupPairs = await DbContext.GroupPairs.Where(p => p.GroupGID == dto.Group.GID).Select(p => p.GroupUserUID).AsNoTracking().ToListAsync().ConfigureAwait(false); - - await Clients.Users(groupPairs).Client_GroupSendInfo(new GroupInfoDto(group.ToGroupData(), newOwnerPair.GroupUser.ToUserData(), group.GetGroupPermissions()) - { - IsTemporary = group.IsTemporary, - ExpiresAt = group.ExpiresAt, - }).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task GroupChangePassword(GroupPasswordDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (isOwner, group) = await TryValidateOwner(dto.Group.GID).ConfigureAwait(false); - if (!isOwner || dto.Password.Length < 10) return false; - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - group.HashedPassword = StringUtils.Sha256String(dto.Password); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - return true; - } - - [Authorize(Policy = "Identified")] - public async Task GroupClear(GroupDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!hasRights) return; - - var groupPairs = await DbContext.GroupPairs.Include(p => p.GroupUser).Where(p => p.GroupGID == dto.Group.GID).ToListAsync().ConfigureAwait(false); - - await Clients.Users(groupPairs.Where(p => !p.IsPinned && !p.IsModerator).Select(g => g.GroupUserUID)).Client_GroupDelete(new GroupDto(group.ToGroupData())).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - var notPinned = groupPairs.Where(g => !g.IsPinned && !g.IsModerator).ToList(); - - DbContext.GroupPairs.RemoveRange(notPinned); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - foreach (var pair in notPinned) - { - await Clients.Users(groupPairs.Where(p => p.IsPinned).Select(g => g.GroupUserUID)).Client_GroupPairLeft(new GroupPairDto(dto.Group, pair.GroupUser.ToUserData())).ConfigureAwait(false); - - var pairIdent = await GetUserIdent(pair.GroupUserUID).ConfigureAwait(false); - if (string.IsNullOrEmpty(pairIdent)) continue; - - var allUserPairs = await GetAllPairedClientsWithPauseState(pair.GroupUserUID).ConfigureAwait(false); - - var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == pair.GroupUserUID).ToListAsync().ConfigureAwait(false); - DbContext.CharaDataAllowances.RemoveRange(sharedData); - - foreach (var groupUserPair in groupPairs.Where(p => !string.Equals(p.GroupUserUID, pair.GroupUserUID, StringComparison.Ordinal))) - { - await UserGroupLeave(groupUserPair, allUserPairs, pairIdent).ConfigureAwait(false); - } - } - } - - [Authorize(Policy = "Identified")] - public async Task GroupCreate(string? alias) - { - _logger.LogCallInfo(); - var existingGroupsByUser = await DbContext.Groups.CountAsync(u => u.OwnerUID == UserUID).ConfigureAwait(false); - var existingJoinedGroups = await DbContext.GroupPairs.CountAsync(u => u.GroupUserUID == UserUID).ConfigureAwait(false); - if (existingGroupsByUser >= _maxExistingGroupsByUser || existingJoinedGroups >= _maxJoinedGroupsByUser) - { - throw new System.Exception($"Max groups for user is {_maxExistingGroupsByUser}, max joined groups is {_maxJoinedGroupsByUser}."); - } - - var gid = StringUtils.GenerateRandomString(9); - while (await DbContext.Groups.AnyAsync(g => g.GID == "UMB-" + gid).ConfigureAwait(false)) - { - gid = StringUtils.GenerateRandomString(9); - } - gid = "UMB-" + gid; - - var passwd = StringUtils.GenerateRandomString(16); - var sha = SHA256.Create(); - var hashedPw = StringUtils.Sha256String(passwd); - - string? sanitizedAlias = null; - if (!string.IsNullOrWhiteSpace(alias)) - { - sanitizedAlias = alias.Trim(); - if (sanitizedAlias.Length > 50) - { - sanitizedAlias = sanitizedAlias[..50]; - } - - var aliasExists = await DbContext.Groups - .AnyAsync(g => g.Alias != null && EF.Functions.ILike(g.Alias!, sanitizedAlias)) - .ConfigureAwait(false); - if (aliasExists) - { - throw new System.Exception("Syncshell name is already in use."); - } - } - - Group newGroup = new() - { - GID = gid, - HashedPassword = hashedPw, - InvitesEnabled = true, - OwnerUID = UserUID, - Alias = sanitizedAlias, - IsTemporary = false, - ExpiresAt = null, - }; - - GroupPair initialPair = new() - { - GroupGID = newGroup.GID, - GroupUserUID = UserUID, - IsPaused = false, - IsPinned = true, - }; - - await DbContext.Groups.AddAsync(newGroup).ConfigureAwait(false); - await DbContext.GroupPairs.AddAsync(initialPair).ConfigureAwait(false); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var self = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - - await Clients.User(UserUID).Client_GroupSendFullInfo(new GroupFullInfoDto(newGroup.ToGroupData(), self.ToUserData(), GroupPermissions.NoneSet, GroupUserPermissions.NoneSet, GroupUserInfo.None) - { - IsTemporary = newGroup.IsTemporary, - ExpiresAt = newGroup.ExpiresAt, - }).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(gid)); - - return new GroupPasswordDto(newGroup.ToGroupData(), passwd) - { - IsTemporary = newGroup.IsTemporary, - ExpiresAt = newGroup.ExpiresAt, - }; - } - - [Authorize(Policy = "Identified")] - public async Task GroupCreateTemporary(DateTime expiresAtUtc) - { - _logger.LogCallInfo(); - - var now = DateTime.UtcNow; - if (expiresAtUtc.Kind == DateTimeKind.Unspecified) - { - expiresAtUtc = DateTime.SpecifyKind(expiresAtUtc, DateTimeKind.Utc); - } - - if (expiresAtUtc <= now) - { - throw new System.Exception("Expiration must be in the future."); - } - - if (expiresAtUtc > now.AddDays(7)) - { - throw new System.Exception("Temporary syncshells may not last longer than 7 days."); - } - - var existingGroupsByUser = await DbContext.Groups.CountAsync(u => u.OwnerUID == UserUID).ConfigureAwait(false); - var existingJoinedGroups = await DbContext.GroupPairs.CountAsync(u => u.GroupUserUID == UserUID).ConfigureAwait(false); - if (existingGroupsByUser >= _maxExistingGroupsByUser || existingJoinedGroups >= _maxJoinedGroupsByUser) - { - throw new System.Exception($"Max groups for user is {_maxExistingGroupsByUser}, max joined groups is {_maxJoinedGroupsByUser}."); - } - - var gid = StringUtils.GenerateRandomString(9); - while (await DbContext.Groups.AnyAsync(g => g.GID == "UMB-" + gid).ConfigureAwait(false)) - { - gid = StringUtils.GenerateRandomString(9); - } - gid = "UMB-" + gid; - - var passwd = StringUtils.GenerateRandomString(16); - var sha = SHA256.Create(); - var hashedPw = StringUtils.Sha256String(passwd); - - Group newGroup = new() - { - GID = gid, - HashedPassword = hashedPw, - InvitesEnabled = true, - OwnerUID = UserUID, - Alias = null, - IsTemporary = true, - ExpiresAt = expiresAtUtc, - }; - - GroupPair initialPair = new() - { - GroupGID = newGroup.GID, - GroupUserUID = UserUID, - IsPaused = false, - IsPinned = true, - }; - - await DbContext.Groups.AddAsync(newGroup).ConfigureAwait(false); - await DbContext.GroupPairs.AddAsync(initialPair).ConfigureAwait(false); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var self = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - - await Clients.User(UserUID).Client_GroupSendFullInfo(new GroupFullInfoDto(newGroup.ToGroupData(), self.ToUserData(), GroupPermissions.NoneSet, GroupUserPermissions.NoneSet, GroupUserInfo.None) - { - IsTemporary = newGroup.IsTemporary, - ExpiresAt = newGroup.ExpiresAt, - }).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(gid, "Temporary", expiresAtUtc)); - - return new GroupPasswordDto(newGroup.ToGroupData(), passwd) - { - IsTemporary = newGroup.IsTemporary, - ExpiresAt = newGroup.ExpiresAt, - }; - } - - [Authorize(Policy = "Identified")] - public async Task> GroupCreateTempInvite(GroupDto dto, int amount) - { - _logger.LogCallInfo(MareHubLogger.Args(dto, amount)); - List inviteCodes = new(); - List tempInvites = new(); - var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!hasRights) return new(); - - var existingInvites = await DbContext.GroupTempInvites.Where(g => g.GroupGID == group.GID).ToListAsync().ConfigureAwait(false); - - for (int i = 0; i < amount; i++) - { - bool hasValidInvite = false; - string invite = string.Empty; - string hashedInvite = string.Empty; - while (!hasValidInvite) - { - invite = StringUtils.GenerateRandomString(10, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); - hashedInvite = StringUtils.Sha256String(invite); - if (existingInvites.Any(i => string.Equals(i.Invite, hashedInvite, StringComparison.Ordinal))) continue; - hasValidInvite = true; - inviteCodes.Add(invite); - } - - tempInvites.Add(new GroupTempInvite() - { - ExpirationDate = DateTime.UtcNow.AddDays(1), - GroupGID = group.GID, - Invite = hashedInvite, - }); - } - - DbContext.GroupTempInvites.AddRange(tempInvites); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - return inviteCodes; - } - - [Authorize(Policy = "Identified")] - public async Task GroupDelete(GroupDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (hasRights, group) = await TryValidateOwner(dto.Group.GID).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - var groupPairs = await DbContext.GroupPairs.Where(p => p.GroupGID == dto.Group.GID).ToListAsync().ConfigureAwait(false); - DbContext.RemoveRange(groupPairs); - DbContext.Remove(group); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - await Clients.Users(groupPairs.Select(g => g.GroupUserUID)).Client_GroupDelete(new GroupDto(group.ToGroupData())).ConfigureAwait(false); - - await SendGroupDeletedToAll(groupPairs).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task> GroupGetBannedUsers(GroupDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (userHasRights, group) = await TryValidateGroupModeratorOrOwner(dto.GID).ConfigureAwait(false); - if (!userHasRights) return new List(); - - var banEntries = await DbContext.GroupBans.Include(b => b.BannedUser).Where(g => g.GroupGID == dto.Group.GID).AsNoTracking().ToListAsync().ConfigureAwait(false); - - List bannedGroupUsers = banEntries.Select(b => - new BannedGroupUserDto(group.ToGroupData(), b.BannedUser.ToUserData(), b.BannedReason, b.BannedOn, - b.BannedByUID)).ToList(); - - _logger.LogCallInfo(MareHubLogger.Args(dto, bannedGroupUsers.Count)); - - return bannedGroupUsers; - } - - [Authorize(Policy = "Identified")] - public async Task GroupJoin(GroupPasswordDto dto) - { - var aliasOrGid = dto.Group.GID.Trim(); - - _logger.LogCallInfo(MareHubLogger.Args(dto.Group)); - - var group = await DbContext.Groups.Include(g => g.Owner).AsNoTracking().SingleOrDefaultAsync(g => g.GID == aliasOrGid || g.Alias == aliasOrGid).ConfigureAwait(false); - var groupGid = group?.GID ?? string.Empty; - var existingPair = await DbContext.GroupPairs.AsNoTracking().SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.GroupUserUID == UserUID).ConfigureAwait(false); - var hashedPw = StringUtils.Sha256String(dto.Password); - var existingUserCount = await DbContext.GroupPairs.AsNoTracking().CountAsync(g => g.GroupGID == groupGid).ConfigureAwait(false); - var joinedGroups = await DbContext.GroupPairs.CountAsync(g => g.GroupUserUID == UserUID).ConfigureAwait(false); - var isBanned = await DbContext.GroupBans.AnyAsync(g => g.GroupGID == groupGid && g.BannedUserUID == UserUID).ConfigureAwait(false); - var oneTimeInvite = await DbContext.GroupTempInvites.SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.Invite == hashedPw).ConfigureAwait(false); - - if (group == null - || (!string.Equals(group.HashedPassword, hashedPw, StringComparison.Ordinal) && oneTimeInvite == null) - || existingPair != null - || existingUserCount >= _maxGroupUserCount - || !group.InvitesEnabled - || joinedGroups >= _maxJoinedGroupsByUser - || isBanned) - return false; - - if (oneTimeInvite != null) - { - _logger.LogCallInfo(MareHubLogger.Args(aliasOrGid, "TempInvite", oneTimeInvite.Invite)); - DbContext.Remove(oneTimeInvite); - } - - GroupPair newPair = new() - { - GroupGID = group.GID, - GroupUserUID = UserUID, - DisableAnimations = false, - DisableSounds = false, - DisableVFX = false - }; - - await DbContext.GroupPairs.AddAsync(newPair).ConfigureAwait(false); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(aliasOrGid, "Success")); - - await Clients.User(UserUID).Client_GroupSendFullInfo(new GroupFullInfoDto(group.ToGroupData(), group.Owner.ToUserData(), group.GetGroupPermissions(), newPair.GetGroupPairPermissions(), newPair.GetGroupPairUserInfo()) - { - IsTemporary = group.IsTemporary, - ExpiresAt = group.ExpiresAt, - }).ConfigureAwait(false); - - var self = DbContext.Users.Single(u => u.UID == UserUID); - - var groupPairs = await DbContext.GroupPairs.Include(p => p.GroupUser).Where(p => p.GroupGID == group.GID && p.GroupUserUID != UserUID).ToListAsync().ConfigureAwait(false); - - await Clients.Users(groupPairs.Select(p => p.GroupUserUID)) - .Client_GroupPairJoined(new GroupPairFullInfoDto(group.ToGroupData(), self.ToUserData(), newPair.GetGroupPairUserInfo(), newPair.GetGroupPairPermissions())).ConfigureAwait(false); - foreach (var pair in groupPairs) - { - await Clients.User(UserUID).Client_GroupPairJoined(new GroupPairFullInfoDto(group.ToGroupData(), pair.ToUserData(), pair.GetGroupPairUserInfo(), pair.GetGroupPairPermissions())).ConfigureAwait(false); - } - - var allUserPairs = await GetAllPairedClientsWithPauseState().ConfigureAwait(false); - - foreach (var groupUserPair in groupPairs) - { - var userPair = allUserPairs.Single(p => string.Equals(p.UID, groupUserPair.GroupUserUID, StringComparison.Ordinal)); - if (userPair.IsDirectlyPaused != PauseInfo.NoConnection) continue; - if (userPair.IsPausedExcludingGroup(group.GID) is PauseInfo.Unpaused) continue; - if (userPair.IsPausedPerGroup is PauseInfo.Paused) continue; - - var groupUserIdent = await GetUserIdent(groupUserPair.GroupUserUID).ConfigureAwait(false); - if (!string.IsNullOrEmpty(groupUserIdent)) - { - await Clients.User(UserUID).Client_UserSendOnline(new(groupUserPair.ToUserData(), groupUserIdent)).ConfigureAwait(false); - await Clients.User(groupUserPair.GroupUserUID) - .Client_UserSendOnline(new(self.ToUserData(), UserCharaIdent)).ConfigureAwait(false); - } - } - - return true; - } - - [Authorize(Policy = "Identified")] - public async Task GroupLeave(GroupDto dto) - { - await UserLeaveGroup(dto, UserUID).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task GroupPrune(GroupDto dto, int days, bool execute) - { - _logger.LogCallInfo(MareHubLogger.Args(dto, days, execute)); - - var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!hasRights) return -1; - - var allGroupUsers = await DbContext.GroupPairs.Include(p => p.GroupUser).Include(p => p.Group) - .Where(g => g.GroupGID == dto.Group.GID) - .ToListAsync().ConfigureAwait(false); - var usersToPrune = allGroupUsers.Where(p => !p.IsPinned && !p.IsModerator - && p.GroupUserUID != UserUID - && p.Group.OwnerUID != p.GroupUserUID - && p.GroupUser.LastLoggedIn.AddDays(days) < DateTime.UtcNow); - - if (!execute) return usersToPrune.Count(); - - DbContext.GroupPairs.RemoveRange(usersToPrune); - - foreach (var pair in usersToPrune) - { - await Clients.Users(allGroupUsers.Where(p => !usersToPrune.Contains(p)).Select(g => g.GroupUserUID)) - .Client_GroupPairLeft(new GroupPairDto(dto.Group, pair.GroupUser.ToUserData())).ConfigureAwait(false); - } - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - return usersToPrune.Count(); - } - - [Authorize(Policy = "Identified")] - public async Task GroupRemoveUser(GroupPairDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!hasRights) return; - - var (userExists, groupPair) = await TryValidateUserInGroup(dto.Group.GID, dto.User.UID).ConfigureAwait(false); - if (!userExists) return; - - if (groupPair.IsModerator || string.Equals(group.OwnerUID, dto.User.UID, StringComparison.Ordinal)) return; - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - DbContext.GroupPairs.Remove(groupPair); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var groupPairs = DbContext.GroupPairs.Where(p => p.GroupGID == group.GID).AsNoTracking().ToList(); - await Clients.Users(groupPairs.Select(p => p.GroupUserUID)).Client_GroupPairLeft(dto).ConfigureAwait(false); - - var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == dto.UID).ToListAsync().ConfigureAwait(false); - DbContext.CharaDataAllowances.RemoveRange(sharedData); - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var userIdent = await GetUserIdent(dto.User.UID).ConfigureAwait(false); - if (userIdent == null) return; - - await Clients.User(dto.User.UID).Client_GroupDelete(new GroupDto(dto.Group)).ConfigureAwait(false); - - var allUserPairs = await GetAllPairedClientsWithPauseState(dto.User.UID).ConfigureAwait(false); - - foreach (var groupUserPair in groupPairs) - { - await UserGroupLeave(groupUserPair, allUserPairs, userIdent, dto.User.UID).ConfigureAwait(false); - } - } - - [Authorize(Policy = "Identified")] - public async Task GroupSetUserInfo(GroupPairUserInfoDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (userExists, userPair) = await TryValidateUserInGroup(dto.Group.GID, dto.User.UID).ConfigureAwait(false); - if (!userExists) return; - - var (userIsOwner, _) = await TryValidateOwner(dto.Group.GID).ConfigureAwait(false); - var (userIsModerator, _) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - - if (dto.GroupUserInfo.HasFlag(GroupUserInfo.IsPinned) && userIsModerator && !userPair.IsPinned) - { - userPair.IsPinned = true; - } - else if (userIsModerator && userPair.IsPinned) - { - userPair.IsPinned = false; - } - - if (dto.GroupUserInfo.HasFlag(GroupUserInfo.IsModerator) && userIsOwner && !userPair.IsModerator) - { - userPair.IsModerator = true; - } - else if (userIsOwner && userPair.IsModerator) - { - userPair.IsModerator = false; - } - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var groupPairs = await DbContext.GroupPairs.AsNoTracking().Where(p => p.GroupGID == dto.Group.GID).Select(p => p.GroupUserUID).ToListAsync().ConfigureAwait(false); - await Clients.Users(groupPairs).Client_GroupPairChangeUserInfo(new GroupPairUserInfoDto(dto.Group, dto.User, userPair.GetGroupPairUserInfo())).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task> GroupsGetAll() - { - _logger.LogCallInfo(); - - var groups = await DbContext.GroupPairs.Include(g => g.Group).Include(g => g.Group.Owner).Where(g => g.GroupUserUID == UserUID).AsNoTracking().ToListAsync().ConfigureAwait(false); - - return groups.Select(g => new GroupFullInfoDto(g.Group.ToGroupData(), g.Group.Owner.ToUserData(), - g.Group.GetGroupPermissions(), g.GetGroupPairPermissions(), g.GetGroupPairUserInfo()) - { - IsTemporary = g.Group.IsTemporary, - ExpiresAt = g.Group.ExpiresAt, - }).ToList(); - } - - [Authorize(Policy = "Identified")] - public async Task> GroupsGetUsersInGroup(GroupDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (inGroup, _) = await TryValidateUserInGroup(dto.Group.GID).ConfigureAwait(false); - if (!inGroup) return new List(); - - var group = await DbContext.Groups.SingleAsync(g => g.GID == dto.Group.GID).ConfigureAwait(false); - var allPairs = await DbContext.GroupPairs.Include(g => g.GroupUser).Where(g => g.GroupGID == dto.Group.GID && g.GroupUserUID != UserUID).AsNoTracking().ToListAsync().ConfigureAwait(false); - return allPairs.Select(p => new GroupPairFullInfoDto(group.ToGroupData(), p.GroupUser.ToUserData(), p.GetGroupPairUserInfo(), p.GetGroupPairPermissions())).ToList(); - } - - [Authorize(Policy = "Identified")] - public async Task GroupUnbanUser(GroupPairDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (userHasRights, _) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); - if (!userHasRights) return; - - var banEntry = await DbContext.GroupBans.SingleOrDefaultAsync(g => g.GroupGID == dto.Group.GID && g.BannedUserUID == dto.User.UID).ConfigureAwait(false); - if (banEntry == null) return; - - DbContext.Remove(banEntry); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs deleted file mode 100644 index 77bcd96..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs +++ /dev/null @@ -1,514 +0,0 @@ -using System.Text; -using System.Text.Json; -using System.Text.RegularExpressions; -using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Data.Extensions; -using MareSynchronos.API.Dto.User; -using MareSynchronosServer.Utils; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Models; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; - -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - private static readonly string[] AllowedExtensionsForGamePaths = { ".mdl", ".tex", ".mtrl", ".tmb", ".pap", ".avfx", ".atex", ".sklb", ".eid", ".phyb", ".pbd", ".scd", ".skp", ".shpk" }; - - [Authorize(Policy = "Identified")] - public async Task UserAddPair(UserDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - // don't allow adding nothing - var uid = dto.User.UID.Trim(); - if (string.Equals(dto.User.UID, UserUID, StringComparison.Ordinal) || string.IsNullOrWhiteSpace(dto.User.UID)) return; - - // grab other user, check if it exists and if a pair already exists - var otherUser = await DbContext.Users.SingleOrDefaultAsync(u => u.UID == uid || u.Alias == uid).ConfigureAwait(false); - if (otherUser == null) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, $"Cannot pair with {dto.User.UID}, UID does not exist").ConfigureAwait(false); - return; - } - - if (string.Equals(otherUser.UID, UserUID, StringComparison.Ordinal)) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, $"My god you can't pair with yourself why would you do that please stop").ConfigureAwait(false); - return; - } - - var existingEntry = - await DbContext.ClientPairs.AsNoTracking() - .FirstOrDefaultAsync(p => - p.User.UID == UserUID && p.OtherUserUID == otherUser.UID).ConfigureAwait(false); - - if (existingEntry != null) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, $"Cannot pair with {dto.User.UID}, already paired").ConfigureAwait(false); - return; - } - - // grab self create new client pair and save - var user = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - ClientPair wl = new ClientPair() - { - IsPaused = false, - OtherUser = otherUser, - User = user, - }; - await DbContext.ClientPairs.AddAsync(wl).ConfigureAwait(false); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - // get the opposite entry of the client pair - var otherEntry = OppositeEntry(otherUser.UID); - var otherIdent = await GetUserIdent(otherUser.UID).ConfigureAwait(false); - - var ownPerm = UserPermissions.Paired; - var otherPerm = UserPermissions.NoneSet; - otherPerm.SetPaired(otherEntry != null); - otherPerm.SetPaused(otherEntry?.IsPaused ?? false); - var userPairResponse = new UserPairDto(otherUser.ToUserData(), ownPerm, otherPerm); - await Clients.User(user.UID).Client_UserAddClientPair(userPairResponse).ConfigureAwait(false); - - // check if other user is online - if (otherIdent == null || otherEntry == null) return; - - // send push with update to other user if other user is online - await Clients.User(otherUser.UID).Client_UserAddClientPair(new UserPairDto(user.ToUserData(), otherPerm, ownPerm)).ConfigureAwait(false); - - if (!otherPerm.IsPaused()) - { - await Clients.User(UserUID).Client_UserSendOnline(new(otherUser.ToUserData(), otherIdent)).ConfigureAwait(false); - await Clients.User(otherUser.UID).Client_UserSendOnline(new(user.ToUserData(), UserCharaIdent)).ConfigureAwait(false); - } - } - - [Authorize(Policy = "Identified")] - public async Task UserDelete() - { - _logger.LogCallInfo(); - - var userEntry = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - var secondaryUsers = await DbContext.Auth.Include(u => u.User).Where(u => u.PrimaryUserUID == UserUID).Select(c => c.User).ToListAsync().ConfigureAwait(false); - foreach (var user in secondaryUsers) - { - await DeleteUser(user).ConfigureAwait(false); - } - - await DeleteUser(userEntry).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task> UserGetOnlinePairs() - { - _logger.LogCallInfo(); - - var allPairedUsers = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - var pairs = await GetOnlineUsers(allPairedUsers).ConfigureAwait(false); - - await SendOnlineToAllPairedUsers().ConfigureAwait(false); - - return pairs.Select(p => new OnlineUserIdentDto(new UserData(p.Key), p.Value)).ToList(); - } - - [Authorize(Policy = "Identified")] - public async Task> UserGetPairedClients() - { - _logger.LogCallInfo(); - - var query = - from userToOther in DbContext.ClientPairs - join otherToUser in DbContext.ClientPairs - on new - { - user = userToOther.UserUID, - other = userToOther.OtherUserUID, - } equals new - { - user = otherToUser.OtherUserUID, - other = otherToUser.UserUID, - } into leftJoin - from otherEntry in leftJoin.DefaultIfEmpty() - where - userToOther.UserUID == UserUID - select new - { - userToOther.OtherUser.Alias, - userToOther.IsPaused, - OtherIsPaused = otherEntry != null && otherEntry.IsPaused, - userToOther.OtherUserUID, - IsSynced = otherEntry != null, - DisableOwnAnimations = userToOther.DisableAnimations, - DisableOwnSounds = userToOther.DisableSounds, - DisableOwnVFX = userToOther.DisableVFX, - DisableOtherAnimations = otherEntry == null ? false : otherEntry.DisableAnimations, - DisableOtherSounds = otherEntry == null ? false : otherEntry.DisableSounds, - DisableOtherVFX = otherEntry == null ? false : otherEntry.DisableVFX - }; - - var results = await query.AsNoTracking().ToListAsync().ConfigureAwait(false); - - return results.Select(c => - { - var ownPerm = UserPermissions.Paired; - ownPerm.SetPaused(c.IsPaused); - ownPerm.SetDisableAnimations(c.DisableOwnAnimations); - ownPerm.SetDisableSounds(c.DisableOwnSounds); - ownPerm.SetDisableVFX(c.DisableOwnVFX); - var otherPerm = UserPermissions.NoneSet; - otherPerm.SetPaired(c.IsSynced); - otherPerm.SetPaused(c.OtherIsPaused); - otherPerm.SetDisableAnimations(c.DisableOtherAnimations); - otherPerm.SetDisableSounds(c.DisableOtherSounds); - otherPerm.SetDisableVFX(c.DisableOtherVFX); - return new UserPairDto(new(c.OtherUserUID, c.Alias), ownPerm, otherPerm); - }).ToList(); - } - - [Authorize(Policy = "Identified")] - public async Task UserGetProfile(UserDto user) - { - _logger.LogCallInfo(MareHubLogger.Args(user)); - - var allUserPairs = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - - if (!allUserPairs.Contains(user.User.UID, StringComparer.Ordinal) && !string.Equals(user.User.UID, UserUID, StringComparison.Ordinal)) - { - return new UserProfileDto(user.User, false, null, null, "Due to the pause status you cannot access this users profile."); - } - - var data = await DbContext.UserProfileData.SingleOrDefaultAsync(u => u.UserUID == user.User.UID).ConfigureAwait(false); - if (data == null) return new UserProfileDto(user.User, false, null, null, null); - - if (data.FlaggedForReport) return new UserProfileDto(user.User, true, null, null, "This profile is flagged for report and pending evaluation"); - if (data.ProfileDisabled) return new UserProfileDto(user.User, true, null, null, "This profile was permanently disabled"); - - return new UserProfileDto(user.User, false, data.IsNSFW, data.Base64ProfileImage, data.UserDescription); - } - - [Authorize(Policy = "Identified")] - public async Task UserPushData(UserCharaDataMessageDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto.CharaData.FileReplacements.Count)); - - // check for honorific containing . and / - try - { - var honorificJson = Encoding.Default.GetString(Convert.FromBase64String(dto.CharaData.HonorificData)); - var deserialized = JsonSerializer.Deserialize(honorificJson); - if (deserialized.TryGetProperty("Title", out var honorificTitle)) - { - var title = honorificTitle.GetString().Normalize(NormalizationForm.FormKD); - if (UrlRegex().IsMatch(title)) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "Your data was not pushed: The usage of URLs the Honorific titles is prohibited. Remove them to be able to continue to push data.").ConfigureAwait(false); - throw new HubException("Invalid data provided, Honorific title invalid: " + title); - } - } - } - catch (HubException) - { - throw; - } - catch (Exception) - { - // swallow - } - - bool hadInvalidData = false; - List invalidGamePaths = new(); - List invalidFileSwapPaths = new(); - foreach (var replacement in dto.CharaData.FileReplacements.SelectMany(p => p.Value)) - { - var invalidPaths = replacement.GamePaths.Where(p => !GamePathRegex().IsMatch(p)).ToList(); - invalidPaths.AddRange(replacement.GamePaths.Where(p => !AllowedExtensionsForGamePaths.Any(e => p.EndsWith(e, StringComparison.OrdinalIgnoreCase)))); - replacement.GamePaths = replacement.GamePaths.Where(p => !invalidPaths.Contains(p, StringComparer.OrdinalIgnoreCase)).ToArray(); - bool validGamePaths = replacement.GamePaths.Any(); - bool validHash = string.IsNullOrEmpty(replacement.Hash) || HashRegex().IsMatch(replacement.Hash); - bool validFileSwapPath = string.IsNullOrEmpty(replacement.FileSwapPath) || GamePathRegex().IsMatch(replacement.FileSwapPath); - if (!validGamePaths || !validHash || !validFileSwapPath) - { - _logger.LogCallWarning(MareHubLogger.Args("Invalid Data", "GamePaths", validGamePaths, string.Join(",", invalidPaths), "Hash", validHash, replacement.Hash, "FileSwap", validFileSwapPath, replacement.FileSwapPath)); - hadInvalidData = true; - if (!validFileSwapPath) invalidFileSwapPaths.Add(replacement.FileSwapPath); - if (!validGamePaths) invalidGamePaths.AddRange(replacement.GamePaths); - if (!validHash) invalidFileSwapPaths.Add(replacement.Hash); - } - } - - if (hadInvalidData) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "One or more of your supplied mods were rejected from the server. Consult /xllog for more information.").ConfigureAwait(false); - throw new HubException("Invalid data provided, contact the appropriate mod creator to resolve those issues" - + Environment.NewLine - + string.Join(Environment.NewLine, invalidGamePaths.Select(p => "Invalid Game Path: " + p)) - + Environment.NewLine - + string.Join(Environment.NewLine, invalidFileSwapPaths.Select(p => "Invalid FileSwap Path: " + p))); - } - - var allPairedUsers = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - var idents = await GetOnlineUsers(allPairedUsers).ConfigureAwait(false); - - var recipients = allPairedUsers.Where(f => dto.Recipients.Select(r => r.UID).Contains(f, StringComparer.Ordinal)).ToList(); - - _logger.LogCallInfo(MareHubLogger.Args(idents.Count, recipients.Count())); - - await Clients.Users(recipients).Client_UserReceiveCharacterData(new OnlineUserCharaDataDto(new UserData(UserUID), dto.CharaData)).ConfigureAwait(false); - - _mareMetrics.IncCounter(MetricsAPI.CounterUserPushData); - _mareMetrics.IncCounter(MetricsAPI.CounterUserPushDataTo, recipients.Count()); - } - - [Authorize(Policy = "Identified")] - public async Task UserRemovePair(UserDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - if (string.Equals(dto.User.UID, UserUID, StringComparison.Ordinal)) return; - - // check if client pair even exists - ClientPair callerPair = - await DbContext.ClientPairs.SingleOrDefaultAsync(w => w.UserUID == UserUID && w.OtherUserUID == dto.User.UID).ConfigureAwait(false); - if (callerPair == null) return; - - bool callerHadPaused = callerPair.IsPaused; - - // delete from database, send update info to users pair list - DbContext.ClientPairs.Remove(callerPair); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - await Clients.User(UserUID).Client_UserRemoveClientPair(dto).ConfigureAwait(false); - - // check if opposite entry exists - var oppositeClientPair = OppositeEntry(dto.User.UID); - if (oppositeClientPair == null) return; - - // check if other user is online, if no then there is no need to do anything further - var otherIdent = await GetUserIdent(dto.User.UID).ConfigureAwait(false); - if (otherIdent == null) return; - - // get own ident and - await Clients.User(dto.User.UID) - .Client_UserUpdateOtherPairPermissions(new UserPermissionsDto(new UserData(UserUID), - UserPermissions.NoneSet)).ConfigureAwait(false); - - // if the other user had paused the user the state will be offline for either, do nothing - bool otherHadPaused = oppositeClientPair.IsPaused; - if (!callerHadPaused && otherHadPaused) return; - - var allUsers = await GetAllPairedClientsWithPauseState().ConfigureAwait(false); - var pauseEntry = allUsers.SingleOrDefault(f => string.Equals(f.UID, dto.User.UID, StringComparison.Ordinal)); - var isPausedInGroup = pauseEntry == null || pauseEntry.IsPausedPerGroup is PauseInfo.Paused or PauseInfo.NoConnection; - - // if neither user had paused each other and both are in unpaused groups, state will be online for both, do nothing - if (!callerHadPaused && !otherHadPaused && !isPausedInGroup) return; - - // if neither user had paused each other and either is not in an unpaused group with each other, change state to offline - if (!callerHadPaused && !otherHadPaused && isPausedInGroup) - { - await Clients.User(UserUID).Client_UserSendOffline(dto).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false); - } - - // if the caller had paused other but not the other has paused the caller and they are in an unpaused group together, change state to online - if (callerHadPaused && !otherHadPaused && !isPausedInGroup) - { - await Clients.User(UserUID).Client_UserSendOnline(new(dto.User, otherIdent)).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false); - } - } - - [Authorize(Policy = "Identified")] - public async Task UserReportProfile(UserProfileReportDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - UserProfileDataReport report = await DbContext.UserProfileReports.SingleOrDefaultAsync(u => u.ReportedUserUID == dto.User.UID && u.ReportingUserUID == UserUID).ConfigureAwait(false); - if (report != null) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "You already reported this profile and it's pending validation").ConfigureAwait(false); - return; - } - - UserProfileData profile = await DbContext.UserProfileData.SingleOrDefaultAsync(u => u.UserUID == dto.User.UID).ConfigureAwait(false); - if (profile == null) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "This user has no profile").ConfigureAwait(false); - return; - } - - UserProfileDataReport reportToAdd = new() - { - ReportDate = DateTime.UtcNow, - ReportingUserUID = UserUID, - ReportReason = dto.ProfileReport, - ReportedUserUID = dto.User.UID, - }; - - profile.FlaggedForReport = true; - - await DbContext.UserProfileReports.AddAsync(reportToAdd).ConfigureAwait(false); - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var allPairedUsers = await GetAllPairedUnpausedUsers(dto.User.UID).ConfigureAwait(false); - var pairs = await GetOnlineUsers(allPairedUsers).ConfigureAwait(false); - - await Clients.Users(pairs.Select(p => p.Key)).Client_UserUpdateProfile(new(dto.User)).ConfigureAwait(false); - await Clients.Users(dto.User.UID).Client_UserUpdateProfile(new(dto.User)).ConfigureAwait(false); - } - - [Authorize(Policy = "Identified")] - public async Task UserSetPairPermissions(UserPermissionsDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - if (string.Equals(dto.User.UID, UserUID, StringComparison.Ordinal)) return; - ClientPair pair = await DbContext.ClientPairs.SingleOrDefaultAsync(w => w.UserUID == UserUID && w.OtherUserUID == dto.User.UID).ConfigureAwait(false); - if (pair == null) return; - - var pauseChange = pair.IsPaused != dto.Permissions.IsPaused(); - - pair.IsPaused = dto.Permissions.IsPaused(); - pair.DisableAnimations = dto.Permissions.IsDisableAnimations(); - pair.DisableSounds = dto.Permissions.IsDisableSounds(); - pair.DisableVFX = dto.Permissions.IsDisableVFX(); - DbContext.Update(pair); - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - var otherEntry = OppositeEntry(dto.User.UID); - - await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(dto).ConfigureAwait(false); - - if (otherEntry != null) - { - await Clients.User(dto.User.UID).Client_UserUpdateOtherPairPermissions(new UserPermissionsDto(new UserData(UserUID), dto.Permissions)).ConfigureAwait(false); - - if (pauseChange) - { - var otherCharaIdent = await GetUserIdent(pair.OtherUserUID).ConfigureAwait(false); - - if (UserCharaIdent == null || otherCharaIdent == null || otherEntry.IsPaused) return; - - if (dto.Permissions.IsPaused()) - { - await Clients.User(UserUID).Client_UserSendOffline(dto).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false); - } - else - { - await Clients.User(UserUID).Client_UserSendOnline(new(dto.User, otherCharaIdent)).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false); - } - } - } - } - - [Authorize(Policy = "Identified")] - public async Task UserSetProfile(UserProfileDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - if (!string.Equals(dto.User.UID, UserUID, StringComparison.Ordinal)) throw new HubException("Cannot modify profile data for anyone but yourself"); - - var existingData = await DbContext.UserProfileData.SingleOrDefaultAsync(u => u.UserUID == dto.User.UID).ConfigureAwait(false); - - if (existingData?.FlaggedForReport ?? false) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "Your profile is currently flagged for report and cannot be edited").ConfigureAwait(false); - return; - } - - if (existingData?.ProfileDisabled ?? false) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "Your profile was permanently disabled and cannot be edited").ConfigureAwait(false); - return; - } - - if (!string.IsNullOrEmpty(dto.ProfilePictureBase64)) - { - byte[] imageData = Convert.FromBase64String(dto.ProfilePictureBase64); - using MemoryStream ms = new(imageData); - var format = await Image.DetectFormatAsync(ms).ConfigureAwait(false); - if (!format.FileExtensions.Contains("png", StringComparer.OrdinalIgnoreCase)) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "Your provided image file is not in PNG format").ConfigureAwait(false); - return; - } - using var image = Image.Load(imageData); - - if (image.Width > 256 || image.Height > 256 || (imageData.Length > 250 * 1024)) - { - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "Your provided image file is larger than 256x256 or more than 250KiB.").ConfigureAwait(false); - return; - } - } - - if (existingData != null) - { - if (string.Equals("", dto.ProfilePictureBase64, StringComparison.OrdinalIgnoreCase)) - { - existingData.Base64ProfileImage = null; - } - else if (dto.ProfilePictureBase64 != null) - { - existingData.Base64ProfileImage = dto.ProfilePictureBase64; - } - - if (dto.IsNSFW != null) - { - existingData.IsNSFW = dto.IsNSFW.Value; - } - - if (dto.Description != null) - { - existingData.UserDescription = dto.Description; - } - } - else - { - UserProfileData userProfileData = new() - { - UserUID = dto.User.UID, - Base64ProfileImage = dto.ProfilePictureBase64 ?? null, - UserDescription = dto.Description ?? null, - IsNSFW = dto.IsNSFW ?? false - }; - - await DbContext.UserProfileData.AddAsync(userProfileData).ConfigureAwait(false); - } - - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - var allPairedUsers = await GetAllPairedUnpausedUsers().ConfigureAwait(false); - var pairs = await GetOnlineUsers(allPairedUsers).ConfigureAwait(false); - - await Clients.Users(pairs.Select(p => p.Key)).Client_UserUpdateProfile(new(dto.User)).ConfigureAwait(false); - await Clients.Caller.Client_UserUpdateProfile(new(dto.User)).ConfigureAwait(false); - } - - [GeneratedRegex(@"^([a-z0-9_ '+&,\.\-\{\}]+\/)+([a-z0-9_ '+&,\.\-\{\}]+\.[a-z]{3,4})$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.ECMAScript)] - private static partial Regex GamePathRegex(); - - [GeneratedRegex(@"^[A-Z0-9]{40}$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.ECMAScript)] - private static partial Regex HashRegex(); - - [GeneratedRegex("^[-a-zA-Z0-9@:%._\\+~#=]{1,256}[\\.,][a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&\\/=]*)$")] - private static partial Regex UrlRegex(); - - private ClientPair OppositeEntry(string otherUID) => - DbContext.ClientPairs.AsNoTracking().SingleOrDefault(w => w.User.UID == otherUID && w.OtherUser.UID == UserUID); -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs deleted file mode 100644 index 5c95217..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs +++ /dev/null @@ -1,147 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Dto; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Services; -using MareSynchronosServer.Utils; -using MareSynchronosShared; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using StackExchange.Redis.Extensions.Core.Abstractions; - -namespace MareSynchronosServer.Hubs; - -[Authorize(Policy = "Authenticated")] -public partial class MareHub : Hub, IMareHub -{ - private readonly MareMetrics _mareMetrics; - private readonly SystemInfoService _systemInfoService; - private readonly IHttpContextAccessor _contextAccessor; - private readonly MareHubLogger _logger; - private readonly string _shardName; - private readonly int _maxExistingGroupsByUser; - private readonly int _maxJoinedGroupsByUser; - private readonly int _maxGroupUserCount; - private readonly IRedisDatabase _redis; - private readonly GPoseLobbyDistributionService _gPoseLobbyDistributionService; - private readonly Uri _fileServerAddress; - private readonly Version _expectedClientVersion; - private readonly int _maxCharaDataByUser; - - private readonly Lazy _dbContextLazy; - private MareDbContext DbContext => _dbContextLazy.Value; - - public MareHub(MareMetrics mareMetrics, - IDbContextFactory mareDbContextFactory, ILogger logger, SystemInfoService systemInfoService, - IConfigurationService configuration, IHttpContextAccessor contextAccessor, - IRedisDatabase redisDb, GPoseLobbyDistributionService gPoseLobbyDistributionService) - { - _mareMetrics = mareMetrics; - _systemInfoService = systemInfoService; - _shardName = configuration.GetValue(nameof(ServerConfiguration.ShardName)); - _maxExistingGroupsByUser = configuration.GetValueOrDefault(nameof(ServerConfiguration.MaxExistingGroupsByUser), 3); - _maxJoinedGroupsByUser = configuration.GetValueOrDefault(nameof(ServerConfiguration.MaxJoinedGroupsByUser), 6); - _maxGroupUserCount = configuration.GetValueOrDefault(nameof(ServerConfiguration.MaxGroupUserCount), 100); - _fileServerAddress = configuration.GetValue(nameof(ServerConfiguration.CdnFullUrl)); - _expectedClientVersion = configuration.GetValueOrDefault(nameof(ServerConfiguration.ExpectedClientVersion), new Version(0, 0, 0)); - _maxCharaDataByUser = configuration.GetValueOrDefault(nameof(ServerConfiguration.MaxCharaDataByUser), 10); - _contextAccessor = contextAccessor; - _redis = redisDb; - _gPoseLobbyDistributionService = gPoseLobbyDistributionService; - _logger = new MareHubLogger(this, logger); - _dbContextLazy = new Lazy(() => mareDbContextFactory.CreateDbContext()); - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - DbContext.Dispose(); - } - - base.Dispose(disposing); - } - - [Authorize(Policy = "Identified")] - public async Task GetConnectionDto() - { - _logger.LogCallInfo(); - - _mareMetrics.IncCounter(MetricsAPI.CounterInitializedConnections); - - await Clients.Caller.Client_UpdateSystemInfo(_systemInfoService.SystemInfoDto).ConfigureAwait(false); - - var dbUser = DbContext.Users.SingleOrDefault(f => f.UID == UserUID); - dbUser.LastLoggedIn = DateTime.UtcNow; - await DbContext.SaveChangesAsync().ConfigureAwait(false); - - await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Information, "Bienvenue sur UmbraSync ! Utilisateurs en ligne : " + _systemInfoService.SystemInfoDto.OnlineUsers).ConfigureAwait(false); - - return new ConnectionDto(new UserData(dbUser.UID, string.IsNullOrWhiteSpace(dbUser.Alias) ? null : dbUser.Alias)) - { - CurrentClientVersion = _expectedClientVersion, - ServerVersion = IMareHub.ApiVersion, - IsAdmin = dbUser.IsAdmin, - IsModerator = dbUser.IsModerator, - ServerInfo = new ServerInfo() - { - MaxGroupsCreatedByUser = _maxExistingGroupsByUser, - ShardName = _shardName, - MaxGroupsJoinedByUser = _maxJoinedGroupsByUser, - MaxGroupUserCount = _maxGroupUserCount, - FileServerAddress = _fileServerAddress, - MaxCharaData = _maxCharaDataByUser - }, - }; - } - - [Authorize(Policy = "Authenticated")] - public async Task CheckClientHealth() - { - await UpdateUserOnRedis().ConfigureAwait(false); - - return false; - } - - [Authorize(Policy = "Authenticated")] - public override async Task OnConnectedAsync() - { - _mareMetrics.IncGaugeWithLabels(MetricsAPI.GaugeConnections, labels: Continent); - - try - { - _logger.LogCallInfo(MareHubLogger.Args(_contextAccessor.GetIpAddress(), UserCharaIdent)); - - await UpdateUserOnRedis().ConfigureAwait(false); - } - catch { } - - await base.OnConnectedAsync().ConfigureAwait(false); - } - - [Authorize(Policy = "Authenticated")] - public override async Task OnDisconnectedAsync(Exception exception) - { - _mareMetrics.DecGaugeWithLabels(MetricsAPI.GaugeConnections, labels: Continent); - - try - { - _logger.LogCallInfo(MareHubLogger.Args(_contextAccessor.GetIpAddress(), UserCharaIdent)); - if (exception != null) - _logger.LogCallWarning(MareHubLogger.Args(_contextAccessor.GetIpAddress(), exception.Message, exception.StackTrace)); - - await GposeLobbyLeave().ConfigureAwait(false); - await RemoveUserFromRedis().ConfigureAwait(false); - - await SendOfflineToAllPairedUsers().ConfigureAwait(false); - } - catch { } - - await base.OnDisconnectedAsync(exception).ConfigureAwait(false); - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/SignalRLimitFilter.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/SignalRLimitFilter.cs deleted file mode 100644 index a2e8017..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/SignalRLimitFilter.cs +++ /dev/null @@ -1,112 +0,0 @@ -using AspNetCoreRateLimit; -using MareSynchronosShared; -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.SignalR; -using Microsoft.Extensions.Options; - -namespace MareSynchronosServer.Hubs; -public class SignalRLimitFilter : IHubFilter -{ - private readonly IRateLimitProcessor _processor; - private readonly IHttpContextAccessor accessor; - private readonly ILogger logger; - private static readonly SemaphoreSlim ConnectionLimiterSemaphore = new(20, 20); - private static readonly SemaphoreSlim DisconnectLimiterSemaphore = new(20, 20); - - public SignalRLimitFilter( - IOptions options, IProcessingStrategy processing, IIpPolicyStore policyStore, IHttpContextAccessor accessor, ILogger logger) - { - _processor = new IpRateLimitProcessor(options?.Value, policyStore, processing); - this.accessor = accessor; - this.logger = logger; - } - - public async ValueTask InvokeMethodAsync( - HubInvocationContext invocationContext, Func> next) - { - var ip = accessor.GetIpAddress(); - var client = new ClientRequestIdentity - { - ClientIp = ip, - Path = invocationContext.HubMethodName, - HttpVerb = "ws", - ClientId = invocationContext.Context.UserIdentifier, - }; - foreach (var rule in await _processor.GetMatchingRulesAsync(client).ConfigureAwait(false)) - { - var counter = await _processor.ProcessRequestAsync(client, rule).ConfigureAwait(false); - if (counter.Count > rule.Limit) - { - var authUserId = invocationContext.Context.User.Claims?.SingleOrDefault(c => string.Equals(c.Type, MareClaimTypes.Uid, StringComparison.Ordinal))?.Value ?? "Unknown"; - var retry = counter.Timestamp.RetryAfterFrom(rule); - logger.LogWarning("Method rate limit triggered from {ip}/{authUserId}: {method}", ip, authUserId, invocationContext.HubMethodName); - throw new HubException($"call limit {retry}"); - } - } - - return await next(invocationContext).ConfigureAwait(false); - } - - // Optional method - public async Task OnConnectedAsync(HubLifetimeContext context, Func next) - { - await ConnectionLimiterSemaphore.WaitAsync().ConfigureAwait(false); - try - { - var ip = accessor.GetIpAddress(); - var client = new ClientRequestIdentity - { - ClientIp = ip, - Path = "Connect", - HttpVerb = "ws", - }; - foreach (var rule in await _processor.GetMatchingRulesAsync(client).ConfigureAwait(false)) - { - var counter = await _processor.ProcessRequestAsync(client, rule).ConfigureAwait(false); - if (counter.Count > rule.Limit) - { - var retry = counter.Timestamp.RetryAfterFrom(rule); - logger.LogWarning("Connection rate limit triggered from {ip}", ip); - ConnectionLimiterSemaphore.Release(); - throw new HubException($"Connection rate limit {retry}"); - } - } - - - await Task.Delay(25).ConfigureAwait(false); - await next(context).ConfigureAwait(false); - } - catch (Exception ex) - { - logger.LogWarning(ex, "Error on OnConnectedAsync"); - } - finally - { - ConnectionLimiterSemaphore.Release(); - } - } - - public async Task OnDisconnectedAsync( - HubLifetimeContext context, Exception exception, Func next) - { - await DisconnectLimiterSemaphore.WaitAsync().ConfigureAwait(false); - if (exception != null) - { - logger.LogWarning(exception, "InitialException on OnDisconnectedAsync"); - } - - try - { - await next(context, exception).ConfigureAwait(false); - await Task.Delay(25).ConfigureAwait(false); - } - catch (Exception e) - { - logger.LogWarning(e, "ThrownException on OnDisconnectedAsync"); - } - finally - { - DisconnectLimiterSemaphore.Release(); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/MareSynchronosServer.csproj b/MareSynchronosServer/MareSynchronosServer/MareSynchronosServer.csproj deleted file mode 100644 index 2159841..0000000 --- a/MareSynchronosServer/MareSynchronosServer/MareSynchronosServer.csproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - net9.0 - aspnet-MareSynchronosServer-BA82A12A-0B30-463C-801D-B7E81318CD50 - 1.1.0.0 - enable - - - - - - - - - - - Never - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - diff --git a/MareSynchronosServer/MareSynchronosServer/Program.cs b/MareSynchronosServer/MareSynchronosServer/Program.cs deleted file mode 100644 index e05f94f..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Program.cs +++ /dev/null @@ -1,77 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosServer; - -public class Program -{ - public static void Main(string[] args) - { - var hostBuilder = CreateHostBuilder(args); - var host = hostBuilder.Build(); - using (var scope = host.Services.CreateScope()) - { - var services = scope.ServiceProvider; - using var context = services.GetRequiredService(); - var options = services.GetRequiredService>(); - var logger = host.Services.GetRequiredService>(); - - if (options.IsMain) - { - context.Database.Migrate(); - context.SaveChanges(); - - // clean up residuals - var unfinishedRegistrations = context.LodeStoneAuth.Where(c => c.StartedAt != null); - context.RemoveRange(unfinishedRegistrations); - context.SaveChanges(); - - logger.LogInformation(options.ToString()); - } - - var metrics = services.GetRequiredService(); - - metrics.SetGaugeTo(MetricsAPI.GaugeUsersRegistered, context.Users.AsNoTracking().Count()); - metrics.SetGaugeTo(MetricsAPI.GaugePairs, context.ClientPairs.AsNoTracking().Count()); - metrics.SetGaugeTo(MetricsAPI.GaugePairsPaused, context.ClientPairs.AsNoTracking().Count(p => p.IsPaused)); - - } - - if (args.Length == 0 || !string.Equals(args[0], "dry", StringComparison.Ordinal)) - { - try - { - host.Run(); - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } - } - - public static IHostBuilder CreateHostBuilder(string[] args) - { - var loggerFactory = LoggerFactory.Create(builder => - { - builder.ClearProviders(); - builder.AddConsole(); - }); - var logger = loggerFactory.CreateLogger(); - return Host.CreateDefaultBuilder(args) - .UseSystemd() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseContentRoot(AppContext.BaseDirectory); - webBuilder.ConfigureLogging((ctx, builder) => - { - builder.AddConfiguration(ctx.Configuration.GetSection("Logging")); - builder.AddFile(o => o.RootPath = AppContext.BaseDirectory); - }); - webBuilder.UseStartup(ctx => new Startup(ctx.Configuration, logger)); - }); - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Properties/launchSettings.json b/MareSynchronosServer/MareSynchronosServer/Properties/launchSettings.json deleted file mode 100644 index 50deb2c..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Properties/launchSettings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "profiles": { - "MareSynchronosServer": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": false, - //"applicationUrl": "https://localhost:5001;http://localhost:5000;https://192.168.1.124:5001;http://192.168.1.124:5000", - "applicationUrl": "http://localhost:5000;https://localhost:5001;https://darkarchon.internet-box.ch:5001", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Properties/serviceDependencies.json b/MareSynchronosServer/MareSynchronosServer/Properties/serviceDependencies.json deleted file mode 100644 index 33703d5..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Properties/serviceDependencies.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dependencies": {} -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Properties/serviceDependencies.local.json b/MareSynchronosServer/MareSynchronosServer/Properties/serviceDependencies.local.json deleted file mode 100644 index 33703d5..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Properties/serviceDependencies.local.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dependencies": {} -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Services/CharaDataCleanupService.cs b/MareSynchronosServer/MareSynchronosServer/Services/CharaDataCleanupService.cs deleted file mode 100644 index fb0735b..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Services/CharaDataCleanupService.cs +++ /dev/null @@ -1,50 +0,0 @@ -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; - -namespace MareSynchronosServer.Services; - -public class CharaDataCleanupService : IHostedService -{ - private readonly ILogger _logger; - private readonly IDbContextFactory _dbContextFactory; - private readonly CancellationTokenSource _cleanupCts = new(); - - public CharaDataCleanupService(ILogger logger, IDbContextFactory dbContextFactory) - { - _logger = logger; - _dbContextFactory = dbContextFactory; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _ = Cleanup(cancellationToken); - return Task.CompletedTask; - } - - private async Task Cleanup(CancellationToken ct) - { - _logger.LogInformation("CharaData Cleanup Service started"); - while (!ct.IsCancellationRequested) - { - using (var db = await _dbContextFactory.CreateDbContextAsync(ct).ConfigureAwait(false)) - { - var dateTime = DateTime.UtcNow; - var expiredData = await db.CharaData.Where(c => c.ExpiryDate <= DateTime.UtcNow).ToListAsync(cancellationToken: ct).ConfigureAwait(false); - - _logger.LogInformation("Removing {count} expired Chara Data entries", expiredData.Count); - - db.RemoveRange(expiredData); - await db.SaveChangesAsync(ct).ConfigureAwait(false); - } - - await Task.Delay(TimeSpan.FromHours(12), ct).ConfigureAwait(false); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _cleanupCts?.Cancel(); - _cleanupCts?.Dispose(); - return Task.CompletedTask; - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Services/GPoseLobbyDistributionService.cs b/MareSynchronosServer/MareSynchronosServer/Services/GPoseLobbyDistributionService.cs deleted file mode 100644 index 249407d..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Services/GPoseLobbyDistributionService.cs +++ /dev/null @@ -1,226 +0,0 @@ -using MareSynchronos.API.Dto.CharaData; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; -using Microsoft.AspNetCore.SignalR; -using StackExchange.Redis.Extensions.Core.Abstractions; - -namespace MareSynchronosServer.Services; - -public sealed class GPoseLobbyDistributionService : IHostedService, IDisposable -{ - private CancellationTokenSource _runtimeCts = new(); - private readonly Dictionary> _lobbyWorldData = []; - private readonly Dictionary> _lobbyPoseData = []; - private readonly SemaphoreSlim _lobbyPoseDataModificationSemaphore = new(1, 1); - private readonly SemaphoreSlim _lobbyWorldDataModificationSemaphore = new(1, 1); - - public GPoseLobbyDistributionService(ILogger logger, IRedisDatabase redisDb, - IHubContext hubContext) - { - _logger = logger; - _redisDb = redisDb; - _hubContext = hubContext; - } - - private bool _disposed; - private readonly ILogger _logger; - private readonly IRedisDatabase _redisDb; - private readonly IHubContext _hubContext; - - public void Dispose() - { - if (_disposed) - { - return; - } - - _runtimeCts.Cancel(); - _runtimeCts.Dispose(); - _lobbyPoseDataModificationSemaphore.Dispose(); - _lobbyWorldDataModificationSemaphore.Dispose(); - - _disposed = true; - } - - public async Task PushWorldData(string lobby, string user, WorldData worldData) - { - await _lobbyWorldDataModificationSemaphore.WaitAsync().ConfigureAwait(false); - try - { - if (!_lobbyWorldData.TryGetValue(lobby, out var worldDataDict)) - { - _lobbyWorldData[lobby] = worldDataDict = new(StringComparer.Ordinal); - } - worldDataDict[user] = worldData; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Pushing World Data for Lobby {lobby} by User {user}", lobby, user); - } - finally - { - _lobbyWorldDataModificationSemaphore.Release(); - } - } - - public async Task PushPoseData(string lobby, string user, PoseData poseData) - { - await _lobbyPoseDataModificationSemaphore.WaitAsync().ConfigureAwait(false); - try - { - if (!_lobbyPoseData.TryGetValue(lobby, out var poseDataDict)) - { - _lobbyPoseData[lobby] = poseDataDict = new(StringComparer.Ordinal); - } - poseDataDict[user] = poseData; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Pushing World Data for Lobby {lobby} by User {user}", lobby, user); - } - finally - { - _lobbyPoseDataModificationSemaphore.Release(); - } - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _ = WorldDataDistribution(_runtimeCts.Token); - _ = PoseDataDistribution(_runtimeCts.Token); - - return Task.CompletedTask; - } - - private async Task WorldDataDistribution(CancellationToken token) - { - while (!token.IsCancellationRequested) - { - try - { - await DistributeWorldData(token).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during World Data Distribution"); - } - await Task.Delay(TimeSpan.FromSeconds(1), token).ConfigureAwait(false); - } - } - - private async Task PoseDataDistribution(CancellationToken token) - { - while (!token.IsCancellationRequested) - { - try - { - await DistributePoseData(token).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Pose Data Distribution"); - } - await Task.Delay(TimeSpan.FromSeconds(2), token).ConfigureAwait(false); - } - } - - private async Task DistributeWorldData(CancellationToken token) - { - await _lobbyWorldDataModificationSemaphore.WaitAsync(token).ConfigureAwait(false); - Dictionary> clone = []; - try - { - clone = _lobbyWorldData.ToDictionary(k => k.Key, k => k.Value, StringComparer.Ordinal); - _lobbyWorldData.Clear(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Distributing World Data Clone generation"); - _lobbyWorldData.Clear(); - return; - } - finally - { - _lobbyWorldDataModificationSemaphore.Release(); - } - - foreach (var lobbyId in clone) - { - token.ThrowIfCancellationRequested(); - - try - { - if (!lobbyId.Value.Values.Any()) - continue; - - var gposeLobbyUsers = await _redisDb.GetAsync>($"GposeLobby:{lobbyId.Key}").ConfigureAwait(false); - if (gposeLobbyUsers == null) - continue; - - foreach (var data in lobbyId.Value) - { - await _hubContext.Clients.Users(gposeLobbyUsers.Where(k => !string.Equals(k, data.Key, StringComparison.Ordinal))) - .Client_GposeLobbyPushWorldData(new(data.Key), data.Value).ConfigureAwait(false); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during World Data Distribution for Lobby {lobby}", lobbyId.Key); - continue; - } - } - } - - private async Task DistributePoseData(CancellationToken token) - { - await _lobbyPoseDataModificationSemaphore.WaitAsync(token).ConfigureAwait(false); - Dictionary> clone = []; - try - { - clone = _lobbyPoseData.ToDictionary(k => k.Key, k => k.Value, StringComparer.Ordinal); - _lobbyPoseData.Clear(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Distributing Pose Data Clone generation"); - _lobbyPoseData.Clear(); - return; - } - finally - { - _lobbyPoseDataModificationSemaphore.Release(); - } - - foreach (var lobbyId in clone) - { - token.ThrowIfCancellationRequested(); - - try - { - if (!lobbyId.Value.Values.Any()) - continue; - - var gposeLobbyUsers = await _redisDb.GetAsync>($"GposeLobby:{lobbyId.Key}").ConfigureAwait(false); - if (gposeLobbyUsers == null) - continue; - - foreach (var data in lobbyId.Value) - { - await _hubContext.Clients.Users(gposeLobbyUsers.Where(k => !string.Equals(k, data.Key, StringComparison.Ordinal))) - .Client_GposeLobbyPushPoseData(new(data.Key), data.Value).ConfigureAwait(false); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Pose Data Distribution for Lobby {lobby}", lobbyId.Key); - continue; - } - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _runtimeCts.Cancel(); - return Task.CompletedTask; - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs b/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs deleted file mode 100644 index 35db7ac..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs +++ /dev/null @@ -1,98 +0,0 @@ -using MareSynchronos.API.Dto; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using StackExchange.Redis.Extensions.Core.Abstractions; - -namespace MareSynchronosServer.Services; - -public class SystemInfoService : IHostedService, IDisposable -{ - private readonly MareMetrics _mareMetrics; - private readonly IConfigurationService _config; - private readonly IServiceProvider _services; - private readonly ILogger _logger; - private readonly IHubContext _hubContext; - private readonly IRedisDatabase _redis; - private Timer _timer; - public SystemInfoDto SystemInfoDto { get; private set; } = new(); - - public SystemInfoService(MareMetrics mareMetrics, IConfigurationService configurationService, IServiceProvider services, - ILogger logger, IHubContext hubContext, IRedisDatabase redisDb) - { - _mareMetrics = mareMetrics; - _config = configurationService; - _services = services; - _logger = logger; - _hubContext = hubContext; - _redis = redisDb; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("System Info Service started"); - - var timeOut = _config.IsMain ? 5 : 15; - - _timer = new Timer(PushSystemInfo, null, TimeSpan.Zero, TimeSpan.FromSeconds(timeOut)); - - return Task.CompletedTask; - } - - private void PushSystemInfo(object state) - { - try - { - ThreadPool.GetAvailableThreads(out int workerThreads, out int ioThreads); - - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeAvailableWorkerThreads, workerThreads); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeAvailableIOWorkerThreads, ioThreads); - - var onlineUsers = (_redis.SearchKeysAsync("UID:*").GetAwaiter().GetResult()).Count(); - SystemInfoDto = new SystemInfoDto() - { - OnlineUsers = onlineUsers, - }; - - if (_config.IsMain) - { - _logger.LogTrace("Sending System Info, Online Users: {onlineUsers}", onlineUsers); - - _hubContext.Clients.All.Client_UpdateSystemInfo(SystemInfoDto); - - using var scope = _services.CreateScope(); - using var db = scope.ServiceProvider.GetService()!; - - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeAuthorizedConnections, onlineUsers); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugePairs, db.ClientPairs.AsNoTracking().Count()); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugePairsPaused, db.ClientPairs.AsNoTracking().Count(p => p.IsPaused)); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeGroups, db.Groups.AsNoTracking().Count()); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeGroupPairs, db.GroupPairs.AsNoTracking().Count()); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeGroupPairsPaused, db.GroupPairs.AsNoTracking().Count(p => p.IsPaused)); - _mareMetrics.SetGaugeTo(MetricsAPI.GaugeUsersRegistered, db.Users.AsNoTracking().Count()); - } - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Failed to push system info"); - } - } - - - public Task StopAsync(CancellationToken cancellationToken) - { - _timer?.Change(Timeout.Infinite, 0); - - return Task.CompletedTask; - } - - public void Dispose() - { - _timer?.Dispose(); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Services/UserCleanupService.cs b/MareSynchronosServer/MareSynchronosServer/Services/UserCleanupService.cs deleted file mode 100644 index 531845d..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Services/UserCleanupService.cs +++ /dev/null @@ -1,217 +0,0 @@ -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Models; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.EntityFrameworkCore; -using System.Linq; - -namespace MareSynchronosServer.Services; - -public class UserCleanupService : IHostedService -{ - private readonly MareMetrics metrics; - private readonly ILogger _logger; - private readonly IDbContextFactory _mareDbContextFactory; - private readonly IConfigurationService _configuration; - private CancellationTokenSource _cleanupCts; - - public UserCleanupService(MareMetrics metrics, ILogger logger, IDbContextFactory mareDbContextFactory, IConfigurationService configuration) - { - this.metrics = metrics; - _logger = logger; - _mareDbContextFactory = mareDbContextFactory; - _configuration = configuration; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Cleanup Service started"); - _cleanupCts = new(); - - _ = CleanUp(_cleanupCts.Token); - - return Task.CompletedTask; - } - - private async Task CleanUp(CancellationToken ct) - { - while (!ct.IsCancellationRequested) - { - using (var dbContext = await _mareDbContextFactory.CreateDbContextAsync(ct).ConfigureAwait(false)) - { - - CleanUpOutdatedLodestoneAuths(dbContext); - - await PurgeUnusedAccounts(dbContext).ConfigureAwait(false); - - await PurgeTempInvites(dbContext).ConfigureAwait(false); - await PurgeExpiredTemporaryGroups(dbContext).ConfigureAwait(false); - - dbContext.SaveChanges(); - } - - var span = TimeSpan.FromMinutes(1); - var nextRun = DateTime.Now.Add(span); - - _logger.LogInformation("User Cleanup Complete, next run at {date}", nextRun); - await Task.Delay(span, ct).ConfigureAwait(false); - } - } - - private async Task PurgeExpiredTemporaryGroups(MareDbContext dbContext) - { - try - { - var now = DateTime.UtcNow; - var expiredGroups = await dbContext.Groups - .Where(g => g.IsTemporary && g.ExpiresAt != null && g.ExpiresAt <= now) - .ToListAsync() - .ConfigureAwait(false); - - if (expiredGroups.Count == 0) return; - - _logger.LogInformation("Cleaning up {count} expired temporary syncshells", expiredGroups.Count); - - dbContext.Groups.RemoveRange(expiredGroups); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during temporary syncshell purge"); - } - } - - private async Task PurgeTempInvites(MareDbContext dbContext) - { - try - { - var tempInvites = await dbContext.GroupTempInvites.ToListAsync().ConfigureAwait(false); - dbContext.RemoveRange(tempInvites.Where(i => i.ExpirationDate < DateTime.UtcNow)); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during Temp Invite purge"); - } - } - - private async Task PurgeUnusedAccounts(MareDbContext dbContext) - { - try - { - if (_configuration.GetValueOrDefault(nameof(ServerConfiguration.PurgeUnusedAccounts), false)) - { - var usersOlderThanDays = _configuration.GetValueOrDefault(nameof(ServerConfiguration.PurgeUnusedAccountsPeriodInDays), 14); - var maxGroupsByUser = _configuration.GetValueOrDefault(nameof(ServerConfiguration.MaxGroupUserCount), 3); - - _logger.LogInformation("Cleaning up users older than {usersOlderThanDays} days", usersOlderThanDays); - - var allUsers = dbContext.Users.Where(u => string.IsNullOrEmpty(u.Alias)).ToList(); - List usersToRemove = new(); - foreach (var user in allUsers) - { - if (user.LastLoggedIn < DateTime.UtcNow - TimeSpan.FromDays(usersOlderThanDays)) - { - _logger.LogInformation("User outdated: {userUID}", user.UID); - usersToRemove.Add(user); - } - } - - foreach (var user in usersToRemove) - { - await SharedDbFunctions.PurgeUser(_logger, user, dbContext, maxGroupsByUser).ConfigureAwait(false); - } - } - - _logger.LogInformation("Cleaning up unauthorized users"); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during user purge"); - } - } - - private void CleanUpOutdatedLodestoneAuths(MareDbContext dbContext) - { - try - { - _logger.LogInformation($"Cleaning up expired lodestone authentications"); - var lodestoneAuths = dbContext.LodeStoneAuth.Include(u => u.User).Where(a => a.StartedAt != null).ToList(); - List expiredAuths = new List(); - foreach (var auth in lodestoneAuths) - { - if (auth.StartedAt < DateTime.UtcNow - TimeSpan.FromMinutes(15)) - { - expiredAuths.Add(auth); - } - } - - dbContext.Users.RemoveRange(expiredAuths.Where(u => u.User != null).Select(a => a.User)); - dbContext.RemoveRange(expiredAuths); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during expired auths cleanup"); - } - } - - public async Task PurgeUser(User user, MareDbContext dbContext) - { - _logger.LogInformation("Purging user: {uid}", user.UID); - - var lodestone = dbContext.LodeStoneAuth.SingleOrDefault(a => a.User.UID == user.UID); - - if (lodestone != null) - { - dbContext.Remove(lodestone); - } - - var auth = dbContext.Auth.Single(a => a.UserUID == user.UID); - - var ownPairData = dbContext.ClientPairs.Where(u => u.User.UID == user.UID).ToList(); - dbContext.ClientPairs.RemoveRange(ownPairData); - var otherPairData = dbContext.ClientPairs.Include(u => u.User) - .Where(u => u.OtherUser.UID == user.UID).ToList(); - dbContext.ClientPairs.RemoveRange(otherPairData); - - var userJoinedGroups = await dbContext.GroupPairs.Include(g => g.Group).Where(u => u.GroupUserUID == user.UID).ToListAsync().ConfigureAwait(false); - - foreach (var userGroupPair in userJoinedGroups) - { - bool ownerHasLeft = string.Equals(userGroupPair.Group.OwnerUID, user.UID, StringComparison.Ordinal); - - if (ownerHasLeft) - { - var groupPairs = await dbContext.GroupPairs.Where(g => g.GroupGID == userGroupPair.GroupGID && g.GroupUserUID != user.UID).ToListAsync().ConfigureAwait(false); - - if (!groupPairs.Any()) - { - _logger.LogInformation("Group {gid} has no new owner, deleting", userGroupPair.GroupGID); - dbContext.Groups.Remove(userGroupPair.Group); - } - else - { - _ = await SharedDbFunctions.MigrateOrDeleteGroup(dbContext, userGroupPair.Group, groupPairs, _configuration.GetValueOrDefault(nameof(ServerConfiguration.MaxExistingGroupsByUser), 3)).ConfigureAwait(false); - } - } - - dbContext.GroupPairs.Remove(userGroupPair); - - await dbContext.SaveChangesAsync().ConfigureAwait(false); - } - - _logger.LogInformation("User purged: {uid}", user.UID); - - dbContext.Auth.Remove(auth); - dbContext.Users.Remove(user); - - await dbContext.SaveChangesAsync().ConfigureAwait(false); - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _cleanupCts.Cancel(); - - return Task.CompletedTask; - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Startup.cs b/MareSynchronosServer/MareSynchronosServer/Startup.cs deleted file mode 100644 index 63cd403..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Startup.cs +++ /dev/null @@ -1,365 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using MareSynchronosServer.Hubs; -using Microsoft.AspNetCore.Http.Connections; -using Microsoft.AspNetCore.SignalR; -using Microsoft.AspNetCore.Authorization; -using AspNetCoreRateLimit; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosServer.Services; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Services; -using Prometheus; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.IdentityModel.Tokens; -using System.Text; -using Microsoft.AspNetCore.HttpOverrides; -using StackExchange.Redis; -using StackExchange.Redis.Extensions.Core.Configuration; -using System.Net; -using StackExchange.Redis.Extensions.System.Text.Json; -using MareSynchronos.API.SignalR; -using MessagePack; -using MessagePack.Resolvers; -using Microsoft.AspNetCore.Mvc.Controllers; -using MareSynchronosServer.Controllers; -using MareSynchronosShared.RequirementHandlers; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosServer; - -public class Startup -{ - private readonly ILogger _logger; - - public Startup(IConfiguration configuration, ILogger logger) - { - Configuration = configuration; - _logger = logger; - } - - public IConfiguration Configuration { get; } - - public void ConfigureServices(IServiceCollection services) - { - services.AddHttpContextAccessor(); - - services.AddTransient(_ => Configuration); - - var mareConfig = Configuration.GetRequiredSection("MareSynchronos"); - - // configure metrics - ConfigureMetrics(services); - - // configure database - ConfigureDatabase(services, mareConfig); - - // configure authentication and authorization - ConfigureAuthorization(services); - - // configure rate limiting - ConfigureIpRateLimiting(services); - - // configure SignalR - ConfigureSignalR(services, mareConfig); - - // configure mare specific services - ConfigureMareServices(services, mareConfig); - - services.AddHealthChecks(); - services.AddControllers().ConfigureApplicationPartManager(a => - { - a.FeatureProviders.Remove(a.FeatureProviders.OfType().First()); - if (mareConfig.GetValue(nameof(ServerConfiguration.MainServerAddress), defaultValue: null) == null) - { - a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(MareServerConfigurationController), typeof(MareBaseConfigurationController), typeof(ClientMessageController), typeof(MainController), typeof(DiscoveryNotifyController))); - } - else - { - a.FeatureProviders.Add(new AllowedControllersFeatureProvider()); - } - }); - } - - private void ConfigureMareServices(IServiceCollection services, IConfigurationSection mareConfig) - { - bool isMainServer = mareConfig.GetValue(nameof(ServerConfiguration.MainServerAddress), defaultValue: null) == null; - - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - - services.AddSingleton(); - services.AddSingleton(); - services.AddHostedService(provider => provider.GetService()); - // configure services based on main server status - ConfigureServicesBasedOnShardType(services, mareConfig, isMainServer); - - if (isMainServer) - { - services.AddSingleton(); - services.AddHostedService(provider => provider.GetService()); - services.AddSingleton(); - services.AddHostedService(provider => provider.GetService()); - } - - services.AddSingleton(); - services.AddHostedService(provider => provider.GetService()); - } - - private static void ConfigureSignalR(IServiceCollection services, IConfigurationSection mareConfig) - { - services.AddSingleton(); - - var signalRServiceBuilder = services.AddSignalR(hubOptions => - { - hubOptions.MaximumReceiveMessageSize = long.MaxValue; - hubOptions.EnableDetailedErrors = true; - hubOptions.MaximumParallelInvocationsPerClient = 10; - hubOptions.StreamBufferCapacity = 200; - - hubOptions.AddFilter(); - }).AddMessagePackProtocol(opt => - { - var resolver = CompositeResolver.Create(StandardResolverAllowPrivate.Instance, - BuiltinResolver.Instance, - AttributeFormatterResolver.Instance, - // replace enum resolver - DynamicEnumAsStringResolver.Instance, - DynamicGenericResolver.Instance, - DynamicUnionResolver.Instance, - DynamicObjectResolver.Instance, - PrimitiveObjectResolver.Instance, - // final fallback(last priority) - StandardResolver.Instance); - - opt.SerializerOptions = MessagePackSerializerOptions.Standard - .WithCompression(MessagePackCompression.Lz4Block) - .WithResolver(resolver); - }); - - // configure redis for SignalR - var redisConnection = mareConfig.GetValue(nameof(ServerConfiguration.RedisConnectionString), string.Empty); - signalRServiceBuilder.AddStackExchangeRedis(redisConnection, options => { }); - - var options = ConfigurationOptions.Parse(redisConnection); - - var endpoint = options.EndPoints[0]; - string address = ""; - int port = 0; - if (endpoint is DnsEndPoint dnsEndPoint) { address = dnsEndPoint.Host; port = dnsEndPoint.Port; } - if (endpoint is IPEndPoint ipEndPoint) { address = ipEndPoint.Address.ToString(); port = ipEndPoint.Port; } - var redisConfiguration = new RedisConfiguration() - { - AbortOnConnectFail = true, - KeyPrefix = "", - Hosts = new RedisHost[] - { - new RedisHost(){ Host = address, Port = port }, - }, - AllowAdmin = true, - ConnectTimeout = options.ConnectTimeout, - Database = 0, - Ssl = false, - Password = options.Password, - ServerEnumerationStrategy = new ServerEnumerationStrategy() - { - Mode = ServerEnumerationStrategy.ModeOptions.All, - TargetRole = ServerEnumerationStrategy.TargetRoleOptions.Any, - UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.Throw, - }, - MaxValueLength = 1024, - PoolSize = mareConfig.GetValue(nameof(ServerConfiguration.RedisPool), 50), - SyncTimeout = options.SyncTimeout, - }; - - services.AddStackExchangeRedisExtensions(redisConfiguration); - } - - private void ConfigureIpRateLimiting(IServiceCollection services) - { - services.Configure(Configuration.GetSection("IpRateLimiting")); - services.Configure(Configuration.GetSection("IpRateLimitPolicies")); - services.AddSingleton(); - services.AddMemoryCache(); - services.AddInMemoryRateLimiting(); - } - - private static void ConfigureAuthorization(IServiceCollection services) - { - services.AddTransient(); - - services.AddOptions(JwtBearerDefaults.AuthenticationScheme) - .Configure>((options, config) => - { - options.TokenValidationParameters = new() - { - ValidateIssuer = false, - ValidateLifetime = false, - ValidateAudience = false, - ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(config.GetValue(nameof(MareConfigurationBase.Jwt)))), - }; - - // Allow SignalR WebSocket connections to authenticate via access_token query on the hub path - options.Events = new JwtBearerEvents - { - OnMessageReceived = context => - { - var accessToken = context.Request.Query["access_token"].ToString(); - var path = context.HttpContext.Request.Path; - if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments(IMareHub.Path)) - { - context.Token = accessToken; - } - return Task.CompletedTask; - } - }; - }); - - services.AddAuthentication(o => - { - o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddJwtBearer(); - - services.AddAuthorization(options => - { - options.DefaultPolicy = new AuthorizationPolicyBuilder() - .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) - .RequireAuthenticatedUser().Build(); - options.AddPolicy("Authenticated", policy => - { - policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); - policy.RequireAuthenticatedUser(); - }); - options.AddPolicy("Identified", policy => - { - policy.AddRequirements(new UserRequirement(UserRequirements.Identified)); - }); - options.AddPolicy("Admin", policy => - { - policy.AddRequirements(new UserRequirement(UserRequirements.Identified | UserRequirements.Administrator)); - }); - options.AddPolicy("Moderator", policy => - { - policy.AddRequirements(new UserRequirement(UserRequirements.Identified | UserRequirements.Moderator | UserRequirements.Administrator)); - }); - options.AddPolicy("Internal", new AuthorizationPolicyBuilder().RequireClaim(MareClaimTypes.Internal, "true").Build()); - }); - } - - private void ConfigureDatabase(IServiceCollection services, IConfigurationSection mareConfig) - { - services.AddDbContextPool(options => - { - options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - builder.MigrationsAssembly("MareSynchronosShared"); - }).UseSnakeCaseNamingConvention(); - options.EnableThreadSafetyChecks(false); - }, mareConfig.GetValue(nameof(MareConfigurationBase.DbContextPoolSize), 1024)); - services.AddDbContextFactory(options => - { - options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - builder.MigrationsAssembly("MareSynchronosShared"); - }).UseSnakeCaseNamingConvention(); - options.EnableThreadSafetyChecks(false); - }); - } - - private static void ConfigureMetrics(IServiceCollection services) - { - services.AddSingleton(m => new MareMetrics(m.GetService>(), new List - { - MetricsAPI.CounterInitializedConnections, - MetricsAPI.CounterUserPushData, - MetricsAPI.CounterUserPushDataTo, - MetricsAPI.CounterUsersRegisteredDeleted, - MetricsAPI.CounterAuthenticationCacheHits, - MetricsAPI.CounterAuthenticationFailures, - MetricsAPI.CounterAuthenticationRequests, - MetricsAPI.CounterAuthenticationSuccesses, - }, new List - { - MetricsAPI.GaugeAuthorizedConnections, - MetricsAPI.GaugeConnections, - MetricsAPI.GaugePairs, - MetricsAPI.GaugePairsPaused, - MetricsAPI.GaugeAvailableIOWorkerThreads, - MetricsAPI.GaugeAvailableWorkerThreads, - MetricsAPI.GaugeGroups, - MetricsAPI.GaugeGroupPairs, - MetricsAPI.GaugeGroupPairsPaused, - MetricsAPI.GaugeUsersRegistered, - MetricsAPI.GaugeGposeLobbies, - MetricsAPI.GaugeGposeLobbyUsers - })); - } - - private static void ConfigureServicesBasedOnShardType(IServiceCollection services, IConfigurationSection mareConfig, bool isMainServer) - { - if (!isMainServer) - { - services.AddSingleton, MareConfigurationServiceClient>(); - services.AddSingleton, MareConfigurationServiceClient>(); - - services.AddHostedService(p => (MareConfigurationServiceClient)p.GetService>()); - services.AddHostedService(p => (MareConfigurationServiceClient)p.GetService>()); - } - else - { - services.AddSingleton, MareConfigurationServiceServer>(); - services.AddSingleton, MareConfigurationServiceServer>(); - } - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger logger) - { - logger.LogInformation("Running Configure"); - - var config = app.ApplicationServices.GetRequiredService>(); - - // Respect X-Forwarded-* headers from reverse proxies (required for correct scheme/host) - app.UseForwardedHeaders(new ForwardedHeadersOptions - { - ForwardedHeaders = ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedFor - }); - - app.UseIpRateLimiting(); - - app.UseRouting(); - - app.UseWebSockets(); - app.UseHttpMetrics(); - - var metricServer = new KestrelMetricServer(config.GetValueOrDefault(nameof(MareConfigurationBase.MetricsPort), 4980)); - metricServer.Start(); - - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - endpoints.MapHub(IMareHub.Path, options => - { - options.ApplicationMaxBufferSize = 5242880; - options.TransportMaxBufferSize = 5242880; - options.Transports = HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents | HttpTransportType.LongPolling; - }); - - endpoints.MapHealthChecks("/health").AllowAnonymous(); - endpoints.MapControllers(); - - foreach (var source in endpoints.DataSources.SelectMany(e => e.Endpoints).Cast()) - { - if (source == null) continue; - _logger.LogInformation("Endpoint: {url} ", source.RoutePattern.RawText); - } - }); - - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/Extensions.cs b/MareSynchronosServer/MareSynchronosServer/Utils/Extensions.cs deleted file mode 100644 index a9644ff..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Utils/Extensions.cs +++ /dev/null @@ -1,53 +0,0 @@ -using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Data.Extensions; -using MareSynchronosShared.Models; - -namespace MareSynchronosServer.Utils -{ - public static class Extensions - { - public static GroupData ToGroupData(this Group group) - { - return new GroupData(group.GID, group.Alias); - } - - public static UserData ToUserData(this GroupPair pair) - { - return new UserData(pair.GroupUser.UID, pair.GroupUser.Alias); - } - - public static UserData ToUserData(this User user) - { - return new UserData(user.UID, user.Alias); - } - - public static GroupPermissions GetGroupPermissions(this Group group) - { - var permissions = GroupPermissions.NoneSet; - permissions.SetDisableAnimations(group.DisableAnimations); - permissions.SetDisableSounds(group.DisableSounds); - permissions.SetDisableInvites(!group.InvitesEnabled); - permissions.SetDisableVFX(group.DisableVFX); - return permissions; - } - - public static GroupUserPermissions GetGroupPairPermissions(this GroupPair groupPair) - { - var permissions = GroupUserPermissions.NoneSet; - permissions.SetDisableAnimations(groupPair.DisableAnimations); - permissions.SetDisableSounds(groupPair.DisableSounds); - permissions.SetPaused(groupPair.IsPaused); - permissions.SetDisableVFX(groupPair.DisableVFX); - return permissions; - } - - public static GroupUserInfo GetGroupPairUserInfo(this GroupPair groupPair) - { - var groupUserInfo = GroupUserInfo.None; - groupUserInfo.SetPinned(groupPair.IsPinned); - groupUserInfo.SetModerator(groupPair.IsModerator); - return groupUserInfo; - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/MareHubLogger.cs b/MareSynchronosServer/MareSynchronosServer/Utils/MareHubLogger.cs deleted file mode 100644 index 91a95e2..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Utils/MareHubLogger.cs +++ /dev/null @@ -1,33 +0,0 @@ -using MareSynchronosServer.Hubs; -using System.Runtime.CompilerServices; - -namespace MareSynchronosServer.Utils; - -public class MareHubLogger -{ - private readonly MareHub _hub; - private readonly ILogger _logger; - - public MareHubLogger(MareHub hub, ILogger logger) - { - _hub = hub; - _logger = logger; - } - - public static object[] Args(params object[] args) - { - return args; - } - - public void LogCallInfo(object[] args = null, [CallerMemberName] string methodName = "") - { - string formattedArgs = args != null && args.Length != 0 ? "|" + string.Join(":", args) : string.Empty; - _logger.LogInformation("{uid}:{method}{args}", _hub.UserUID, methodName, formattedArgs); - } - - public void LogCallWarning(object[] args = null, [CallerMemberName] string methodName = "") - { - string formattedArgs = args != null && args.Length != 0 ? "|" + string.Join(":", args) : string.Empty; - _logger.LogWarning("{uid}:{method}{args}", _hub.UserUID, methodName, formattedArgs); - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/PauseInfo.cs b/MareSynchronosServer/MareSynchronosServer/Utils/PauseInfo.cs deleted file mode 100644 index 987b195..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Utils/PauseInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MareSynchronosServer.Utils; - -public enum PauseInfo -{ - NoConnection, - Paused, - Unpaused, -} diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs b/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs deleted file mode 100644 index f656c3a..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Utils/PauseState.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MareSynchronosServer.Utils; - -public record PauseState -{ - public string GID { get; set; } - public bool IsPaused => IsSelfPaused || IsOtherPaused; - public bool IsSelfPaused { get; set; } - public bool IsOtherPaused { get; set; } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs b/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs deleted file mode 100644 index 13de566..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Utils/PausedEntry.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace MareSynchronosServer.Utils; - -public record PausedEntry -{ - public string UID { get; set; } - public List PauseStates { get; set; } = new(); - - public PauseInfo IsDirectlyPaused => PauseStateWithoutGroups == null ? PauseInfo.NoConnection - : PauseStates.First(g => g.GID == null).IsPaused ? PauseInfo.Paused : PauseInfo.Unpaused; - - public PauseInfo IsPausedPerGroup => !PauseStatesWithoutDirect.Any() ? PauseInfo.NoConnection - : PauseStatesWithoutDirect.All(p => p.IsPaused) ? PauseInfo.Paused : PauseInfo.Unpaused; - - private IEnumerable PauseStatesWithoutDirect => PauseStates.Where(f => f.GID != null); - private PauseState PauseStateWithoutGroups => PauseStates.SingleOrDefault(p => p.GID == null); - - public bool IsPaused - { - get - { - var isDirectlyPaused = IsDirectlyPaused; - bool result; - if (isDirectlyPaused != PauseInfo.NoConnection) - { - result = isDirectlyPaused == PauseInfo.Paused; - } - else - { - result = IsPausedPerGroup == PauseInfo.Paused; - } - - return result; - } - } - - public PauseInfo IsOtherPausedForSpecificGroup(string gid) - { - var state = PauseStatesWithoutDirect.SingleOrDefault(g => string.Equals(g.GID, gid, StringComparison.Ordinal)); - if (state == null) return PauseInfo.NoConnection; - return state.IsOtherPaused ? PauseInfo.Paused : PauseInfo.Unpaused; - } - - public PauseInfo IsPausedForSpecificGroup(string gid) - { - var state = PauseStatesWithoutDirect.SingleOrDefault(g => string.Equals(g.GID, gid, StringComparison.Ordinal)); - if (state == null) return PauseInfo.NoConnection; - return state.IsPaused ? PauseInfo.Paused : PauseInfo.NoConnection; - } - - public PauseInfo IsPausedExcludingGroup(string gid) - { - var states = PauseStatesWithoutDirect.Where(f => !string.Equals(f.GID, gid, StringComparison.Ordinal)).ToList(); - if (!states.Any()) return PauseInfo.NoConnection; - var result = states.All(p => p.IsPaused); - if (result) return PauseInfo.Paused; - return PauseInfo.Unpaused; - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Utils/UserPair.cs b/MareSynchronosServer/MareSynchronosServer/Utils/UserPair.cs deleted file mode 100644 index 1a5c367..0000000 --- a/MareSynchronosServer/MareSynchronosServer/Utils/UserPair.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MareSynchronosServer.Hubs; - -public partial class MareHub -{ - private record UserPair - { - public string UserUID { get; set; } - public string OtherUserUID { get; set; } - public bool UserPausedOther { get; set; } - public bool OtherPausedUser { get; set; } - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/appsettings.json b/MareSynchronosServer/MareSynchronosServer/appsettings.json deleted file mode 100644 index 38ca83d..0000000 --- a/MareSynchronosServer/MareSynchronosServer/appsettings.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Port=5432;Database=mare;Username=postgres" - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information", - "MareSynchronosServer.Authentication": "Warning", - "System.IO.IOException": "Warning" - }, - "File": { - "BasePath": "logs", - "FileAccessMode": "KeepOpenAndAutoFlush", - "FileEncodingName": "utf-8", - "DateFormat": "yyyMMdd", - "MaxFileSize": 10485760, - "Files": [ - { - "Path": "mare-.log" - } - ] - } - }, - "MareSynchronos": { - "DbContextPoolSize": 2000, - "CdnFullUrl": "https:///cache/", - "ServiceAddress": "http://localhost:5002", - "StaticFileServiceAddress": "http://localhost:5003" - }, - "AllowedHosts": "*", - "Kestrel": { - "Endpoints": { - "Https": { - "Url": "https://+:5000", - "Certificate": { - "Subject": "darkarchon.internet-box.ch", - "Store": "My", - "Location": "LocalMachine" - //"AllowInvalid": false - // "Path": "", //use path, keypath and password to provide a valid certificate if not using windows key store - // "KeyPath": "" - // "Password": "" - } - } - } - }, - "IpRateLimiting": { - "EnableEndpointRateLimiting": false, - "StackBlockedRequests": false, - "RealIpHeader": "X-Real-IP", - "ClientIdHeader": "X-ClientId", - "HttpStatusCode": 429, - "IpWhitelist": [ ], - "GeneralRules": [ ] - }, - "IPRateLimitPolicies": { - "IpRules": [] - } -} diff --git a/MareSynchronosServer/MareSynchronosServices/.config/dotnet-tools.json b/MareSynchronosServer/MareSynchronosServices/.config/dotnet-tools.json deleted file mode 100644 index 98091c9..0000000 --- a/MareSynchronosServer/MareSynchronosServices/.config/dotnet-tools.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "dotnet-ef": { - "version": "6.0.8", - "commands": [ - "dotnet-ef" - ] - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServices/Discord/DiscordBot.cs b/MareSynchronosServer/MareSynchronosServices/Discord/DiscordBot.cs deleted file mode 100644 index bf17215..0000000 --- a/MareSynchronosServer/MareSynchronosServices/Discord/DiscordBot.cs +++ /dev/null @@ -1,421 +0,0 @@ -using Discord; -using Discord.Interactions; -using Discord.Rest; -using Discord.WebSocket; -using MareSynchronos.API.Data.Enum; -using MareSynchronos.API.Dto.User; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; -using MareSynchronosShared.Data; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using StackExchange.Redis; -using System.Text; - -namespace MareSynchronosServices.Discord; - -internal class DiscordBot : IHostedService -{ - private readonly DiscordBotServices _botServices; - private readonly IConfigurationService _configurationService; - private readonly IConnectionMultiplexer _connectionMultiplexer; - private readonly DiscordSocketClient _discordClient; - private readonly ILogger _logger; - private readonly IHubContext _mareHubContext; - private readonly IServiceProvider _services; - private InteractionService _interactionModule; - private CancellationTokenSource? _processReportQueueCts; - private CancellationTokenSource? _updateStatusCts; - private CancellationTokenSource? _vanityUpdateCts; - - public DiscordBot(DiscordBotServices botServices, IServiceProvider services, IConfigurationService configuration, - IHubContext mareHubContext, - ILogger logger, IConnectionMultiplexer connectionMultiplexer) - { - _botServices = botServices; - _services = services; - _configurationService = configuration; - _mareHubContext = mareHubContext; - _logger = logger; - _connectionMultiplexer = connectionMultiplexer; - _discordClient = new(new DiscordSocketConfig() - { - DefaultRetryMode = RetryMode.AlwaysRetry - }); - - _discordClient.Log += Log; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - var token = _configurationService.GetValueOrDefault(nameof(ServicesConfiguration.DiscordBotToken), string.Empty); - if (!string.IsNullOrEmpty(token)) - { - _interactionModule = new InteractionService(_discordClient); - await _interactionModule.AddModuleAsync(typeof(MareModule), _services).ConfigureAwait(false); - - await _discordClient.LoginAsync(TokenType.Bot, token).ConfigureAwait(false); - await _discordClient.StartAsync().ConfigureAwait(false); - - _discordClient.Ready += DiscordClient_Ready; - _discordClient.ButtonExecuted += ButtonExecutedHandler; - _discordClient.InteractionCreated += async (x) => - { - var ctx = new SocketInteractionContext(_discordClient, x); - await _interactionModule.ExecuteCommandAsync(ctx, _services); - }; - - await _botServices.Start(); - _ = UpdateStatusAsync(); - } - } - - public async Task StopAsync(CancellationToken cancellationToken) - { - if (!string.IsNullOrEmpty(_configurationService.GetValueOrDefault(nameof(ServicesConfiguration.DiscordBotToken), string.Empty))) - { - _discordClient.ButtonExecuted -= ButtonExecutedHandler; - - await _botServices.Stop(); - _processReportQueueCts?.Cancel(); - _updateStatusCts?.Cancel(); - _vanityUpdateCts?.Cancel(); - - await _discordClient.LogoutAsync().ConfigureAwait(false); - await _discordClient.StopAsync().ConfigureAwait(false); - } - } - - private async Task ButtonExecutedHandler(SocketMessageComponent arg) - { - var id = arg.Data.CustomId; - if (!id.StartsWith("mare-report-button", StringComparison.Ordinal)) return; - - var userId = arg.User.Id; - using var scope = _services.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); - var user = await dbContext.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == userId).ConfigureAwait(false); - - if (user == null || (!user.User.IsModerator && !user.User.IsAdmin)) - { - EmbedBuilder eb = new(); - eb.WithTitle($"Cannot resolve report"); - eb.WithDescription($"<@{userId}>: You have no rights to resolve this report"); - await arg.RespondAsync(embed: eb.Build()).ConfigureAwait(false); - return; - } - - id = id.Remove(0, "mare-report-button-".Length); - var split = id.Split('-', StringSplitOptions.RemoveEmptyEntries); - - var profile = await dbContext.UserProfileData.SingleAsync(u => u.UserUID == split[1]).ConfigureAwait(false); - - var embed = arg.Message.Embeds.First(); - - var builder = embed.ToEmbedBuilder(); - var otherPairs = await dbContext.ClientPairs.Where(p => p.UserUID == split[1]).Select(p => p.OtherUserUID).ToListAsync().ConfigureAwait(false); - switch (split[0]) - { - case "dismiss": - builder.AddField("Resolution", $"Dismissed by <@{userId}>"); - builder.WithColor(Color.Green); - profile.FlaggedForReport = false; - break; - - case "banreporting": - builder.AddField("Resolution", $"Dismissed by <@{userId}>, Reporting user banned"); - builder.WithColor(Color.DarkGreen); - profile.FlaggedForReport = false; - var reportingUser = await dbContext.Auth.SingleAsync(u => u.UserUID == split[2]).ConfigureAwait(false); - reportingUser.IsBanned = true; - var regReporting = await dbContext.LodeStoneAuth.SingleAsync(u => u.User.UID == reportingUser.UserUID).ConfigureAwait(false); - dbContext.BannedRegistrations.Add(new MareSynchronosShared.Models.BannedRegistrations() - { - DiscordIdOrLodestoneAuth = regReporting.HashedLodestoneId - }); - dbContext.BannedRegistrations.Add(new MareSynchronosShared.Models.BannedRegistrations() - { - DiscordIdOrLodestoneAuth = regReporting.DiscordId.ToString() - }); - break; - - case "banprofile": - builder.AddField("Resolution", $"Profile has been banned by <@{userId}>"); - builder.WithColor(Color.Red); - profile.Base64ProfileImage = null; - profile.UserDescription = null; - profile.ProfileDisabled = true; - profile.FlaggedForReport = false; - break; - - case "banuser": - builder.AddField("Resolution", $"User has been banned by <@{userId}>"); - builder.WithColor(Color.DarkRed); - var offendingUser = await dbContext.Auth.SingleAsync(u => u.UserUID == split[1]).ConfigureAwait(false); - offendingUser.IsBanned = true; - profile.Base64ProfileImage = null; - profile.UserDescription = null; - profile.ProfileDisabled = true; - var reg = await dbContext.LodeStoneAuth.SingleAsync(u => u.User.UID == offendingUser.UserUID).ConfigureAwait(false); - dbContext.BannedRegistrations.Add(new MareSynchronosShared.Models.BannedRegistrations() - { - DiscordIdOrLodestoneAuth = reg.HashedLodestoneId - }); - dbContext.BannedRegistrations.Add(new MareSynchronosShared.Models.BannedRegistrations() - { - DiscordIdOrLodestoneAuth = reg.DiscordId.ToString() - }); - break; - } - - await dbContext.SaveChangesAsync().ConfigureAwait(false); - - await _mareHubContext.Clients.Users(otherPairs).SendAsync(nameof(IMareHub.Client_UserUpdateProfile), new UserDto(new(split[1]))).ConfigureAwait(false); - await _mareHubContext.Clients.User(split[1]).SendAsync(nameof(IMareHub.Client_UserUpdateProfile), new UserDto(new(split[1]))).ConfigureAwait(false); - - await arg.Message.ModifyAsync(msg => - { - msg.Content = arg.Message.Content; - msg.Components = null; - msg.Embed = new Optional(builder.Build()); - }).ConfigureAwait(false); - } - - private async Task DiscordClient_Ready() - { - var guild = (await _discordClient.Rest.GetGuildsAsync()).First(); - await _interactionModule.RegisterCommandsToGuildAsync(guild.Id, true).ConfigureAwait(false); - - //_ = RemoveUsersNotInVanityRole(); - _ = ProcessReportsQueue(); - } - - private Task Log(LogMessage msg) - { - _logger.LogInformation("{msg}", msg); - - return Task.CompletedTask; - } - - private async Task ProcessReportsQueue() - { - var guild = (await _discordClient.Rest.GetGuildsAsync()).First(); - - _processReportQueueCts?.Cancel(); - _processReportQueueCts?.Dispose(); - _processReportQueueCts = new(); - var token = _processReportQueueCts.Token; - while (!token.IsCancellationRequested) - { - await Task.Delay(TimeSpan.FromSeconds(30)).ConfigureAwait(false); - - if (_discordClient.ConnectionState != ConnectionState.Connected) continue; - var reportChannelId = _configurationService.GetValue(nameof(ServicesConfiguration.DiscordChannelForReports)); - if (reportChannelId == null) continue; - - try - { - using (var scope = _services.CreateScope()) - { - _logger.LogTrace("Checking for Profile Reports"); - var dbContext = scope.ServiceProvider.GetRequiredService(); - if (!dbContext.UserProfileReports.Any()) - { - continue; - } - - var reports = await dbContext.UserProfileReports.ToListAsync().ConfigureAwait(false); - var restChannel = await guild.GetTextChannelAsync(reportChannelId.Value).ConfigureAwait(false); - - foreach (var report in reports) - { - var reportedUser = await dbContext.Users.SingleAsync(u => u.UID == report.ReportedUserUID).ConfigureAwait(false); - var reportedUserLodestone = await dbContext.LodeStoneAuth.SingleOrDefaultAsync(u => u.User.UID == report.ReportedUserUID).ConfigureAwait(false); - var reportingUser = await dbContext.Users.SingleAsync(u => u.UID == report.ReportingUserUID).ConfigureAwait(false); - var reportingUserLodestone = await dbContext.LodeStoneAuth.SingleOrDefaultAsync(u => u.User.UID == report.ReportingUserUID).ConfigureAwait(false); - var reportedUserProfile = await dbContext.UserProfileData.SingleAsync(u => u.UserUID == report.ReportedUserUID).ConfigureAwait(false); - EmbedBuilder eb = new(); - eb.WithTitle("Mare Synchronos Profile Report"); - - StringBuilder reportedUserSb = new(); - StringBuilder reportingUserSb = new(); - reportedUserSb.Append(reportedUser.UID); - reportingUserSb.Append(reportingUser.UID); - if (reportedUserLodestone != null) - { - reportedUserSb.AppendLine($" (<@{reportedUserLodestone.DiscordId}>)"); - } - if (reportingUserLodestone != null) - { - reportingUserSb.AppendLine($" (<@{reportingUserLodestone.DiscordId}>)"); - } - eb.AddField("Reported User", reportedUserSb.ToString()); - eb.AddField("Reporting User", reportingUserSb.ToString()); - eb.AddField("Report Date (UTC)", report.ReportDate); - eb.AddField("Report Reason", string.IsNullOrWhiteSpace(report.ReportReason) ? "-" : report.ReportReason); - eb.AddField("Reported User Profile Description", string.IsNullOrWhiteSpace(reportedUserProfile.UserDescription) ? "-" : reportedUserProfile.UserDescription); - eb.AddField("Reported User Profile Is NSFW", reportedUserProfile.IsNSFW); - - var cb = new ComponentBuilder(); - cb.WithButton("Dismiss Report", customId: $"mare-report-button-dismiss-{reportedUser.UID}", style: ButtonStyle.Primary); - cb.WithButton("Ban profile", customId: $"mare-report-button-banprofile-{reportedUser.UID}", style: ButtonStyle.Secondary); - cb.WithButton("Ban user", customId: $"mare-report-button-banuser-{reportedUser.UID}", style: ButtonStyle.Danger); - cb.WithButton("Dismiss and Ban Reporting user", customId: $"mare-report-button-banreporting-{reportedUser.UID}-{reportingUser.UID}", style: ButtonStyle.Danger); - - if (!string.IsNullOrEmpty(reportedUserProfile.Base64ProfileImage)) - { - var fileName = reportedUser.UID + "_profile_" + Guid.NewGuid().ToString("N") + ".png"; - eb.WithImageUrl($"attachment://{fileName}"); - using MemoryStream ms = new(Convert.FromBase64String(reportedUserProfile.Base64ProfileImage)); - await restChannel.SendFileAsync(ms, fileName, "User Report", embed: eb.Build(), components: cb.Build(), isSpoiler: true).ConfigureAwait(false); - } - else - { - var msg = await restChannel.SendMessageAsync(embed: eb.Build(), components: cb.Build()).ConfigureAwait(false); - } - - dbContext.Remove(report); - } - - await dbContext.SaveChangesAsync().ConfigureAwait(false); - } - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Failed to process reports"); - } - } - } - - private async Task RemoveUsersNotInVanityRole() - { - _vanityUpdateCts?.Cancel(); - _vanityUpdateCts?.Dispose(); - _vanityUpdateCts = new(); - var token = _vanityUpdateCts.Token; - var guild = (await _discordClient.Rest.GetGuildsAsync()).First(); - var commands = await guild.GetApplicationCommandsAsync(); - var appId = await _discordClient.GetApplicationInfoAsync().ConfigureAwait(false); - var vanityCommandId = commands.First(c => c.ApplicationId == appId.Id && c.Name == "setvanityuid").Id; - - while (!token.IsCancellationRequested) - { - try - { - _logger.LogInformation($"Cleaning up Vanity UIDs"); - _logger.LogInformation("Getting application commands from guild {guildName}", guild.Name); - var restGuild = await _discordClient.Rest.GetGuildAsync(guild.Id); - var vanityCommand = await restGuild.GetSlashCommandAsync(vanityCommandId).ConfigureAwait(false); - GuildApplicationCommandPermission commandPermissions = null; - try - { - _logger.LogInformation($"Getting command permissions"); - commandPermissions = await vanityCommand.GetCommandPermission().ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error getting command permissions"); - throw new Exception("Can't get command permissions"); - } - - _logger.LogInformation($"Getting allowed role ids from permissions"); - List allowedRoleIds = new(); - try - { - allowedRoleIds = (from perm in commandPermissions.Permissions where perm.TargetType == ApplicationCommandPermissionTarget.Role where perm.Permission select perm.TargetId).ToList(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error resolving permissions to roles"); - } - - _logger.LogInformation($"Found allowed role ids: {string.Join(", ", allowedRoleIds)}"); - - if (allowedRoleIds.Any()) - { - await using var scope = _services.CreateAsyncScope(); - await using (var db = scope.ServiceProvider.GetRequiredService()) - { - var aliasedUsers = await db.LodeStoneAuth.Include("User") - .Where(c => c.User != null && !string.IsNullOrEmpty(c.User.Alias)).ToListAsync().ConfigureAwait(false); - var aliasedGroups = await db.Groups.Include(u => u.Owner) - .Where(c => !string.IsNullOrEmpty(c.Alias)).ToListAsync().ConfigureAwait(false); - - foreach (var lodestoneAuth in aliasedUsers) - { - var discordUser = await restGuild.GetUserAsync(lodestoneAuth.DiscordId).ConfigureAwait(false); - _logger.LogInformation($"Checking User: {lodestoneAuth.DiscordId}, {lodestoneAuth.User.UID} ({lodestoneAuth.User.Alias}), User in Roles: {string.Join(", ", discordUser?.RoleIds ?? new List())}"); - - if (discordUser == null || !discordUser.RoleIds.Any(u => allowedRoleIds.Contains(u))) - { - _logger.LogInformation($"User {lodestoneAuth.User.UID} not in allowed roles, deleting alias"); - lodestoneAuth.User.Alias = null; - var secondaryUsers = await db.Auth.Include(u => u.User).Where(u => u.PrimaryUserUID == lodestoneAuth.User.UID).ToListAsync().ConfigureAwait(false); - foreach (var secondaryUser in secondaryUsers) - { - _logger.LogInformation($"Secondary User {secondaryUser.User.UID} not in allowed roles, deleting alias"); - - secondaryUser.User.Alias = null; - db.Update(secondaryUser.User); - } - db.Update(lodestoneAuth.User); - } - - await db.SaveChangesAsync().ConfigureAwait(false); - await Task.Delay(1000); - } - - foreach (var group in aliasedGroups) - { - var lodestoneUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(f => f.User.UID == group.OwnerUID).ConfigureAwait(false); - RestGuildUser discordUser = null; - if (lodestoneUser != null) - { - discordUser = await restGuild.GetUserAsync(lodestoneUser.DiscordId).ConfigureAwait(false); - } - - _logger.LogInformation($"Checking Group: {group.GID}, owned by {lodestoneUser?.User?.UID ?? string.Empty} ({lodestoneUser?.User?.Alias ?? string.Empty}), User in Roles: {string.Join(", ", discordUser?.RoleIds ?? new List())}"); - - if (lodestoneUser == null || discordUser == null || !discordUser.RoleIds.Any(u => allowedRoleIds.Contains(u))) - { - _logger.LogInformation($"User {lodestoneUser.User.UID} not in allowed roles, deleting group alias"); - group.Alias = null; - db.Update(group); - } - - await db.SaveChangesAsync().ConfigureAwait(false); - await Task.Delay(1000); - } - } - } - else - { - _logger.LogInformation("No roles for command defined, no cleanup performed"); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Something failed during checking vanity user uids"); - } - - _logger.LogInformation("Vanity UID cleanup complete"); - await Task.Delay(TimeSpan.FromHours(12), _vanityUpdateCts.Token).ConfigureAwait(false); - } - } - - private async Task UpdateStatusAsync() - { - _updateStatusCts = new(); - while (!_updateStatusCts.IsCancellationRequested) - { - var endPoint = _connectionMultiplexer.GetEndPoints().First(); - var onlineUsers = await _connectionMultiplexer.GetServer(endPoint).KeysAsync(pattern: "UID:*").CountAsync(); - - //_logger.LogInformation("Users online: " + onlineUsers); - await _discordClient.SetActivityAsync(new Game("with " + onlineUsers + " Users")).ConfigureAwait(false); - await Task.Delay(TimeSpan.FromSeconds(15)).ConfigureAwait(false); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServices/Discord/DiscordBotServices.cs b/MareSynchronosServer/MareSynchronosServices/Discord/DiscordBotServices.cs deleted file mode 100644 index 7c8cc94..0000000 --- a/MareSynchronosServer/MareSynchronosServices/Discord/DiscordBotServices.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Collections.Concurrent; -using MareSynchronosShared.Metrics; - -namespace MareSynchronosServices.Discord; - -public class DiscordBotServices -{ - public readonly string[] LodestoneServers = new[] { "eu", "na", "jp", "fr", "de" }; - public ConcurrentDictionary DiscordLodestoneMapping = new(); - public ConcurrentDictionary DiscordRelinkLodestoneMapping = new(); - public ConcurrentDictionary LastVanityChange = new(); - public ConcurrentDictionary LastVanityGidChange = new(); - private readonly IServiceProvider _serviceProvider; - private CancellationTokenSource? verificationTaskCts; - - public DiscordBotServices(IServiceProvider serviceProvider, ILogger logger, MareMetrics metrics) - { - _serviceProvider = serviceProvider; - Logger = logger; - Metrics = metrics; - } - - public ILogger Logger { get; init; } - public MareMetrics Metrics { get; init; } - public ConcurrentQueue>> VerificationQueue { get; } = new(); - - public Task Start() - { - _ = ProcessVerificationQueue(); - return Task.CompletedTask; - } - - public Task Stop() - { - verificationTaskCts?.Cancel(); - return Task.CompletedTask; - } - - private async Task ProcessVerificationQueue() - { - verificationTaskCts = new CancellationTokenSource(); - while (!verificationTaskCts.IsCancellationRequested) - { - if (VerificationQueue.TryDequeue(out var queueitem)) - { - try - { - queueitem.Value.Invoke(_serviceProvider); - - Logger.LogInformation("Sent login information to user"); - } - catch (Exception e) - { - Logger.LogError(e, "Error during queue work"); - } - } - - await Task.Delay(TimeSpan.FromSeconds(2), verificationTaskCts.Token).ConfigureAwait(false); - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServices/Discord/MareModule.cs b/MareSynchronosServer/MareSynchronosServices/Discord/MareModule.cs deleted file mode 100644 index 5eed682..0000000 --- a/MareSynchronosServer/MareSynchronosServices/Discord/MareModule.cs +++ /dev/null @@ -1,1260 +0,0 @@ -using Discord; -using Discord.Interactions; -using MareSynchronosShared.Data; -using System.Text.RegularExpressions; -using Microsoft.EntityFrameworkCore; -using Discord.WebSocket; -using Prometheus; -using MareSynchronosShared.Models; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Services; -using StackExchange.Redis; -using MareSynchronos.API.Data.Enum; -using System.Net.Http.Headers; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosServices.Discord; - -public class LodestoneModal : IModal -{ - public string Title => "Verify with Lodestone"; - - [InputLabel("Enter the Lodestone URL of your Character")] - [ModalTextInput("lodestone_url", TextInputStyle.Short, "https://*.finalfantasyxiv.com/lodestone/character//")] - public string LodestoneUrl { get; set; } -} - -public class MareModule : InteractionModuleBase -{ - private readonly ILogger _logger; - private readonly IServiceProvider _services; - private readonly DiscordBotServices _botServices; - private readonly IConfigurationService _mareClientConfigurationService; - private readonly IConfigurationService _mareServicesConfiguration; - private readonly IConnectionMultiplexer _connectionMultiplexer; - private readonly ServerTokenGenerator _serverTokenGenerator; - private Random random = new(); - - public MareModule(ILogger logger, IServiceProvider services, DiscordBotServices botServices, - IConfigurationService mareClientConfigurationService, - IConfigurationService mareServicesConfiguration, - IConnectionMultiplexer connectionMultiplexer, ServerTokenGenerator serverTokenGenerator) - { - _logger = logger; - _services = services; - _botServices = botServices; - _mareClientConfigurationService = mareClientConfigurationService; - _mareServicesConfiguration = mareServicesConfiguration; - _connectionMultiplexer = connectionMultiplexer; - _serverTokenGenerator = serverTokenGenerator; - } - - //[SlashCommand("register", "Starts the registration process")] - public async Task Register([Summary("overwrite", "Overwrites your old account")] bool overwrite = false) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(Register), - string.Join(",", new[] { $"{nameof(overwrite)}:{overwrite}" })); - - try - { - if (overwrite) - { - await DeletePreviousUserAccount(Context.User.Id).ConfigureAwait(false); - } - - using var scope = _services.CreateScope(); - using var db = scope.ServiceProvider.GetService(); - - if (db.LodeStoneAuth.Any(a => a.DiscordId == Context.User.Id)) - { - EmbedBuilder eb = new(); - // user already in db - eb.WithTitle("Registration failed"); - eb.WithDescription("You are already registered. Use `/recover overwrite` to delete your old account and create a new one."); - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - else - { - // Umbra - Register immediately - var user = new User(); - - var hasValidUid = false; - while (!hasValidUid) - { - var uid = StringUtils.GenerateRandomString(7); - if (db.Users.Any(u => u.UID == uid || u.Alias == uid)) continue; - user.UID = uid; - hasValidUid = true; - } - - user.LastLoggedIn = DateTime.UtcNow; - - var computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - - var auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = user, - }; - - LodeStoneAuth lsAuth = new LodeStoneAuth() - { - DiscordId = Context.User.Id, - HashedLodestoneId = null, - LodestoneAuthString = null, - User = user, - StartedAt = null - }; - - await db.Users.AddAsync(user).ConfigureAwait(false); - await db.Auth.AddAsync(auth).ConfigureAwait(false); - await db.LodeStoneAuth.AddAsync(lsAuth).ConfigureAwait(false); - await db.SaveChangesAsync().ConfigureAwait(false); - - _botServices.Logger.LogInformation("User registered: {userUID}", user.UID); - - EmbedBuilder eb = new(); - - eb.WithTitle("Registration successful"); - eb.WithDescription("This is your private secret key. Do not share this private secret key with anyone. **If you lose it, it is irrevocably lost.**" - + Environment.NewLine + Environment.NewLine - + $"**{computedHash}**" - + Environment.NewLine + Environment.NewLine - + "Enter this key in Umbra Sync and hit Connect / Reconnect." - + Environment.NewLine - + "Have fun."); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - //[SlashCommand("createsecondaryuid", "Creates a new Secret Key to be used for alts")] - public async Task AddSecondary() - { - try - { - var embed = await HandleAddSecondary(Context.User.Id).ConfigureAwait(false); - await RespondAsync(embeds: new[] { embed }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - //[SlashCommand("setvanityuid", "Sets your Vanity UID.")] - public async Task SetVanityUid([Summary("vanity_uid", "Desired Vanity UID")] string vanityUid, - [Summary("secondary_uid", "Will set the vanity UID for a secondary UID")] string? secondaryUid = null) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(SetVanityUid), - string.Join(",", new[] { $"{nameof(vanityUid)}:{vanityUid}" })); - - try - { - EmbedBuilder eb = new(); - - eb = await HandleVanityUid(eb, Context.User.Id, vanityUid, secondaryUid); - - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - //[SlashCommand("setsyncshellvanityid", "Sets a Vanity GID for a Syncshell")] - public async Task SetSyncshellVanityId( - [Summary("syncshell_id", "Syncshell ID")] string syncshellId, - [Summary("vanity_syncshell_id", "Desired Vanity Syncshell ID")] string vanityId) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(SetSyncshellVanityId), - string.Join(",", new[] { $"{nameof(syncshellId)}:{syncshellId}", $"{nameof(vanityId)}:{vanityId}" })); - - try - { - EmbedBuilder eb = new(); - - eb = await HandleVanityGid(eb, Context.User.Id, syncshellId, vanityId); - - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - // Umbra - Disable /verify command - //[SlashCommand("verify", "Finishes the registration process for the Mare Synchronos server of this Discord")] - public async Task Verify() - { - _logger.LogInformation("SlashCommand:{userId}:{Method}", - Context.Interaction.User.Id, nameof(Verify)); - try - { - EmbedBuilder eb = new(); - if (_botServices.VerificationQueue.Any(u => u.Key == Context.User.Id)) - { - eb.WithTitle("Already queued for verfication"); - eb.WithDescription("You are already queued for verification. Please wait."); - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - else if (!_botServices.DiscordLodestoneMapping.ContainsKey(Context.User.Id)) - { - eb.WithTitle("Cannot verify registration"); - eb.WithDescription("You need to **/register** first before you can **/verify**" + Environment.NewLine + "If your registration got stuck for some reason, use **/register overwrite:true**"); - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - else - { - await DeferAsync(ephemeral: true).ConfigureAwait(false); - _botServices.VerificationQueue.Enqueue(new KeyValuePair>(Context.User.Id, async (sp) => await HandleVerifyAsync((SocketSlashCommand)Context.Interaction, sp))); - } - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - // Umbra - Disable /verify command - //[SlashCommand("verify_relink", "Finishes the relink process for your user on the Mare Synchronos server of this Discord")] - public async Task VerifyRelink() - { - _logger.LogInformation("SlashCommand:{userId}:{Method}", - Context.Interaction.User.Id, nameof(VerifyRelink)); - - try - { - EmbedBuilder eb = new(); - if (_botServices.VerificationQueue.Any(u => u.Key == Context.User.Id)) - { - eb.WithTitle("Already queued for verfication"); - eb.WithDescription("You are already queued for verification. Please wait."); - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - else if (!_botServices.DiscordRelinkLodestoneMapping.ContainsKey(Context.User.Id)) - { - eb.WithTitle("Cannot verify relink"); - eb.WithDescription("You need to **/relink** first before you can **/verify_relink**"); - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - else - { - await DeferAsync(ephemeral: true).ConfigureAwait(false); - _botServices.VerificationQueue.Enqueue(new KeyValuePair>(Context.User.Id, async (sp) => await HandleVerifyRelinkAsync((SocketSlashCommand)Context.Interaction, sp))); - } - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - - } - - //[SlashCommand("recover", "Allows you to recover your account by generating a new secret key")] - public async Task Recover([Summary("secondary_uid", "(Optional) Your secondary UID")] string? secondaryUid = null) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}", - Context.Interaction.User.Id, nameof(Recover)); - - await RespondWithModalAsync($"recover_modal:{secondaryUid ?? "-1"}").ConfigureAwait(false); - } - - [SlashCommand("userinfo", "Shows you your user information")] - public async Task UserInfo([Summary("secondary_uid", "(Optional) Your secondary UID")] string? secondaryUid = null, - [Summary("discord_user", "ADMIN ONLY: Discord User to check for")] IUser? discordUser = null, - [Summary("uid", "ADMIN ONLY: UID to check for")] string? uid = null) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}", - Context.Interaction.User.Id, nameof(UserInfo)); - - try - { - EmbedBuilder eb = new(); - - eb = await HandleUserInfo(eb, Context.User.Id, secondaryUid, discordUser?.Id ?? null, uid); - - await RespondAsync(embeds: new[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - //[SlashCommand("relink", "Allows you to link a new Discord account to an existing Mare account")] - public async Task Relink() - { - _logger.LogInformation("SlashCommand:{userId}:{Method}", - Context.Interaction.User.Id, nameof(Relink)); - await RespondWithModalAsync("relink_modal").ConfigureAwait(false); - } - - [SlashCommand("useradd", "ADMIN ONLY: add a user unconditionally to the Database")] - public async Task UserAdd([Summary("desired_uid", "Desired UID")] string desiredUid) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}:{params}", - Context.Interaction.User.Id, nameof(UserAdd), - string.Join(",", new[] { $"{nameof(desiredUid)}:{desiredUid}" })); - - try - { - var embed = await HandleUserAdd(desiredUid, Context.User.Id); - - await RespondAsync(embeds: new[] { embed }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - [SlashCommand("message", "ADMIN ONLY: sends a message to clients")] - public async Task SendMessageToClients([Summary("message", "Message to send")] string message, - [Summary("severity", "Severity of the message")] MessageSeverity messageType = MessageSeverity.Information, - [Summary("uid", "User ID to the person to send the message to")] string? uid = null) - { - _logger.LogInformation("SlashCommand:{userId}:{Method}:{message}:{type}:{uid}", Context.Interaction.User.Id, nameof(SendMessageToClients), message, messageType, uid); - - using var scope = _services.CreateScope(); - using var db = scope.ServiceProvider.GetService(); - - if (!(await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(a => a.DiscordId == Context.Interaction.User.Id))?.User?.IsAdmin ?? true) - { - await RespondAsync("No permission", ephemeral: true).ConfigureAwait(false); - return; - } - - if (!string.IsNullOrEmpty(uid) && !await db.Users.AnyAsync(u => u.UID == uid)) - { - await RespondAsync("Specified UID does not exist", ephemeral: true).ConfigureAwait(false); - return; - } - - try - { - using HttpClient c = new HttpClient(); - c.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); - await c.PostAsJsonAsync(new Uri(_mareServicesConfiguration.GetValue - (nameof(ServicesConfiguration.MainServerAddress)), "/msgc/sendMessage"), new ClientMessage(messageType, message, uid ?? string.Empty)) - .ConfigureAwait(false); - - var discordChannelForMessages = _mareServicesConfiguration.GetValueOrDefault(nameof(ServicesConfiguration.DiscordChannelForMessages), null); - if (uid == null && discordChannelForMessages != null) - { - var discordChannel = await Context.Guild.GetChannelAsync(discordChannelForMessages.Value) as IMessageChannel; - if (discordChannel != null) - { - var embedColor = messageType switch - { - MessageSeverity.Information => Color.Blue, - MessageSeverity.Warning => new Color(255, 255, 0), - MessageSeverity.Error => Color.Red, - _ => Color.Blue - }; - - EmbedBuilder eb = new(); - eb.WithTitle(messageType + " server message"); - eb.WithColor(embedColor); - eb.WithDescription(message); - - await discordChannel.SendMessageAsync(embed: eb.Build()); - } - } - - await RespondAsync("Message sent", ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - await RespondAsync("Failed to send message: " + ex.ToString(), ephemeral: true).ConfigureAwait(false); - } - } - - //[ModalInteraction("recover_modal:*")] - public async Task RecoverModal(string? secondaryUid, LodestoneModal modal) - { - _logger.LogInformation("Modal:{userId}:{Method}", - Context.Interaction.User.Id, nameof(RecoverModal)); - - if (secondaryUid == "-1") secondaryUid = null; - - try - { - var embed = await HandleRecoverModalAsync(modal, Context.User.Id, secondaryUid).ConfigureAwait(false); - await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - //[ModalInteraction("register_modal")] - public async Task RegisterModal(LodestoneModal modal) - { - _logger.LogInformation("Modal:{userId}:{Method}", - Context.Interaction.User.Id, nameof(RegisterModal)); - - try - { - var embed = await HandleRegisterModalAsync(modal, Context.User.Id).ConfigureAwait(false); - await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - //[ModalInteraction("relink_modal")] - public async Task RelinkModal(LodestoneModal modal) - { - _logger.LogInformation("Modal:{userId}:{Method}", - Context.Interaction.User.Id, nameof(RelinkModal)); - - try - { - var embed = await HandleRelinkModalAsync(modal, Context.User.Id).ConfigureAwait(false); - await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false); - } - catch (Exception ex) - { - EmbedBuilder eb = new(); - eb.WithTitle("An error occured"); - eb.WithDescription("Please report this error to bug-reports: " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); - - await RespondAsync(embeds: new Embed[] { eb.Build() }, ephemeral: true).ConfigureAwait(false); - } - } - - public async Task HandleAddSecondary(ulong discordUserId) - { - var embed = new EmbedBuilder(); - - using var scope = _services.CreateScope(); - using var db = scope.ServiceProvider.GetService(); - - var lodestoneAuth = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(a => a.DiscordId == discordUserId).ConfigureAwait(false); - if (lodestoneAuth == null) - { - embed.WithTitle("Failed to add secondary user"); - embed.WithDescription("You have no registered account yet. Register an account first before trying to add secondary keys."); - return embed.Build(); - } - - var secondaryCount = await db.Auth.CountAsync(u => u.PrimaryUserUID == lodestoneAuth.User.UID).ConfigureAwait(false); - if (await db.Auth.CountAsync(u => u.PrimaryUserUID == lodestoneAuth.User.UID).ConfigureAwait(false) >= 25) - { - embed.WithTitle("Failed to add secondary user"); - embed.WithDescription("You already made 25 secondary UIDs, which is the limit."); - return embed.Build(); - } - - User newUser = new() - { - IsAdmin = false, - IsModerator = false, - LastLoggedIn = DateTime.UtcNow, - }; - - var hasValidUid = false; - while (!hasValidUid) - { - var uid = StringUtils.GenerateRandomString(7); - if (await db.Users.AnyAsync(u => u.UID == uid || u.Alias == uid).ConfigureAwait(false)) continue; - newUser.UID = uid; - hasValidUid = true; - } - - var computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - var auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = newUser, - PrimaryUserUID = lodestoneAuth.User.UID, - UserUID = newUser.UID - }; - - await db.Users.AddAsync(newUser).ConfigureAwait(false); - await db.Auth.AddAsync(auth).ConfigureAwait(false); - - await db.SaveChangesAsync().ConfigureAwait(false); - - embed.WithTitle("Secondary UID created"); - embed.AddField("UID", newUser.UID); - embed.AddField("Secret Key", computedHash); - embed.AddField("Secondary UIDs", $"You now have {secondaryCount + 1}/25 secondary UIDs"); - - return embed.Build(); - } - - public async Task HandleUserAdd(string desiredUid, ulong discordUserId) - { - var embed = new EmbedBuilder(); - - using var scope = _services.CreateScope(); - using var db = scope.ServiceProvider.GetService(); - if (!(await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(a => a.DiscordId == discordUserId))?.User?.IsAdmin ?? true) - { - embed.WithTitle("Failed to add user"); - embed.WithDescription("No permission"); - } - else if (db.Users.Any(u => u.UID == desiredUid || u.Alias == desiredUid)) - { - embed.WithTitle("Failed to add user"); - embed.WithDescription("Already in Database"); - } - else - { - User newUser = new() - { - IsAdmin = false, - IsModerator = false, - LastLoggedIn = DateTime.UtcNow, - UID = desiredUid, - }; - - var computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - var auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = newUser, - }; - - await db.Users.AddAsync(newUser); - await db.Auth.AddAsync(auth); - - await db.SaveChangesAsync(); - - embed.WithTitle("Successfully added " + desiredUid); - embed.WithDescription("Secret Key: " + computedHash); - } - - return embed.Build(); - } - - private async Task HandleUserInfo(EmbedBuilder eb, ulong id, string? secondaryUserUid = null, ulong? optionalUser = null, string? uid = null) - { - bool showForSecondaryUser = secondaryUserUid != null; - using var scope = _services.CreateScope(); - await using var db = scope.ServiceProvider.GetRequiredService(); - - var primaryUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == id).ConfigureAwait(false); - - ulong userToCheckForDiscordId = id; - - if (primaryUser == null) - { - eb.WithTitle("No account"); - eb.WithDescription("No account was found associated to your Discord user"); - return eb; - } - - bool isAdminCall = primaryUser.User.IsModerator || primaryUser.User.IsAdmin; - - if ((optionalUser != null || uid != null) && !isAdminCall) - { - eb.WithTitle("Unauthorized"); - eb.WithDescription("You are not authorized to view another users' information"); - return eb; - } - else if ((optionalUser != null || uid != null) && isAdminCall) - { - LodeStoneAuth userInDb = null; - if (optionalUser != null) - { - userInDb = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == optionalUser).ConfigureAwait(false); - } - else if (uid != null) - { - userInDb = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.User.UID == uid || u.User.Alias == uid).ConfigureAwait(false); - } - - if (userInDb == null) - { - eb.WithTitle("No account"); - eb.WithDescription("The Discord user has no valid account"); - return eb; - } - - userToCheckForDiscordId = userInDb.DiscordId; - } - - var lodestoneUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == userToCheckForDiscordId).ConfigureAwait(false); - var dbUser = lodestoneUser.User; - if (showForSecondaryUser) - { - dbUser = (await db.Auth.Include(u => u.User).SingleOrDefaultAsync(u => u.PrimaryUserUID == dbUser.UID && u.UserUID == secondaryUserUid))?.User; - if (dbUser == null) - { - eb.WithTitle("No such secondary UID"); - eb.WithDescription($"A secondary UID {secondaryUserUid} was not found attached to your primary UID {primaryUser.User.UID}."); - return eb; - } - } - - var auth = await db.Auth.Include(u => u.PrimaryUser).SingleOrDefaultAsync(u => u.UserUID == dbUser.UID).ConfigureAwait(false); - var groups = await db.Groups.Where(g => g.OwnerUID == dbUser.UID).ToListAsync().ConfigureAwait(false); - var groupsJoined = await db.GroupPairs.Where(g => g.GroupUserUID == dbUser.UID).ToListAsync().ConfigureAwait(false); - var identity = await _connectionMultiplexer.GetDatabase().StringGetAsync("UID:" + dbUser.UID).ConfigureAwait(false); - - eb.WithTitle("User Information"); - eb.WithDescription("This is the user information for Discord User <@" + userToCheckForDiscordId + ">" + Environment.NewLine + Environment.NewLine - + "If you want to verify your secret key is valid, go to https://emn178.github.io/online-tools/sha256.html and copy your secret key into there and compare it to the Hashed Secret Key provided below."); - eb.AddField("UID", dbUser.UID); - if (!string.IsNullOrEmpty(dbUser.Alias)) - { - eb.AddField("Vanity UID", dbUser.Alias); - } - if (showForSecondaryUser) - { - eb.AddField("Primary UID for " + dbUser.UID, auth.PrimaryUserUID); - } - else - { - var secondaryUIDs = await db.Auth.Where(p => p.PrimaryUserUID == dbUser.UID).Select(p => p.UserUID).ToListAsync(); - if (secondaryUIDs.Any()) - { - eb.AddField("Secondary UIDs", string.Join(Environment.NewLine, secondaryUIDs)); - } - } - eb.AddField("Last Online (UTC)", dbUser.LastLoggedIn.ToString("U")); - eb.AddField("Currently online ", !string.IsNullOrEmpty(identity)); - eb.AddField("Hashed Secret Key", auth.HashedKey); - eb.AddField("Joined Syncshells", groupsJoined.Count); - eb.AddField("Owned Syncshells", groups.Count); - foreach (var group in groups) - { - var syncShellUserCount = await db.GroupPairs.CountAsync(g => g.GroupGID == group.GID).ConfigureAwait(false); - if (!string.IsNullOrEmpty(group.Alias)) - { - eb.AddField("Owned Syncshell " + group.GID + " Vanity ID", group.Alias); - } - eb.AddField("Owned Syncshell " + group.GID + " User Count", syncShellUserCount); - } - - if (isAdminCall && !string.IsNullOrEmpty(identity)) - { - eb.AddField("Character Ident", identity); - } - - return eb; - } - - private async Task HandleRecoverModalAsync(LodestoneModal arg, ulong userid, string? secondaryUid) - { - var embed = new EmbedBuilder(); - - var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.LodestoneUrl); - if (lodestoneId == null) - { - embed.WithTitle("Invalid Lodestone URL"); - embed.WithDescription("The lodestone URL was not valid. It should have following format:" + Environment.NewLine - + "https://eu.finalfantasyxiv.com/lodestone/character/YOUR_LODESTONE_ID/"); - } - else - { - using var scope = _services.CreateScope(); - - var hashedLodestoneId = StringUtils.Sha256String(lodestoneId.ToString()); - - await using var db = scope.ServiceProvider.GetService(); - var existingLodestoneAuth = await db.LodeStoneAuth.Include("User") - .FirstOrDefaultAsync(a => a.DiscordId == userid && a.HashedLodestoneId == hashedLodestoneId) - .ConfigureAwait(false); - - if (existingLodestoneAuth == null || existingLodestoneAuth.User == null) - { - embed.WithTitle("Recovery failed"); - embed.WithDescription("This DiscordID or Lodestone account pair does not exist."); - } - else - { - string computedHash = string.Empty; - Auth auth; - if (string.IsNullOrEmpty(secondaryUid)) - { - var previousAuth = await db.Auth.FirstOrDefaultAsync(u => u.UserUID == existingLodestoneAuth.User.UID); - if (previousAuth != null) - { - db.Auth.Remove(previousAuth); - } - - computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = existingLodestoneAuth.User, - }; - - await db.Auth.AddAsync(auth).ConfigureAwait(false); - } - else - { - var previousAuth = await db.Auth.Include(u => u.User).FirstOrDefaultAsync(u => u.PrimaryUserUID == existingLodestoneAuth.User.UID && u.UserUID == secondaryUid).ConfigureAwait(false); - if (previousAuth == null) - { - embed.WithTitle("Recovery failed"); - embed.WithDescription("This DiscordID has no secondary UID " + secondaryUid); - - return embed.Build(); - } - - db.Auth.Remove(previousAuth); - - computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = previousAuth.User, - PrimaryUserUID = existingLodestoneAuth.User.UID - }; - } - - embed.WithTitle("Recovery successful"); - embed.WithDescription("This is your new private secret key. Do not share this private secret key with anyone. **If you lose it, it is irrevocably lost.**" - + Environment.NewLine + Environment.NewLine - + $"**{computedHash}**" - + Environment.NewLine + Environment.NewLine - + "Enter this key in Umbra Sync and hit save to connect to the service."); - - await db.Auth.AddAsync(auth).ConfigureAwait(false); - await db.SaveChangesAsync().ConfigureAwait(false); - } - } - - return embed.Build(); - } - - private async Task HandleRegisterModalAsync(LodestoneModal arg, ulong userid) - { - var embed = new EmbedBuilder(); - - var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.LodestoneUrl); - if (lodestoneId == null) - { - embed.WithTitle("Invalid Lodestone URL"); - embed.WithDescription("The lodestone URL was not valid. It should have following format:" + Environment.NewLine - + "https://eu.finalfantasyxiv.com/lodestone/character/YOUR_LODESTONE_ID/"); - } - else - { - // check if userid is already in db - using var scope = _services.CreateScope(); - - var hashedLodestoneId = StringUtils.Sha256String(lodestoneId.ToString()); - - using var db = scope.ServiceProvider.GetService(); - - // check if discord id or lodestone id is banned - if (db.BannedRegistrations.Any(a => a.DiscordIdOrLodestoneAuth == userid.ToString() || a.DiscordIdOrLodestoneAuth == hashedLodestoneId)) - { - embed.WithTitle("no"); - embed.WithDescription("your account is banned"); - } - else if (db.LodeStoneAuth.Any(a => a.DiscordId == userid)) - { - // user already in db - embed.WithTitle("Registration failed"); - embed.WithDescription("You cannot register more than one lodestone character to your discord account."); - } - else if (db.LodeStoneAuth.Any(a => a.HashedLodestoneId == hashedLodestoneId)) - { - // character already in db - embed.WithTitle("Registration failed"); - embed.WithDescription("This lodestone character already exists in the Database. If you want to attach this character to your current Discord account use **/relink**."); - } - else - { - string lodestoneAuth = await GenerateLodestoneAuth(userid, hashedLodestoneId, db).ConfigureAwait(false); - // check if lodestone id is already in db - embed.WithTitle("Authorize your character"); - embed.WithDescription("Add following key to your character profile at https://na.finalfantasyxiv.com/lodestone/my/setting/profile/" - + Environment.NewLine + Environment.NewLine - + $"**{lodestoneAuth}**" - + Environment.NewLine + Environment.NewLine - + $"**! THIS IS NOT THE KEY YOU HAVE TO ENTER IN MARE !**" - + Environment.NewLine + Environment.NewLine - + "Once added and saved, use command **/verify** to finish registration and receive a secret key to use for Mare Synchronos." - + Environment.NewLine - + "__You can delete the entry from your profile after verification.__" - + Environment.NewLine + Environment.NewLine - + "The verification will expire in approximately 15 minutes. If you fail to **/verify** the registration will be invalidated and you have to **/register** again."); - _botServices.DiscordLodestoneMapping[userid] = lodestoneId.ToString(); - } - } - - return embed.Build(); - } - - private async Task HandleRelinkModalAsync(LodestoneModal arg, ulong userid) - { - var embed = new EmbedBuilder(); - - var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.LodestoneUrl); - if (lodestoneId == null) - { - embed.WithTitle("Invalid Lodestone URL"); - embed.WithDescription("The lodestone URL was not valid. It should have following format:" + Environment.NewLine - + "https://eu.finalfantasyxiv.com/lodestone/character/YOUR_LODESTONE_ID/"); - } - else - { - // check if userid is already in db - using var scope = _services.CreateScope(); - - var hashedLodestoneId = StringUtils.Sha256String(lodestoneId.ToString()); - - using var db = scope.ServiceProvider.GetService(); - - // check if discord id or lodestone id is banned - if (db.BannedRegistrations.Any(a => a.DiscordIdOrLodestoneAuth == userid.ToString() || a.DiscordIdOrLodestoneAuth == hashedLodestoneId)) - { - embed.WithTitle("no"); - embed.WithDescription("your account is banned"); - } - else if (db.LodeStoneAuth.Any(a => a.DiscordId == userid)) - { - // user already in db - embed.WithTitle("Relink failed"); - embed.WithDescription("You cannot register more than one lodestone character to your discord account."); - } - else if (!db.LodeStoneAuth.Any(a => a.HashedLodestoneId == hashedLodestoneId)) - { - // character already in db - embed.WithTitle("Relink failed"); - embed.WithDescription("This lodestone character does not exist in the database."); - } - else - { - string lodestoneAuth = await GenerateLodestoneAuth(userid, hashedLodestoneId, db).ConfigureAwait(false); - // check if lodestone id is already in db - embed.WithTitle("Authorize your character for relinking"); - embed.WithDescription("Add following key to your character profile at https://na.finalfantasyxiv.com/lodestone/my/setting/profile/" - + Environment.NewLine + Environment.NewLine - + $"**{lodestoneAuth}**" - + Environment.NewLine + Environment.NewLine - + $"**! THIS IS NOT THE KEY YOU HAVE TO ENTER IN MARE !**" - + Environment.NewLine + Environment.NewLine - + "Once added and saved, use command **/verify_relink** to finish relink and receive a new secret key to use for Mare Synchronos." - + Environment.NewLine - + "__You can delete the entry from your profile after verification.__" - + Environment.NewLine + Environment.NewLine - + "The verification will expire in approximately 15 minutes. If you fail to **/verify_relink** the relink will be invalidated and you have to **/relink** again."); - _botServices.DiscordRelinkLodestoneMapping[userid] = lodestoneId.ToString(); - } - } - - return embed.Build(); - } - - private async Task GenerateLodestoneAuth(ulong discordid, string hashedLodestoneId, MareDbContext dbContext) - { - var auth = StringUtils.GenerateRandomString(32); - LodeStoneAuth lsAuth = new LodeStoneAuth() - { - DiscordId = discordid, - HashedLodestoneId = hashedLodestoneId, - LodestoneAuthString = auth, - StartedAt = DateTime.UtcNow - }; - - dbContext.Add(lsAuth); - await dbContext.SaveChangesAsync().ConfigureAwait(false); - - return auth; - } - - private int? ParseCharacterIdFromLodestoneUrl(string lodestoneUrl) - { - var regex = new Regex(@"https:\/\/(na|eu|de|fr|jp)\.finalfantasyxiv\.com\/lodestone\/character\/\d+"); - var matches = regex.Match(lodestoneUrl); - var isLodestoneUrl = matches.Success; - if (!isLodestoneUrl || matches.Groups.Count < 1) return null; - - lodestoneUrl = matches.Groups[0].ToString(); - var stringId = lodestoneUrl.Split('/', StringSplitOptions.RemoveEmptyEntries).Last(); - if (!int.TryParse(stringId, out int lodestoneId)) - { - return null; - } - - return lodestoneId; - } - - private async Task HandleVanityUid(EmbedBuilder eb, ulong id, string newUid, string? secondaryUid) - { - if (_botServices.LastVanityChange.TryGetValue(id, out var lastChange)) - { - var timeRemaining = DateTime.UtcNow.Subtract(lastChange); - if (timeRemaining.TotalHours < 24) - { - eb.WithTitle(("Failed to set Vanity UID")); - eb.WithDescription( - $"You can only change your vanity UID once every 24h. Your last change is {timeRemaining} ago."); - } - } - - Regex rgx = new(@"^[_\-a-zA-Z0-9]{5,15}$", RegexOptions.ECMAScript); - if (!rgx.Match(newUid).Success || newUid.Length < 5 || newUid.Length > 15) - { - eb.WithTitle("Failed to set Vanity UID"); - eb.WithDescription("The Vanity UID must be between 5 and 15 characters and only contain letters A-Z, numbers 0-9, as well as - and _."); - return eb; - } - - using var scope = _services.CreateScope(); - await using var db = scope.ServiceProvider.GetRequiredService(); - - var lodestoneUser = await db.LodeStoneAuth.Include("User").SingleOrDefaultAsync(u => u.DiscordId == id).ConfigureAwait(false); - if (lodestoneUser == null) - { - eb.WithTitle("Failed to set Vanity UID"); - eb.WithDescription("You do not have a registered account on this server."); - return eb; - } - - var uidExists = await db.Users.AnyAsync(u => u.UID == newUid || u.Alias == newUid).ConfigureAwait(false); - if (uidExists) - { - eb.WithTitle("Failed to set Vanity UID"); - eb.WithDescription("This UID is already taken."); - return eb; - } - - if (secondaryUid != null) - { - var secondaryUser = await db.Auth.Include(u => u.PrimaryUser).Include(u => u.User) - .SingleOrDefaultAsync(u => u.UserUID == secondaryUid && u.PrimaryUserUID == lodestoneUser.User.UID).ConfigureAwait(false); - if (secondaryUser == null) - { - eb.WithTitle("No secondary UID found"); - eb.WithDescription($"Did not find a secondary UID {secondaryUid} attached to your primary UID {lodestoneUser.User.UID}"); - return eb; - } - - secondaryUser.User.Alias = newUid; - db.Update(secondaryUser); - - eb.WithTitle("Vanity UID set"); - eb.WithDescription($"Your Vanity UID for the secondary UID {secondaryUid} was set to **{newUid}**." - + Environment.NewLine + "For those changes to apply you will have to reconnect to Mare."); - } - else - { - var user = lodestoneUser.User; - user.Alias = newUid; - db.Update(user); - - eb.WithTitle("Vanity UID set"); - eb.WithDescription("Your Vanity UID was set to **" + newUid + "**." - + Environment.NewLine + "For those changes to apply you will have to reconnect to Mare."); - } - - await db.SaveChangesAsync(); - - _botServices.LastVanityChange[id] = DateTime.UtcNow; - return eb; - } - - private async Task HandleVanityGid(EmbedBuilder eb, ulong id, string oldGid, string newGid) - { - if (_botServices.LastVanityGidChange.TryGetValue(oldGid, out var lastChange)) - { - var dateTimeDiff = DateTime.UtcNow.Subtract(lastChange); - if (dateTimeDiff.TotalHours < 24) - { - eb.WithTitle(("Failed to set Vanity Syncshell Id")); - eb.WithDescription( - $"You can only change the Vanity Syncshell Id once every 24h. Your last change is {dateTimeDiff} ago."); - } - } - - Regex rgx = new(@"^[_\-a-zA-Z0-9]{5,20}$", RegexOptions.ECMAScript); - if (!rgx.Match(newGid).Success || newGid.Length < 5 || newGid.Length > 20) - { - eb.WithTitle("Failed to set Vanity Syncshell Id"); - eb.WithDescription("The Vanity Syncshell Id must be between 5 and 20 characters and only contain letters A-Z, numbers 0-9 as well as - and _."); - return eb; - } - - using var scope = _services.CreateScope(); - await using var db = scope.ServiceProvider.GetRequiredService(); - - var lodestoneUser = await db.LodeStoneAuth.Include(u => u.User).SingleOrDefaultAsync(u => u.DiscordId == id).ConfigureAwait(false); - if (lodestoneUser == null) - { - eb.WithTitle("Failed to set Vanity Syncshell Id"); - eb.WithDescription("You do not have a registered account on this server."); - return eb; - } - - var group = await db.Groups.FirstOrDefaultAsync(g => g.GID == oldGid || g.Alias == oldGid).ConfigureAwait(false); - if (group == null) - { - eb.WithTitle("Failed to set Vanity Syncshell Id"); - eb.WithDescription("The provided Syncshell Id does not exist."); - return eb; - } - - if (lodestoneUser.User.UID != group.OwnerUID) - { - eb.WithTitle("Failed to set Vanity Syncshell Id"); - eb.WithDescription("You are not the owner of this Syncshell"); - return eb; - } - - var uidExists = await db.Groups.AnyAsync(u => u.GID == newGid || u.Alias == newGid).ConfigureAwait(false); - if (uidExists) - { - eb.WithTitle("Failed to set Vanity Syncshell Id"); - eb.WithDescription("This Syncshell Id is already taken."); - return eb; - } - - group.Alias = newGid; - db.Update(group); - await db.SaveChangesAsync(); - - _botServices.LastVanityGidChange[newGid] = DateTime.UtcNow; - _botServices.LastVanityGidChange[oldGid] = DateTime.UtcNow; - - eb.WithTitle("Vanity Syncshell Id set"); - eb.WithDescription("The Vanity Syncshell Id was set to **" + newGid + "**." + Environment.NewLine + "For those changes to apply you will have to reconnect to Mare."); - return eb; - } - - private async Task DeletePreviousUserAccount(ulong id) - { - using var scope = _services.CreateScope(); - using var db = scope.ServiceProvider.GetService(); - var discordAuthedUser = await db.LodeStoneAuth.Include(u => u.User).FirstOrDefaultAsync(u => u.DiscordId == id).ConfigureAwait(false); - if (discordAuthedUser != null) - { - if (discordAuthedUser.User != null) - { - var maxGroupsByUser = _mareClientConfigurationService.GetValueOrDefault(nameof(ServerConfiguration.MaxGroupUserCount), 3); - - await SharedDbFunctions.PurgeUser(_logger, discordAuthedUser.User, db, maxGroupsByUser); - } - else - { - db.Remove(discordAuthedUser); - } - - await db.SaveChangesAsync().ConfigureAwait(false); - } - } - - private async Task HandleVerifyRelinkAsync(SocketSlashCommand cmd, IServiceProvider serviceProvider) - { - var embedBuilder = new EmbedBuilder(); - - using var scope = serviceProvider.CreateScope(); - var req = new HttpClient(); - using var db = scope.ServiceProvider.GetService(); - - var lodestoneAuth = db.LodeStoneAuth.SingleOrDefault(u => u.DiscordId == cmd.User.Id); - if (lodestoneAuth != null && _botServices.DiscordRelinkLodestoneMapping.ContainsKey(cmd.User.Id)) - { - var randomServer = _botServices.LodestoneServers[random.Next(_botServices.LodestoneServers.Length)]; - var response = await req.GetAsync($"https://{randomServer}.finalfantasyxiv.com/lodestone/character/{_botServices.DiscordRelinkLodestoneMapping[cmd.User.Id]}").ConfigureAwait(false); - if (response.IsSuccessStatusCode) - { - var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - if (content.Contains(lodestoneAuth.LodestoneAuthString)) - { - _botServices.DiscordRelinkLodestoneMapping.TryRemove(cmd.User.Id, out _); - - var existingLodestoneAuth = db.LodeStoneAuth.Include(u => u.User).SingleOrDefault(u => u.DiscordId != cmd.User.Id && u.HashedLodestoneId == lodestoneAuth.HashedLodestoneId); - - var previousAuth = await db.Auth.FirstOrDefaultAsync(u => u.UserUID == existingLodestoneAuth.User.UID && string.IsNullOrEmpty(u.PrimaryUserUID)); - if (previousAuth != null) - { - db.Auth.Remove(previousAuth); - } - - var computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - var auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = existingLodestoneAuth.User, - }; - - lodestoneAuth.StartedAt = null; - lodestoneAuth.LodestoneAuthString = null; - lodestoneAuth.User = existingLodestoneAuth.User; - - db.LodeStoneAuth.Remove(existingLodestoneAuth); - - await db.Auth.AddAsync(auth).ConfigureAwait(false); - - _botServices.Logger.LogInformation("User relinked: {userUID}", lodestoneAuth.User.UID); - - embedBuilder.WithTitle("Relink successful"); - embedBuilder.WithDescription("This is your **new** private secret key. Do not share this private secret key with anyone. **If you lose it, it is irrevocably lost.**" - + Environment.NewLine + Environment.NewLine - + $"**{computedHash}**" - + Environment.NewLine + Environment.NewLine - + "Enter this key in Mare Synchronos and hit save to connect to the service."); - } - else - { - embedBuilder.WithTitle("Failed to verify your character"); - embedBuilder.WithDescription("Did not find requested authentication key on your profile. Make sure you have saved *twice*, then do **/relink_verify** again."); - lodestoneAuth.StartedAt = DateTime.UtcNow; - } - } - - await db.SaveChangesAsync().ConfigureAwait(false); - } - else - { - embedBuilder.WithTitle("Your auth has expired or something else went wrong"); - embedBuilder.WithDescription("Start again with **/relink**"); - _botServices.DiscordRelinkLodestoneMapping.TryRemove(cmd.User.Id, out _); - } - - var dataEmbed = embedBuilder.Build(); - - await cmd.FollowupAsync(embed: dataEmbed, ephemeral: true).ConfigureAwait(false); - } - - private async Task HandleVerifyAsync(SocketSlashCommand cmd, IServiceProvider serviceProvider) - { - var embedBuilder = new EmbedBuilder(); - - using var scope = serviceProvider.CreateScope(); - var req = new HttpClient(); - using var db = scope.ServiceProvider.GetService(); - - var lodestoneAuth = db.LodeStoneAuth.SingleOrDefault(u => u.DiscordId == cmd.User.Id); - if (lodestoneAuth != null && _botServices.DiscordLodestoneMapping.ContainsKey(cmd.User.Id)) - { - var randomServer = _botServices.LodestoneServers[random.Next(_botServices.LodestoneServers.Length)]; - var response = await req.GetAsync($"https://{randomServer}.finalfantasyxiv.com/lodestone/character/{_botServices.DiscordLodestoneMapping[cmd.User.Id]}").ConfigureAwait(false); - if (response.IsSuccessStatusCode) - { - var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - if (content.Contains(lodestoneAuth.LodestoneAuthString)) - { - _botServices.DiscordLodestoneMapping.TryRemove(cmd.User.Id, out _); - - var user = new User(); - - var hasValidUid = false; - while (!hasValidUid) - { - var uid = StringUtils.GenerateRandomString(7); - if (db.Users.Any(u => u.UID == uid || u.Alias == uid)) continue; - user.UID = uid; - hasValidUid = true; - } - - // make the first registered user on the service to admin - if (!await db.Users.AnyAsync().ConfigureAwait(false)) - { - user.IsAdmin = true; - } - - user.LastLoggedIn = DateTime.UtcNow; - - var computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString()); - var auth = new Auth() - { - HashedKey = StringUtils.Sha256String(computedHash), - User = user, - }; - - await db.Users.AddAsync(user).ConfigureAwait(false); - await db.Auth.AddAsync(auth).ConfigureAwait(false); - - _botServices.Logger.LogInformation("User registered: {userUID}", user.UID); - - lodestoneAuth.StartedAt = null; - lodestoneAuth.User = user; - lodestoneAuth.LodestoneAuthString = null; - - embedBuilder.WithTitle("Registration successful"); - embedBuilder.WithDescription("This is your private secret key. Do not share this private secret key with anyone. **If you lose it, it is irrevocably lost.**" - + Environment.NewLine + Environment.NewLine - + $"**{computedHash}**" - + Environment.NewLine + Environment.NewLine - + "Enter this key in to the plugin when prompted and hit save to connect to the service." - + Environment.NewLine - + "You should connect as soon as possible to not get caught by the automatic cleanup process." - + Environment.NewLine - + "Have fun."); - } - else - { - embedBuilder.WithTitle("Failed to verify your character"); - embedBuilder.WithDescription("Did not find requested authentication key on your profile. Make sure you have saved *twice*, then do **/verify** again."); - lodestoneAuth.StartedAt = DateTime.UtcNow; - } - } - - await db.SaveChangesAsync().ConfigureAwait(false); - } - else - { - embedBuilder.WithTitle("Your auth has expired or something else went wrong"); - embedBuilder.WithDescription("Start again with **/register**"); - _botServices.DiscordLodestoneMapping.TryRemove(cmd.User.Id, out _); - } - - var dataEmbed = embedBuilder.Build(); - - await cmd.FollowupAsync(embed: dataEmbed, ephemeral: true).ConfigureAwait(false); - } -} diff --git a/MareSynchronosServer/MareSynchronosServices/DummyHub.cs b/MareSynchronosServer/MareSynchronosServices/DummyHub.cs deleted file mode 100644 index afcb665..0000000 --- a/MareSynchronosServer/MareSynchronosServices/DummyHub.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.SignalR; - -// this is a very hacky way to attach this file server to the main mare hub signalr instance via redis -// signalr publishes the namespace and hubname into the redis backend so this needs to be equal to the original -// but I don't need to reimplement the hub completely as I only exclusively use it for internal connection calling -// from the queue service so I keep the namespace and name of the class the same so it can connect to the same channel -// if anyone finds a better way to do this let me know - -#pragma warning disable IDE0130 // Namespace does not match folder structure -#pragma warning disable MA0048 // File name must match type name -namespace MareSynchronosServer.Hubs; -public class MareHub : Hub -{ - public override Task OnConnectedAsync() - { - throw new NotSupportedException(); - } - - public override Task OnDisconnectedAsync(Exception exception) - { - throw new NotSupportedException(); - } -} -#pragma warning restore IDE0130 // Namespace does not match folder structure -#pragma warning restore MA0048 // File name must match type name \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServices/MareSynchronosServices.csproj b/MareSynchronosServer/MareSynchronosServices/MareSynchronosServices.csproj deleted file mode 100644 index 79b9226..0000000 --- a/MareSynchronosServer/MareSynchronosServices/MareSynchronosServices.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - net9.0 - enable - - - - - - - - - - - - - - Never - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - diff --git a/MareSynchronosServer/MareSynchronosServices/Program.cs b/MareSynchronosServer/MareSynchronosServices/Program.cs deleted file mode 100644 index 4a3f930..0000000 --- a/MareSynchronosServer/MareSynchronosServices/Program.cs +++ /dev/null @@ -1,43 +0,0 @@ -using MareSynchronosServices; -using MareSynchronosShared.Data; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; - -public class Program -{ - public static void Main(string[] args) - { - var hostBuilder = CreateHostBuilder(args); - var host = hostBuilder.Build(); - - using (var scope = host.Services.CreateScope()) - { - var services = scope.ServiceProvider; - using var dbContext = services.GetRequiredService(); - - var options = host.Services.GetService>(); - var optionsServer = host.Services.GetService>(); - var logger = host.Services.GetService>(); - logger.LogInformation("Loaded MareSynchronos Services Configuration (IsMain: {isMain})", options.IsMain); - logger.LogInformation(options.ToString()); - logger.LogInformation("Loaded MareSynchronos Server Configuration (IsMain: {isMain})", optionsServer.IsMain); - logger.LogInformation(optionsServer.ToString()); - } - - host.Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .UseSystemd() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseContentRoot(AppContext.BaseDirectory); - webBuilder.ConfigureLogging((ctx, builder) => - { - builder.AddConfiguration(ctx.Configuration.GetSection("Logging")); - builder.AddFile(o => o.RootPath = AppContext.BaseDirectory); - }); - webBuilder.UseStartup(); - }); -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServices/Properties/launchSettings.json b/MareSynchronosServer/MareSynchronosServices/Properties/launchSettings.json deleted file mode 100644 index ea24f06..0000000 --- a/MareSynchronosServer/MareSynchronosServices/Properties/launchSettings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "profiles": { - "MareSynchronosServices": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5294;https://localhost:7294", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServices/Startup.cs b/MareSynchronosServer/MareSynchronosServices/Startup.cs deleted file mode 100644 index e8b7437..0000000 --- a/MareSynchronosServer/MareSynchronosServices/Startup.cs +++ /dev/null @@ -1,104 +0,0 @@ -using MareSynchronosServices.Discord; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using Microsoft.EntityFrameworkCore; -using Prometheus; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Services; -using StackExchange.Redis; -using MessagePack.Resolvers; -using MessagePack; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosServices; - -public class Startup -{ - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - var config = app.ApplicationServices.GetRequiredService>(); - - var metricServer = new KestrelMetricServer(config.GetValueOrDefault(nameof(MareConfigurationBase.MetricsPort), 4982)); - metricServer.Start(); - - app.UseRouting(); - app.UseEndpoints(e => - { - e.MapHub("/dummyhub"); - }); - } - - public void ConfigureServices(IServiceCollection services) - { - var mareConfig = Configuration.GetSection("MareSynchronos"); - - services.AddDbContextPool(options => - { - options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - }).UseSnakeCaseNamingConvention(); - options.EnableThreadSafetyChecks(false); - }, Configuration.GetValue(nameof(MareConfigurationBase.DbContextPoolSize), 1024)); - - services.AddSingleton(m => new MareMetrics(m.GetService>(), new List { }, - new List { })); - - var redis = mareConfig.GetValue(nameof(ServerConfiguration.RedisConnectionString), string.Empty); - var options = ConfigurationOptions.Parse(redis); - options.ClientName = "Mare"; - options.ChannelPrefix = "UserData"; - ConnectionMultiplexer connectionMultiplexer = ConnectionMultiplexer.Connect(options); - services.AddSingleton(connectionMultiplexer); - - var signalRServiceBuilder = services.AddSignalR(hubOptions => - { - hubOptions.MaximumReceiveMessageSize = long.MaxValue; - hubOptions.EnableDetailedErrors = true; - hubOptions.MaximumParallelInvocationsPerClient = 10; - hubOptions.StreamBufferCapacity = 200; - }).AddMessagePackProtocol(opt => - { - var resolver = CompositeResolver.Create(StandardResolverAllowPrivate.Instance, - BuiltinResolver.Instance, - AttributeFormatterResolver.Instance, - // replace enum resolver - DynamicEnumAsStringResolver.Instance, - DynamicGenericResolver.Instance, - DynamicUnionResolver.Instance, - DynamicObjectResolver.Instance, - PrimitiveObjectResolver.Instance, - // final fallback(last priority) - StandardResolver.Instance); - - opt.SerializerOptions = MessagePackSerializerOptions.Standard - .WithCompression(MessagePackCompression.Lz4Block) - .WithResolver(resolver); - }); - - // configure redis for SignalR - var redisConnection = mareConfig.GetValue(nameof(MareConfigurationBase.RedisConnectionString), string.Empty); - signalRServiceBuilder.AddStackExchangeRedis(redisConnection, options => { }); - - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - services.AddSingleton(Configuration); - services.AddSingleton(); - services.AddSingleton(); - services.AddHostedService(); - services.AddSingleton, MareConfigurationServiceServer>(); - services.AddSingleton, MareConfigurationServiceClient>(); - services.AddSingleton, MareConfigurationServiceClient>(); - - services.AddHostedService(p => (MareConfigurationServiceClient)p.GetService>()); - services.AddHostedService(p => (MareConfigurationServiceClient)p.GetService>()); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServices/appsettings.Development.json b/MareSynchronosServer/MareSynchronosServices/appsettings.Development.json deleted file mode 100644 index 0c208ae..0000000 --- a/MareSynchronosServer/MareSynchronosServices/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServices/appsettings.json b/MareSynchronosServer/MareSynchronosServices/appsettings.json deleted file mode 100644 index 902d25f..0000000 --- a/MareSynchronosServer/MareSynchronosServices/appsettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Port=5432;Database=mare;Username=postgres" - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "Kestrel": { - "Endpoints": { - "Http": { - "Protocols": "Http2", - "Url": "http://+:5002" - } - } - }, - "MareSynchronos": { - "DbContextPoolSize": 1024, - "DiscordBotToken": "", - "DiscordChannelForMessages": "", - "PurgeUnusedAccounts": true, - "PurgeUnusedAccountsPeriodInDays": 14, - "FailedAuthForTempBan": 5, - "TempBanDurationInMinutes": 30, - }, - "AllowedHosts": "*" -} diff --git a/MareSynchronosServer/MareSynchronosShared/Data/MareDbContext.cs b/MareSynchronosServer/MareSynchronosShared/Data/MareDbContext.cs deleted file mode 100644 index 9b03f1e..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Data/MareDbContext.cs +++ /dev/null @@ -1,131 +0,0 @@ -using MareSynchronosShared.Models; -using Microsoft.EntityFrameworkCore; - -namespace MareSynchronosShared.Data; - -public class MareDbContext : DbContext -{ -#if DEBUG - public MareDbContext() { } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - if (optionsBuilder.IsConfigured) - { - base.OnConfiguring(optionsBuilder); - return; - } - - optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Database=mare;Username=postgres", builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - builder.MigrationsAssembly("MareSynchronosShared"); - }).UseSnakeCaseNamingConvention(); - optionsBuilder.EnableThreadSafetyChecks(false); - - base.OnConfiguring(optionsBuilder); - } -#endif - - public MareDbContext(DbContextOptions options) : base(options) - { - } - - public DbSet Auth { get; set; } - public DbSet BannedRegistrations { get; set; } - public DbSet BannedUsers { get; set; } - public DbSet ClientPairs { get; set; } - public DbSet Files { get; set; } - public DbSet ForbiddenUploadEntries { get; set; } - public DbSet GroupBans { get; set; } - public DbSet GroupPairs { get; set; } - public DbSet Groups { get; set; } - public DbSet GroupTempInvites { get; set; } - public DbSet LodeStoneAuth { get; set; } - public DbSet UserProfileData { get; set; } - public DbSet UserProfileReports { get; set; } - public DbSet Users { get; set; } - public DbSet CharaData { get; set; } - public DbSet CharaDataFiles { get; set; } - public DbSet CharaDataFileSwaps { get; set; } - public DbSet CharaDataOriginalFiles { get; set; } - public DbSet CharaDataPoses { get; set; } - public DbSet CharaDataAllowances { get; set; } - - protected override void OnModelCreating(ModelBuilder mb) - { - mb.Entity().ToTable("auth"); - mb.Entity().ToTable("users"); - mb.Entity().ToTable("file_caches"); - mb.Entity().HasIndex(c => c.UploaderUID); - mb.Entity().ToTable("client_pairs"); - mb.Entity().HasKey(u => new { u.UserUID, u.OtherUserUID }); - mb.Entity().HasIndex(c => c.UserUID); - mb.Entity().HasIndex(c => c.OtherUserUID); - mb.Entity().ToTable("forbidden_upload_entries"); - mb.Entity().ToTable("banned_users"); - mb.Entity().ToTable("lodestone_auth"); - mb.Entity().ToTable("banned_registrations"); - mb.Entity().ToTable("groups"); - mb.Entity().HasIndex(c => c.OwnerUID); - mb.Entity().ToTable("group_pairs"); - mb.Entity().HasKey(u => new { u.GroupGID, u.GroupUserUID }); - mb.Entity().HasIndex(c => c.GroupUserUID); - mb.Entity().HasIndex(c => c.GroupGID); - mb.Entity().ToTable("group_bans"); - mb.Entity().HasKey(u => new { u.GroupGID, u.BannedUserUID }); - mb.Entity().HasIndex(c => c.BannedUserUID); - mb.Entity().HasIndex(c => c.GroupGID); - mb.Entity().ToTable("group_temp_invites"); - mb.Entity().HasKey(u => new { u.GroupGID, u.Invite }); - mb.Entity().HasIndex(c => c.GroupGID); - mb.Entity().HasIndex(c => c.Invite); - mb.Entity().ToTable("user_profile_data"); - mb.Entity().HasKey(c => c.UserUID); - mb.Entity().ToTable("user_profile_data_reports"); - mb.Entity().ToTable("chara_data"); - mb.Entity() - .HasMany(p => p.Poses) - .WithOne(c => c.Parent) - .HasForeignKey(c => new { c.ParentId, c.ParentUploaderUID }); - mb.Entity() - .HasMany(p => p.Files) - .WithOne(c => c.Parent) - .HasForeignKey(c => new { c.ParentId, c.ParentUploaderUID }); - mb.Entity() - .HasMany(p => p.OriginalFiles) - .WithOne(p => p.Parent) - .HasForeignKey(p => new { p.ParentId, p.ParentUploaderUID }); - mb.Entity() - .HasMany(p => p.AllowedIndividiuals) - .WithOne(p => p.Parent) - .HasForeignKey(p => new { p.ParentId, p.ParentUploaderUID }); - mb.Entity() - .HasMany(p => p.FileSwaps) - .WithOne(p => p.Parent) - .HasForeignKey(p => new { p.ParentId, p.ParentUploaderUID }); - mb.Entity().HasKey(p => new { p.Id, p.UploaderUID }); - mb.Entity().HasIndex(p => p.UploaderUID); - mb.Entity().HasIndex(p => p.Id); - mb.Entity().ToTable("chara_data_files"); - mb.Entity().HasKey(c => new { c.ParentId, c.ParentUploaderUID, c.GamePath }); - mb.Entity().HasIndex(c => c.ParentId); - mb.Entity().HasOne(f => f.FileCache).WithMany().HasForeignKey(f => f.FileCacheHash).OnDelete(DeleteBehavior.Cascade); - mb.Entity().ToTable("chara_data_file_swaps"); - mb.Entity().HasKey(c => new { c.ParentId, c.ParentUploaderUID, c.GamePath }); - mb.Entity().HasIndex(c => c.ParentId); - mb.Entity().ToTable("chara_data_poses"); - mb.Entity().Property(p => p.Id).ValueGeneratedOnAdd(); - mb.Entity().HasKey(c => new { c.ParentId, c.ParentUploaderUID, c.Id }); - mb.Entity().HasIndex(c => c.ParentId); - mb.Entity().ToTable("chara_data_orig_files"); - mb.Entity().HasKey(c => new { c.ParentId, c.ParentUploaderUID, c.GamePath }); - mb.Entity().HasIndex(c => c.ParentId); - mb.Entity().ToTable("chara_data_allowance"); - mb.Entity().HasKey(c => new { c.ParentId, c.ParentUploaderUID, c.Id }); - mb.Entity().Property(p => p.Id).ValueGeneratedOnAdd(); - mb.Entity().HasIndex(c => c.ParentId); - mb.Entity().HasOne(u => u.AllowedGroup).WithMany().HasForeignKey(u => u.AllowedGroupGID).OnDelete(DeleteBehavior.Cascade); - mb.Entity().HasOne(u => u.AllowedUser).WithMany().HasForeignKey(u => u.AllowedUserUID).OnDelete(DeleteBehavior.Cascade); - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Extensions.cs b/MareSynchronosServer/MareSynchronosShared/Extensions.cs deleted file mode 100644 index abcac4f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Extensions.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Microsoft.AspNetCore.Http; - -namespace MareSynchronosShared; - -public static class Extensions -{ - private static long _noIpCntr = 0; - public static string GetIpAddress(this IHttpContextAccessor accessor) - { - try - { - if (!string.IsNullOrEmpty(accessor.HttpContext.Request.Headers["CF-CONNECTING-IP"])) - return accessor.HttpContext.Request.Headers["CF-CONNECTING-IP"]; - - if (!string.IsNullOrEmpty(accessor.HttpContext.Request.Headers["X-Forwarded-For"])) - { - return accessor.HttpContext.Request.Headers["X-Forwarded-For"]; - } - - var ipAddress = accessor.HttpContext.GetServerVariable("HTTP_X_FORWARDED_FOR"); - - if (!string.IsNullOrWhiteSpace(ipAddress)) - { - var addresses = ipAddress.Split(',', StringSplitOptions.RemoveEmptyEntries); - var lastEntry = addresses.LastOrDefault(); - if (lastEntry != null) - { - return lastEntry; - } - } - - return accessor.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "NoIp"; - } - catch - { - return "NoIp" + _noIpCntr++; - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/MareSynchronosShared.csproj b/MareSynchronosServer/MareSynchronosShared/MareSynchronosShared.csproj deleted file mode 100644 index 352d5c9..0000000 --- a/MareSynchronosServer/MareSynchronosShared/MareSynchronosShared.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - net9.0 - enable - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - diff --git a/MareSynchronosServer/MareSynchronosShared/Metrics/MareMetrics.cs b/MareSynchronosServer/MareSynchronosShared/Metrics/MareMetrics.cs deleted file mode 100644 index 624e907..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Metrics/MareMetrics.cs +++ /dev/null @@ -1,84 +0,0 @@ -using Microsoft.Extensions.Logging; -using Prometheus; - -namespace MareSynchronosShared.Metrics; - -public class MareMetrics -{ - public MareMetrics(ILogger logger, List countersToServe, List gaugesToServe) - { - logger.LogInformation("Initializing MareMetrics"); - foreach (var counter in countersToServe) - { - logger.LogInformation($"Creating Metric for Counter {counter}"); - counters.Add(counter, Prometheus.Metrics.CreateCounter(counter, counter)); - } - - foreach (var gauge in gaugesToServe) - { - logger.LogInformation($"Creating Metric for Counter {gauge}"); - if (!string.Equals(gauge, MetricsAPI.GaugeConnections, StringComparison.OrdinalIgnoreCase)) - gauges.Add(gauge, Prometheus.Metrics.CreateGauge(gauge, gauge)); - else - gauges.Add(gauge, Prometheus.Metrics.CreateGauge(gauge, gauge, new[] { "continent" })); - } - } - - private readonly Dictionary counters = new(StringComparer.Ordinal); - - private readonly Dictionary gauges = new(StringComparer.Ordinal); - - public void IncGaugeWithLabels(string gaugeName, double value = 1.0, params string[] labels) - { - if (gauges.TryGetValue(gaugeName, out Gauge gauge)) - { - lock (gauge) - gauge.WithLabels(labels).Inc(value); - } - } - - public void DecGaugeWithLabels(string gaugeName, double value = 1.0, params string[] labels) - { - if (gauges.TryGetValue(gaugeName, out Gauge gauge)) - { - lock (gauge) - gauge.WithLabels(labels).Dec(value); - } - } - - public void SetGaugeTo(string gaugeName, double value) - { - if (gauges.TryGetValue(gaugeName, out Gauge gauge)) - { - lock (gauge) - gauge.Set(value); - } - } - - public void IncGauge(string gaugeName, double value = 1.0) - { - if (gauges.TryGetValue(gaugeName, out Gauge gauge)) - { - lock (gauge) - gauge.Inc(value); - } - } - - public void DecGauge(string gaugeName, double value = 1.0) - { - if (gauges.TryGetValue(gaugeName, out Gauge gauge)) - { - lock (gauge) - gauge.Dec(value); - } - } - - public void IncCounter(string counterName, double value = 1.0) - { - if (counters.TryGetValue(counterName, out Counter counter)) - { - lock (counter) - counter.Inc(value); - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Metrics/MetricsAPI.cs b/MareSynchronosServer/MareSynchronosShared/Metrics/MetricsAPI.cs deleted file mode 100644 index d3aee90..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Metrics/MetricsAPI.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace MareSynchronosShared.Metrics; - -public class MetricsAPI -{ - public const string CounterInitializedConnections = "mare_initialized_connections"; - public const string GaugeConnections = "mare_connections"; - public const string GaugeAuthorizedConnections = "mare_authorized_connections"; - public const string GaugeAvailableWorkerThreads = "mare_available_threadpool"; - public const string GaugeAvailableIOWorkerThreads = "mare_available_threadpool_io"; - public const string GaugeUsersRegistered = "mare_users_registered"; - public const string CounterUsersRegisteredDeleted = "mare_users_registered_deleted"; - public const string GaugePairs = "mare_pairs"; - public const string GaugePairsPaused = "mare_pairs_paused"; - public const string GaugeFilesTotal = "mare_files"; - public const string GaugeFilesTotalColdStorage = "mare_files_cold"; - public const string GaugeFilesTotalSize = "mare_files_size"; - public const string GaugeFilesTotalSizeColdStorage = "mare_files_size_cold"; - public const string GaugeFilesDownloadingFromCache = "mare_files_downloading_from_cache"; - public const string GaugeFilesTasksWaitingForDownloadFromCache = "mare_files_waiting_for_dl"; - public const string CounterUserPushData = "mare_user_push"; - public const string CounterUserPushDataTo = "mare_user_push_to"; - public const string CounterAuthenticationRequests = "mare_auth_requests"; - public const string CounterAuthenticationCacheHits = "mare_auth_requests_cachehit"; - public const string CounterAuthenticationFailures = "mare_auth_requests_fail"; - public const string CounterAuthenticationSuccesses = "mare_auth_requests_success"; - public const string GaugeGroups = "mare_groups"; - public const string GaugeGroupPairs = "mare_groups_pairs"; - public const string GaugeGroupPairsPaused = "mare_groups_pairs_paused"; - public const string GaugeFilesUniquePastHour = "mare_files_unique_past_hour"; - public const string GaugeFilesUniquePastHourSize = "mare_files_unique_past_hour_size"; - public const string GaugeFilesUniquePastDay = "mare_files_unique_past_day"; - public const string GaugeFilesUniquePastDaySize = "mare_files_unique_past_day_size"; - public const string GaugeCurrentDownloads = "mare_current_downloads"; - public const string GaugeQueueFree = "mare_download_queue_free"; - public const string GaugeQueueActive = "mare_download_queue_active"; - public const string GaugeQueueInactive = "mare_download_queue_inactive"; - public const string GaugeDownloadQueue = "mare_download_queue"; - public const string GaugeDownloadQueueCancelled = "mare_download_queue_cancelled"; - public const string GaugeDownloadPriorityQueue = "mare_download_priority_queue"; - public const string GaugeDownloadPriorityQueueCancelled = "mare_download_priority_queue_cancelled"; - public const string CounterFileRequests = "mare_files_requests"; - public const string CounterFileRequestSize = "mare_files_request_size"; - public const string CounterAccountsCreated = "mare_accounts_created"; - public const string GaugeGposeLobbies = "mare_gpose_lobbies"; - public const string GaugeGposeLobbyUsers = "mare_gpose_lobby_users"; -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731210149_InitialCreate.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220731210149_InitialCreate.Designer.cs deleted file mode 100644 index 31ea23a..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731210149_InitialCreate.Designer.cs +++ /dev/null @@ -1,241 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220731210149_InitialCreate")] - partial class InitialCreate - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("Auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("BannedUsers", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("ClientPairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("FileCaches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasColumnType("text") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("ForbiddenUploadEntries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("Users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.HasOne("MareSynchronosServer.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_uid"); - - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_uid"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.HasOne("MareSynchronosServer.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731210149_InitialCreate.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220731210149_InitialCreate.cs deleted file mode 100644 index 0fec13f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731210149_InitialCreate.cs +++ /dev/null @@ -1,163 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class InitialCreate : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "BannedUsers", - columns: table => new - { - character_identification = table.Column(type: "text", nullable: false), - reason = table.Column(type: "text", nullable: true), - timestamp = table.Column(type: "bytea", rowVersion: true, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_banned_users", x => x.character_identification); - }); - - migrationBuilder.CreateTable( - name: "ForbiddenUploadEntries", - columns: table => new - { - hash = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), - forbidden_by = table.Column(type: "text", nullable: true), - timestamp = table.Column(type: "bytea", rowVersion: true, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_forbidden_upload_entries", x => x.hash); - }); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - uid = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), - character_identification = table.Column(type: "text", nullable: true), - timestamp = table.Column(type: "bytea", rowVersion: true, nullable: true), - is_moderator = table.Column(type: "boolean", nullable: false), - is_admin = table.Column(type: "boolean", nullable: false), - last_logged_in = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_users", x => x.uid); - }); - - migrationBuilder.CreateTable( - name: "Auth", - columns: table => new - { - hashed_key = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - user_uid = table.Column(type: "character varying(10)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_auth", x => x.hashed_key); - table.ForeignKey( - name: "fk_auth_users_user_uid", - column: x => x.user_uid, - principalTable: "Users", - principalColumn: "uid"); - }); - - migrationBuilder.CreateTable( - name: "ClientPairs", - columns: table => new - { - user_uid = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), - other_user_uid = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), - is_paused = table.Column(type: "boolean", nullable: false), - allow_receiving_messages = table.Column(type: "boolean", nullable: false), - timestamp = table.Column(type: "bytea", rowVersion: true, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_client_pairs", x => new { x.user_uid, x.other_user_uid }); - table.ForeignKey( - name: "fk_client_pairs_users_other_user_uid", - column: x => x.other_user_uid, - principalTable: "Users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "fk_client_pairs_users_user_uid", - column: x => x.user_uid, - principalTable: "Users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "FileCaches", - columns: table => new - { - hash = table.Column(type: "character varying(40)", maxLength: 40, nullable: false), - uploader_uid = table.Column(type: "character varying(10)", nullable: true), - uploaded = table.Column(type: "boolean", nullable: false), - timestamp = table.Column(type: "bytea", rowVersion: true, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_file_caches", x => x.hash); - table.ForeignKey( - name: "fk_file_caches_users_uploader_uid", - column: x => x.uploader_uid, - principalTable: "Users", - principalColumn: "uid"); - }); - - migrationBuilder.CreateIndex( - name: "ix_auth_user_uid", - table: "Auth", - column: "user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_client_pairs_other_user_uid", - table: "ClientPairs", - column: "other_user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_client_pairs_user_uid", - table: "ClientPairs", - column: "user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_file_caches_uploader_uid", - table: "FileCaches", - column: "uploader_uid"); - - migrationBuilder.CreateIndex( - name: "ix_users_character_identification", - table: "Users", - column: "character_identification"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Auth"); - - migrationBuilder.DropTable( - name: "BannedUsers"); - - migrationBuilder.DropTable( - name: "ClientPairs"); - - migrationBuilder.DropTable( - name: "FileCaches"); - - migrationBuilder.DropTable( - name: "ForbiddenUploadEntries"); - - migrationBuilder.DropTable( - name: "Users"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731211419_RenameLowerSnakeCase.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220731211419_RenameLowerSnakeCase.Designer.cs deleted file mode 100644 index 59c7501..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731211419_RenameLowerSnakeCase.Designer.cs +++ /dev/null @@ -1,241 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220731211419_RenameLowerSnakeCase")] - partial class RenameLowerSnakeCase - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasColumnType("text") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.HasOne("MareSynchronosServer.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.HasOne("MareSynchronosServer.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731211419_RenameLowerSnakeCase.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220731211419_RenameLowerSnakeCase.cs deleted file mode 100644 index aaaf083..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220731211419_RenameLowerSnakeCase.cs +++ /dev/null @@ -1,133 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class RenameLowerSnakeCase : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_auth_users_user_uid", - table: "Auth"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_other_user_uid", - table: "ClientPairs"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_user_uid", - table: "ClientPairs"); - - migrationBuilder.RenameTable( - name: "Users", - newName: "users"); - - migrationBuilder.RenameTable( - name: "Auth", - newName: "auth"); - - migrationBuilder.RenameTable( - name: "ForbiddenUploadEntries", - newName: "forbidden_upload_entries"); - - migrationBuilder.RenameTable( - name: "FileCaches", - newName: "file_caches"); - - migrationBuilder.RenameTable( - name: "ClientPairs", - newName: "client_pairs"); - - migrationBuilder.RenameTable( - name: "BannedUsers", - newName: "banned_users"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_user_temp_id", - table: "auth", - column: "user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_other_user_temp_id1", - table: "client_pairs", - column: "other_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_user_temp_id2", - table: "client_pairs", - column: "user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_auth_users_user_temp_id", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_other_user_temp_id1", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_user_temp_id2", - table: "client_pairs"); - - migrationBuilder.RenameTable( - name: "users", - newName: "Users"); - - migrationBuilder.RenameTable( - name: "auth", - newName: "Auth"); - - migrationBuilder.RenameTable( - name: "forbidden_upload_entries", - newName: "ForbiddenUploadEntries"); - - migrationBuilder.RenameTable( - name: "file_caches", - newName: "FileCaches"); - - migrationBuilder.RenameTable( - name: "client_pairs", - newName: "ClientPairs"); - - migrationBuilder.RenameTable( - name: "banned_users", - newName: "BannedUsers"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_user_uid", - table: "Auth", - column: "user_uid", - principalTable: "Users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_other_user_uid", - table: "ClientPairs", - column: "other_user_uid", - principalTable: "Users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_user_uid", - table: "ClientPairs", - column: "user_uid", - principalTable: "Users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801121419_AddLodestoneAuth.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220801121419_AddLodestoneAuth.Designer.cs deleted file mode 100644 index 5bab84a..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801121419_AddLodestoneAuth.Designer.cs +++ /dev/null @@ -1,283 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220801121419_AddLodestoneAuth")] - partial class AddLodestoneAuth - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasColumnType("text") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasColumnType("text") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasColumnType("text") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.HasOne("MareSynchronosServer.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.HasOne("MareSynchronosServer.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801121419_AddLodestoneAuth.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220801121419_AddLodestoneAuth.cs deleted file mode 100644 index 13bc0ac..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801121419_AddLodestoneAuth.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class AddLodestoneAuth : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "lodestone_auth", - columns: table => new - { - discord_id = table.Column(type: "numeric(20,0)", nullable: false), - hashed_lodestone_id = table.Column(type: "text", nullable: true), - lodestone_auth_string = table.Column(type: "text", nullable: true), - user_uid = table.Column(type: "character varying(10)", nullable: true), - started_at = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_lodestone_auth", x => x.discord_id); - table.ForeignKey( - name: "fk_lodestone_auth_users_user_uid", - column: x => x.user_uid, - principalTable: "users", - principalColumn: "uid"); - }); - - migrationBuilder.CreateIndex( - name: "ix_lodestone_auth_user_uid", - table: "lodestone_auth", - column: "user_uid"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "lodestone_auth"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801122103_AddNullableLodestoneAuthProperties.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220801122103_AddNullableLodestoneAuthProperties.Designer.cs deleted file mode 100644 index 3b29f0d..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801122103_AddNullableLodestoneAuthProperties.Designer.cs +++ /dev/null @@ -1,283 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220801122103_AddNullableLodestoneAuthProperties")] - partial class AddNullableLodestoneAuthProperties - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasColumnType("text") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasColumnType("text") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasColumnType("text") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.HasOne("MareSynchronosServer.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.HasOne("MareSynchronosServer.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801122103_AddNullableLodestoneAuthProperties.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220801122103_AddNullableLodestoneAuthProperties.cs deleted file mode 100644 index 1692083..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220801122103_AddNullableLodestoneAuthProperties.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class AddNullableLodestoneAuthProperties : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "started_at", - table: "lodestone_auth", - type: "timestamp with time zone", - nullable: true, - oldClrType: typeof(DateTime), - oldType: "timestamp with time zone"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "started_at", - table: "lodestone_auth", - type: "timestamp with time zone", - nullable: false, - defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), - oldClrType: typeof(DateTime), - oldType: "timestamp with time zone", - oldNullable: true); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220806103053_AddBannedRegistrations.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220806103053_AddBannedRegistrations.Designer.cs deleted file mode 100644 index 82a1dcf..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220806103053_AddBannedRegistrations.Designer.cs +++ /dev/null @@ -1,295 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220806103053_AddBannedRegistrations")] - partial class AddBannedRegistrations - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasColumnType("text") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasColumnType("text") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasColumnType("text") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasColumnType("text") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("CharacterIdentification") - .HasColumnType("text") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.HasOne("MareSynchronosServer.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.HasOne("MareSynchronosServer.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220806103053_AddBannedRegistrations.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220806103053_AddBannedRegistrations.cs deleted file mode 100644 index 954eb2d..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220806103053_AddBannedRegistrations.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class AddBannedRegistrations : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "banned_registrations", - columns: table => new - { - discord_id_or_lodestone_auth = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_banned_registrations", x => x.discord_id_or_lodestone_auth); - }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "banned_registrations"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220816170426_SetMaxLimitForStrings.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220816170426_SetMaxLimitForStrings.Designer.cs deleted file mode 100644 index 66a6821..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220816170426_SetMaxLimitForStrings.Designer.cs +++ /dev/null @@ -1,302 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220816170426_SetMaxLimitForStrings")] - partial class SetMaxLimitForStrings - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.Auth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.ClientPair", b => - { - b.HasOne("MareSynchronosServer.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.FileCache", b => - { - b.HasOne("MareSynchronosServer.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosServer.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosServer.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220816170426_SetMaxLimitForStrings.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220816170426_SetMaxLimitForStrings.cs deleted file mode 100644 index a6cbde0..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220816170426_SetMaxLimitForStrings.cs +++ /dev/null @@ -1,131 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class SetMaxLimitForStrings : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "character_identification", - table: "users", - type: "character varying(100)", - maxLength: 100, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "lodestone_auth_string", - table: "lodestone_auth", - type: "character varying(100)", - maxLength: 100, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "hashed_lodestone_id", - table: "lodestone_auth", - type: "character varying(100)", - maxLength: 100, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "forbidden_by", - table: "forbidden_upload_entries", - type: "character varying(100)", - maxLength: 100, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "character_identification", - table: "banned_users", - type: "character varying(100)", - maxLength: 100, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "discord_id_or_lodestone_auth", - table: "banned_registrations", - type: "character varying(100)", - maxLength: 100, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "character_identification", - table: "users", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "lodestone_auth_string", - table: "lodestone_auth", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "hashed_lodestone_id", - table: "lodestone_auth", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "forbidden_by", - table: "forbidden_upload_entries", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "character_identification", - table: "banned_users", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100); - - migrationBuilder.AlterColumn( - name: "discord_id_or_lodestone_auth", - table: "banned_registrations", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220824225157_AddAlias.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220824225157_AddAlias.Designer.cs deleted file mode 100644 index 256f0ef..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220824225157_AddAlias.Designer.cs +++ /dev/null @@ -1,307 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220824225157_AddAlias")] - partial class AddAlias - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("alias"); - - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.HasIndex("CharacterIdentification") - .HasDatabaseName("ix_users_character_identification"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220824225157_AddAlias.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220824225157_AddAlias.cs deleted file mode 100644 index f18b67f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220824225157_AddAlias.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class AddAlias : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "alias", - table: "users", - type: "character varying(10)", - maxLength: 10, - nullable: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "alias", - table: "users"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220917115233_Groups.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220917115233_Groups.Designer.cs deleted file mode 100644 index 1a45495..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220917115233_Groups.Designer.cs +++ /dev/null @@ -1,389 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220917115233_Groups")] - partial class Groups - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(14) - .HasColumnType("character varying(14)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(14)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id5"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id4"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220917115233_Groups.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220917115233_Groups.cs deleted file mode 100644 index 39c1604..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220917115233_Groups.cs +++ /dev/null @@ -1,123 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class Groups : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "ix_users_character_identification", - table: "users"); - - migrationBuilder.DropColumn( - name: "character_identification", - table: "users"); - - migrationBuilder.AlterColumn( - name: "alias", - table: "users", - type: "character varying(10)", - maxLength: 10, - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(100)", - oldMaxLength: 100, - oldNullable: true); - - migrationBuilder.CreateTable( - name: "groups", - columns: table => new - { - gid = table.Column(type: "character varying(14)", maxLength: 14, nullable: false), - owner_uid = table.Column(type: "character varying(10)", nullable: true), - alias = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - invites_enabled = table.Column(type: "boolean", nullable: false), - hashed_password = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_groups", x => x.gid); - table.ForeignKey( - name: "fk_groups_users_owner_temp_id5", - column: x => x.owner_uid, - principalTable: "users", - principalColumn: "uid"); - }); - - migrationBuilder.CreateTable( - name: "group_pairs", - columns: table => new - { - group_gid = table.Column(type: "character varying(14)", nullable: false), - group_user_uid = table.Column(type: "character varying(10)", nullable: false), - is_paused = table.Column(type: "boolean", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_group_pairs", x => new { x.group_gid, x.group_user_uid }); - table.ForeignKey( - name: "fk_group_pairs_groups_group_temp_id", - column: x => x.group_gid, - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "fk_group_pairs_users_group_user_temp_id4", - column: x => x.group_user_uid, - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "ix_group_pairs_group_gid", - table: "group_pairs", - column: "group_gid"); - - migrationBuilder.CreateIndex( - name: "ix_group_pairs_group_user_uid", - table: "group_pairs", - column: "group_user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_groups_owner_uid", - table: "groups", - column: "owner_uid"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "group_pairs"); - - migrationBuilder.DropTable( - name: "groups"); - - migrationBuilder.AlterColumn( - name: "alias", - table: "users", - type: "character varying(100)", - maxLength: 100, - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(10)", - oldMaxLength: 10, - oldNullable: true); - - migrationBuilder.AddColumn( - name: "character_identification", - table: "users", - type: "character varying(100)", - maxLength: 100, - nullable: true); - - migrationBuilder.CreateIndex( - name: "ix_users_character_identification", - table: "users", - column: "character_identification"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220929150304_ChangeGidLength.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220929150304_ChangeGidLength.Designer.cs deleted file mode 100644 index 7699c58..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220929150304_ChangeGidLength.Designer.cs +++ /dev/null @@ -1,389 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20220929150304_ChangeGidLength")] - partial class ChangeGidLength - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id5"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id4"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20220929150304_ChangeGidLength.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20220929150304_ChangeGidLength.cs deleted file mode 100644 index ec9dcc1..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20220929150304_ChangeGidLength.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class ChangeGidLength : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "gid", - table: "groups", - type: "character varying(20)", - maxLength: 20, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(14)", - oldMaxLength: 14); - - migrationBuilder.AlterColumn( - name: "group_gid", - table: "group_pairs", - type: "character varying(20)", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(14)"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "gid", - table: "groups", - type: "character varying(14)", - maxLength: 14, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(20)", - oldMaxLength: 20); - - migrationBuilder.AlterColumn( - name: "group_gid", - table: "group_pairs", - type: "character varying(14)", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(20)"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221002105428_IsPinned.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221002105428_IsPinned.Designer.cs deleted file mode 100644 index 4285fe9..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221002105428_IsPinned.Designer.cs +++ /dev/null @@ -1,393 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221002105428_IsPinned")] - partial class IsPinned - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id5"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id4"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221002105428_IsPinned.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221002105428_IsPinned.cs deleted file mode 100644 index 3ee9c31..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221002105428_IsPinned.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class IsPinned : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "is_pinned", - table: "group_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "is_pinned", - table: "group_pairs"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221004125939_AdjustAliasLength.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221004125939_AdjustAliasLength.Designer.cs deleted file mode 100644 index 0b5c721..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221004125939_AdjustAliasLength.Designer.cs +++ /dev/null @@ -1,393 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221004125939_AdjustAliasLength")] - partial class AdjustAliasLength - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id5"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id4"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221004125939_AdjustAliasLength.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221004125939_AdjustAliasLength.cs deleted file mode 100644 index cb623d2..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221004125939_AdjustAliasLength.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class AdjustAliasLength : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "alias", - table: "users", - type: "character varying(15)", - maxLength: 15, - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(10)", - oldMaxLength: 10, - oldNullable: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "alias", - table: "users", - type: "character varying(10)", - maxLength: 10, - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(15)", - oldMaxLength: 15, - oldNullable: true); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006115929_GroupModerator.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221006115929_GroupModerator.Designer.cs deleted file mode 100644 index 56ecd28..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006115929_GroupModerator.Designer.cs +++ /dev/null @@ -1,397 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221006115929_GroupModerator")] - partial class GroupModerator - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id5"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id4"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006115929_GroupModerator.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221006115929_GroupModerator.cs deleted file mode 100644 index e0b45c1..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006115929_GroupModerator.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class GroupModerator : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "is_moderator", - table: "group_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "is_moderator", - table: "group_pairs"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006122618_groupbans.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221006122618_groupbans.Designer.cs deleted file mode 100644 index 9c82ebd..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006122618_groupbans.Designer.cs +++ /dev/null @@ -1,462 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221006122618_groupbans")] - partial class groupbans - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006122618_groupbans.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221006122618_groupbans.cs deleted file mode 100644 index 84860eb..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221006122618_groupbans.cs +++ /dev/null @@ -1,135 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class groupbans : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_groups_group_temp_id", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_users_group_user_temp_id4", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_groups_users_owner_temp_id5", - table: "groups"); - - migrationBuilder.CreateTable( - name: "group_bans", - columns: table => new - { - group_gid = table.Column(type: "character varying(20)", nullable: false), - banned_user_uid = table.Column(type: "character varying(10)", nullable: false), - banned_by_uid = table.Column(type: "character varying(10)", nullable: true), - banned_on = table.Column(type: "timestamp with time zone", nullable: false), - banned_reason = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_group_bans", x => new { x.group_gid, x.banned_user_uid }); - table.ForeignKey( - name: "fk_group_bans_groups_group_temp_id", - column: x => x.group_gid, - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "fk_group_bans_users_banned_by_temp_id4", - column: x => x.banned_by_uid, - principalTable: "users", - principalColumn: "uid"); - table.ForeignKey( - name: "fk_group_bans_users_banned_user_temp_id5", - column: x => x.banned_user_uid, - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "ix_group_bans_banned_by_uid", - table: "group_bans", - column: "banned_by_uid"); - - migrationBuilder.CreateIndex( - name: "ix_group_bans_banned_user_uid", - table: "group_bans", - column: "banned_user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_group_bans_group_gid", - table: "group_bans", - column: "group_gid"); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_groups_group_temp_id1", - table: "group_pairs", - column: "group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_users_group_user_temp_id6", - table: "group_pairs", - column: "group_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_groups_users_owner_temp_id7", - table: "groups", - column: "owner_uid", - principalTable: "users", - principalColumn: "uid"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_groups_group_temp_id1", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_users_group_user_temp_id6", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_groups_users_owner_temp_id7", - table: "groups"); - - migrationBuilder.DropTable( - name: "group_bans"); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_groups_group_temp_id", - table: "group_pairs", - column: "group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_users_group_user_temp_id4", - table: "group_pairs", - column: "group_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_groups_users_owner_temp_id5", - table: "groups", - column: "owner_uid", - principalTable: "users", - principalColumn: "uid"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024141548_GroupTempInvite.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221024141548_GroupTempInvite.Designer.cs deleted file mode 100644 index 8f085d2..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024141548_GroupTempInvite.Designer.cs +++ /dev/null @@ -1,501 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221024141548_GroupTempInvite")] - partial class GroupTempInvite - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024141548_GroupTempInvite.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221024141548_GroupTempInvite.cs deleted file mode 100644 index 8261909..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024141548_GroupTempInvite.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class GroupTempInvite : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "group_temp_invites", - columns: table => new - { - group_gid = table.Column(type: "character varying(20)", nullable: false), - invite = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), - expiration_date = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_group_temp_invites", x => new { x.group_gid, x.invite }); - table.ForeignKey( - name: "fk_group_temp_invites_groups_group_gid", - column: x => x.group_gid, - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "ix_group_temp_invites_group_gid", - table: "group_temp_invites", - column: "group_gid"); - - migrationBuilder.CreateIndex( - name: "ix_group_temp_invites_invite", - table: "group_temp_invites", - column: "invite"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "group_temp_invites"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024181912_AdjustInviteLength.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221024181912_AdjustInviteLength.Designer.cs deleted file mode 100644 index 1cab514..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024181912_AdjustInviteLength.Designer.cs +++ /dev/null @@ -1,501 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221024181912_AdjustInviteLength")] - partial class AdjustInviteLength - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.8") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024181912_AdjustInviteLength.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221024181912_AdjustInviteLength.cs deleted file mode 100644 index 6ad4850..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221024181912_AdjustInviteLength.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - public partial class AdjustInviteLength : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "invite", - table: "group_temp_invites", - type: "character varying(64)", - maxLength: 64, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(10)", - oldMaxLength: 10); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "invite", - table: "group_temp_invites", - type: "character varying(10)", - maxLength: 10, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)", - oldMaxLength: 64); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221228033214_FileCacheSize.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221228033214_FileCacheSize.Designer.cs deleted file mode 100644 index 09c04cb..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221228033214_FileCacheSize.Designer.cs +++ /dev/null @@ -1,506 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20221228033214_FileCacheSize")] - partial class FileCacheSize - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20221228033214_FileCacheSize.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20221228033214_FileCacheSize.cs deleted file mode 100644 index 8fc1201..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20221228033214_FileCacheSize.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class FileCacheSize : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "size", - table: "file_caches", - type: "bigint", - nullable: false, - defaultValue: 0L); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "size", - table: "file_caches"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230111092127_IsBannedForAuth.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230111092127_IsBannedForAuth.Designer.cs deleted file mode 100644 index 7f9e0c6..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230111092127_IsBannedForAuth.Designer.cs +++ /dev/null @@ -1,510 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230111092127_IsBannedForAuth")] - partial class IsBannedForAuth - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230111092127_IsBannedForAuth.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230111092127_IsBannedForAuth.cs deleted file mode 100644 index 7f8ab0e..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230111092127_IsBannedForAuth.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class IsBannedForAuth : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "is_banned", - table: "auth", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "is_banned", - table: "auth"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230118184347_FilesUploadDate.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230118184347_FilesUploadDate.Designer.cs deleted file mode 100644 index 1b5bad8..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230118184347_FilesUploadDate.Designer.cs +++ /dev/null @@ -1,514 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230118184347_FilesUploadDate")] - partial class FilesUploadDate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230118184347_FilesUploadDate.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230118184347_FilesUploadDate.cs deleted file mode 100644 index 8f6a46a..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230118184347_FilesUploadDate.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class FilesUploadDate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "upload_date", - table: "file_caches", - type: "timestamp with time zone", - nullable: false, - defaultValue: new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "upload_date", - table: "file_caches"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230126163758_GroupPerms.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230126163758_GroupPerms.Designer.cs deleted file mode 100644 index 883a1c3..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230126163758_GroupPerms.Designer.cs +++ /dev/null @@ -1,530 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230126163758_GroupPerms")] - partial class GroupPerms - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id2"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id7"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id4"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id6"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230126163758_GroupPerms.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230126163758_GroupPerms.cs deleted file mode 100644 index 0729490..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230126163758_GroupPerms.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class GroupPerms : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "disable_animations", - table: "groups", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "disable_sounds", - table: "groups", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "disable_animations", - table: "group_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "disable_sounds", - table: "group_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "disable_animations", - table: "groups"); - - migrationBuilder.DropColumn( - name: "disable_sounds", - table: "groups"); - - migrationBuilder.DropColumn( - name: "disable_animations", - table: "group_pairs"); - - migrationBuilder.DropColumn( - name: "disable_sounds", - table: "group_pairs"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230131193425_AddPrimaryUserToAuth.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230131193425_AddPrimaryUserToAuth.Designer.cs deleted file mode 100644 index 2baee23..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230131193425_AddPrimaryUserToAuth.Designer.cs +++ /dev/null @@ -1,544 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230131193425_AddPrimaryUserToAuth")] - partial class AddPrimaryUserToAuth - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id1"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id2"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id3"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id8"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id6"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id7"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230131193425_AddPrimaryUserToAuth.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230131193425_AddPrimaryUserToAuth.cs deleted file mode 100644 index 488bbf0..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230131193425_AddPrimaryUserToAuth.cs +++ /dev/null @@ -1,210 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class AddPrimaryUserToAuth : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_auth_users_user_temp_id", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_other_user_temp_id1", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_user_temp_id2", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_by_temp_id4", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_user_temp_id5", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_users_group_user_temp_id6", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_groups_users_owner_temp_id7", - table: "groups"); - - migrationBuilder.AddColumn( - name: "primary_user_uid", - table: "auth", - type: "character varying(10)", - nullable: true); - - migrationBuilder.CreateIndex( - name: "ix_auth_primary_user_uid", - table: "auth", - column: "primary_user_uid"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_primary_user_temp_id", - table: "auth", - column: "primary_user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_user_temp_id1", - table: "auth", - column: "user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_other_user_temp_id2", - table: "client_pairs", - column: "other_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_user_temp_id3", - table: "client_pairs", - column: "user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_by_temp_id5", - table: "group_bans", - column: "banned_by_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_user_temp_id6", - table: "group_bans", - column: "banned_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_users_group_user_temp_id7", - table: "group_pairs", - column: "group_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_groups_users_owner_temp_id8", - table: "groups", - column: "owner_uid", - principalTable: "users", - principalColumn: "uid"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_auth_users_primary_user_temp_id", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_auth_users_user_temp_id1", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_other_user_temp_id2", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_user_temp_id3", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_by_temp_id5", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_user_temp_id6", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_users_group_user_temp_id7", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_groups_users_owner_temp_id8", - table: "groups"); - - migrationBuilder.DropIndex( - name: "ix_auth_primary_user_uid", - table: "auth"); - - migrationBuilder.DropColumn( - name: "primary_user_uid", - table: "auth"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_user_temp_id", - table: "auth", - column: "user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_other_user_temp_id1", - table: "client_pairs", - column: "other_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_user_temp_id2", - table: "client_pairs", - column: "user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_by_temp_id4", - table: "group_bans", - column: "banned_by_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_user_temp_id5", - table: "group_bans", - column: "banned_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_users_group_user_temp_id6", - table: "group_pairs", - column: "group_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_groups_users_owner_temp_id7", - table: "groups", - column: "owner_uid", - principalTable: "users", - principalColumn: "uid"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230228001033_UserPerms.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230228001033_UserPerms.Designer.cs deleted file mode 100644 index 58f336e..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230228001033_UserPerms.Designer.cs +++ /dev/null @@ -1,552 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230228001033_UserPerms")] - partial class UserPerms - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id1"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id2"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id3"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id8"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id6"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id7"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230228001033_UserPerms.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230228001033_UserPerms.cs deleted file mode 100644 index 18556ac..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230228001033_UserPerms.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class UserPerms : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "disable_animations", - table: "client_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "disable_sounds", - table: "client_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "disable_animations", - table: "client_pairs"); - - migrationBuilder.DropColumn( - name: "disable_sounds", - table: "client_pairs"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319015307_UserProfileData.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230319015307_UserProfileData.Designer.cs deleted file mode 100644 index ea2bac1..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319015307_UserProfileData.Designer.cs +++ /dev/null @@ -1,584 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230319015307_UserProfileData")] - partial class UserProfileData - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id1"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id2"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id3"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id8"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id6"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id7"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319015307_UserProfileData.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230319015307_UserProfileData.cs deleted file mode 100644 index 6b4bb1a..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319015307_UserProfileData.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class UserProfileData : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "user_profile_data", - columns: table => new - { - user_uid = table.Column(type: "character varying(10)", nullable: false), - base64profile_image = table.Column(type: "text", nullable: true), - user_description = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_user_profile_data", x => x.user_uid); - table.ForeignKey( - name: "fk_user_profile_data_users_user_uid", - column: x => x.user_uid, - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "user_profile_data"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319114005_UserProfileReports.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230319114005_UserProfileReports.Designer.cs deleted file mode 100644 index 4fd766a..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319114005_UserProfileReports.Designer.cs +++ /dev/null @@ -1,650 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230319114005_UserProfileReports")] - partial class UserProfileReports - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("FlaggedForReport") - .HasColumnType("boolean") - .HasColumnName("flagged_for_report"); - - b.Property("IsNSFW") - .HasColumnType("boolean") - .HasColumnName("is_nsfw"); - - b.Property("ProfileDisabled") - .HasColumnType("boolean") - .HasColumnName("profile_disabled"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ReportDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("report_date"); - - b.Property("ReportReason") - .HasColumnType("text") - .HasColumnName("report_reason"); - - b.Property("ReportedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reported_user_uid"); - - b.Property("ReportingUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reporting_user_uid"); - - b.HasKey("Id") - .HasName("pk_user_profile_data_reports"); - - b.HasIndex("ReportedUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reported_user_uid"); - - b.HasIndex("ReportingUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid"); - - b.ToTable("user_profile_data_reports", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id1"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id2"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id3"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id8"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id6"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id7"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.HasOne("MareSynchronosShared.Models.User", "ReportedUser") - .WithMany() - .HasForeignKey("ReportedUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "ReportingUser") - .WithMany() - .HasForeignKey("ReportingUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid"); - - b.Navigation("ReportedUser"); - - b.Navigation("ReportingUser"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319114005_UserProfileReports.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230319114005_UserProfileReports.cs deleted file mode 100644 index 660af57..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230319114005_UserProfileReports.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class UserProfileReports : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "flagged_for_report", - table: "user_profile_data", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "is_nsfw", - table: "user_profile_data", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "profile_disabled", - table: "user_profile_data", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.CreateTable( - name: "user_profile_data_reports", - columns: table => new - { - id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - report_date = table.Column(type: "timestamp with time zone", nullable: false), - reported_user_uid = table.Column(type: "character varying(10)", nullable: true), - reporting_user_uid = table.Column(type: "character varying(10)", nullable: true), - report_reason = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_user_profile_data_reports", x => x.id); - table.ForeignKey( - name: "fk_user_profile_data_reports_users_reported_user_uid", - column: x => x.reported_user_uid, - principalTable: "users", - principalColumn: "uid"); - table.ForeignKey( - name: "fk_user_profile_data_reports_users_reporting_user_uid", - column: x => x.reporting_user_uid, - principalTable: "users", - principalColumn: "uid"); - }); - - migrationBuilder.CreateIndex( - name: "ix_user_profile_data_reports_reported_user_uid", - table: "user_profile_data_reports", - column: "reported_user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_user_profile_data_reports_reporting_user_uid", - table: "user_profile_data_reports", - column: "reporting_user_uid"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "user_profile_data_reports"); - - migrationBuilder.DropColumn( - name: "flagged_for_report", - table: "user_profile_data"); - - migrationBuilder.DropColumn( - name: "is_nsfw", - table: "user_profile_data"); - - migrationBuilder.DropColumn( - name: "profile_disabled", - table: "user_profile_data"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230420075153_DisableVFX.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230420075153_DisableVFX.Designer.cs deleted file mode 100644 index df61fe6..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230420075153_DisableVFX.Designer.cs +++ /dev/null @@ -1,662 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20230420075153_DisableVFX")] - partial class DisableVFX - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("FlaggedForReport") - .HasColumnType("boolean") - .HasColumnName("flagged_for_report"); - - b.Property("IsNSFW") - .HasColumnType("boolean") - .HasColumnName("is_nsfw"); - - b.Property("ProfileDisabled") - .HasColumnType("boolean") - .HasColumnName("profile_disabled"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ReportDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("report_date"); - - b.Property("ReportReason") - .HasColumnType("text") - .HasColumnName("report_reason"); - - b.Property("ReportedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reported_user_uid"); - - b.Property("ReportingUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reporting_user_uid"); - - b.HasKey("Id") - .HasName("pk_user_profile_data_reports"); - - b.HasIndex("ReportedUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reported_user_uid"); - - b.HasIndex("ReportingUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid"); - - b.ToTable("user_profile_data_reports", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_temp_id"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_temp_id1"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_temp_id2"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_temp_id3"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_temp_id8"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_temp_id5"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_temp_id6"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_temp_id"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_temp_id1"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_temp_id7"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.HasOne("MareSynchronosShared.Models.User", "ReportedUser") - .WithMany() - .HasForeignKey("ReportedUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "ReportingUser") - .WithMany() - .HasForeignKey("ReportingUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid"); - - b.Navigation("ReportedUser"); - - b.Navigation("ReportingUser"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20230420075153_DisableVFX.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20230420075153_DisableVFX.cs deleted file mode 100644 index ca51b6e..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20230420075153_DisableVFX.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class DisableVFX : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "disable_vfx", - table: "groups", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "disable_vfx", - table: "group_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "disable_vfx", - table: "client_pairs", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "disable_vfx", - table: "groups"); - - migrationBuilder.DropColumn( - name: "disable_vfx", - table: "group_pairs"); - - migrationBuilder.DropColumn( - name: "disable_vfx", - table: "client_pairs"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174017_Bump.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174017_Bump.Designer.cs deleted file mode 100644 index 9727ed0..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174017_Bump.Designer.cs +++ /dev/null @@ -1,662 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20250627174017_Bump")] - partial class Bump - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("FlaggedForReport") - .HasColumnType("boolean") - .HasColumnName("flagged_for_report"); - - b.Property("IsNSFW") - .HasColumnType("boolean") - .HasColumnName("is_nsfw"); - - b.Property("ProfileDisabled") - .HasColumnType("boolean") - .HasColumnName("profile_disabled"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ReportDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("report_date"); - - b.Property("ReportReason") - .HasColumnType("text") - .HasColumnName("report_reason"); - - b.Property("ReportedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reported_user_uid"); - - b.Property("ReportingUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reporting_user_uid"); - - b.HasKey("Id") - .HasName("pk_user_profile_data_reports"); - - b.HasIndex("ReportedUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reported_user_uid"); - - b.HasIndex("ReportingUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid"); - - b.ToTable("user_profile_data_reports", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_uid"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_uid"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_uid"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_uid"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_gid"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_uid"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.HasOne("MareSynchronosShared.Models.User", "ReportedUser") - .WithMany() - .HasForeignKey("ReportedUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "ReportingUser") - .WithMany() - .HasForeignKey("ReportingUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid"); - - b.Navigation("ReportedUser"); - - b.Navigation("ReportingUser"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174017_Bump.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174017_Bump.cs deleted file mode 100644 index 073330f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174017_Bump.cs +++ /dev/null @@ -1,250 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class Bump : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_auth_users_primary_user_temp_id", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_auth_users_user_temp_id1", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_other_user_temp_id2", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_user_temp_id3", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_groups_group_temp_id", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_by_temp_id5", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_user_temp_id6", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_groups_group_temp_id1", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_users_group_user_temp_id7", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_groups_users_owner_temp_id8", - table: "groups"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_primary_user_uid", - table: "auth", - column: "primary_user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_user_uid", - table: "auth", - column: "user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_other_user_uid", - table: "client_pairs", - column: "other_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_user_uid", - table: "client_pairs", - column: "user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_groups_group_gid", - table: "group_bans", - column: "group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_by_uid", - table: "group_bans", - column: "banned_by_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_user_uid", - table: "group_bans", - column: "banned_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_groups_group_gid", - table: "group_pairs", - column: "group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_users_group_user_uid", - table: "group_pairs", - column: "group_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_groups_users_owner_uid", - table: "groups", - column: "owner_uid", - principalTable: "users", - principalColumn: "uid"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_auth_users_primary_user_uid", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_auth_users_user_uid", - table: "auth"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_other_user_uid", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_client_pairs_users_user_uid", - table: "client_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_groups_group_gid", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_by_uid", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_bans_users_banned_user_uid", - table: "group_bans"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_groups_group_gid", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_group_pairs_users_group_user_uid", - table: "group_pairs"); - - migrationBuilder.DropForeignKey( - name: "fk_groups_users_owner_uid", - table: "groups"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_primary_user_temp_id", - table: "auth", - column: "primary_user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_auth_users_user_temp_id1", - table: "auth", - column: "user_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_other_user_temp_id2", - table: "client_pairs", - column: "other_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_client_pairs_users_user_temp_id3", - table: "client_pairs", - column: "user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_groups_group_temp_id", - table: "group_bans", - column: "group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_by_temp_id5", - table: "group_bans", - column: "banned_by_uid", - principalTable: "users", - principalColumn: "uid"); - - migrationBuilder.AddForeignKey( - name: "fk_group_bans_users_banned_user_temp_id6", - table: "group_bans", - column: "banned_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_groups_group_temp_id1", - table: "group_pairs", - column: "group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_group_pairs_users_group_user_temp_id7", - table: "group_pairs", - column: "group_user_uid", - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "fk_groups_users_owner_temp_id8", - table: "groups", - column: "owner_uid", - principalTable: "users", - principalColumn: "uid"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174541_MCDO.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174541_MCDO.Designer.cs deleted file mode 100644 index 0a9b2a6..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174541_MCDO.Designer.cs +++ /dev/null @@ -1,974 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20250627174541_MCDO")] - partial class MCDO - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.Property("Id") - .HasColumnType("text") - .HasColumnName("id"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.Property("AccessType") - .HasColumnType("integer") - .HasColumnName("access_type"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_date"); - - b.Property("CustomizeData") - .HasColumnType("text") - .HasColumnName("customize_data"); - - b.Property("Description") - .HasColumnType("text") - .HasColumnName("description"); - - b.Property("DownloadCount") - .HasColumnType("integer") - .HasColumnName("download_count"); - - b.Property("ExpiryDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiry_date"); - - b.Property("GlamourerData") - .HasColumnType("text") - .HasColumnName("glamourer_data"); - - b.Property("ManipulationData") - .HasColumnType("text") - .HasColumnName("manipulation_data"); - - b.Property("ShareType") - .HasColumnType("integer") - .HasColumnName("share_type"); - - b.Property("UpdatedDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("updated_date"); - - b.HasKey("Id", "UploaderUID") - .HasName("pk_chara_data"); - - b.HasIndex("Id") - .HasDatabaseName("ix_chara_data_id"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_chara_data_uploader_uid"); - - b.ToTable("chara_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataAllowance", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("AllowedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("allowed_user_uid"); - - b.HasKey("ParentId", "ParentUploaderUID", "AllowedUserUID") - .HasName("pk_chara_data_allowance"); - - b.HasIndex("AllowedUserUID") - .HasDatabaseName("ix_chara_data_allowance_allowed_user_uid"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_allowance_parent_id"); - - b.ToTable("chara_data_allowance", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFile", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("FileCacheHash") - .HasColumnType("character varying(40)") - .HasColumnName("file_cache_hash"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_files"); - - b.HasIndex("FileCacheHash") - .HasDatabaseName("ix_chara_data_files_file_cache_hash"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_files_parent_id"); - - b.ToTable("chara_data_files", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFileSwap", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("FilePath") - .HasColumnType("text") - .HasColumnName("file_path"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_file_swaps"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_file_swaps_parent_id"); - - b.ToTable("chara_data_file_swaps", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataOriginalFile", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("Hash") - .HasColumnType("text") - .HasColumnName("hash"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_orig_files"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_orig_files_parent_id"); - - b.ToTable("chara_data_orig_files", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataPose", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Description") - .HasColumnType("text") - .HasColumnName("description"); - - b.Property("PoseData") - .HasColumnType("text") - .HasColumnName("pose_data"); - - b.Property("WorldData") - .HasColumnType("text") - .HasColumnName("world_data"); - - b.HasKey("ParentId", "ParentUploaderUID", "Id") - .HasName("pk_chara_data_poses"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_poses_parent_id"); - - b.ToTable("chara_data_poses", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("FlaggedForReport") - .HasColumnType("boolean") - .HasColumnName("flagged_for_report"); - - b.Property("IsNSFW") - .HasColumnType("boolean") - .HasColumnName("is_nsfw"); - - b.Property("ProfileDisabled") - .HasColumnType("boolean") - .HasColumnName("profile_disabled"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ReportDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("report_date"); - - b.Property("ReportReason") - .HasColumnType("text") - .HasColumnName("report_reason"); - - b.Property("ReportedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reported_user_uid"); - - b.Property("ReportingUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reporting_user_uid"); - - b.HasKey("Id") - .HasName("pk_user_profile_data_reports"); - - b.HasIndex("ReportedUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reported_user_uid"); - - b.HasIndex("ReportingUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid"); - - b.ToTable("user_profile_data_reports", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_uid"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataAllowance", b => - { - b.HasOne("MareSynchronosShared.Models.User", "AllowedUser") - .WithMany() - .HasForeignKey("AllowedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_allowance_users_allowed_user_uid"); - - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("AllowedIndividiuals") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_allowance_chara_data_parent_id_parent_uploader_u"); - - b.Navigation("AllowedUser"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFile", b => - { - b.HasOne("MareSynchronosShared.Models.FileCache", "FileCache") - .WithMany() - .HasForeignKey("FileCacheHash") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_files_files_file_cache_hash"); - - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("Files") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_files_chara_data_parent_id_parent_uploader_uid"); - - b.Navigation("FileCache"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFileSwap", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("FileSwaps") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_file_swaps_chara_data_parent_id_parent_uploader_"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataOriginalFile", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("OriginalFiles") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_orig_files_chara_data_parent_id_parent_uploader_"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataPose", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("Poses") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_poses_chara_data_parent_id_parent_uploader_uid"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_uid"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_uid"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_uid"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_gid"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_uid"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.HasOne("MareSynchronosShared.Models.User", "ReportedUser") - .WithMany() - .HasForeignKey("ReportedUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "ReportingUser") - .WithMany() - .HasForeignKey("ReportingUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid"); - - b.Navigation("ReportedUser"); - - b.Navigation("ReportingUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.Navigation("AllowedIndividiuals"); - - b.Navigation("FileSwaps"); - - b.Navigation("Files"); - - b.Navigation("OriginalFiles"); - - b.Navigation("Poses"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174541_MCDO.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174541_MCDO.cs deleted file mode 100644 index 5466ead..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627174541_MCDO.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class MCDO : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "chara_data", - columns: table => new - { - id = table.Column(type: "text", nullable: false), - uploader_uid = table.Column(type: "character varying(10)", nullable: false), - created_date = table.Column(type: "timestamp with time zone", nullable: false), - updated_date = table.Column(type: "timestamp with time zone", nullable: false), - description = table.Column(type: "text", nullable: true), - access_type = table.Column(type: "integer", nullable: false), - share_type = table.Column(type: "integer", nullable: false), - expiry_date = table.Column(type: "timestamp with time zone", nullable: true), - glamourer_data = table.Column(type: "text", nullable: true), - customize_data = table.Column(type: "text", nullable: true), - manipulation_data = table.Column(type: "text", nullable: true), - download_count = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_chara_data", x => new { x.id, x.uploader_uid }); - table.ForeignKey( - name: "fk_chara_data_users_uploader_uid", - column: x => x.uploader_uid, - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "chara_data_allowance", - columns: table => new - { - parent_id = table.Column(type: "text", nullable: false), - parent_uploader_uid = table.Column(type: "character varying(10)", nullable: false), - allowed_user_uid = table.Column(type: "character varying(10)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_chara_data_allowance", x => new { x.parent_id, x.parent_uploader_uid, x.allowed_user_uid }); - table.ForeignKey( - name: "fk_chara_data_allowance_chara_data_parent_id_parent_uploader_u", - columns: x => new { x.parent_id, x.parent_uploader_uid }, - principalTable: "chara_data", - principalColumns: new[] { "id", "uploader_uid" }, - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "fk_chara_data_allowance_users_allowed_user_uid", - column: x => x.allowed_user_uid, - principalTable: "users", - principalColumn: "uid", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "chara_data_file_swaps", - columns: table => new - { - parent_id = table.Column(type: "text", nullable: false), - parent_uploader_uid = table.Column(type: "character varying(10)", nullable: false), - game_path = table.Column(type: "text", nullable: false), - file_path = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_chara_data_file_swaps", x => new { x.parent_id, x.parent_uploader_uid, x.game_path }); - table.ForeignKey( - name: "fk_chara_data_file_swaps_chara_data_parent_id_parent_uploader_", - columns: x => new { x.parent_id, x.parent_uploader_uid }, - principalTable: "chara_data", - principalColumns: new[] { "id", "uploader_uid" }, - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "chara_data_files", - columns: table => new - { - game_path = table.Column(type: "text", nullable: false), - parent_id = table.Column(type: "text", nullable: false), - parent_uploader_uid = table.Column(type: "character varying(10)", nullable: false), - file_cache_hash = table.Column(type: "character varying(40)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_chara_data_files", x => new { x.parent_id, x.parent_uploader_uid, x.game_path }); - table.ForeignKey( - name: "fk_chara_data_files_chara_data_parent_id_parent_uploader_uid", - columns: x => new { x.parent_id, x.parent_uploader_uid }, - principalTable: "chara_data", - principalColumns: new[] { "id", "uploader_uid" }, - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "fk_chara_data_files_files_file_cache_hash", - column: x => x.file_cache_hash, - principalTable: "file_caches", - principalColumn: "hash", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "chara_data_orig_files", - columns: table => new - { - parent_id = table.Column(type: "text", nullable: false), - parent_uploader_uid = table.Column(type: "character varying(10)", nullable: false), - game_path = table.Column(type: "text", nullable: false), - hash = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_chara_data_orig_files", x => new { x.parent_id, x.parent_uploader_uid, x.game_path }); - table.ForeignKey( - name: "fk_chara_data_orig_files_chara_data_parent_id_parent_uploader_", - columns: x => new { x.parent_id, x.parent_uploader_uid }, - principalTable: "chara_data", - principalColumns: new[] { "id", "uploader_uid" }, - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "chara_data_poses", - columns: table => new - { - id = table.Column(type: "bigint", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - parent_id = table.Column(type: "text", nullable: false), - parent_uploader_uid = table.Column(type: "character varying(10)", nullable: false), - description = table.Column(type: "text", nullable: true), - pose_data = table.Column(type: "text", nullable: true), - world_data = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_chara_data_poses", x => new { x.parent_id, x.parent_uploader_uid, x.id }); - table.ForeignKey( - name: "fk_chara_data_poses_chara_data_parent_id_parent_uploader_uid", - columns: x => new { x.parent_id, x.parent_uploader_uid }, - principalTable: "chara_data", - principalColumns: new[] { "id", "uploader_uid" }, - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_id", - table: "chara_data", - column: "id"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_uploader_uid", - table: "chara_data", - column: "uploader_uid"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_allowance_allowed_user_uid", - table: "chara_data_allowance", - column: "allowed_user_uid"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_allowance_parent_id", - table: "chara_data_allowance", - column: "parent_id"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_file_swaps_parent_id", - table: "chara_data_file_swaps", - column: "parent_id"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_files_file_cache_hash", - table: "chara_data_files", - column: "file_cache_hash"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_files_parent_id", - table: "chara_data_files", - column: "parent_id"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_orig_files_parent_id", - table: "chara_data_orig_files", - column: "parent_id"); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_poses_parent_id", - table: "chara_data_poses", - column: "parent_id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "chara_data_allowance"); - - migrationBuilder.DropTable( - name: "chara_data_file_swaps"); - - migrationBuilder.DropTable( - name: "chara_data_files"); - - migrationBuilder.DropTable( - name: "chara_data_orig_files"); - - migrationBuilder.DropTable( - name: "chara_data_poses"); - - migrationBuilder.DropTable( - name: "chara_data"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627204223_AllowedGroup.Designer.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250627204223_AllowedGroup.Designer.cs deleted file mode 100644 index d462c65..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627204223_AllowedGroup.Designer.cs +++ /dev/null @@ -1,1094 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - [Migration("20250627204223_AllowedGroup")] - partial class AllowedGroup - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("MarkForBan") - .HasColumnType("boolean") - .HasColumnName("mark_for_ban"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.Property("Id") - .HasColumnType("text") - .HasColumnName("id"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.Property("AccessType") - .HasColumnType("integer") - .HasColumnName("access_type"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_date"); - - b.Property("CustomizeData") - .HasColumnType("text") - .HasColumnName("customize_data"); - - b.Property("Description") - .HasColumnType("text") - .HasColumnName("description"); - - b.Property("DownloadCount") - .HasColumnType("integer") - .HasColumnName("download_count"); - - b.Property("ExpiryDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiry_date"); - - b.Property("GlamourerData") - .HasColumnType("text") - .HasColumnName("glamourer_data"); - - b.Property("ManipulationData") - .HasColumnType("text") - .HasColumnName("manipulation_data"); - - b.Property("ShareType") - .HasColumnType("integer") - .HasColumnName("share_type"); - - b.Property("UpdatedDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("updated_date"); - - b.HasKey("Id", "UploaderUID") - .HasName("pk_chara_data"); - - b.HasIndex("Id") - .HasDatabaseName("ix_chara_data_id"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_chara_data_uploader_uid"); - - b.ToTable("chara_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataAllowance", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AllowedGroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("allowed_group_gid"); - - b.Property("AllowedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("allowed_user_uid"); - - b.HasKey("ParentId", "ParentUploaderUID", "Id") - .HasName("pk_chara_data_allowance"); - - b.HasIndex("AllowedGroupGID") - .HasDatabaseName("ix_chara_data_allowance_allowed_group_gid"); - - b.HasIndex("AllowedUserUID") - .HasDatabaseName("ix_chara_data_allowance_allowed_user_uid"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_allowance_parent_id"); - - b.ToTable("chara_data_allowance", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFile", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("FileCacheHash") - .HasColumnType("character varying(40)") - .HasColumnName("file_cache_hash"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_files"); - - b.HasIndex("FileCacheHash") - .HasDatabaseName("ix_chara_data_files_file_cache_hash"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_files_parent_id"); - - b.ToTable("chara_data_files", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFileSwap", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("FilePath") - .HasColumnType("text") - .HasColumnName("file_path"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_file_swaps"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_file_swaps_parent_id"); - - b.ToTable("chara_data_file_swaps", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataOriginalFile", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("Hash") - .HasColumnType("text") - .HasColumnName("hash"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_orig_files"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_orig_files_parent_id"); - - b.ToTable("chara_data_orig_files", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataPose", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Description") - .HasColumnType("text") - .HasColumnName("description"); - - b.Property("PoseData") - .HasColumnType("text") - .HasColumnName("pose_data"); - - b.Property("WorldData") - .HasColumnType("text") - .HasColumnName("world_data"); - - b.HasKey("ParentId", "ParentUploaderUID", "Id") - .HasName("pk_chara_data_poses"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_poses_parent_id"); - - b.ToTable("chara_data_poses", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("RawSize") - .HasColumnType("bigint") - .HasColumnName("raw_size"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.Property("PreferDisableAnimations") - .HasColumnType("boolean") - .HasColumnName("prefer_disable_animations"); - - b.Property("PreferDisableSounds") - .HasColumnType("boolean") - .HasColumnName("prefer_disable_sounds"); - - b.Property("PreferDisableVFX") - .HasColumnType("boolean") - .HasColumnName("prefer_disable_vfx"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.HasKey("UserUID", "GroupGID") - .HasName("pk_group_pair_preferred_permissions"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pair_preferred_permissions_group_gid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_group_pair_preferred_permissions_user_uid"); - - b.ToTable("group_pair_preferred_permissions", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("DisableGroupAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_group_animations"); - - b.Property("DisableGroupSounds") - .HasColumnType("boolean") - .HasColumnName("disable_group_sounds"); - - b.Property("DisableGroupVFX") - .HasColumnType("boolean") - .HasColumnName("disable_group_vfx"); - - b.Property("DisableIndividualAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_individual_animations"); - - b.Property("DisableIndividualSounds") - .HasColumnType("boolean") - .HasColumnName("disable_individual_sounds"); - - b.Property("DisableIndividualVFX") - .HasColumnType("boolean") - .HasColumnName("disable_individual_vfx"); - - b.Property("IndividualIsSticky") - .HasColumnType("boolean") - .HasColumnName("individual_is_sticky"); - - b.HasKey("UserUID") - .HasName("pk_user_default_preferred_permissions"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_user_default_preferred_permissions_user_uid"); - - b.ToTable("user_default_preferred_permissions", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Sticky") - .HasColumnType("boolean") - .HasColumnName("sticky"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_user_permission_sets"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_user_permission_sets_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_user_permission_sets_user_uid"); - - b.HasIndex("UserUID", "OtherUserUID", "IsPaused") - .HasDatabaseName("ix_user_permission_sets_user_uid_other_user_uid_is_paused"); - - b.ToTable("user_permission_sets", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("FlaggedForReport") - .HasColumnType("boolean") - .HasColumnName("flagged_for_report"); - - b.Property("IsNSFW") - .HasColumnType("boolean") - .HasColumnName("is_nsfw"); - - b.Property("ProfileDisabled") - .HasColumnType("boolean") - .HasColumnName("profile_disabled"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_uid"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataAllowance", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "AllowedGroup") - .WithMany() - .HasForeignKey("AllowedGroupGID") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_allowance_groups_allowed_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "AllowedUser") - .WithMany() - .HasForeignKey("AllowedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_allowance_users_allowed_user_uid"); - - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("AllowedIndividiuals") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_allowance_chara_data_parent_id_parent_uploader_u"); - - b.Navigation("AllowedGroup"); - - b.Navigation("AllowedUser"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFile", b => - { - b.HasOne("MareSynchronosShared.Models.FileCache", "FileCache") - .WithMany() - .HasForeignKey("FileCacheHash") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_files_files_file_cache_hash"); - - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("Files") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_files_chara_data_parent_id_parent_uploader_uid"); - - b.Navigation("FileCache"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFileSwap", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("FileSwaps") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_file_swaps_chara_data_parent_id_parent_uploader_"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataOriginalFile", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("OriginalFiles") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_orig_files_chara_data_parent_id_parent_uploader_"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataPose", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("Poses") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_poses_chara_data_parent_id_parent_uploader_uid"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_uid"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_uid"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_uid"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_gid"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_uid"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pair_preferred_permissions_groups_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pair_preferred_permissions_users_user_uid"); - - b.Navigation("Group"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_default_preferred_permissions_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_permission_sets_users_other_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_permission_sets_users_user_uid"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.Navigation("AllowedIndividiuals"); - - b.Navigation("FileSwaps"); - - b.Navigation("Files"); - - b.Navigation("OriginalFiles"); - - b.Navigation("Poses"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627204223_AllowedGroup.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250627204223_AllowedGroup.cs deleted file mode 100644 index dd1a979..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250627204223_AllowedGroup.cs +++ /dev/null @@ -1,98 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class AllowedGroup : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropPrimaryKey( - name: "pk_chara_data_allowance", - table: "chara_data_allowance"); - - migrationBuilder.AlterColumn( - name: "allowed_user_uid", - table: "chara_data_allowance", - type: "character varying(10)", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(10)"); - - migrationBuilder.AddColumn( - name: "id", - table: "chara_data_allowance", - type: "bigint", - nullable: false, - defaultValue: 0L) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - migrationBuilder.AddColumn( - name: "allowed_group_gid", - table: "chara_data_allowance", - type: "character varying(20)", - nullable: true); - - migrationBuilder.AddPrimaryKey( - name: "pk_chara_data_allowance", - table: "chara_data_allowance", - columns: new[] { "parent_id", "parent_uploader_uid", "id" }); - - migrationBuilder.CreateIndex( - name: "ix_chara_data_allowance_allowed_group_gid", - table: "chara_data_allowance", - column: "allowed_group_gid"); - - migrationBuilder.AddForeignKey( - name: "fk_chara_data_allowance_groups_allowed_group_gid", - table: "chara_data_allowance", - column: "allowed_group_gid", - principalTable: "groups", - principalColumn: "gid", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "fk_chara_data_allowance_groups_allowed_group_gid", - table: "chara_data_allowance"); - - migrationBuilder.DropPrimaryKey( - name: "pk_chara_data_allowance", - table: "chara_data_allowance"); - - migrationBuilder.DropIndex( - name: "ix_chara_data_allowance_allowed_group_gid", - table: "chara_data_allowance"); - - migrationBuilder.DropColumn( - name: "id", - table: "chara_data_allowance"); - - migrationBuilder.DropColumn( - name: "allowed_group_gid", - table: "chara_data_allowance"); - - migrationBuilder.AlterColumn( - name: "allowed_user_uid", - table: "chara_data_allowance", - type: "character varying(10)", - nullable: false, - defaultValue: "", - oldClrType: typeof(string), - oldType: "character varying(10)", - oldNullable: true); - - migrationBuilder.AddPrimaryKey( - name: "pk_chara_data_allowance", - table: "chara_data_allowance", - columns: new[] { "parent_id", "parent_uploader_uid", "allowed_user_uid" }); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/20250920090000_GroupTemporary.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/20250920090000_GroupTemporary.cs deleted file mode 100644 index 58b23b9..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/20250920090000_GroupTemporary.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - /// - public partial class GroupTemporary : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "expires_at", - table: "groups", - type: "timestamp with time zone", - nullable: true); - - migrationBuilder.AddColumn( - name: "is_temporary", - table: "groups", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "expires_at", - table: "groups"); - - migrationBuilder.DropColumn( - name: "is_temporary", - table: "groups"); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Migrations/MareDbContextModelSnapshot.cs b/MareSynchronosServer/MareSynchronosShared/Migrations/MareDbContextModelSnapshot.cs deleted file mode 100644 index a4bf759..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Migrations/MareDbContextModelSnapshot.cs +++ /dev/null @@ -1,1000 +0,0 @@ -// -using System; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MareSynchronosServer.Migrations -{ - [DbContext(typeof(MareDbContext))] - partial class MareDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.Property("HashedKey") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("hashed_key"); - - b.Property("IsBanned") - .HasColumnType("boolean") - .HasColumnName("is_banned"); - - b.Property("PrimaryUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("primary_user_uid"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("HashedKey") - .HasName("pk_auth"); - - b.HasIndex("PrimaryUserUID") - .HasDatabaseName("ix_auth_primary_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_auth_user_uid"); - - b.ToTable("auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Banned", b => - { - b.Property("CharacterIdentification") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("character_identification"); - - b.Property("Reason") - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("CharacterIdentification") - .HasName("pk_banned_users"); - - b.ToTable("banned_users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b => - { - b.Property("DiscordIdOrLodestoneAuth") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("discord_id_or_lodestone_auth"); - - b.HasKey("DiscordIdOrLodestoneAuth") - .HasName("pk_banned_registrations"); - - b.ToTable("banned_registrations", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.Property("Id") - .HasColumnType("text") - .HasColumnName("id"); - - b.Property("UploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.Property("AccessType") - .HasColumnType("integer") - .HasColumnName("access_type"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_date"); - - b.Property("CustomizeData") - .HasColumnType("text") - .HasColumnName("customize_data"); - - b.Property("Description") - .HasColumnType("text") - .HasColumnName("description"); - - b.Property("DownloadCount") - .HasColumnType("integer") - .HasColumnName("download_count"); - - b.Property("ExpiryDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiry_date"); - - b.Property("GlamourerData") - .HasColumnType("text") - .HasColumnName("glamourer_data"); - - b.Property("ManipulationData") - .HasColumnType("text") - .HasColumnName("manipulation_data"); - - b.Property("ShareType") - .HasColumnType("integer") - .HasColumnName("share_type"); - - b.Property("UpdatedDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("updated_date"); - - b.HasKey("Id", "UploaderUID") - .HasName("pk_chara_data"); - - b.HasIndex("Id") - .HasDatabaseName("ix_chara_data_id"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_chara_data_uploader_uid"); - - b.ToTable("chara_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataAllowance", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AllowedGroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("allowed_group_gid"); - - b.Property("AllowedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("allowed_user_uid"); - - b.HasKey("ParentId", "ParentUploaderUID", "Id") - .HasName("pk_chara_data_allowance"); - - b.HasIndex("AllowedGroupGID") - .HasDatabaseName("ix_chara_data_allowance_allowed_group_gid"); - - b.HasIndex("AllowedUserUID") - .HasDatabaseName("ix_chara_data_allowance_allowed_user_uid"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_allowance_parent_id"); - - b.ToTable("chara_data_allowance", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFile", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("FileCacheHash") - .HasColumnType("character varying(40)") - .HasColumnName("file_cache_hash"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_files"); - - b.HasIndex("FileCacheHash") - .HasDatabaseName("ix_chara_data_files_file_cache_hash"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_files_parent_id"); - - b.ToTable("chara_data_files", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFileSwap", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("FilePath") - .HasColumnType("text") - .HasColumnName("file_path"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_file_swaps"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_file_swaps_parent_id"); - - b.ToTable("chara_data_file_swaps", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataOriginalFile", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("GamePath") - .HasColumnType("text") - .HasColumnName("game_path"); - - b.Property("Hash") - .HasColumnType("text") - .HasColumnName("hash"); - - b.HasKey("ParentId", "ParentUploaderUID", "GamePath") - .HasName("pk_chara_data_orig_files"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_orig_files_parent_id"); - - b.ToTable("chara_data_orig_files", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataPose", b => - { - b.Property("ParentId") - .HasColumnType("text") - .HasColumnName("parent_id"); - - b.Property("ParentUploaderUID") - .HasColumnType("character varying(10)") - .HasColumnName("parent_uploader_uid"); - - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Description") - .HasColumnType("text") - .HasColumnName("description"); - - b.Property("PoseData") - .HasColumnType("text") - .HasColumnName("pose_data"); - - b.Property("WorldData") - .HasColumnType("text") - .HasColumnName("world_data"); - - b.HasKey("ParentId", "ParentUploaderUID", "Id") - .HasName("pk_chara_data_poses"); - - b.HasIndex("ParentId") - .HasDatabaseName("ix_chara_data_poses_parent_id"); - - b.ToTable("chara_data_poses", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.Property("UserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("OtherUserUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("other_user_uid"); - - b.Property("AllowReceivingMessages") - .HasColumnType("boolean") - .HasColumnName("allow_receiving_messages"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("expires_at"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UserUID", "OtherUserUID") - .HasName("pk_client_pairs"); - - b.HasIndex("OtherUserUID") - .HasDatabaseName("ix_client_pairs_other_user_uid"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_client_pairs_user_uid"); - - b.ToTable("client_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("size"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("upload_date"); - - b.Property("Uploaded") - .HasColumnType("boolean") - .HasColumnName("uploaded"); - - b.Property("UploaderUID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uploader_uid"); - - b.HasKey("Hash") - .HasName("pk_file_caches"); - - b.HasIndex("UploaderUID") - .HasDatabaseName("ix_file_caches_uploader_uid"); - - b.ToTable("file_caches", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b => - { - b.Property("Hash") - .HasMaxLength(40) - .HasColumnType("character varying(40)") - .HasColumnName("hash"); - - b.Property("ForbiddenBy") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("forbidden_by"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("Hash") - .HasName("pk_forbidden_upload_entries"); - - b.ToTable("forbidden_upload_entries", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.Property("GID") - .HasMaxLength(20) - .HasColumnType("character varying(20)") - .HasColumnName("gid"); - - b.Property("Alias") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("alias"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("HashedPassword") - .HasColumnType("text") - .HasColumnName("hashed_password"); - - b.Property("IsTemporary") - .HasColumnType("boolean") - .HasColumnName("is_temporary"); - - b.Property("InvitesEnabled") - .HasColumnType("boolean") - .HasColumnName("invites_enabled"); - - b.Property("OwnerUID") - .HasColumnType("character varying(10)") - .HasColumnName("owner_uid"); - - b.HasKey("GID") - .HasName("pk_groups"); - - b.HasIndex("OwnerUID") - .HasDatabaseName("ix_groups_owner_uid"); - - b.ToTable("groups", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("BannedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_user_uid"); - - b.Property("BannedByUID") - .HasColumnType("character varying(10)") - .HasColumnName("banned_by_uid"); - - b.Property("BannedOn") - .HasColumnType("timestamp with time zone") - .HasColumnName("banned_on"); - - b.Property("BannedReason") - .HasColumnType("text") - .HasColumnName("banned_reason"); - - b.HasKey("GroupGID", "BannedUserUID") - .HasName("pk_group_bans"); - - b.HasIndex("BannedByUID") - .HasDatabaseName("ix_group_bans_banned_by_uid"); - - b.HasIndex("BannedUserUID") - .HasDatabaseName("ix_group_bans_banned_user_uid"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_bans_group_gid"); - - b.ToTable("group_bans", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("GroupUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("group_user_uid"); - - b.Property("DisableAnimations") - .HasColumnType("boolean") - .HasColumnName("disable_animations"); - - b.Property("DisableSounds") - .HasColumnType("boolean") - .HasColumnName("disable_sounds"); - - b.Property("DisableVFX") - .HasColumnType("boolean") - .HasColumnName("disable_vfx"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("IsPaused") - .HasColumnType("boolean") - .HasColumnName("is_paused"); - - b.Property("IsPinned") - .HasColumnType("boolean") - .HasColumnName("is_pinned"); - - b.HasKey("GroupGID", "GroupUserUID") - .HasName("pk_group_pairs"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_pairs_group_gid"); - - b.HasIndex("GroupUserUID") - .HasDatabaseName("ix_group_pairs_group_user_uid"); - - b.ToTable("group_pairs", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.Property("GroupGID") - .HasColumnType("character varying(20)") - .HasColumnName("group_gid"); - - b.Property("Invite") - .HasMaxLength(64) - .HasColumnType("character varying(64)") - .HasColumnName("invite"); - - b.Property("ExpirationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_date"); - - b.HasKey("GroupGID", "Invite") - .HasName("pk_group_temp_invites"); - - b.HasIndex("GroupGID") - .HasDatabaseName("ix_group_temp_invites_group_gid"); - - b.HasIndex("Invite") - .HasDatabaseName("ix_group_temp_invites_invite"); - - b.ToTable("group_temp_invites", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.Property("DiscordId") - .ValueGeneratedOnAdd() - .HasColumnType("numeric(20,0)") - .HasColumnName("discord_id"); - - b.Property("HashedLodestoneId") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("hashed_lodestone_id"); - - b.Property("LodestoneAuthString") - .HasMaxLength(100) - .HasColumnType("character varying(100)") - .HasColumnName("lodestone_auth_string"); - - b.Property("StartedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("started_at"); - - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.HasKey("DiscordId") - .HasName("pk_lodestone_auth"); - - b.HasIndex("UserUID") - .HasDatabaseName("ix_lodestone_auth_user_uid"); - - b.ToTable("lodestone_auth", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.User", b => - { - b.Property("UID") - .HasMaxLength(10) - .HasColumnType("character varying(10)") - .HasColumnName("uid"); - - b.Property("Alias") - .HasMaxLength(15) - .HasColumnType("character varying(15)") - .HasColumnName("alias"); - - b.Property("IsAdmin") - .HasColumnType("boolean") - .HasColumnName("is_admin"); - - b.Property("IsModerator") - .HasColumnType("boolean") - .HasColumnName("is_moderator"); - - b.Property("LastLoggedIn") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_logged_in"); - - b.Property("Timestamp") - .IsConcurrencyToken() - .ValueGeneratedOnAddOrUpdate() - .HasColumnType("bytea") - .HasColumnName("timestamp"); - - b.HasKey("UID") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.Property("UserUID") - .HasColumnType("character varying(10)") - .HasColumnName("user_uid"); - - b.Property("Base64ProfileImage") - .HasColumnType("text") - .HasColumnName("base64profile_image"); - - b.Property("FlaggedForReport") - .HasColumnType("boolean") - .HasColumnName("flagged_for_report"); - - b.Property("IsNSFW") - .HasColumnType("boolean") - .HasColumnName("is_nsfw"); - - b.Property("ProfileDisabled") - .HasColumnType("boolean") - .HasColumnName("profile_disabled"); - - b.Property("UserDescription") - .HasColumnType("text") - .HasColumnName("user_description"); - - b.HasKey("UserUID") - .HasName("pk_user_profile_data"); - - b.ToTable("user_profile_data", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ReportDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("report_date"); - - b.Property("ReportReason") - .HasColumnType("text") - .HasColumnName("report_reason"); - - b.Property("ReportedUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reported_user_uid"); - - b.Property("ReportingUserUID") - .HasColumnType("character varying(10)") - .HasColumnName("reporting_user_uid"); - - b.HasKey("Id") - .HasName("pk_user_profile_data_reports"); - - b.HasIndex("ReportedUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reported_user_uid"); - - b.HasIndex("ReportingUserUID") - .HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid"); - - b.ToTable("user_profile_data_reports", (string)null); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Auth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser") - .WithMany() - .HasForeignKey("PrimaryUserUID") - .HasConstraintName("fk_auth_users_primary_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_auth_users_user_uid"); - - b.Navigation("PrimaryUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataAllowance", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "AllowedGroup") - .WithMany() - .HasForeignKey("AllowedGroupGID") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_allowance_groups_allowed_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "AllowedUser") - .WithMany() - .HasForeignKey("AllowedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_allowance_users_allowed_user_uid"); - - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("AllowedIndividiuals") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_allowance_chara_data_parent_id_parent_uploader_u"); - - b.Navigation("AllowedGroup"); - - b.Navigation("AllowedUser"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFile", b => - { - b.HasOne("MareSynchronosShared.Models.FileCache", "FileCache") - .WithMany() - .HasForeignKey("FileCacheHash") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("fk_chara_data_files_files_file_cache_hash"); - - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("Files") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_files_chara_data_parent_id_parent_uploader_uid"); - - b.Navigation("FileCache"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataFileSwap", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("FileSwaps") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_file_swaps_chara_data_parent_id_parent_uploader_"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataOriginalFile", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("OriginalFiles") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_orig_files_chara_data_parent_id_parent_uploader_"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaDataPose", b => - { - b.HasOne("MareSynchronosShared.Models.CharaData", "Parent") - .WithMany("Poses") - .HasForeignKey("ParentId", "ParentUploaderUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_chara_data_poses_chara_data_parent_id_parent_uploader_uid"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b => - { - b.HasOne("MareSynchronosShared.Models.User", "OtherUser") - .WithMany() - .HasForeignKey("OtherUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_other_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_client_pairs_users_user_uid"); - - b.Navigation("OtherUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Uploader") - .WithMany() - .HasForeignKey("UploaderUID") - .HasConstraintName("fk_file_caches_users_uploader_uid"); - - b.Navigation("Uploader"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.Group", b => - { - b.HasOne("MareSynchronosShared.Models.User", "Owner") - .WithMany() - .HasForeignKey("OwnerUID") - .HasConstraintName("fk_groups_users_owner_uid"); - - b.Navigation("Owner"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b => - { - b.HasOne("MareSynchronosShared.Models.User", "BannedBy") - .WithMany() - .HasForeignKey("BannedByUID") - .HasConstraintName("fk_group_bans_users_banned_by_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "BannedUser") - .WithMany() - .HasForeignKey("BannedUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_users_banned_user_uid"); - - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_bans_groups_group_gid"); - - b.Navigation("BannedBy"); - - b.Navigation("BannedUser"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_groups_group_gid"); - - b.HasOne("MareSynchronosShared.Models.User", "GroupUser") - .WithMany() - .HasForeignKey("GroupUserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_pairs_users_group_user_uid"); - - b.Navigation("Group"); - - b.Navigation("GroupUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b => - { - b.HasOne("MareSynchronosShared.Models.Group", "Group") - .WithMany() - .HasForeignKey("GroupGID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_group_temp_invites_groups_group_gid"); - - b.Navigation("Group"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .HasConstraintName("fk_lodestone_auth_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b => - { - b.HasOne("MareSynchronosShared.Models.User", "User") - .WithMany() - .HasForeignKey("UserUID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_user_profile_data_users_user_uid"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b => - { - b.HasOne("MareSynchronosShared.Models.User", "ReportedUser") - .WithMany() - .HasForeignKey("ReportedUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid"); - - b.HasOne("MareSynchronosShared.Models.User", "ReportingUser") - .WithMany() - .HasForeignKey("ReportingUserUID") - .HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid"); - - b.Navigation("ReportedUser"); - - b.Navigation("ReportingUser"); - }); - - modelBuilder.Entity("MareSynchronosShared.Models.CharaData", b => - { - b.Navigation("AllowedIndividiuals"); - - b.Navigation("FileSwaps"); - - b.Navigation("Files"); - - b.Navigation("OriginalFiles"); - - b.Navigation("Poses"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/Auth.cs b/MareSynchronosServer/MareSynchronosShared/Models/Auth.cs deleted file mode 100644 index 49113aa..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/Auth.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class Auth -{ - [Key] - [MaxLength(64)] - public string HashedKey { get; set; } - - public string UserUID { get; set; } - public User User { get; set; } - public bool IsBanned { get; set; } - public string? PrimaryUserUID { get; set; } - public User? PrimaryUser { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/Banned.cs b/MareSynchronosServer/MareSynchronosShared/Models/Banned.cs deleted file mode 100644 index c38e11d..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/Banned.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class Banned -{ - [Key] - [MaxLength(100)] - public string CharacterIdentification { get; set; } - public string Reason { get; set; } - [Timestamp] - public byte[] Timestamp { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/BannedRegistrations.cs b/MareSynchronosServer/MareSynchronosShared/Models/BannedRegistrations.cs deleted file mode 100644 index 70d2ffe..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/BannedRegistrations.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class BannedRegistrations -{ - [Key] - [MaxLength(100)] - public string DiscordIdOrLodestoneAuth { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/CharaData.cs b/MareSynchronosServer/MareSynchronosShared/Models/CharaData.cs deleted file mode 100644 index 41fe744..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/CharaData.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public enum CharaDataAccess -{ - Individuals, - ClosePairs, - AllPairs, - Public -} - -public enum CharaDataShare -{ - Private, - Shared -} - -public class CharaData -{ - public string Id { get; set; } - public virtual User Uploader { get; set; } - public string UploaderUID { get; set; } - public DateTime CreatedDate { get; set; } - public DateTime UpdatedDate { get; set; } - public string Description { get; set; } - public CharaDataAccess AccessType { get; set; } - public CharaDataShare ShareType { get; set; } - public DateTime? ExpiryDate { get; set; } - public string? GlamourerData { get; set; } - public string? CustomizeData { get; set; } - public string? ManipulationData { get; set; } - public int DownloadCount { get; set; } = 0; - public virtual ICollection Poses { get; set; } = []; - public virtual ICollection Files { get; set; } = []; - public virtual ICollection FileSwaps { get; set; } = []; - public virtual ICollection OriginalFiles { get; set; } = []; - public virtual ICollection AllowedIndividiuals { get; set; } = []; -} - -public class CharaDataAllowance -{ - [Key] - public long Id { get; set; } - public virtual CharaData Parent { get; set; } - public string ParentId { get; set; } - public string ParentUploaderUID { get; set; } - public virtual User? AllowedUser { get; set; } - public string? AllowedUserUID { get; set; } - public virtual Group? AllowedGroup { get; set; } - public string? AllowedGroupGID { get; set; } -} - -public class CharaDataOriginalFile -{ - public virtual CharaData Parent { get; set; } - public string ParentId { get; set; } - public string ParentUploaderUID { get; set; } - public string GamePath { get; set; } - public string Hash { get; set; } -} - -public class CharaDataFile -{ - public virtual FileCache FileCache { get; set; } - public string FileCacheHash { get; set; } - public string GamePath { get; set; } - public virtual CharaData Parent { get; set; } - public string ParentId { get; set; } - public string ParentUploaderUID { get; set; } -} - -public class CharaDataFileSwap -{ - public virtual CharaData Parent { get; set; } - public string ParentId { get; set; } - public string ParentUploaderUID { get; set; } - public string GamePath { get; set; } - public string FilePath { get; set; } -} - -public class CharaDataPose -{ - public long Id { get; set; } - public virtual CharaData Parent { get; set; } - public string ParentId { get; set; } - public string ParentUploaderUID { get; set; } - public string Description { get; set; } - public string PoseData { get; set; } - public string WorldData { get; set; } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Models/ClientPair.cs b/MareSynchronosServer/MareSynchronosShared/Models/ClientPair.cs deleted file mode 100644 index 694ccdc..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/ClientPair.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class ClientPair -{ - [MaxLength(10)] - public string UserUID { get; set; } - public User User { get; set; } - [MaxLength(10)] - public string OtherUserUID { get; set; } - public User OtherUser { get; set; } - public bool IsPaused { get; set; } - public bool AllowReceivingMessages { get; set; } = false; - [Timestamp] - public byte[] Timestamp { get; set; } - public bool DisableSounds { get; set; } = false; - public bool DisableAnimations { get; set; } = false; - public bool DisableVFX { get; set; } = false; -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/FileCache.cs b/MareSynchronosServer/MareSynchronosShared/Models/FileCache.cs deleted file mode 100644 index 3ffd2c2..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/FileCache.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class FileCache -{ - [Key] - [MaxLength(40)] - public string Hash { get; set; } - [MaxLength(10)] - public string UploaderUID { get; set; } - public User Uploader { get; set; } - public bool Uploaded { get; set; } - public DateTime UploadDate { get; set; } - [Timestamp] - public byte[] Timestamp { get; set; } - public long Size { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/ForbiddenUploadEntry.cs b/MareSynchronosServer/MareSynchronosShared/Models/ForbiddenUploadEntry.cs deleted file mode 100644 index 12c946f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/ForbiddenUploadEntry.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class ForbiddenUploadEntry -{ - [Key] - [MaxLength(40)] - public string Hash { get; set; } - [MaxLength(100)] - public string ForbiddenBy { get; set; } - [Timestamp] - public byte[] Timestamp { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/Group.cs b/MareSynchronosServer/MareSynchronosShared/Models/Group.cs deleted file mode 100644 index e1f0ff2..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/Group.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class Group -{ - [Key] - [MaxLength(20)] - public string GID { get; set; } - public string OwnerUID { get; set; } - public User Owner { get; set; } - [MaxLength(50)] - public string Alias { get; set; } - public bool InvitesEnabled { get; set; } - public string HashedPassword { get; set; } - public bool DisableSounds { get; set; } - public bool DisableAnimations { get; set; } - public bool DisableVFX { get; set; } - public bool IsTemporary { get; set; } - public DateTime? ExpiresAt { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/GroupBan.cs b/MareSynchronosServer/MareSynchronosShared/Models/GroupBan.cs deleted file mode 100644 index ad92530..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/GroupBan.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MareSynchronosShared.Models; - -public class GroupBan -{ - public Group Group { get; set; } - public string GroupGID { get; set; } - public User BannedUser { get; set; } - public string BannedUserUID { get; set; } - public User BannedBy { get; set; } - public string BannedByUID { get; set; } - public DateTime BannedOn { get; set; } - public string BannedReason { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/GroupPair.cs b/MareSynchronosServer/MareSynchronosShared/Models/GroupPair.cs deleted file mode 100644 index 57abe80..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/GroupPair.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MareSynchronosShared.Models; - -public class GroupPair -{ - public string GroupGID { get; set; } - public Group Group { get; set; } - public string GroupUserUID { get; set; } - public User GroupUser { get; set; } - public bool IsPaused { get; set; } - public bool IsPinned { get; set; } - public bool IsModerator { get; set; } - public bool DisableSounds { get; set; } - public bool DisableAnimations { get; set; } - public bool DisableVFX { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/GroupTempInvite.cs b/MareSynchronosServer/MareSynchronosShared/Models/GroupTempInvite.cs deleted file mode 100644 index d3f81b7..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/GroupTempInvite.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class GroupTempInvite -{ - public Group Group { get; set; } - public string GroupGID { get; set; } - [MaxLength(64)] - public string Invite { get; set; } - public DateTime ExpirationDate { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/LodeStoneAuth.cs b/MareSynchronosServer/MareSynchronosShared/Models/LodeStoneAuth.cs deleted file mode 100644 index 30afd19..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/LodeStoneAuth.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class LodeStoneAuth -{ - [Key] - public ulong DiscordId { get; set; } - [MaxLength(100)] - public string HashedLodestoneId { get; set; } - [MaxLength(100)] - public string? LodestoneAuthString { get; set; } - public User? User { get; set; } - public DateTime? StartedAt { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/User.cs b/MareSynchronosServer/MareSynchronosShared/Models/User.cs deleted file mode 100644 index 6fcb2f6..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/User.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MareSynchronosShared.Models; - -public class User -{ - [Key] - [MaxLength(10)] - public string UID { get; set; } - [Timestamp] - public byte[] Timestamp { get; set; } - - public bool IsModerator { get; set; } = false; - - public bool IsAdmin { get; set; } = false; - - public DateTime LastLoggedIn { get; set; } - [MaxLength(15)] - public string Alias { get; set; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Models/UserProfileData.cs b/MareSynchronosServer/MareSynchronosShared/Models/UserProfileData.cs deleted file mode 100644 index 9d8e848..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/UserProfileData.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace MareSynchronosShared.Models; - -public class UserProfileData -{ - public string Base64ProfileImage { get; set; } - public bool FlaggedForReport { get; set; } - public bool IsNSFW { get; set; } - public bool ProfileDisabled { get; set; } - public User User { get; set; } - - public string UserDescription { get; set; } - - [Required] - [Key] - [ForeignKey(nameof(User))] - public string UserUID { get; set; } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Models/UserProfileDataReport.cs b/MareSynchronosServer/MareSynchronosShared/Models/UserProfileDataReport.cs deleted file mode 100644 index cd53b76..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Models/UserProfileDataReport.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace MareSynchronosShared.Models; - -public class UserProfileDataReport -{ - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } - - public DateTime ReportDate { get; set; } - public User ReportedUser { get; set; } - - [ForeignKey(nameof(ReportedUser))] - public string ReportedUserUID { get; set; } - - public User ReportingUser { get; set; } - - [ForeignKey(nameof(ReportingUser))] - public string ReportingUserUID { get; set; } - - public string ReportReason { get; set; } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirement.cs b/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirement.cs deleted file mode 100644 index 317a30c..0000000 --- a/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirement.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.AspNetCore.Authorization; - -namespace MareSynchronosShared.RequirementHandlers; - -public class UserRequirement : IAuthorizationRequirement -{ - public UserRequirement(UserRequirements requirements) - { - Requirements = requirements; - } - - public UserRequirements Requirements { get; } -} diff --git a/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirementHandler.cs b/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirementHandler.cs deleted file mode 100644 index 5cc38e5..0000000 --- a/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirementHandler.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using MareSynchronosShared.Data; -using Microsoft.EntityFrameworkCore; -using MareSynchronosShared.Utils; -using StackExchange.Redis; -using StackExchange.Redis.Extensions.Core.Abstractions; -using Microsoft.Extensions.Logging; - -namespace MareSynchronosShared.RequirementHandlers; - -public class UserRequirementHandler : AuthorizationHandler -{ - private readonly IDbContextFactory _dbContextFactory; - private readonly ILogger _logger; - private readonly IRedisDatabase _redis; - - public UserRequirementHandler(IDbContextFactory dbContextFactory, ILogger logger, IRedisDatabase redisDb) - { - _dbContextFactory = dbContextFactory; - _logger = logger; - _redis = redisDb; - } - - protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, UserRequirement requirement, HubInvocationContext resource) - { - var uid = context.User.Claims.SingleOrDefault(g => string.Equals(g.Type, MareClaimTypes.Uid, StringComparison.Ordinal))?.Value; - - if (uid == null) context.Fail(); - - if ((requirement.Requirements & UserRequirements.Identified) is UserRequirements.Identified) - { - var ident = await _redis.GetAsync("UID:" + uid).ConfigureAwait(false); - if (ident == RedisValue.EmptyString) context.Fail(); - } - - if ((requirement.Requirements & UserRequirements.Administrator) is UserRequirements.Administrator) - { - using var dbContext = await _dbContextFactory.CreateDbContextAsync().ConfigureAwait(false); - var user = await dbContext.Users.AsNoTracking().SingleOrDefaultAsync(b => b.UID == uid).ConfigureAwait(false); - if (user == null || !user.IsAdmin) context.Fail(); - _logger.LogInformation("Admin {uid} authenticated", uid); - } - - if ((requirement.Requirements & UserRequirements.Moderator) is UserRequirements.Moderator) - { - using var dbContext = await _dbContextFactory.CreateDbContextAsync().ConfigureAwait(false); - var user = await dbContext.Users.AsNoTracking().SingleOrDefaultAsync(b => b.UID == uid).ConfigureAwait(false); - if (user == null || !user.IsAdmin && !user.IsModerator) context.Fail(); - _logger.LogInformation("Admin/Moderator {uid} authenticated", uid); - } - - context.Succeed(requirement); - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirements.cs b/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirements.cs deleted file mode 100644 index 95fed1f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/RequirementHandlers/UserRequirements.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MareSynchronosShared.RequirementHandlers; - -public enum UserRequirements -{ - Identified = 0b00000001, - Moderator = 0b00000010, - Administrator = 0b00000100, -} diff --git a/MareSynchronosServer/MareSynchronosShared/Services/IConfigurationService.cs b/MareSynchronosServer/MareSynchronosShared/Services/IConfigurationService.cs deleted file mode 100644 index 85c21e6..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Services/IConfigurationService.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosShared.Services; - -public interface IConfigurationService where T : class, IMareConfiguration -{ - bool IsMain { get; } - T1 GetValue(string key); - T1 GetValueOrDefault(string key, T1 defaultValue); - string ToString(); -} diff --git a/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationController.cs b/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationController.cs deleted file mode 100644 index 4b9a01d..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationController.cs +++ /dev/null @@ -1,60 +0,0 @@ -using MareSynchronosShared.Utils.Configuration; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; - -namespace MareSynchronosShared.Services; - -[Route("configuration/[controller]")] -[Authorize(Policy = "Internal")] -public class MareConfigurationController : Controller where T : class, IMareConfiguration -{ - private readonly ILogger> _logger; - private IOptionsMonitor _config; - - public MareConfigurationController(IOptionsMonitor config, ILogger> logger) - { - _config = config; - _logger = logger; - } - - [HttpGet("GetConfigurationEntry")] - [Authorize(Policy = "Internal")] - public IActionResult GetConfigurationEntry(string key, string defaultValue) - { - var result = _config.CurrentValue.SerializeValue(key, defaultValue); - _logger.LogInformation("Requested " + key + ", returning:" + result); - return Ok(result); - } -} - -#pragma warning disable MA0048 // File name must match type name -public class MareStaticFilesServerConfigurationController : MareConfigurationController -{ - public MareStaticFilesServerConfigurationController(IOptionsMonitor config, ILogger logger) : base(config, logger) - { - } -} - -public class MareBaseConfigurationController : MareConfigurationController -{ - public MareBaseConfigurationController(IOptionsMonitor config, ILogger logger) : base(config, logger) - { - } -} - -public class MareServerConfigurationController : MareConfigurationController -{ - public MareServerConfigurationController(IOptionsMonitor config, ILogger logger) : base(config, logger) - { - } -} - -public class MareServicesConfigurationController : MareConfigurationController -{ - public MareServicesConfigurationController(IOptionsMonitor config, ILogger logger) : base(config, logger) - { - } -} -#pragma warning restore MA0048 // File name must match type name diff --git a/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationServiceClient.cs b/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationServiceClient.cs deleted file mode 100644 index 6eaff9f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationServiceClient.cs +++ /dev/null @@ -1,189 +0,0 @@ -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using System.Collections; -using System.Collections.Concurrent; -using System.Globalization; -using System.Net.Http.Headers; -using System.Reflection; -using System.Text; -using System.Text.Json; - -namespace MareSynchronosShared.Services; - -public class MareConfigurationServiceClient : IHostedService, IConfigurationService where T : class, IMareConfiguration -{ - private readonly IOptionsMonitor _config; - private readonly ConcurrentDictionary _cachedRemoteProperties = new(StringComparer.Ordinal); - private readonly ILogger> _logger; - private readonly ServerTokenGenerator _serverTokenGenerator; - private readonly CancellationTokenSource _updateTaskCts = new(); - private bool _initialized = false; - private readonly HttpClient _httpClient; - - private Uri GetRoute(string key, string value) - { - if (_config.CurrentValue.GetType() == typeof(ServerConfiguration)) - return new Uri((_config.CurrentValue as ServerConfiguration).MainServerAddress, $"configuration/MareServerConfiguration/{nameof(MareServerConfigurationController.GetConfigurationEntry)}?key={key}&defaultValue={value}"); - if (_config.CurrentValue.GetType() == typeof(MareConfigurationBase)) - return new Uri((_config.CurrentValue as MareConfigurationBase).MainServerAddress, $"configuration/MareBaseConfiguration/{nameof(MareBaseConfigurationController.GetConfigurationEntry)}?key={key}&defaultValue={value}"); - if (_config.CurrentValue.GetType() == typeof(ServicesConfiguration)) - return new Uri((_config.CurrentValue as ServicesConfiguration).MainServerAddress, $"configuration/MareServicesConfiguration/{nameof(MareServicesConfigurationController.GetConfigurationEntry)}?key={key}&defaultValue={value}"); - if (_config.CurrentValue.GetType() == typeof(StaticFilesServerConfiguration)) - return new Uri((_config.CurrentValue as StaticFilesServerConfiguration).MainFileServerAddress, $"configuration/MareStaticFilesServerConfiguration/{nameof(MareStaticFilesServerConfigurationController.GetConfigurationEntry)}?key={key}&defaultValue={value}"); - - throw new NotSupportedException("Config is not supported to be gotten remotely"); - } - - public MareConfigurationServiceClient(ILogger> logger, IOptionsMonitor config, ServerTokenGenerator serverTokenGenerator) - { - _config = config; - _logger = logger; - _serverTokenGenerator = serverTokenGenerator; - _httpClient = new(); - } - - public bool IsMain => false; - - public T1 GetValueOrDefault(string key, T1 defaultValue) - { - var prop = _config.CurrentValue.GetType().GetProperty(key); - if (prop == null) return defaultValue; - if (prop.PropertyType != typeof(T1)) throw new InvalidCastException($"Invalid Cast: Property {key} is {prop.PropertyType}, wanted: {typeof(T1)}"); - bool isRemote = prop.GetCustomAttributes(typeof(RemoteConfigurationAttribute), inherit: true).Any(); - if (isRemote && _cachedRemoteProperties.TryGetValue(key, out var remotevalue)) - { - return (T1)remotevalue; - } - - var value = prop.GetValue(_config.CurrentValue); - var defaultPropValue = prop.PropertyType.IsValueType ? Activator.CreateInstance(prop.PropertyType) : null; - if (value == defaultPropValue) return defaultValue; - return (T1)value; - } - - public T1 GetValue(string key) - { - var prop = _config.CurrentValue.GetType().GetProperty(key); - if (prop == null) throw new KeyNotFoundException(key); - if (prop.PropertyType != typeof(T1)) throw new InvalidCastException($"Invalid Cast: Property {key} is {prop.PropertyType}, wanted: {typeof(T1)}"); - bool isRemote = prop.GetCustomAttributes(typeof(RemoteConfigurationAttribute), inherit: true).Any(); - if (isRemote && _cachedRemoteProperties.TryGetValue(key, out var remotevalue)) - { - return (T1)remotevalue; - } - - var value = prop.GetValue(_config.CurrentValue); - return (T1)value; - } - - public override string ToString() - { - var props = _config.CurrentValue.GetType().GetProperties(); - StringBuilder sb = new(); - foreach (var prop in props) - { - var isRemote = prop.GetCustomAttributes(typeof(RemoteConfigurationAttribute), true).Any(); - var getValueMethod = GetType().GetMethod(nameof(GetValue)).MakeGenericMethod(prop.PropertyType); - var value = isRemote ? getValueMethod.Invoke(this, new[] { prop.Name }) : prop.GetValue(_config.CurrentValue); - if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && !typeof(string).IsAssignableFrom(prop.PropertyType)) - { - var enumVal = (IEnumerable)value; - value = string.Empty; - foreach (var listVal in enumVal) - { - value += listVal.ToString() + ", "; - } - } - sb.AppendLine($"{prop.Name} (IsRemote: {isRemote}) => {value}"); - } - return sb.ToString(); - } - - private async Task GetValueFromRemote(string key, object defaultValue) - { - try - { - _logger.LogInformation("Getting {key} from Http", key); - using HttpRequestMessage msg = new(HttpMethod.Get, GetRoute(key, Convert.ToString(defaultValue, CultureInfo.InvariantCulture))); - msg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _serverTokenGenerator.Token); - using var response = await _httpClient.SendAsync(msg).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - _logger.LogInformation("Http Response for {key} = {value}", key, content); - return JsonSerializer.Deserialize(content); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Failure Getting Remote Entry for {key}", key); - return (T1)defaultValue; - } - } - - private async Task UpdateRemoteProperties(CancellationToken ct) - { - while (!ct.IsCancellationRequested) - { - _logger.LogInformation("Getting Properties from Remote for " + typeof(T)); - try - { - var properties = _config.CurrentValue.GetType().GetProperties(); - foreach (var prop in properties) - { - try - { - if (!prop.GetCustomAttributes(typeof(RemoteConfigurationAttribute), true).Any()) continue; - _logger.LogInformation("Checking Property " + prop.Name); - var mi = GetType().GetMethod(nameof(GetValueFromRemote), BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(prop.PropertyType); - var defaultValue = prop.PropertyType.IsValueType ? Activator.CreateInstance(prop.PropertyType) : null; - var task = (Task)mi.Invoke(this, new[] { prop.Name, defaultValue }); - await task.ConfigureAwait(false); - - var resultProperty = task.GetType().GetProperty("Result"); - var resultValue = resultProperty.GetValue(task); - - if (resultValue != defaultValue) - { - _cachedRemoteProperties[prop.Name] = resultValue; - _logger.LogInformation(prop.Name + " is now " + resultValue.ToString()); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during getting property " + prop.Name); - } - } - - if (!_initialized) - { - _initialized = true; - } - - _logger.LogInformation("Saved properties from HTTP are now:"); - _logger.LogInformation(ToString()); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failure getting or updating properties from HTTP, retrying in 30min"); - } - - await Task.Delay(TimeSpan.FromMinutes(30), ct).ConfigureAwait(false); - } - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Starting MareConfigurationServiceClient"); - _ = UpdateRemoteProperties(_updateTaskCts.Token); - while (!_initialized && !cancellationToken.IsCancellationRequested) await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false); - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _updateTaskCts.Cancel(); - _httpClient.Dispose(); - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationServiceServer.cs b/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationServiceServer.cs deleted file mode 100644 index 657f5a4..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Services/MareConfigurationServiceServer.cs +++ /dev/null @@ -1,51 +0,0 @@ -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using Microsoft.Extensions.Options; -using System.Collections; -using System.Text; - -namespace MareSynchronosShared.Services; - -public class MareConfigurationServiceServer : IConfigurationService where T : class, IMareConfiguration -{ - private readonly IOptionsMonitor _config; - public bool IsMain => true; - - public MareConfigurationServiceServer(IOptionsMonitor config) - { - _config = config; - } - - public T1 GetValueOrDefault(string key, T1 defaultValue) - { - return _config.CurrentValue.GetValueOrDefault(key, defaultValue); - } - - public T1 GetValue(string key) - { - return _config.CurrentValue.GetValue(key); - } - - public override string ToString() - { - var props = _config.CurrentValue.GetType().GetProperties(); - StringBuilder sb = new(); - foreach (var prop in props) - { - var isRemote = prop.GetCustomAttributes(typeof(RemoteConfigurationAttribute), true).Any(); - var getValueMethod = GetType().GetMethod(nameof(GetValue)).MakeGenericMethod(prop.PropertyType); - var value = isRemote ? getValueMethod.Invoke(this, new[] { prop.Name }) : prop.GetValue(_config.CurrentValue); - if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && !typeof(string).IsAssignableFrom(prop.PropertyType)) - { - var enumVal = (IEnumerable)value; - value = string.Empty; - foreach (var listVal in enumVal) - { - value += listVal.ToString() + ", "; - } - } - sb.AppendLine($"{prop.Name} (IsRemote: {isRemote}) => {value}"); - } - return sb.ToString(); - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/AllowedControllersFeatureProvider.cs b/MareSynchronosServer/MareSynchronosShared/Utils/AllowedControllersFeatureProvider.cs deleted file mode 100644 index 1001a3b..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/AllowedControllersFeatureProvider.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.AspNetCore.Mvc.Controllers; -using System.Reflection; -using Microsoft.Extensions.Logging; - -namespace MareSynchronosShared.Utils; - -public class AllowedControllersFeatureProvider : ControllerFeatureProvider -{ - private readonly ILogger _logger; - private readonly Type[] _allowedTypes; - - public AllowedControllersFeatureProvider(params Type[] allowedTypes) - { - _allowedTypes = allowedTypes; - } - - protected override bool IsController(TypeInfo typeInfo) - { - return base.IsController(typeInfo) && _allowedTypes.Contains(typeInfo.AsType()); - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/ClientMessage.cs b/MareSynchronosServer/MareSynchronosShared/Utils/ClientMessage.cs deleted file mode 100644 index cc7e294..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/ClientMessage.cs +++ /dev/null @@ -1,4 +0,0 @@ -using MareSynchronos.API.Data.Enum; - -namespace MareSynchronosShared.Utils; -public record ClientMessage(MessageSeverity Severity, string Message, string UID); diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/AuthServiceConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/AuthServiceConfiguration.cs deleted file mode 100644 index 94385b7..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/AuthServiceConfiguration.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Text; - -namespace MareSynchronosShared.Utils.Configuration; - -public class AuthServiceConfiguration : MareConfigurationBase -{ - public string GeoIPDbCityFile { get; set; } = string.Empty; - public bool UseGeoIP { get; set; } = false; - public int FailedAuthForTempBan { get; set; } = 5; - public int TempBanDurationInMinutes { get; set; } = 5; - public List WhitelistedIps { get; set; } = new(); - - public int RegisterIpLimit { get; set; } = 3; - public int RegisterIpDurationInMinutes { get; set; } = 10; - - public string WellKnown { get; set; } = string.Empty; - - public override string ToString() - { - StringBuilder sb = new(); - sb.AppendLine(base.ToString()); - sb.AppendLine($"{nameof(GeoIPDbCityFile)} => {GeoIPDbCityFile}"); - sb.AppendLine($"{nameof(UseGeoIP)} => {UseGeoIP}"); - sb.AppendLine($"{nameof(RegisterIpLimit)} => {RegisterIpLimit}"); - sb.AppendLine($"{nameof(RegisterIpDurationInMinutes)} => {RegisterIpDurationInMinutes}"); - sb.AppendLine($"{nameof(WellKnown)} => {WellKnown}"); - return sb.ToString(); - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/CdnShardConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/CdnShardConfiguration.cs deleted file mode 100644 index 32ab367..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/CdnShardConfiguration.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MareSynchronosShared.Utils.Configuration; - -public class CdnShardConfiguration -{ - public List Continents { get; set; } - public string FileMatch { get; set; } - public Uri CdnFullUrl { get; set; } - - public override string ToString() - { - return CdnFullUrl.ToString() + "[" + string.Join(',', Continents) + "] == " + FileMatch; - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/IMareConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/IMareConfiguration.cs deleted file mode 100644 index e18a839..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/IMareConfiguration.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MareSynchronosShared.Utils.Configuration; - -public interface IMareConfiguration -{ - T GetValueOrDefault(string key, T defaultValue); - T GetValue(string key); - string SerializeValue(string key, string defaultValue); -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/MareConfigurationBase.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/MareConfigurationBase.cs deleted file mode 100644 index 0bd2c62..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/MareConfigurationBase.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Reflection; -using System.Text; -using System.Text.Json; - -namespace MareSynchronosShared.Utils.Configuration; - -public class MareConfigurationBase : IMareConfiguration -{ - public int DbContextPoolSize { get; set; } = 100; - public string Jwt { get; set; } = string.Empty; - public Uri MainServerAddress { get; set; } - public int RedisPool { get; set; } = 50; - public int MetricsPort { get; set; } - public string RedisConnectionString { get; set; } = string.Empty; - public string ShardName { get; set; } = string.Empty; - - public T GetValue(string key) - { - var prop = GetType().GetProperty(key); - if (prop == null) throw new KeyNotFoundException(key); - if (prop.PropertyType != typeof(T)) throw new ArgumentException($"Requested {key} with T:{typeof(T)}, where {key} is {prop.PropertyType}"); - return (T)prop.GetValue(this); - } - - public T GetValueOrDefault(string key, T defaultValue) - { - var prop = GetType().GetProperty(key); - if (prop.PropertyType != typeof(T)) throw new ArgumentException($"Requested {key} with T:{typeof(T)}, where {key} is {prop.PropertyType}"); - if (prop == null) return defaultValue; - return (T)prop.GetValue(this); - } - - public string SerializeValue(string key, string defaultValue) - { - var prop = GetType().GetProperty(key); - if (prop == null) return defaultValue; - if (prop.GetCustomAttribute() == null) return defaultValue; - return JsonSerializer.Serialize(prop.GetValue(this), prop.PropertyType); - } - - public override string ToString() - { - StringBuilder sb = new(); - sb.AppendLine(base.ToString()); - sb.AppendLine($"{nameof(MainServerAddress)} => {MainServerAddress}"); - sb.AppendLine($"{nameof(RedisConnectionString)} => {RedisConnectionString}"); - sb.AppendLine($"{nameof(ShardName)} => {ShardName}"); - sb.AppendLine($"{nameof(DbContextPoolSize)} => {DbContextPoolSize}"); - return sb.ToString(); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/ServerConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/ServerConfiguration.cs deleted file mode 100644 index 879dbfb..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/ServerConfiguration.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Text; - -namespace MareSynchronosShared.Utils.Configuration; - -public class ServerConfiguration : MareConfigurationBase -{ - [RemoteConfiguration] - public Uri CdnFullUrl { get; set; } = null; - - [RemoteConfiguration] - public Version ExpectedClientVersion { get; set; } = new Version(0, 0, 0); - - [RemoteConfiguration] - public int MaxExistingGroupsByUser { get; set; } = 3; - - [RemoteConfiguration] - public int MaxGroupUserCount { get; set; } = 100; - - [RemoteConfiguration] - public int MaxJoinedGroupsByUser { get; set; } = 6; - - [RemoteConfiguration] - public bool PurgeUnusedAccounts { get; set; } = false; - - [RemoteConfiguration] - public int PurgeUnusedAccountsPeriodInDays { get; set; } = 14; - - [RemoteConfiguration] - public int MaxCharaDataByUser { get; set; } = 10; - - public override string ToString() - { - StringBuilder sb = new(); - sb.AppendLine(base.ToString()); - sb.AppendLine($"{nameof(CdnFullUrl)} => {CdnFullUrl}"); - sb.AppendLine($"{nameof(RedisConnectionString)} => {RedisConnectionString}"); - sb.AppendLine($"{nameof(ExpectedClientVersion)} => {ExpectedClientVersion}"); - sb.AppendLine($"{nameof(MaxExistingGroupsByUser)} => {MaxExistingGroupsByUser}"); - sb.AppendLine($"{nameof(MaxJoinedGroupsByUser)} => {MaxJoinedGroupsByUser}"); - sb.AppendLine($"{nameof(MaxGroupUserCount)} => {MaxGroupUserCount}"); - sb.AppendLine($"{nameof(PurgeUnusedAccounts)} => {PurgeUnusedAccounts}"); - sb.AppendLine($"{nameof(PurgeUnusedAccountsPeriodInDays)} => {PurgeUnusedAccountsPeriodInDays}"); - sb.AppendLine($"{nameof(MaxCharaDataByUser)} => {MaxCharaDataByUser}"); - return sb.ToString(); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/ServicesConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/ServicesConfiguration.cs deleted file mode 100644 index 70e0b23..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/ServicesConfiguration.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Text; - -namespace MareSynchronosShared.Utils.Configuration; - -public class ServicesConfiguration : MareConfigurationBase -{ - public string DiscordBotToken { get; set; } = string.Empty; - public ulong? DiscordChannelForMessages { get; set; } = null; - public ulong? DiscordChannelForReports { get; set; } = null; - - public override string ToString() - { - StringBuilder sb = new(); - sb.AppendLine(base.ToString()); - sb.AppendLine($"{nameof(DiscordBotToken)} => {DiscordBotToken}"); - sb.AppendLine($"{nameof(MainServerAddress)} => {MainServerAddress}"); - sb.AppendLine($"{nameof(DiscordChannelForMessages)} => {DiscordChannelForMessages}"); - sb.AppendLine($"{nameof(DiscordChannelForReports)} => {DiscordChannelForReports}"); - return sb.ToString(); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/StaticFilesServerConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/StaticFilesServerConfiguration.cs deleted file mode 100644 index cd13538..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/Configuration/StaticFilesServerConfiguration.cs +++ /dev/null @@ -1,67 +0,0 @@ -using MareSynchronosShared.Utils; -using System.Text; - -namespace MareSynchronosShared.Utils.Configuration; - -public class StaticFilesServerConfiguration : MareConfigurationBase -{ - public bool IsDistributionNode { get; set; } = false; - public bool NotifyMainServerDirectly { get; set; } = false; - public Uri MainFileServerAddress { get; set; } = null; - public Uri DistributionFileServerAddress { get; set; } = null; - public bool DistributionFileServerForceHTTP2 { get; set; } = false; - public int ForcedDeletionOfFilesAfterHours { get; set; } = -1; - public double CacheSizeHardLimitInGiB { get; set; } = -1; - public int MinimumFileRetentionPeriodInDays { get; set; } = 7; - public int UnusedFileRetentionPeriodInDays { get; set; } = 14; - public string CacheDirectory { get; set; } - public int DownloadQueueSize { get; set; } = 50; - public int DownloadTimeoutSeconds { get; set; } = 5; - public int DownloadQueueReleaseSeconds { get; set; } = 15; - public int DownloadQueueClearLimit { get; set; } = 15000; - public int CleanupCheckInMinutes { get; set; } = 15; - public bool UseColdStorage { get; set; } = false; - public string ColdStorageDirectory { get; set; } = null; - public double ColdStorageSizeHardLimitInGiB { get; set; } = -1; - public int ColdStorageMinimumFileRetentionPeriodInDays { get; set; } = 30; - public int ColdStorageUnusedFileRetentionPeriodInDays { get; set; } = 30; - public double CacheSmallSizeThresholdKiB { get; set; } = 64; - public double CacheLargeSizeThresholdKiB { get; set; } = 1024; - [RemoteConfiguration] - public Uri CdnFullUrl { get; set; } = null; - [RemoteConfiguration] - public List CdnShardConfiguration { get; set; } = new(); - - public bool UseXAccelRedirect { get; set; } = false; - public string XAccelRedirectPrefix { get; set; } = "/_internal/mare-files/"; - public bool UseSSI { get; set; } = false; - public string SSIContentType { get; set; } = "application/x-block-file-list"; - - public override string ToString() - { - StringBuilder sb = new(); - sb.AppendLine(base.ToString()); - sb.AppendLine($"{nameof(IsDistributionNode)} => {IsDistributionNode}"); - sb.AppendLine($"{nameof(NotifyMainServerDirectly)} => {NotifyMainServerDirectly}"); - sb.AppendLine($"{nameof(MainFileServerAddress)} => {MainFileServerAddress}"); - sb.AppendLine($"{nameof(DistributionFileServerAddress)} => {DistributionFileServerAddress}"); - sb.AppendLine($"{nameof(DistributionFileServerForceHTTP2)} => {DistributionFileServerForceHTTP2}"); - sb.AppendLine($"{nameof(ForcedDeletionOfFilesAfterHours)} => {ForcedDeletionOfFilesAfterHours}"); - sb.AppendLine($"{nameof(CacheSizeHardLimitInGiB)} => {CacheSizeHardLimitInGiB}"); - sb.AppendLine($"{nameof(UseColdStorage)} => {UseColdStorage}"); - sb.AppendLine($"{nameof(ColdStorageDirectory)} => {ColdStorageDirectory}"); - sb.AppendLine($"{nameof(ColdStorageSizeHardLimitInGiB)} => {ColdStorageSizeHardLimitInGiB}"); - sb.AppendLine($"{nameof(ColdStorageMinimumFileRetentionPeriodInDays)} => {ColdStorageMinimumFileRetentionPeriodInDays}"); - sb.AppendLine($"{nameof(ColdStorageUnusedFileRetentionPeriodInDays)} => {ColdStorageUnusedFileRetentionPeriodInDays}"); - sb.AppendLine($"{nameof(MinimumFileRetentionPeriodInDays)} => {MinimumFileRetentionPeriodInDays}"); - sb.AppendLine($"{nameof(UnusedFileRetentionPeriodInDays)} => {UnusedFileRetentionPeriodInDays}"); - sb.AppendLine($"{nameof(CacheSmallSizeThresholdKiB)} => {CacheSmallSizeThresholdKiB}"); - sb.AppendLine($"{nameof(CacheLargeSizeThresholdKiB)} => {CacheLargeSizeThresholdKiB}"); - sb.AppendLine($"{nameof(CacheDirectory)} => {CacheDirectory}"); - sb.AppendLine($"{nameof(DownloadQueueSize)} => {DownloadQueueSize}"); - sb.AppendLine($"{nameof(DownloadQueueReleaseSeconds)} => {DownloadQueueReleaseSeconds}"); - sb.AppendLine($"{nameof(CdnShardConfiguration)} => {string.Join(", ", CdnShardConfiguration)}"); - sb.AppendLine($"{nameof(UseXAccelRedirect)} => {UseXAccelRedirect}"); - return sb.ToString(); - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/IdBasedUserIdProvider.cs b/MareSynchronosServer/MareSynchronosShared/Utils/IdBasedUserIdProvider.cs deleted file mode 100644 index 45d592f..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/IdBasedUserIdProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.AspNetCore.SignalR; - -namespace MareSynchronosShared.Utils; - -public class IdBasedUserIdProvider : IUserIdProvider -{ - public string GetUserId(HubConnectionContext context) - { - return context.User!.Claims.SingleOrDefault(c => string.Equals(c.Type, MareClaimTypes.Uid, StringComparison.Ordinal))?.Value; - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/MareClaimTypes.cs b/MareSynchronosServer/MareSynchronosShared/Utils/MareClaimTypes.cs deleted file mode 100644 index 7641e9e..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/MareClaimTypes.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MareSynchronosShared.Utils; - -public static class MareClaimTypes -{ - public const string Uid = "uid"; - public const string Alias = "alias"; - public const string CharaIdent = "character_identification"; - public const string Internal = "internal"; - public const string Continent = "continent"; -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/RemoteConfigurationAttribute.cs b/MareSynchronosServer/MareSynchronosShared/Utils/RemoteConfigurationAttribute.cs deleted file mode 100644 index dd7ee5b..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/RemoteConfigurationAttribute.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MareSynchronosShared.Utils; - -[AttributeUsage(AttributeTargets.Property)] -public class RemoteConfigurationAttribute : Attribute { } \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/ServerTokenGenerator.cs b/MareSynchronosServer/MareSynchronosShared/Utils/ServerTokenGenerator.cs deleted file mode 100644 index d7fffff..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/ServerTokenGenerator.cs +++ /dev/null @@ -1,61 +0,0 @@ -using MareSynchronosShared.Utils.Configuration; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Microsoft.IdentityModel.Tokens; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Text; - -namespace MareSynchronosShared.Utils; - -public class ServerTokenGenerator -{ - private readonly IOptionsMonitor _configuration; - private readonly ILogger _logger; - - private Dictionary _tokenDictionary { get; set; } = new(StringComparer.Ordinal); - public string Token - { - get - { - var currentJwt = _configuration.CurrentValue.Jwt; - if (_tokenDictionary.TryGetValue(currentJwt, out var token)) - { - return token; - } - - return GenerateToken(); - } - } - - public ServerTokenGenerator(IOptionsMonitor configuration, ILogger logger) - { - _configuration = configuration; - _logger = logger; - } - - private string GenerateToken() - { - var signingKey = _configuration.CurrentValue.Jwt; - var authSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(signingKey)); - - var token = new SecurityTokenDescriptor() - { - Subject = new ClaimsIdentity(new List() - { - new Claim(MareClaimTypes.Uid, _configuration.CurrentValue.ShardName), - new Claim(MareClaimTypes.Internal, "true"), - }), - SigningCredentials = new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256Signature), - }; - - var handler = new JwtSecurityTokenHandler(); - var rawData = handler.CreateJwtSecurityToken(token).RawData; - - _tokenDictionary[signingKey] = rawData; - - _logger.LogInformation("Generated Token: {data}", rawData); - - return rawData; - } -} diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/SharedDbFunctions.cs b/MareSynchronosServer/MareSynchronosShared/Utils/SharedDbFunctions.cs deleted file mode 100644 index 587ce06..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/SharedDbFunctions.cs +++ /dev/null @@ -1,124 +0,0 @@ -using MareSynchronosShared.Data; -using MareSynchronosShared.Models; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; - -namespace MareSynchronosShared.Utils; - -public static class SharedDbFunctions -{ - public static async Task<(bool, string)> MigrateOrDeleteGroup(MareDbContext context, Group group, List groupPairs, int maxGroupsByUser) - { - bool groupHasMigrated = false; - string newOwner = string.Empty; - foreach (var potentialNewOwner in groupPairs.OrderByDescending(p => p.IsModerator).ThenByDescending(p => p.IsPinned).ToList()) - { - groupHasMigrated = await TryMigrateGroup(context, group, potentialNewOwner.GroupUserUID, maxGroupsByUser).ConfigureAwait(false); - - if (groupHasMigrated) - { - newOwner = potentialNewOwner.GroupUserUID; - potentialNewOwner.IsPinned = true; - potentialNewOwner.IsModerator = false; - - await context.SaveChangesAsync().ConfigureAwait(false); - break; - } - } - - if (!groupHasMigrated) - { - context.GroupPairs.RemoveRange(groupPairs); - context.Groups.Remove(group); - - await context.SaveChangesAsync().ConfigureAwait(false); - } - - return (groupHasMigrated, newOwner); - } - - public static async Task PurgeUser(ILogger _logger, User user, MareDbContext dbContext, int maxGroupsByUser) - { - _logger.LogInformation("Purging user: {uid}", user.UID); - - var secondaryUsers = await dbContext.Auth.Include(u => u.User) - .Where(u => u.PrimaryUserUID == user.UID).Select(c => c.User).ToListAsync().ConfigureAwait(false); - - foreach (var secondaryUser in secondaryUsers) - { - await PurgeUser(_logger, secondaryUser, dbContext, maxGroupsByUser).ConfigureAwait(false); - } - - var lodestone = dbContext.LodeStoneAuth.SingleOrDefault(a => a.User.UID == user.UID); - - var userProfileData = await dbContext.UserProfileData.SingleOrDefaultAsync(u => u.UserUID == user.UID).ConfigureAwait(false); - - if (lodestone != null) - { - dbContext.Remove(lodestone); - } - - if (userProfileData != null) - { - dbContext.Remove(userProfileData); - } - - var auth = dbContext.Auth.Single(a => a.UserUID == user.UID); - - var ownPairData = dbContext.ClientPairs.Where(u => u.User.UID == user.UID).ToList(); - dbContext.ClientPairs.RemoveRange(ownPairData); - var otherPairData = dbContext.ClientPairs.Include(u => u.User) - .Where(u => u.OtherUser.UID == user.UID).ToList(); - dbContext.ClientPairs.RemoveRange(otherPairData); - - var userJoinedGroups = await dbContext.GroupPairs.Include(g => g.Group).Where(u => u.GroupUserUID == user.UID).ToListAsync().ConfigureAwait(false); - - foreach (var userGroupPair in userJoinedGroups) - { - bool ownerHasLeft = string.Equals(userGroupPair.Group.OwnerUID, user.UID, StringComparison.Ordinal); - - if (ownerHasLeft) - { - var groupPairs = await dbContext.GroupPairs.Where(g => g.GroupGID == userGroupPair.GroupGID && g.GroupUserUID != user.UID).ToListAsync().ConfigureAwait(false); - - if (!groupPairs.Any()) - { - _logger.LogInformation("Group {gid} has no new owner, deleting", userGroupPair.GroupGID); - dbContext.Groups.Remove(userGroupPair.Group); - } - else - { - _ = await MigrateOrDeleteGroup(dbContext, userGroupPair.Group, groupPairs, maxGroupsByUser).ConfigureAwait(false); - } - } - - dbContext.GroupPairs.Remove(userGroupPair); - - await dbContext.SaveChangesAsync().ConfigureAwait(false); - } - - var bannedinGroups = await dbContext.GroupBans.Where(u => u.BannedUserUID == user.UID).ToListAsync().ConfigureAwait(false); - - dbContext.GroupBans.RemoveRange(bannedinGroups); - - _logger.LogInformation("User purged: {uid}", user.UID); - - dbContext.Auth.Remove(auth); - dbContext.Users.Remove(user); - - await dbContext.SaveChangesAsync().ConfigureAwait(false); - } - - private static async Task TryMigrateGroup(MareDbContext context, Group group, string potentialNewOwnerUid, int maxGroupsByUser) - { - var newOwnerOwnedGroups = await context.Groups.CountAsync(g => g.OwnerUID == potentialNewOwnerUid).ConfigureAwait(false); - if (newOwnerOwnedGroups >= maxGroupsByUser) - { - return false; - } - group.OwnerUID = potentialNewOwnerUid; - group.Alias = null; - await context.SaveChangesAsync().ConfigureAwait(false); - return true; - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs b/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs deleted file mode 100644 index ede0ec3..0000000 --- a/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Security.Cryptography; -using System.Text; - -namespace MareSynchronosShared.Utils; - -public static class StringUtils -{ - public static string GenerateRandomString(int length, string? allowableChars = null) - { - if (string.IsNullOrEmpty(allowableChars)) - allowableChars = @"ABCDEFGHJKLMNPQRSTUVWXYZ0123456789"; - - // Generate random data - var rnd = RandomNumberGenerator.GetBytes(length); - - // Generate the output string - var allowable = allowableChars.ToCharArray(); - var l = allowable.Length; - var chars = new char[length]; - for (var i = 0; i < length; i++) - chars[i] = allowable[rnd[i] % l]; - - return new string(chars); - } - - public static string Sha256String(string input) - { - using var sha256 = SHA256.Create(); - return BitConverter.ToString(sha256.ComputeHash(Encoding.UTF8.GetBytes(input))).Replace("-", "", StringComparison.OrdinalIgnoreCase); - } -} - -public static class ListUtils -{ - private static Random rng = new(); - - public static void Shuffle(this IList list) - { - int n = list.Count; - while (n > 1) - { - n--; - int k = rng.Next(n + 1); - T value = list[k]; - list[k] = list[n]; - list[n] = value; - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/.config/dotnet-tools.json b/MareSynchronosServer/MareSynchronosStaticFilesServer/.config/dotnet-tools.json deleted file mode 100644 index 98091c9..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/.config/dotnet-tools.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "dotnet-ef": { - "version": "6.0.8", - "commands": [ - "dotnet-ef" - ] - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/CacheController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/CacheController.cs deleted file mode 100644 index 34d5b6e..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/CacheController.cs +++ /dev/null @@ -1,51 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronosStaticFilesServer.Services; -using MareSynchronosStaticFilesServer.Utils; -using Microsoft.AspNetCore.Mvc; -using System.Globalization; -using System.Text; - -namespace MareSynchronosStaticFilesServer.Controllers; - -[Route(MareFiles.Cache)] -public class CacheController : ControllerBase -{ - private readonly RequestBlockFileListResultFactory _requestBlockFileListResultFactory; - private readonly CachedFileProvider _cachedFileProvider; - private readonly RequestQueueService _requestQueue; - private readonly FileStatisticsService _fileStatisticsService; - - public CacheController(ILogger logger, RequestBlockFileListResultFactory requestBlockFileListResultFactory, - CachedFileProvider cachedFileProvider, RequestQueueService requestQueue, FileStatisticsService fileStatisticsService) : base(logger) - { - _requestBlockFileListResultFactory = requestBlockFileListResultFactory; - _cachedFileProvider = cachedFileProvider; - _requestQueue = requestQueue; - _fileStatisticsService = fileStatisticsService; - } - - [HttpGet(MareFiles.Cache_Get)] - public async Task GetFiles(Guid requestId) - { - _logger.LogDebug($"GetFile:{MareUser}:{requestId}"); - - if (!_requestQueue.IsActiveProcessing(requestId, MareUser, out var request)) return BadRequest(); - - _requestQueue.ActivateRequest(requestId); - - long requestSize = 0; - var fileList = new List(request.FileIds.Count); - - foreach (var file in request.FileIds) - { - var fi = await _cachedFileProvider.GetAndDownloadFile(file); - if (fi == null) continue; - requestSize += fi.Length; - fileList.Add(fi); - } - - _fileStatisticsService.LogRequest(requestSize); - - return _requestBlockFileListResultFactory.Create(requestId, fileList); - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/ControllerBase.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/ControllerBase.cs deleted file mode 100644 index 018ab85..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/ControllerBase.cs +++ /dev/null @@ -1,18 +0,0 @@ -using MareSynchronosShared.Utils; -using Microsoft.AspNetCore.Mvc; - -namespace MareSynchronosStaticFilesServer.Controllers; - -public class ControllerBase : Controller -{ - protected ILogger _logger; - - public ControllerBase(ILogger logger) - { - _logger = logger; - } - - protected string MareUser => HttpContext.User.Claims.First(f => string.Equals(f.Type, MareClaimTypes.Uid, StringComparison.Ordinal)).Value; - protected string Continent => HttpContext.User.Claims.FirstOrDefault(f => string.Equals(f.Type, MareClaimTypes.Continent, StringComparison.Ordinal))?.Value ?? "*"; - protected bool IsPriority => false; -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/DistributionController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/DistributionController.cs deleted file mode 100644 index f18dd10..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/DistributionController.cs +++ /dev/null @@ -1,60 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MareSynchronosStaticFilesServer.Controllers; - -[Route(MareFiles.Distribution)] -public class DistributionController : ControllerBase -{ - private readonly CachedFileProvider _cachedFileProvider; - private readonly IConfigurationService _configuration; - - public DistributionController(ILogger logger, CachedFileProvider cachedFileProvider, - IConfigurationService configuration) : base(logger) - { - _cachedFileProvider = cachedFileProvider; - _configuration = configuration; - } - - [HttpGet(MareFiles.Distribution_Get)] - [Authorize(Policy = "Internal")] - public async Task GetFile(string file) - { - _logger.LogInformation($"GetFile:{MareUser}:{file}"); - - var fi = await _cachedFileProvider.GetAndDownloadFile(file); - if (fi == null) return NotFound(); - - if (_configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseXAccelRedirect), false)) - { - var prefix = _configuration.GetValue(nameof(StaticFilesServerConfiguration.XAccelRedirectPrefix)); - Response.Headers.Append("X-Accel-Redirect", Path.Combine(prefix, file)); - return Ok(); - } - else - { - return PhysicalFile(fi.FullName, "application/octet-stream"); - } - } - - [HttpPost("touch")] - [Authorize(Policy = "Internal")] - public IActionResult TouchFiles([FromBody] string[] files) - { - _logger.LogInformation($"TouchFiles:{MareUser}:{files.Length}"); - - if (files.Length == 0) - return Ok(); - - Task.Run(() => { - foreach (var file in files) - _cachedFileProvider.TouchColdHash(file); - }).ConfigureAwait(false); - - return Ok(); - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/MainController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/MainController.cs deleted file mode 100644 index 7e43ba0..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/MainController.cs +++ /dev/null @@ -1,25 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronosStaticFilesServer.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MareSynchronosStaticFilesServer.Controllers; - -[Route(MareFiles.Main)] -public class MainController : ControllerBase -{ - private readonly IClientReadyMessageService _messageService; - - public MainController(ILogger logger, IClientReadyMessageService mareHub) : base(logger) - { - _messageService = mareHub; - } - - [HttpGet(MareFiles.Main_SendReady)] - [Authorize(Policy = "Internal")] - public IActionResult SendReadyToClients(string uid, Guid requestId) - { - _messageService.SendDownloadReady(uid, requestId); - return Ok(); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs deleted file mode 100644 index 031ab67..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs +++ /dev/null @@ -1,72 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronosStaticFilesServer.Services; -using Microsoft.AspNetCore.Mvc; - -namespace MareSynchronosStaticFilesServer.Controllers; - -[Route(MareFiles.Request)] -public class RequestController : ControllerBase -{ - private readonly CachedFileProvider _cachedFileProvider; - private readonly RequestQueueService _requestQueue; - private readonly FilePreFetchService _preFetchService; - - public RequestController(ILogger logger, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue, FilePreFetchService preFetchService) : base(logger) - { - _cachedFileProvider = cachedFileProvider; - _requestQueue = requestQueue; - _preFetchService = preFetchService; - } - - [HttpGet] - [Route(MareFiles.Request_Cancel)] - public async Task CancelQueueRequest(Guid requestId) - { - try - { - _requestQueue.RemoveFromQueue(requestId, MareUser, IsPriority); - return Ok(); - } - catch (OperationCanceledException) { return BadRequest(); } - } - - [HttpPost] - [Route(MareFiles.Request_Enqueue)] - public async Task PreRequestFilesAsync([FromBody] IEnumerable files) - { - try - { - var hashList = files.ToList(); - var fileList = new List(); - - foreach (var file in hashList) - { - _logger.LogDebug("Prerequested file: " + file); - var fileInfo = await _cachedFileProvider.DownloadFileWhenRequired(file).ConfigureAwait(false); - if (fileInfo != null) - fileList.Add(fileInfo); - } - - _preFetchService.PrefetchFiles(fileList); - - Guid g = Guid.NewGuid(); - await _requestQueue.EnqueueUser(new(g, MareUser, hashList), IsPriority, HttpContext.RequestAborted); - - return Ok(g); - } - catch (OperationCanceledException) { return BadRequest(); } - } - - [HttpGet] - [Route(MareFiles.Request_Check)] - public async Task CheckQueueAsync(Guid requestId, [FromBody] IEnumerable files) - { - try - { - if (!_requestQueue.StillEnqueued(requestId, MareUser, IsPriority)) - await _requestQueue.EnqueueUser(new(requestId, MareUser, files.ToList()), IsPriority, HttpContext.RequestAborted); - return Ok(); - } - catch (OperationCanceledException) { return BadRequest(); } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/ServerFilesController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/ServerFilesController.cs deleted file mode 100644 index 7f95358..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/ServerFilesController.cs +++ /dev/null @@ -1,280 +0,0 @@ -using K4os.Compression.LZ4.Streams; -using MareSynchronos.API.Dto.Files; -using MareSynchronos.API.Routes; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Models; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Services; -using MareSynchronosStaticFilesServer.Utils; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using System.Collections.Concurrent; -using System.Security.Cryptography; -using System.Security.Policy; -using System.Text.Json; -using System.Text.RegularExpressions; - -namespace MareSynchronosStaticFilesServer.Controllers; - -[Route(MareFiles.ServerFiles)] -public class ServerFilesController : ControllerBase -{ - private static readonly SemaphoreSlim _fileLockDictLock = new(1); - private static readonly ConcurrentDictionary _fileUploadLocks = new(StringComparer.Ordinal); - private readonly string _basePath; - private readonly string _coldBasePath; - private readonly CachedFileProvider _cachedFileProvider; - private readonly IConfigurationService _configuration; - private readonly IHubContext _hubContext; - private readonly MareDbContext _mareDbContext; - private readonly MareMetrics _metricsClient; - - public ServerFilesController(ILogger logger, CachedFileProvider cachedFileProvider, - IConfigurationService configuration, - IHubContext hubContext, - MareDbContext mareDbContext, MareMetrics metricsClient) : base(logger) - { - _configuration = configuration; - _basePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.CacheDirectory)); - if (_configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseColdStorage), false)) - _basePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.ColdStorageDirectory)); - _cachedFileProvider = cachedFileProvider; - _hubContext = hubContext; - _mareDbContext = mareDbContext; - _metricsClient = metricsClient; - } - - [HttpPost(MareFiles.ServerFiles_DeleteAll)] - public async Task FilesDeleteAll() - { - return Ok(); - } - - [HttpGet(MareFiles.ServerFiles_GetSizes)] - public async Task FilesGetSizes([FromBody] List hashes) - { - var forbiddenFiles = await _mareDbContext.ForbiddenUploadEntries. - Where(f => hashes.Contains(f.Hash)).ToListAsync().ConfigureAwait(false); - List response = new(); - - var cacheFile = await _mareDbContext.Files.AsNoTracking().Where(f => hashes.Contains(f.Hash)).AsNoTracking().Select(k => new { k.Hash, k.Size }).AsNoTracking().ToListAsync().ConfigureAwait(false); - - var allFileShards = new List(_configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.CdnShardConfiguration), new List())); - - foreach (var file in cacheFile) - { - var forbiddenFile = forbiddenFiles.SingleOrDefault(f => string.Equals(f.Hash, file.Hash, StringComparison.OrdinalIgnoreCase)); - Uri? baseUrl = null; - - if (forbiddenFile == null) - { - List selectedShards = new(); - var matchingShards = allFileShards.Where(f => new Regex(f.FileMatch).IsMatch(file.Hash)).ToList(); - - if (string.Equals(Continent, "*", StringComparison.Ordinal)) - { - selectedShards = matchingShards; - } - else - { - selectedShards = matchingShards.Where(c => c.Continents.Contains(Continent, StringComparer.OrdinalIgnoreCase)).ToList(); - if (!selectedShards.Any()) selectedShards = matchingShards; - } - - var shard = selectedShards - .OrderBy(s => !s.Continents.Any() ? 0 : 1) - .ThenBy(s => s.Continents.Contains("*", StringComparer.Ordinal) ? 0 : 1) - .ThenBy(g => Guid.NewGuid()).FirstOrDefault(); - - baseUrl = shard?.CdnFullUrl ?? _configuration.GetValue(nameof(StaticFilesServerConfiguration.CdnFullUrl)); - } - - response.Add(new DownloadFileDto - { - FileExists = file.Size > 0, - ForbiddenBy = forbiddenFile?.ForbiddenBy ?? string.Empty, - IsForbidden = forbiddenFile != null, - Hash = file.Hash, - Size = file.Size, - Url = baseUrl?.ToString() ?? string.Empty, - }); - } - - return Ok(JsonSerializer.Serialize(response)); - } - - [HttpPost(MareFiles.ServerFiles_FilesSend)] - public async Task FilesSend([FromBody] FilesSendDto filesSendDto) - { - var userSentHashes = new HashSet(filesSendDto.FileHashes.Distinct(StringComparer.Ordinal).Select(s => string.Concat(s.Where(c => char.IsLetterOrDigit(c)))), StringComparer.Ordinal); - var notCoveredFiles = new Dictionary(StringComparer.Ordinal); - var forbiddenFiles = await _mareDbContext.ForbiddenUploadEntries.AsNoTracking().Where(f => userSentHashes.Contains(f.Hash)).AsNoTracking().ToDictionaryAsync(f => f.Hash, f => f).ConfigureAwait(false); - var existingFiles = await _mareDbContext.Files.AsNoTracking().Where(f => userSentHashes.Contains(f.Hash)).AsNoTracking().ToDictionaryAsync(f => f.Hash, f => f).ConfigureAwait(false); - - List fileCachesToUpload = new(); - foreach (var hash in userSentHashes) - { - // Skip empty file hashes, duplicate file hashes, forbidden file hashes and existing file hashes - if (string.IsNullOrEmpty(hash)) { continue; } - if (notCoveredFiles.ContainsKey(hash)) { continue; } - if (forbiddenFiles.ContainsKey(hash)) - { - notCoveredFiles[hash] = new UploadFileDto() - { - ForbiddenBy = forbiddenFiles[hash].ForbiddenBy, - Hash = hash, - IsForbidden = true, - }; - - continue; - } - if (existingFiles.TryGetValue(hash, out var file) && file.Uploaded) { continue; } - - notCoveredFiles[hash] = new UploadFileDto() - { - Hash = hash, - }; - } - - if (notCoveredFiles.Any(p => !p.Value.IsForbidden)) - { - await _hubContext.Clients.Users(filesSendDto.UIDs).SendAsync(nameof(IMareHub.Client_UserReceiveUploadStatus), new MareSynchronos.API.Dto.User.UserDto(new(MareUser))) - .ConfigureAwait(false); - } - - return Ok(JsonSerializer.Serialize(notCoveredFiles.Values.ToList())); - } - - [HttpPost(MareFiles.ServerFiles_Upload + "/{hash}")] - [RequestSizeLimit(200 * 1024 * 1024)] - public async Task UploadFile(string hash, CancellationToken requestAborted) - { - _logger.LogInformation("{user} uploading file {file}", MareUser, hash); - hash = hash.ToUpperInvariant(); - var existingFile = await _mareDbContext.Files.SingleOrDefaultAsync(f => f.Hash == hash); - if (existingFile != null) return Ok(); - - SemaphoreSlim? fileLock = null; - bool successfullyWaited = false; - while (!successfullyWaited && !requestAborted.IsCancellationRequested) - { - lock (_fileUploadLocks) - { - if (!_fileUploadLocks.TryGetValue(hash, out fileLock)) - _fileUploadLocks[hash] = fileLock = new SemaphoreSlim(1); - } - - try - { - await fileLock.WaitAsync(requestAborted).ConfigureAwait(false); - successfullyWaited = true; - } - catch (ObjectDisposedException) - { - _logger.LogWarning("Semaphore disposed for {hash}, recreating", hash); - } - } - - try - { - var existingFileCheck2 = await _mareDbContext.Files.SingleOrDefaultAsync(f => f.Hash == hash); - if (existingFileCheck2 != null) - { - return Ok(); - } - - var path = FilePathUtil.GetFilePath(_basePath, hash); - var tmpPath = path + ".tmp"; - long compressedSize = -1; - - try - { - // Write incoming file to a temporary file while also hashing the decompressed content - - // Stream flow diagram: - // Request.Body ==> (Tee) ==> FileStream - // ==> CountedStream ==> LZ4DecoderStream ==> HashingStream ==> Stream.Null - - // Reading via TeeStream causes the request body to be copied to tmpPath - using var tmpFileStream = new FileStream(tmpPath, FileMode.Create); - using var teeStream = new TeeStream(Request.Body, tmpFileStream); - teeStream.DisposeUnderlying = false; - // Read via CountedStream to count the number of compressed bytes - using var countStream = new CountedStream(teeStream); - countStream.DisposeUnderlying = false; - - // The decompressed file content is read through LZ4DecoderStream, and written out to HashingStream - using var decStream = LZ4Stream.Decode(countStream, extraMemory: 0, leaveOpen: true); - // HashingStream simply hashes the decompressed bytes without writing them anywhere - using var hashStream = new HashingStream(Stream.Null, SHA1.Create()); - hashStream.DisposeUnderlying = false; - - await decStream.CopyToAsync(hashStream, requestAborted).ConfigureAwait(false); - decStream.Close(); - - var hashString = BitConverter.ToString(hashStream.Finish()) - .Replace("-", "", StringComparison.Ordinal).ToUpperInvariant(); - if (!string.Equals(hashString, hash, StringComparison.Ordinal)) - throw new InvalidOperationException($"Hash does not match file, computed: {hashString}, expected: {hash}"); - - compressedSize = countStream.BytesRead; - - // File content is verified -- move it to its final location - System.IO.File.Move(tmpPath, path, true); - } - catch - { - try - { - System.IO.File.Delete(tmpPath); - } - catch { } - throw; - } - - // update on db - await _mareDbContext.Files.AddAsync(new FileCache() - { - Hash = hash, - UploadDate = DateTime.UtcNow, - UploaderUID = MareUser, - Size = compressedSize, - Uploaded = true - }).ConfigureAwait(false); - await _mareDbContext.SaveChangesAsync().ConfigureAwait(false); - - _metricsClient.IncGauge(MetricsAPI.GaugeFilesTotal, 1); - _metricsClient.IncGauge(MetricsAPI.GaugeFilesTotalSize, compressedSize); - - _fileUploadLocks.TryRemove(hash, out _); - - return Ok(); - } - catch (Exception e) - { - _logger.LogError(e, "Error during file upload"); - return BadRequest(); - } - finally - { - try - { - fileLock?.Release(); - fileLock?.Dispose(); - } - catch (ObjectDisposedException) - { - // it's disposed whatever - } - finally - { - _fileUploadLocks.TryRemove(hash, out _); - } - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/DummyHub.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/DummyHub.cs deleted file mode 100644 index afcb665..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/DummyHub.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.SignalR; - -// this is a very hacky way to attach this file server to the main mare hub signalr instance via redis -// signalr publishes the namespace and hubname into the redis backend so this needs to be equal to the original -// but I don't need to reimplement the hub completely as I only exclusively use it for internal connection calling -// from the queue service so I keep the namespace and name of the class the same so it can connect to the same channel -// if anyone finds a better way to do this let me know - -#pragma warning disable IDE0130 // Namespace does not match folder structure -#pragma warning disable MA0048 // File name must match type name -namespace MareSynchronosServer.Hubs; -public class MareHub : Hub -{ - public override Task OnConnectedAsync() - { - throw new NotSupportedException(); - } - - public override Task OnDisconnectedAsync(Exception exception) - { - throw new NotSupportedException(); - } -} -#pragma warning restore IDE0130 // Namespace does not match folder structure -#pragma warning restore MA0048 // File name must match type name \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/MareSynchronosStaticFilesServer.csproj b/MareSynchronosServer/MareSynchronosStaticFilesServer/MareSynchronosStaticFilesServer.csproj deleted file mode 100644 index c1c0fd0..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/MareSynchronosStaticFilesServer.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - net9.0 - enable - - - - - - - - - - - Never - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Program.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Program.cs deleted file mode 100644 index 42da70d..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Program.cs +++ /dev/null @@ -1,43 +0,0 @@ -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosStaticFilesServer; - -public class Program -{ - public static void Main(string[] args) - { - var hostBuilder = CreateHostBuilder(args); - var host = hostBuilder.Build(); - - using (var scope = host.Services.CreateScope()) - { - var options = host.Services.GetService>(); - var optionsServer = host.Services.GetService>(); - var logger = host.Services.GetService>(); - logger.LogInformation("Loaded MareSynchronos Static Files Server Configuration (IsMain: {isMain})", options.IsMain); - logger.LogInformation(options.ToString()); - logger.LogInformation("Loaded MareSynchronos Server Auth Configuration (IsMain: {isMain})", optionsServer.IsMain); - logger.LogInformation(optionsServer.ToString()); - } - - host.Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) - { - var loggerFactory = LoggerFactory.Create(builder => - { - builder.ClearProviders(); - builder.AddConsole(); - }); - var logger = loggerFactory.CreateLogger(); - return Host.CreateDefaultBuilder(args) - .UseSystemd() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseContentRoot(AppContext.BaseDirectory); - webBuilder.UseStartup(ctx => new Startup(ctx.Configuration, logger)); - }); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Properties/launchSettings.json b/MareSynchronosServer/MareSynchronosStaticFilesServer/Properties/launchSettings.json deleted file mode 100644 index 6ba3599..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:21378", - "sslPort": 44331 - } - }, - "profiles": { - "MareSynchronosStaticFilesServer": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7094;http://localhost:5094", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/CachedFileProvider.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/CachedFileProvider.cs deleted file mode 100644 index bc0c987..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/CachedFileProvider.cs +++ /dev/null @@ -1,243 +0,0 @@ -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosStaticFilesServer.Utils; -using System.Collections.Concurrent; -using System.Net.Http.Headers; -using MareSynchronosShared.Utils; -using MareSynchronos.API.Routes; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosStaticFilesServer.Services; - -public sealed class CachedFileProvider : IDisposable -{ - private readonly IConfigurationService _configuration; - private readonly ILogger _logger; - private readonly FileStatisticsService _fileStatisticsService; - private readonly MareMetrics _metrics; - private readonly ServerTokenGenerator _generator; - private readonly ITouchHashService _touchService; - private readonly Uri _remoteCacheSourceUri; - private readonly bool _useColdStorage; - private readonly string _hotStoragePath; - private readonly string _coldStoragePath; - private readonly ConcurrentDictionary _currentTransfers = new(StringComparer.Ordinal); - private readonly HttpClient _httpClient; - private readonly SemaphoreSlim _downloadSemaphore = new(1, 1); - private bool _disposed; - - private bool IsMainServer => _remoteCacheSourceUri == null && _isDistributionServer; - private bool _isDistributionServer; - - public CachedFileProvider(IConfigurationService configuration, ILogger logger, - FileStatisticsService fileStatisticsService, MareMetrics metrics, ServerTokenGenerator generator, ITouchHashService touchService) - { - AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); - _configuration = configuration; - _logger = logger; - _fileStatisticsService = fileStatisticsService; - _metrics = metrics; - _generator = generator; - _touchService = touchService; - _remoteCacheSourceUri = configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DistributionFileServerAddress), null); - _isDistributionServer = configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.IsDistributionNode), false); - _useColdStorage = configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseColdStorage), false); - _hotStoragePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.CacheDirectory)); - _coldStoragePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.ColdStorageDirectory)); - _httpClient = new(); - _httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MareSynchronosServer", "1.0.0.0")); - } - - public void Dispose() - { - if (_disposed) - { - return; - } - - _disposed = true; - _httpClient?.Dispose(); - } - - private async Task DownloadTask(string hash) - { - var destinationFilePath = FilePathUtil.GetFilePath(_useColdStorage ? _coldStoragePath : _hotStoragePath, hash); - - // if cold storage is not configured or file not found or error is present try to download file from remote - var downloadUrl = MareFiles.DistributionGetFullPath(_remoteCacheSourceUri, hash); - _logger.LogInformation("Did not find {hash}, downloading from {server}", hash, downloadUrl); - - using var requestMessage = new HttpRequestMessage(HttpMethod.Get, downloadUrl); - requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _generator.Token); - if (_configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DistributionFileServerForceHTTP2), false)) - { - requestMessage.Version = new Version(2, 0); - requestMessage.VersionPolicy = HttpVersionPolicy.RequestVersionExact; - } - HttpResponseMessage? response = null; - - try - { - response = await _httpClient.SendAsync(requestMessage).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Failed to download {url}", downloadUrl); - response?.Dispose(); - return; - } - - var tempFileName = destinationFilePath + ".dl"; - var fileStream = new FileStream(tempFileName, FileMode.Create, FileAccess.ReadWrite); - var bufferSize = 4096; - var buffer = new byte[bufferSize]; - - var bytesRead = 0; - using var content = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); - while ((bytesRead = await content.ReadAsync(buffer).ConfigureAwait(false)) > 0) - { - await fileStream.WriteAsync(buffer.AsMemory(0, bytesRead)).ConfigureAwait(false); - } - await fileStream.FlushAsync().ConfigureAwait(false); - await fileStream.DisposeAsync().ConfigureAwait(false); - File.Move(tempFileName, destinationFilePath, true); - - _metrics.IncGauge(_useColdStorage ? MetricsAPI.GaugeFilesTotalColdStorage : MetricsAPI.GaugeFilesTotal); - _metrics.IncGauge(_useColdStorage ? MetricsAPI.GaugeFilesTotalSizeColdStorage : MetricsAPI.GaugeFilesTotalSize, new FileInfo(destinationFilePath).Length); - response.Dispose(); - } - - private bool TryCopyFromColdStorage(string hash, string destinationFilePath) - { - if (!_useColdStorage) return false; - - if (string.IsNullOrEmpty(_coldStoragePath)) return false; - - var coldStorageFilePath = FilePathUtil.GetFilePath(_coldStoragePath, hash); - if (!File.Exists(coldStorageFilePath)) return false; - - try - { - _logger.LogDebug("Copying {hash} from cold storage: {path}", hash, coldStorageFilePath); - var tempFileName = destinationFilePath + ".dl"; - File.Copy(coldStorageFilePath, tempFileName, true); - File.Move(tempFileName, destinationFilePath, true); - var destinationFile = new FileInfo(destinationFilePath); - _metrics.IncGauge(MetricsAPI.GaugeFilesTotal); - _metrics.IncGauge(MetricsAPI.GaugeFilesTotalSize, new FileInfo(destinationFilePath).Length); - return true; - } - catch (Exception ex) - { - // Recover from a fairly common race condition -- max wait time is 75ms - // Having TryCopyFromColdStorage protected by the downloadtask mutex doesn't work for some reason? - for (int retry = 0; retry < 5; ++retry) - { - Thread.Sleep(5 + retry * 5); - if (File.Exists(destinationFilePath)) - return true; - } - _logger.LogWarning(ex, "Could not copy {coldStoragePath} from cold storage", coldStorageFilePath); - } - - return false; - } - - // Returns FileInfo ONLY if the hot file was immediately available without downloading - // Since the intended use is for pre-fetching files from hot storage, this is exactly what we need anyway - public async Task DownloadFileWhenRequired(string hash) - { - var fi = FilePathUtil.GetFileInfoForHash(_hotStoragePath, hash); - - if (fi != null && fi.Length != 0) - return fi; - - // first check cold storage - if (TryCopyFromColdStorage(hash, FilePathUtil.GetFilePath(_hotStoragePath, hash))) - return null; - - // no distribution server configured to download from - if (_remoteCacheSourceUri == null) - return null; - - await _downloadSemaphore.WaitAsync().ConfigureAwait(false); - if (!_currentTransfers.TryGetValue(hash, out var downloadTask) || (downloadTask?.IsCompleted ?? true)) - { - _currentTransfers[hash] = Task.Run(async () => - { - try - { - _metrics.IncGauge(MetricsAPI.GaugeFilesDownloadingFromCache); - await DownloadTask(hash).ConfigureAwait(false); - TryCopyFromColdStorage(hash, FilePathUtil.GetFilePath(_hotStoragePath, hash)); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during Download Task for {hash}", hash); - } - finally - { - _metrics.DecGauge(MetricsAPI.GaugeFilesDownloadingFromCache); - _currentTransfers.Remove(hash, out _); - } - }); - } - _downloadSemaphore.Release(); - - return null; - } - - public async Task GetAndDownloadFile(string hash) - { - var fi = await DownloadFileWhenRequired(hash).ConfigureAwait(false); - - if (fi == null && _currentTransfers.TryGetValue(hash, out var downloadTask)) - { - try - { - using CancellationTokenSource cts = new(); - cts.CancelAfter(TimeSpan.FromSeconds(120)); - _metrics.IncGauge(MetricsAPI.GaugeFilesTasksWaitingForDownloadFromCache); - await downloadTask.WaitAsync(cts.Token).ConfigureAwait(false); - } - catch (Exception e) - { - _logger.LogWarning(e, "Failed while waiting for download task for {hash}", hash); - return null; - } - finally - { - _metrics.DecGauge(MetricsAPI.GaugeFilesTasksWaitingForDownloadFromCache); - } - } - - fi ??= FilePathUtil.GetFileInfoForHash(_hotStoragePath, hash); - - if (fi == null) - return null; - - fi.LastAccessTimeUtc = DateTime.UtcNow; - _touchService.TouchColdHash(hash); - - _fileStatisticsService.LogFile(hash, fi.Length); - - return fi; - } - - public async Task GetAndDownloadFileStream(string hash) - { - var fi = await GetAndDownloadFile(hash).ConfigureAwait(false); - return new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.Inheritable | FileShare.Read); - } - - public void TouchColdHash(string hash) - { - _touchService.TouchColdHash(hash); - } - - public bool AnyFilesDownloading(List hashes) - { - return hashes.Exists(_currentTransfers.Keys.Contains); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ColdTouchHashService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ColdTouchHashService.cs deleted file mode 100644 index f63d5ce..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ColdTouchHashService.cs +++ /dev/null @@ -1,82 +0,0 @@ -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Utils; -using System.Collections.Concurrent; - -namespace MareSynchronosStaticFilesServer.Services; - -// Perform access time updates for cold cache files accessed via hot cache or shard servers -public class ColdTouchHashService : ITouchHashService -{ - private readonly ILogger _logger; - private readonly IConfigurationService _configuration; - - private readonly bool _useColdStorage; - private readonly string _coldStoragePath; - - // Debounce multiple updates towards the same file - private readonly ConcurrentDictionary _lastUpdateTimesUtc = new(StringComparer.Ordinal); - private int _cleanupCounter = 0; - private object _cleanupLockObj = new(); - private const double _debounceTimeSecs = 900.0; - - public ColdTouchHashService(ILogger logger, IConfigurationService configuration) - { - _logger = logger; - _configuration = configuration; - _useColdStorage = configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseColdStorage), false); - _coldStoragePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.ColdStorageDirectory)); - } - - public Task StartAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - - public void TouchColdHash(string hash) - { - if (!_useColdStorage) - return; - - var nowUtc = DateTime.UtcNow; - - // Clean up debounce dictionary regularly - if (_cleanupCounter++ >= 1000) - { - _cleanupCounter = 0; - if (Monitor.TryEnter(_cleanupLockObj)) - { - try - { - foreach (var entry in _lastUpdateTimesUtc.Where(entry => (nowUtc - entry.Value).TotalSeconds >= _debounceTimeSecs).ToList()) - _lastUpdateTimesUtc.TryRemove(entry.Key, out _); - } - finally - { - Monitor.Exit(_cleanupLockObj); - } - } - } - - // Ignore multiple updates within a time window of the first - if (_lastUpdateTimesUtc.TryGetValue(hash, out var lastUpdateTimeUtc) && (nowUtc - lastUpdateTimeUtc).TotalSeconds < _debounceTimeSecs) - return; - - var fileInfo = FilePathUtil.GetFileInfoForHash(_coldStoragePath, hash); - if (fileInfo != null) - { - _logger.LogTrace("Touching {fileName}", fileInfo.Name); - try - { - fileInfo.LastAccessTimeUtc = nowUtc; - } - catch (IOException) { return; } - _lastUpdateTimesUtc.TryAdd(hash, nowUtc); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FileCleanupService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FileCleanupService.cs deleted file mode 100644 index ff18cfe..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FileCleanupService.cs +++ /dev/null @@ -1,359 +0,0 @@ -using ByteSizeLib; -using MareSynchronos.API.Dto.Files; -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Models; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Utils; -using MessagePack.Formatters; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Hosting.Systemd; - -namespace MareSynchronosStaticFilesServer.Services; - -public class FileCleanupService : IHostedService -{ - private readonly IConfigurationService _configuration; - private readonly ILogger _logger; - private readonly MareMetrics _metrics; - private readonly IServiceProvider _services; - - private readonly string _hotStoragePath; - private readonly string _coldStoragePath; - private readonly bool _isMain = false; - private readonly bool _isDistributionNode = false; - private readonly bool _useColdStorage = false; - private HashSet _orphanedFiles = new(StringComparer.Ordinal); - - private CancellationTokenSource _cleanupCts; - - private int HotStorageMinimumRetention => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.MinimumFileRetentionPeriodInDays), 7); - private int HotStorageRetention => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UnusedFileRetentionPeriodInDays), 14); - private double HotStorageSize => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.CacheSizeHardLimitInGiB), -1.0); - - private int ColdStorageMinimumRetention => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.ColdStorageMinimumFileRetentionPeriodInDays), 60); - private int ColdStorageRetention => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.ColdStorageUnusedFileRetentionPeriodInDays), 60); - private double ColdStorageSize => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.ColdStorageSizeHardLimitInGiB), -1.0); - - private double SmallSizeKiB => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.CacheSmallSizeThresholdKiB), 64.0); - private double LargeSizeKiB => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.CacheLargeSizeThresholdKiB), 1024.0); - - private int ForcedDeletionAfterHours => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.ForcedDeletionOfFilesAfterHours), -1); - private int CleanupCheckMinutes => _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.CleanupCheckInMinutes), 15); - - private List GetAllHotFiles() => new DirectoryInfo(_hotStoragePath).GetFiles("*", SearchOption.AllDirectories) - .Where(f => f != null && f.Name.Length == 40) - .OrderBy(f => f.LastAccessTimeUtc).ToList(); - - private List GetAllColdFiles() => new DirectoryInfo(_coldStoragePath).GetFiles("*", SearchOption.AllDirectories) - .Where(f => f != null && f.Name.Length == 40) - .OrderBy(f => f.LastAccessTimeUtc).ToList(); - - private List GetTempFiles() => new DirectoryInfo(_useColdStorage ? _coldStoragePath : _hotStoragePath).GetFiles("*", SearchOption.AllDirectories) - .Where(f => f != null && (f.Name.EndsWith(".dl", StringComparison.InvariantCultureIgnoreCase) || f.Name.EndsWith(".tmp", StringComparison.InvariantCultureIgnoreCase))).ToList(); - - public FileCleanupService(MareMetrics metrics, ILogger logger, - IServiceProvider services, IConfigurationService configuration) - { - _metrics = metrics; - _logger = logger; - _services = services; - _configuration = configuration; - _useColdStorage = _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseColdStorage), false); - _hotStoragePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.CacheDirectory)); - _coldStoragePath = configuration.GetValue(nameof(StaticFilesServerConfiguration.ColdStorageDirectory)); - _isDistributionNode = configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.IsDistributionNode), false); - _isMain = configuration.GetValue(nameof(StaticFilesServerConfiguration.MainFileServerAddress)) == null && _isDistributionNode; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Cleanup Service started"); - - InitializeGauges(); - - _cleanupCts = new(); - - _ = CleanUpTask(_cleanupCts.Token); - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _cleanupCts.Cancel(); - - return Task.CompletedTask; - } - - private List CleanUpFilesBeyondSizeLimit(List files, double sizeLimit, double minTTL, double maxTTL, CancellationToken ct) - { - var removedFiles = new List(); - if (sizeLimit <= 0) - { - return removedFiles; - } - - var smallSize = SmallSizeKiB * 1024.0; - var largeSize = LargeSizeKiB * 1024.0; - var now = DateTime.Now; - - // Avoid nonsense in future calculations - if (smallSize < 0.0) - smallSize = 0.0; - - if (largeSize < smallSize) - largeSize = smallSize; - - if (minTTL < 0.0) - minTTL = 0.0; - - if (maxTTL < minTTL) - maxTTL = minTTL; - - // Calculates a deletion priority to prioritize deletion of larger files over a configured TTL range based on a file's size. - // This is intended to be applied to the hot cache, as the cost of recovering many small files is greater than a single large file. - // Example (minTTL=7, maxTTL=30): - // - A 10MB file was last accessed 5 days ago. Its calculated optimum TTL is 7 days. result = 0.7143 - // - A 50kB file was last accessed 10 days ago. Its calculated optimum TTL is 30 days. result = 0.3333 - // The larger file will be deleted with a higher priority than the smaller file. - double CalculateTTLProgression(FileInfo file) - { - var fileLength = (double)file.Length; - var fileAgeDays = (now - file.LastAccessTime).TotalDays; - var sizeNorm = Math.Clamp((fileLength - smallSize) / (largeSize - smallSize), 0.0, 1.0); - // Using Math.Sqrt(sizeNorm) would create a more logical scaling curve, but it barely matters - var ttlDayRange = (maxTTL - minTTL) * (1.0 - sizeNorm); - var daysPastMinTTL = Math.Max(fileAgeDays - minTTL, 0.0); - // There is some creativity in choosing an upper bound here: - // - With no upper bound, any file larger than `largeSize` is always the highest priority for deletion once it passes its calculated TTL - // - With 1.0 as an upper bound, all files older than `maxTTL` will have the same priority regardless of size - // - Using maxTTL/minTTL chooses a logical cut-off point where any files old enough to be affected would have been cleaned up already - var ttlProg = Math.Clamp(daysPastMinTTL / ttlDayRange, 0.0, maxTTL / minTTL); - return ttlProg; - } - - try - { - // Since we already have the file list sorted by access time, the list index is incorporated in to - // the dictionary key to preserve it as a secondary ordering - var sortedFiles = new PriorityQueue(); - - foreach (var (file, i) in files.Select((file, i) => ( file, i ))) - { - double ttlProg = CalculateTTLProgression(file); - sortedFiles.Enqueue(file, (-ttlProg, i)); - } - - _logger.LogInformation("Cleaning up files beyond the cache size limit of {cacheSizeLimit} GiB", sizeLimit); - var totalCacheSizeInBytes = files.Sum(s => s.Length); - long cacheSizeLimitInBytes = (long)ByteSize.FromGibiBytes(sizeLimit).Bytes; - while (totalCacheSizeInBytes > cacheSizeLimitInBytes && sortedFiles.Count != 0 && !ct.IsCancellationRequested) - { - var file = sortedFiles.Dequeue(); - totalCacheSizeInBytes -= file.Length; - _logger.LogInformation("Deleting {file} with size {size:N2}MiB", file.FullName, ByteSize.FromBytes(file.Length).MebiBytes); - file.Delete(); - removedFiles.Add(file.Name); - } - files.RemoveAll(f => removedFiles.Contains(f.Name, StringComparer.InvariantCultureIgnoreCase)); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during cache size limit cleanup"); - } - - return removedFiles; - } - - private void CleanUpOrphanedFiles(HashSet allDbFileHashes, List allPhysicalFiles, CancellationToken ct) - { - // To avoid race conditions with file uploads, only delete files on a second pass - var newOrphanedFiles = new HashSet(StringComparer.Ordinal); - - foreach (var file in allPhysicalFiles.ToList()) - { - if (!allDbFileHashes.Contains(file.Name.ToUpperInvariant())) - { - _logger.LogInformation("File not in DB, marking: {fileName}", file.Name); - newOrphanedFiles.Add(file.FullName); - } - - ct.ThrowIfCancellationRequested(); - } - - foreach (var fullName in _orphanedFiles.Where(f => newOrphanedFiles.Contains(f))) - { - var name = Path.GetFileName(fullName); - File.Delete(fullName); - _logger.LogInformation("File still not in DB, deleting: {fileName}", name); - allPhysicalFiles.RemoveAll(f => f.FullName.Equals(fullName, StringComparison.InvariantCultureIgnoreCase)); - } - - _orphanedFiles = newOrphanedFiles; - } - - private List CleanUpOutdatedFiles(List files, int unusedRetention, int forcedDeletionAfterHours, CancellationToken ct) - { - var removedFiles = new List(); - try - { - _logger.LogInformation("Cleaning up files older than {filesOlderThanDays} days", unusedRetention); - if (forcedDeletionAfterHours > 0) - { - _logger.LogInformation("Cleaning up files written to longer than {hours}h ago", forcedDeletionAfterHours); - } - - var lastAccessCutoffTime = DateTime.Now.Subtract(TimeSpan.FromDays(unusedRetention)); - var forcedDeletionCutoffTime = DateTime.Now.Subtract(TimeSpan.FromHours(forcedDeletionAfterHours)); - - foreach (var file in files) - { - if (file.LastAccessTime < lastAccessCutoffTime) - { - _logger.LogInformation("File outdated: {fileName}, {fileSize:N2}MiB", file.Name, ByteSize.FromBytes(file.Length).MebiBytes); - file.Delete(); - removedFiles.Add(file.Name); - } - else if (forcedDeletionAfterHours > 0 && file.LastWriteTime < forcedDeletionCutoffTime) - { - _logger.LogInformation("File forcefully deleted: {fileName}, {fileSize:N2}MiB", file.Name, ByteSize.FromBytes(file.Length).MebiBytes); - file.Delete(); - removedFiles.Add(file.Name); - } - - ct.ThrowIfCancellationRequested(); - } - files.RemoveAll(f => removedFiles.Contains(f.Name, StringComparer.InvariantCultureIgnoreCase)); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during file cleanup of old files"); - } - - return removedFiles; - } - - private void CleanUpTempFiles() - { - var pastTime = DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(20)); - var tempFiles = GetTempFiles(); - foreach (var tempFile in tempFiles.Where(f => f.LastWriteTimeUtc < pastTime)) - tempFile.Delete(); - } - - private async Task CleanUpTask(CancellationToken ct) - { - while (!ct.IsCancellationRequested) - { - try - { - using var scope = _services.CreateScope(); - using var dbContext = _isMain ? scope.ServiceProvider.GetService()! : null; - - HashSet allDbFileHashes = null; - - // Database operations only performed on main server - if (_isMain) - { - var allDbFiles = await dbContext.Files.ToListAsync(ct).ConfigureAwait(false); - allDbFileHashes = new HashSet(allDbFiles.Select(a => a.Hash.ToUpperInvariant()), StringComparer.Ordinal); - } - - if (_useColdStorage) - { - var coldFiles = GetAllColdFiles(); - var removedColdFiles = new List(); - - removedColdFiles.AddRange( - CleanUpOutdatedFiles(coldFiles, ColdStorageRetention, ForcedDeletionAfterHours, ct) - ); - removedColdFiles.AddRange( - CleanUpFilesBeyondSizeLimit(coldFiles, ColdStorageSize, ColdStorageMinimumRetention, ColdStorageRetention, ct) - ); - - // Remove cold storage files are deleted from the database, if we are the main file server - if (_isMain) - { - dbContext.Files.RemoveRange( - dbContext.Files.Where(f => removedColdFiles.Contains(f.Hash)) - ); - allDbFileHashes.ExceptWith(removedColdFiles); - CleanUpOrphanedFiles(allDbFileHashes, coldFiles, ct); - } - - // Remove hot copies of files now that the authoritative copy is gone - foreach (var removedFile in removedColdFiles) - { - var hotFile = FilePathUtil.GetFileInfoForHash(_hotStoragePath, removedFile); - hotFile?.Delete(); - } - - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotalSizeColdStorage, coldFiles.Sum(f => { try { return f.Length; } catch { return 0; } })); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotalColdStorage, coldFiles.Count); - } - - var hotFiles = GetAllHotFiles(); - var removedHotFiles = new List(); - - removedHotFiles.AddRange( - CleanUpOutdatedFiles(hotFiles, HotStorageRetention, forcedDeletionAfterHours: _useColdStorage ? ForcedDeletionAfterHours : -1, ct) - ); - removedHotFiles.AddRange( - CleanUpFilesBeyondSizeLimit(hotFiles, HotStorageSize, HotStorageMinimumRetention, HotStorageRetention, ct) - ); - - if (_isMain) - { - // If cold storage is not active, then "hot" files are deleted from the database instead - if (!_useColdStorage) - { - dbContext.Files.RemoveRange( - dbContext.Files.Where(f => removedHotFiles.Contains(f.Hash)) - ); - allDbFileHashes.ExceptWith(removedHotFiles); - } - - CleanUpOrphanedFiles(allDbFileHashes, hotFiles, ct); - - await dbContext.SaveChangesAsync(ct).ConfigureAwait(false); - } - - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotalSize, hotFiles.Sum(f => { try { return f.Length; } catch { return 0; } })); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotal, hotFiles.Count); - - CleanUpTempFiles(); - } - catch (Exception e) - { - _logger.LogError(e, "Error during cleanup task"); - } - - var cleanupCheckMinutes = CleanupCheckMinutes; - var now = DateTime.Now; - TimeOnly currentTime = new(now.Hour, now.Minute, now.Second); - TimeOnly futureTime = new(now.Hour, now.Minute - now.Minute % cleanupCheckMinutes, 0); - var span = futureTime.AddMinutes(cleanupCheckMinutes) - currentTime; - - _logger.LogInformation("File Cleanup Complete, next run at {date}", now.Add(span)); - await Task.Delay(span, ct).ConfigureAwait(false); - } - } - - private void InitializeGauges() - { - if (_useColdStorage) - { - var allFilesInColdStorageDir = GetAllColdFiles(); - - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotalSizeColdStorage, allFilesInColdStorageDir.Sum(f => f.Length)); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotalColdStorage, allFilesInColdStorageDir.Count); - } - - var allFilesInHotStorage = GetAllHotFiles(); - - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotalSize, allFilesInHotStorage.Sum(f => { try { return f.Length; } catch { return 0; } })); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesTotal, allFilesInHotStorage.Count); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FilePreFetchService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FilePreFetchService.cs deleted file mode 100644 index 1dc8a6e..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FilePreFetchService.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Microsoft.Win32.SafeHandles; -using System.Runtime.InteropServices; -using System.Threading.Channels; - -namespace MareSynchronosStaticFilesServer.Services; - -// Pre-fetch files from cache storage in to memory -public class FilePreFetchService : IHostedService -{ - private struct PreFetchRequest - { - public FileInfo FileInfo; - public DateTime ExpiryUtc; - } - - private readonly ILogger _logger; - - private CancellationTokenSource _prefetchCts; - private readonly Channel _prefetchChannel; - - private const int _readAheadBytes = 8 * 1024 * 1024; // Maximum number of of bytes to prefetch per file (8MB) - private const int _preFetchTasks = 4; // Maximum number of tasks to process prefetches concurrently - - // Use readahead() on linux if its available - [DllImport("libc", EntryPoint = "readahead")] - static extern int LinuxReadAheadExternal(SafeFileHandle fd, Int64 offset, int count); - - private bool _hasLinuxReadAhead = true; - - public FilePreFetchService(ILogger logger) - { - _logger = logger; - _prefetchChannel = Channel.CreateUnbounded(); - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("File PreFetch Service started"); - _prefetchCts = new(); - for (int i = 0; i < _preFetchTasks; ++i) - _ = PrefetchTask(_prefetchCts.Token); - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _prefetchCts.Cancel(); - return Task.CompletedTask; - } - - // Queue a list of hashes to be prefetched in a background task - public void PrefetchFiles(ICollection fileList) - { - if (!_hasLinuxReadAhead) - { - if (!_prefetchCts.IsCancellationRequested) - { - _logger.LogError("readahead() is not available - aborting File PreFetch Service"); - _prefetchCts.Cancel(); - } - return; - } - - var nowUtc = DateTime.UtcNow; - - // Expire prefetch requests that aren't picked up within 500ms - // By this point the request is probably already being served, or things are moving too slow to matter anyway - var expiry = nowUtc + TimeSpan.FromMilliseconds(500); - - foreach (var fileInfo in fileList) - { - _ = _prefetchChannel.Writer.TryWrite(new PreFetchRequest(){ - FileInfo = fileInfo, - ExpiryUtc = expiry, - }); - } - } - - private async Task PrefetchTask(CancellationToken ct) - { - var reader = _prefetchChannel.Reader; - - while (!ct.IsCancellationRequested) - { - try - { - var req = await reader.ReadAsync(ct).ConfigureAwait(false); - var nowUtc = DateTime.UtcNow; - - if (nowUtc >= req.ExpiryUtc) - { - _logger.LogDebug("Skipped expired prefetch for {hash}", req.FileInfo.Name); - continue; - } - - try - { - var fs = new FileStream(req.FileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.Inheritable | FileShare.Read); - - await using (fs.ConfigureAwait(false)) - { - try - { - _ = LinuxReadAheadExternal(fs.SafeFileHandle, 0, _readAheadBytes); - _logger.LogTrace("Prefetched {hash}", req.FileInfo.Name); - } - catch (EntryPointNotFoundException) - { - _hasLinuxReadAhead = false; - } - } - } - catch (IOException) { } - } - catch (OperationCanceledException) - { - continue; - } - catch (Exception e) - { - _logger.LogError(e, "Error during prefetch task"); - } - } - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FileStatisticsService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FileStatisticsService.cs deleted file mode 100644 index 84487e8..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/FileStatisticsService.cs +++ /dev/null @@ -1,94 +0,0 @@ -using MareSynchronosShared.Metrics; -using System.Collections.Concurrent; - -namespace MareSynchronosStaticFilesServer.Services; - -public class FileStatisticsService : IHostedService -{ - private readonly MareMetrics _metrics; - private readonly ILogger _logger; - private CancellationTokenSource _resetCancellationTokenSource; - private ConcurrentDictionary _pastHourFiles = new(StringComparer.Ordinal); - private ConcurrentDictionary _pastDayFiles = new(StringComparer.Ordinal); - - public FileStatisticsService(MareMetrics metrics, ILogger logger) - { - _metrics = metrics; - _logger = logger; - } - - public void LogFile(string fileHash, long length) - { - if (!_pastHourFiles.ContainsKey(fileHash)) - { - _pastHourFiles[fileHash] = length; - _metrics.IncGauge(MetricsAPI.GaugeFilesUniquePastHour); - _metrics.IncGauge(MetricsAPI.GaugeFilesUniquePastHourSize, length); - } - if (!_pastDayFiles.ContainsKey(fileHash)) - { - _pastDayFiles[fileHash] = length; - _metrics.IncGauge(MetricsAPI.GaugeFilesUniquePastDay); - _metrics.IncGauge(MetricsAPI.GaugeFilesUniquePastDaySize, length); - } - } - - public void LogRequest(long requestSize) - { - _metrics.IncCounter(MetricsAPI.CounterFileRequests, 1); - _metrics.IncCounter(MetricsAPI.CounterFileRequestSize, requestSize); - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Starting FileStatisticsService"); - _resetCancellationTokenSource = new(); - _ = ResetHourlyFileData(); - _ = ResetDailyFileData(); - return Task.CompletedTask; - } - - public async Task ResetHourlyFileData() - { - while (!_resetCancellationTokenSource.Token.IsCancellationRequested) - { - _logger.LogInformation("Resetting 1h Data"); - - _pastHourFiles = new(StringComparer.Ordinal); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesUniquePastHour, 0); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesUniquePastHourSize, 0); - - var now = DateTime.UtcNow; - TimeOnly currentTime = new(now.Hour, now.Minute, now.Second); - TimeOnly futureTime = new(now.Hour, 0, 0); - var span = futureTime.AddHours(1) - currentTime; - - await Task.Delay(span, _resetCancellationTokenSource.Token).ConfigureAwait(false); - } - } - - public async Task ResetDailyFileData() - { - while (!_resetCancellationTokenSource.Token.IsCancellationRequested) - { - _logger.LogInformation("Resetting 24h Data"); - - _pastDayFiles = new(StringComparer.Ordinal); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesUniquePastDay, 0); - _metrics.SetGaugeTo(MetricsAPI.GaugeFilesUniquePastDaySize, 0); - - var now = DateTime.UtcNow; - DateTime midnight = new(new DateOnly(now.Date.Year, now.Date.Month, now.Date.Day), new(0, 0, 0)); - var span = midnight.AddDays(1) - now; - - await Task.Delay(span, _resetCancellationTokenSource.Token).ConfigureAwait(false); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _resetCancellationTokenSource.Cancel(); - _logger.LogInformation("Stopping FileStatisticsService"); - return Task.CompletedTask; - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/IClientReadyMessageService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/IClientReadyMessageService.cs deleted file mode 100644 index 932cf51..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/IClientReadyMessageService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MareSynchronosStaticFilesServer.Services; - -public interface IClientReadyMessageService -{ - void SendDownloadReady(string uid, Guid requestId); -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ITouchHashService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ITouchHashService.cs deleted file mode 100644 index 679c19e..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ITouchHashService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MareSynchronosStaticFilesServer.Services; - -public interface ITouchHashService : IHostedService -{ - void TouchColdHash(string hash); -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/MainClientReadyMessageService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/MainClientReadyMessageService.cs deleted file mode 100644 index 17149c9..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/MainClientReadyMessageService.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.AspNetCore.SignalR; -using MareSynchronos.API.SignalR; -using MareSynchronosServer.Hubs; - -namespace MareSynchronosStaticFilesServer.Services; - -public class MainClientReadyMessageService : IClientReadyMessageService -{ - private readonly ILogger _logger; - private readonly IHubContext _mareHub; - - public MainClientReadyMessageService(ILogger logger, IHubContext mareHub) - { - _logger = logger; - _mareHub = mareHub; - } - - public void SendDownloadReady(string uid, Guid requestId) - { - _ = Task.Run(async () => - { - _logger.LogDebug("Sending Client Ready for {uid}:{requestId} to SignalR", uid, requestId); - await _mareHub.Clients.User(uid).SendAsync(nameof(IMareHub.Client_DownloadReady), requestId).ConfigureAwait(false); - }); - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/RequestQueueService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/RequestQueueService.cs deleted file mode 100644 index 7170226..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/RequestQueueService.cs +++ /dev/null @@ -1,222 +0,0 @@ -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Utils; -using System.Collections.Concurrent; -using System.Timers; - -namespace MareSynchronosStaticFilesServer.Services; - -public class RequestQueueService : IHostedService -{ - private readonly IClientReadyMessageService _clientReadyMessageService; - private readonly CachedFileProvider _cachedFileProvider; - private readonly ILogger _logger; - private readonly MareMetrics _metrics; - private readonly ConcurrentQueue _queue = new(); - private readonly ConcurrentQueue _priorityQueue = new(); - private readonly int _queueExpirationSeconds; - private readonly SemaphoreSlim _queueProcessingSemaphore = new(1); - private readonly UserQueueEntry[] _userQueueRequests; - private int _queueLimitForReset; - private readonly int _queueReleaseSeconds; - private System.Timers.Timer _queueTimer; - - public RequestQueueService(MareMetrics metrics, IConfigurationService configurationService, - ILogger logger, IClientReadyMessageService hubContext, CachedFileProvider cachedFileProvider) - { - _userQueueRequests = new UserQueueEntry[configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DownloadQueueSize), 50)]; - _queueExpirationSeconds = configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DownloadTimeoutSeconds), 5); - _queueLimitForReset = configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DownloadQueueClearLimit), 15000); - _queueReleaseSeconds = configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DownloadQueueReleaseSeconds), 15); - _metrics = metrics; - _logger = logger; - _clientReadyMessageService = hubContext; - _cachedFileProvider = cachedFileProvider; - } - - public void ActivateRequest(Guid request) - { - _logger.LogDebug("Activating request {guid}", request); - var req = _userQueueRequests.First(f => f != null && f.UserRequest.RequestId == request); - req.MarkActive(); - } - - public async Task EnqueueUser(UserRequest request, bool isPriority, CancellationToken token) - { - while (_queueProcessingSemaphore.CurrentCount == 0) - { - await Task.Delay(50, token).ConfigureAwait(false); - } - - _logger.LogDebug("Enqueueing req {guid} from {user} for {file}", request.RequestId, request.User, string.Join(", ", request.FileIds)); - - GetQueue(isPriority).Enqueue(request); - } - - public void FinishRequest(Guid request) - { - var req = _userQueueRequests.FirstOrDefault(f => f != null && f.UserRequest.RequestId == request); - if (req != null) - { - var idx = Array.IndexOf(_userQueueRequests, req); - _logger.LogDebug("Finishing Request {guid}, clearing slot {idx}", request, idx); - _userQueueRequests[idx] = null; - } - else - { - _logger.LogDebug("Request {guid} already cleared", request); - } - } - - public bool IsActiveProcessing(Guid request, string user, out UserRequest userRequest) - { - var userQueueRequest = _userQueueRequests.FirstOrDefault(u => u != null && u.UserRequest.RequestId == request && string.Equals(u.UserRequest.User, user, StringComparison.Ordinal)); - userRequest = userQueueRequest?.UserRequest ?? null; - return userQueueRequest != null && userRequest != null && userQueueRequest.ExpirationDate > DateTime.UtcNow; - } - - public void RemoveFromQueue(Guid requestId, string user, bool isPriority) - { - var existingRequest = GetQueue(isPriority).FirstOrDefault(f => f.RequestId == requestId && string.Equals(f.User, user, StringComparison.Ordinal)); - if (existingRequest == null) - { - var activeSlot = _userQueueRequests.FirstOrDefault(r => r != null && string.Equals(r.UserRequest.User, user, StringComparison.Ordinal) && r.UserRequest.RequestId == requestId); - if (activeSlot != null) - { - var idx = Array.IndexOf(_userQueueRequests, activeSlot); - if (idx >= 0) - { - _userQueueRequests[idx] = null; - } - } - } - else - { - existingRequest.IsCancelled = true; - } - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _queueTimer = new System.Timers.Timer(500); - _queueTimer.Elapsed += ProcessQueue; - _queueTimer.AutoReset = true; - _queueTimer.Start(); - return Task.CompletedTask; - } - - private ConcurrentQueue GetQueue(bool isPriority) => isPriority ? _priorityQueue : _queue; - - public bool StillEnqueued(Guid request, string user, bool isPriority) - { - return GetQueue(isPriority).Any(c => c.RequestId == request && string.Equals(c.User, user, StringComparison.Ordinal)); - } - - public Task StopAsync(CancellationToken cancellationToken) - { - _queueTimer.Stop(); - return Task.CompletedTask; - } - - private void DequeueIntoSlot(UserRequest userRequest, int slot) - { - _logger.LogDebug("Dequeueing {req} into {i}: {user} with {file}", userRequest.RequestId, slot, userRequest.User, string.Join(", ", userRequest.FileIds)); - _userQueueRequests[slot] = new(userRequest, DateTime.UtcNow.AddSeconds(_queueExpirationSeconds)); - _clientReadyMessageService.SendDownloadReady(userRequest.User, userRequest.RequestId); - } - - private void ProcessQueue(object src, ElapsedEventArgs e) - { - if (_queueProcessingSemaphore.CurrentCount == 0) return; - - _queueProcessingSemaphore.Wait(); - - try - { - if (_queue.Count(c => !c.IsCancelled) > _queueLimitForReset) - { - _queue.Clear(); - return; - } - - for (int i = 0; i < _userQueueRequests.Length; i++) - { - try - { - if (_userQueueRequests[i] != null - && (((!_userQueueRequests[i].IsActive && _userQueueRequests[i].ExpirationDate < DateTime.UtcNow)) - || (_userQueueRequests[i].IsActive && _userQueueRequests[i].ActivationDate < DateTime.UtcNow.Subtract(TimeSpan.FromSeconds(_queueReleaseSeconds)))) - ) - { - _logger.LogDebug("Expiring request {guid} slot {slot}", _userQueueRequests[i].UserRequest.RequestId, i); - _userQueueRequests[i] = null; - } - - if (_userQueueRequests[i] != null) continue; - - while (true) - { - if (!_priorityQueue.All(u => _cachedFileProvider.AnyFilesDownloading(u.FileIds)) - && _priorityQueue.TryDequeue(out var prioRequest)) - { - if (prioRequest.IsCancelled) - { - continue; - } - - if (_cachedFileProvider.AnyFilesDownloading(prioRequest.FileIds)) - { - _priorityQueue.Enqueue(prioRequest); - continue; - } - - DequeueIntoSlot(prioRequest, i); - break; - } - - if (!_queue.All(u => _cachedFileProvider.AnyFilesDownloading(u.FileIds)) - && _queue.TryDequeue(out var request)) - { - if (request.IsCancelled) - { - continue; - } - - if (_cachedFileProvider.AnyFilesDownloading(request.FileIds)) - { - _queue.Enqueue(request); - continue; - } - - DequeueIntoSlot(request, i); - break; - } - - break; - } - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during inside queue processing"); - } - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error during Queue processing"); - } - finally - { - _queueProcessingSemaphore.Release(); - } - - _metrics.SetGaugeTo(MetricsAPI.GaugeQueueFree, _userQueueRequests.Count(c => c == null)); - _metrics.SetGaugeTo(MetricsAPI.GaugeQueueActive, _userQueueRequests.Count(c => c != null && c.IsActive)); - _metrics.SetGaugeTo(MetricsAPI.GaugeQueueInactive, _userQueueRequests.Count(c => c != null && !c.IsActive)); - _metrics.SetGaugeTo(MetricsAPI.GaugeDownloadQueue, _queue.Count(q => !q.IsCancelled)); - _metrics.SetGaugeTo(MetricsAPI.GaugeDownloadQueueCancelled, _queue.Count(q => q.IsCancelled)); - _metrics.SetGaugeTo(MetricsAPI.GaugeDownloadPriorityQueue, _priorityQueue.Count(q => !q.IsCancelled)); - _metrics.SetGaugeTo(MetricsAPI.GaugeDownloadPriorityQueueCancelled, _priorityQueue.Count(q => q.IsCancelled)); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ShardClientReadyMessageService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ShardClientReadyMessageService.cs deleted file mode 100644 index b8584f2..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ShardClientReadyMessageService.cs +++ /dev/null @@ -1,51 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using System.Net.Http.Headers; - -namespace MareSynchronosStaticFilesServer.Services; - -public class ShardClientReadyMessageService : IClientReadyMessageService -{ - private readonly ILogger _logger; - private readonly ServerTokenGenerator _tokenGenerator; - private readonly IConfigurationService _configurationService; - private readonly HttpClient _httpClient; - - public ShardClientReadyMessageService(ILogger logger, ServerTokenGenerator tokenGenerator, IConfigurationService configurationService) - { - _logger = logger; - _tokenGenerator = tokenGenerator; - _configurationService = configurationService; - _httpClient = new(); - _httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MareSynchronosServer", "1.0.0.0")); - } - - public void SendDownloadReady(string uid, Guid requestId) - { - _ = Task.Run(async () => - { - var mainUrlConfigKey = _configurationService.GetValue(nameof(StaticFilesServerConfiguration.NotifyMainServerDirectly)) - ? nameof(StaticFilesServerConfiguration.MainServerAddress) - : nameof(StaticFilesServerConfiguration.MainFileServerAddress); - var mainUrl = _configurationService.GetValue(mainUrlConfigKey); - var path = MareFiles.MainSendReadyFullPath(mainUrl, uid, requestId); - using HttpRequestMessage msg = new() - { - RequestUri = path - }; - msg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _tokenGenerator.Token); - - _logger.LogDebug("Sending Client Ready for {uid}:{requestId} to {path}", uid, requestId, path); - try - { - using var result = await _httpClient.SendAsync(msg).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failure to send for {uid}:{requestId}", uid, requestId); - } - }); - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ShardTouchMessageService.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ShardTouchMessageService.cs deleted file mode 100644 index 5a02881..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Services/ShardTouchMessageService.cs +++ /dev/null @@ -1,132 +0,0 @@ -using MareSynchronos.API.Routes; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using MareSynchronosShared.Utils.Configuration; -using System.Net.Http.Headers; - -namespace MareSynchronosStaticFilesServer.Services; - -// Notify distribution server of file hashes downloaded via shards, so they are not prematurely purged from its cold cache -public class ShardTouchMessageService : ITouchHashService -{ - private readonly ILogger _logger; - private readonly ServerTokenGenerator _tokenGenerator; - private readonly IConfigurationService _configuration; - private readonly HttpClient _httpClient; - private readonly Uri _remoteCacheSourceUri; - private readonly HashSet _touchHashSet = new(); - private readonly ColdTouchHashService _nestedService = null; - - private CancellationTokenSource _touchmsgCts; - - public ShardTouchMessageService(ILogger logger, ILogger nestedLogger, - ServerTokenGenerator tokenGenerator, IConfigurationService configuration) - { - _logger = logger; - _tokenGenerator = tokenGenerator; - _configuration = configuration; - _remoteCacheSourceUri = _configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DistributionFileServerAddress), null); - _httpClient = new(); - _httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MareSynchronosServer", "1.0.0.0")); - - if (configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseColdStorage), false)) - { - _nestedService = new ColdTouchHashService(nestedLogger, configuration); - } - } - - public Task StartAsync(CancellationToken cancellationToken) - { - if (_remoteCacheSourceUri == null) - return Task.CompletedTask; - - _logger.LogInformation("Touch Message Service started"); - - _touchmsgCts = new(); - - _ = TouchMessageTask(_touchmsgCts.Token); - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - if (_remoteCacheSourceUri == null) - return Task.CompletedTask; - - _touchmsgCts.Cancel(); - - return Task.CompletedTask; - } - - private async Task SendTouches(IEnumerable hashes) - { - var mainUrl = _remoteCacheSourceUri; - var path = new Uri(mainUrl, MareFiles.Distribution + "/touch"); - using HttpRequestMessage msg = new() - { - RequestUri = path - }; - msg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _tokenGenerator.Token); - msg.Method = HttpMethod.Post; - msg.Content = JsonContent.Create(hashes); - if (_configuration.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DistributionFileServerForceHTTP2), false)) - { - msg.Version = new Version(2, 0); - msg.VersionPolicy = HttpVersionPolicy.RequestVersionExact; - } - - _logger.LogDebug("Sending remote touch to {path}", path); - try - { - using var result = await _httpClient.SendAsync(msg).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failure to send touches for {hashChunk}", hashes); - } - } - - private async Task TouchMessageTask(CancellationToken ct) - { - List hashes; - - while (!ct.IsCancellationRequested) - { - try - { - lock (_touchHashSet) - { - hashes = _touchHashSet.ToList(); - _touchHashSet.Clear(); - } - if (hashes.Count > 0) - await SendTouches(hashes).ConfigureAwait(false); - await Task.Delay(TimeSpan.FromSeconds(60), ct).ConfigureAwait(false); - } - catch (Exception e) - { - _logger.LogError(e, "Error during touch message task"); - } - } - - lock (_touchHashSet) - { - hashes = _touchHashSet.ToList(); - _touchHashSet.Clear(); - } - if (hashes.Count > 0) - await SendTouches(hashes).ConfigureAwait(false); - } - - public void TouchColdHash(string hash) - { - if (_nestedService != null) - _nestedService.TouchColdHash(hash); - - lock (_touchHashSet) - { - _touchHashSet.Add(hash); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs deleted file mode 100644 index 9c01a36..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs +++ /dev/null @@ -1,271 +0,0 @@ -using MareSynchronosShared.Data; -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils; -using MareSynchronosStaticFilesServer.Controllers; -using MareSynchronosStaticFilesServer.Services; -using MareSynchronosStaticFilesServer.Utils; -using MessagePack; -using MessagePack.Resolvers; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Server.Kestrel.Core; -using Microsoft.AspNetCore.SignalR; -using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; -using Prometheus; -using StackExchange.Redis.Extensions.Core.Configuration; -using StackExchange.Redis.Extensions.System.Text.Json; -using StackExchange.Redis; -using System.Net; -using System.Text; -using MareSynchronosShared.Utils.Configuration; - -namespace MareSynchronosStaticFilesServer; - -public class Startup -{ - private bool _isMain; - private bool _isDistributionNode; - private bool _hasDistributionUpstream; - private readonly ILogger _logger; - - public Startup(IConfiguration configuration, ILogger logger) - { - Configuration = configuration; - _logger = logger; - var mareSettings = Configuration.GetRequiredSection("MareSynchronos"); - _isDistributionNode = mareSettings.GetValue(nameof(StaticFilesServerConfiguration.IsDistributionNode), false); - _hasDistributionUpstream = !string.IsNullOrEmpty(mareSettings.GetValue(nameof(StaticFilesServerConfiguration.DistributionFileServerAddress), string.Empty)); - _isMain = string.IsNullOrEmpty(mareSettings.GetValue(nameof(StaticFilesServerConfiguration.MainFileServerAddress), string.Empty)) && _isDistributionNode; - } - - public IConfiguration Configuration { get; } - - public void ConfigureServices(IServiceCollection services) - { - services.AddHttpContextAccessor(); - - services.AddLogging(); - - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - services.Configure(Configuration.GetRequiredSection("MareSynchronos")); - services.Configure(Configuration.GetSection("Kestrel")); - services.AddSingleton(Configuration); - - var mareConfig = Configuration.GetRequiredSection("MareSynchronos"); - - // metrics configuration - services.AddSingleton(m => new MareMetrics(m.GetService>(), new List - { - MetricsAPI.CounterFileRequests, - MetricsAPI.CounterFileRequestSize - }, new List - { - MetricsAPI.GaugeFilesTotalColdStorage, - MetricsAPI.GaugeFilesTotalSizeColdStorage, - MetricsAPI.GaugeFilesTotalSize, - MetricsAPI.GaugeFilesTotal, - MetricsAPI.GaugeFilesUniquePastDay, - MetricsAPI.GaugeFilesUniquePastDaySize, - MetricsAPI.GaugeFilesUniquePastHour, - MetricsAPI.GaugeFilesUniquePastHourSize, - MetricsAPI.GaugeCurrentDownloads, - MetricsAPI.GaugeDownloadQueue, - MetricsAPI.GaugeDownloadQueueCancelled, - MetricsAPI.GaugeDownloadPriorityQueue, - MetricsAPI.GaugeDownloadPriorityQueueCancelled, - MetricsAPI.GaugeQueueFree, - MetricsAPI.GaugeQueueInactive, - MetricsAPI.GaugeQueueActive, - MetricsAPI.GaugeFilesDownloadingFromCache, - MetricsAPI.GaugeFilesTasksWaitingForDownloadFromCache - })); - - // generic services - services.AddSingleton(); - services.AddHostedService(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddHostedService(p => p.GetService()); - services.AddSingleton(); - services.AddHostedService(p => p.GetService()); - services.AddHostedService(m => m.GetService()); - services.AddSingleton, MareConfigurationServiceClient>(); - services.AddHostedService(p => (MareConfigurationServiceClient)p.GetService>()); - - // specific services - if (_isMain) - { - services.AddSingleton(); - services.AddSingleton, MareConfigurationServiceServer>(); - services.AddDbContextPool(options => - { - options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => - { - builder.MigrationsHistoryTable("_efmigrationshistory", "public"); - }).UseSnakeCaseNamingConvention(); - options.EnableThreadSafetyChecks(false); - }, mareConfig.GetValue(nameof(MareConfigurationBase.DbContextPoolSize), 1024)); - - var signalRServiceBuilder = services.AddSignalR(hubOptions => - { - hubOptions.MaximumReceiveMessageSize = long.MaxValue; - hubOptions.EnableDetailedErrors = true; - hubOptions.MaximumParallelInvocationsPerClient = 10; - hubOptions.StreamBufferCapacity = 200; - }).AddMessagePackProtocol(opt => - { - var resolver = CompositeResolver.Create(StandardResolverAllowPrivate.Instance, - BuiltinResolver.Instance, - AttributeFormatterResolver.Instance, - // replace enum resolver - DynamicEnumAsStringResolver.Instance, - DynamicGenericResolver.Instance, - DynamicUnionResolver.Instance, - DynamicObjectResolver.Instance, - PrimitiveObjectResolver.Instance, - // final fallback(last priority) - StandardResolver.Instance); - - opt.SerializerOptions = MessagePackSerializerOptions.Standard - .WithCompression(MessagePackCompression.Lz4Block) - .WithResolver(resolver); - }); - - // configure redis for SignalR - var redisConnection = mareConfig.GetValue(nameof(ServerConfiguration.RedisConnectionString), string.Empty); - signalRServiceBuilder.AddStackExchangeRedis(redisConnection, options => { }); - - var options = ConfigurationOptions.Parse(redisConnection); - - var endpoint = options.EndPoints[0]; - string address = ""; - int port = 0; - if (endpoint is DnsEndPoint dnsEndPoint) { address = dnsEndPoint.Host; port = dnsEndPoint.Port; } - if (endpoint is IPEndPoint ipEndPoint) { address = ipEndPoint.Address.ToString(); port = ipEndPoint.Port; } - var redisConfiguration = new RedisConfiguration() - { - AbortOnConnectFail = true, - KeyPrefix = "", - Hosts = new RedisHost[] - { - new RedisHost(){ Host = address, Port = port }, - }, - AllowAdmin = true, - ConnectTimeout = options.ConnectTimeout, - Database = 0, - Ssl = false, - Password = options.Password, - ServerEnumerationStrategy = new ServerEnumerationStrategy() - { - Mode = ServerEnumerationStrategy.ModeOptions.All, - TargetRole = ServerEnumerationStrategy.TargetRoleOptions.Any, - UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.Throw, - }, - MaxValueLength = 1024, - PoolSize = mareConfig.GetValue(nameof(ServerConfiguration.RedisPool), 50), - SyncTimeout = options.SyncTimeout, - }; - - services.AddStackExchangeRedisExtensions(redisConfiguration); - } - else - { - services.AddSingleton(); - services.AddSingleton, MareConfigurationServiceClient>(); - services.AddHostedService(p => (MareConfigurationServiceClient)p.GetService>()); - } - - if (!_hasDistributionUpstream) - { - services.AddSingleton(); - services.AddHostedService(p => p.GetService()); - } - else - { - services.AddSingleton(); - services.AddHostedService(p => p.GetService()); - } - - // controller setup - services.AddControllers().ConfigureApplicationPartManager(a => - { - a.FeatureProviders.Remove(a.FeatureProviders.OfType().First()); - if (_isMain) - { - a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(MareStaticFilesServerConfigurationController), - typeof(CacheController), typeof(RequestController), typeof(ServerFilesController), - typeof(DistributionController), typeof(MainController))); - } - else if (_isDistributionNode) - { - a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(CacheController), typeof(RequestController), typeof(DistributionController))); - } - else - { - a.FeatureProviders.Add(new AllowedControllersFeatureProvider(typeof(CacheController), typeof(RequestController))); - } - }); - - // authentication and authorization - services.AddOptions(JwtBearerDefaults.AuthenticationScheme) - .Configure>((o, s) => - { - o.TokenValidationParameters = new() - { - ValidateIssuer = false, - ValidateLifetime = false, - ValidateAudience = false, - ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(s.GetValue(nameof(MareConfigurationBase.Jwt)))) - }; - }); - services.AddAuthentication(o => - { - o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddJwtBearer(); - services.AddAuthorization(options => - { - options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); - options.AddPolicy("Internal", new AuthorizationPolicyBuilder().RequireClaim(MareClaimTypes.Internal, "true").Build()); - }); - services.AddSingleton(); - - services.AddHealthChecks(); - services.AddHttpLogging(e => e = new Microsoft.AspNetCore.HttpLogging.HttpLoggingOptions()); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.UseHttpLogging(); - - app.UseRouting(); - - var config = app.ApplicationServices.GetRequiredService>(); - - var metricServer = new KestrelMetricServer(config.GetValueOrDefault(nameof(MareConfigurationBase.MetricsPort), 4981)); - metricServer.Start(); - - app.UseHttpMetrics(); - - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseEndpoints(e => - { - if (_isMain) - { - e.MapHub("/dummyhub"); - } - - e.MapControllers(); - e.MapHealthChecks("/health").WithMetadata(new AllowAnonymousAttribute()); - }); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/CountedStream.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/CountedStream.cs deleted file mode 100644 index d5412c5..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/CountedStream.cs +++ /dev/null @@ -1,73 +0,0 @@ - -namespace MareSynchronosStaticFilesServer.Utils; - -// Counts the number of bytes read/written to an underlying stream -public class CountedStream : Stream -{ - private readonly Stream _stream; - public long BytesRead { get; private set; } - public long BytesWritten { get; private set; } - public bool DisposeUnderlying = true; - - public Stream UnderlyingStream { get => _stream; } - - public CountedStream(Stream underlyingStream) - { - _stream = underlyingStream; - } - - protected override void Dispose(bool disposing) - { - if (!DisposeUnderlying) - return; - _stream.Dispose(); - } - - public override bool CanRead => _stream.CanRead; - public override bool CanSeek => _stream.CanSeek; - public override bool CanWrite => _stream.CanWrite; - public override long Length => _stream.Length; - - public override long Position { get => _stream.Position; set => _stream.Position = value; } - - public override void Flush() - { - _stream.Flush(); - } - - public override int Read(byte[] buffer, int offset, int count) - { - int n = _stream.Read(buffer, offset, count); - BytesRead += n; - return n; - } - - public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) - { - int n = await _stream.ReadAsync(buffer, offset, count, cancellationToken); - BytesRead += n; - return n; - } - - public override long Seek(long offset, SeekOrigin origin) - { - return _stream.Seek(offset, origin); - } - - public override void SetLength(long value) - { - _stream.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - _stream.Write(buffer, offset, count); - BytesWritten += count; - } - - public async override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) - { - await _stream.WriteAsync(buffer, offset, count, cancellationToken); - BytesWritten += count; - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/FilePathUtil.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/FilePathUtil.cs deleted file mode 100644 index cd0d04d..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/FilePathUtil.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace MareSynchronosStaticFilesServer.Utils; - -public static partial class FilePathUtil -{ - public static FileInfo GetFileInfoForHash(string basePath, string hash) - { - if (hash.Length != 40 || !hash.All(char.IsAsciiLetterOrDigit)) throw new InvalidOperationException(); - - FileInfo fi = new(Path.Join(basePath, hash[0].ToString(), hash)); - if (!fi.Exists) - { - fi = new FileInfo(Path.Join(basePath, hash)); - if (!fi.Exists) - { - return null; - } - } - - return fi; - } - - public static string GetFilePath(string basePath, string hash) - { - if (hash.Length != 40 || !hash.All(char.IsAsciiLetterOrDigit)) throw new InvalidOperationException(); - - var dirPath = Path.Join(basePath, hash[0].ToString()); - var path = Path.Join(dirPath, hash); - if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath); - return path; - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/HashingStream.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/HashingStream.cs deleted file mode 100644 index 4fdcf5d..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/HashingStream.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System.Security.Cryptography; - -namespace MareSynchronosStaticFilesServer.Utils; - -// Calculates the hash of content read or written to a stream -public class HashingStream : Stream -{ - private readonly Stream _stream; - private readonly HashAlgorithm _hashAlgo; - private bool _finished = false; - public bool DisposeUnderlying = true; - - public Stream UnderlyingStream { get => _stream; } - - public HashingStream(Stream underlyingStream, HashAlgorithm hashAlgo) - { - _stream = underlyingStream; - _hashAlgo = hashAlgo; - } - - protected override void Dispose(bool disposing) - { - if (!DisposeUnderlying) - return; - if (!_finished) - _stream.Dispose(); - _hashAlgo.Dispose(); - } - - public override bool CanRead => _stream.CanRead; - public override bool CanSeek => false; - public override bool CanWrite => _stream.CanWrite; - public override long Length => _stream.Length; - - public override long Position { get => _stream.Position; set => throw new NotSupportedException(); } - - public override void Flush() - { - _stream.Flush(); - } - - public override int Read(byte[] buffer, int offset, int count) - { - if (_finished) - throw new ObjectDisposedException("HashingStream"); - int n = _stream.Read(buffer, offset, count); - if (n > 0) - _hashAlgo.TransformBlock(buffer, offset, n, buffer, offset); - return n; - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException(); - } - - public override void SetLength(long value) - { - if (_finished) - throw new ObjectDisposedException("HashingStream"); - _stream.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - if (_finished) - throw new ObjectDisposedException("HashingStream"); - _stream.Write(buffer, offset, count); - string x = new(System.Text.Encoding.ASCII.GetChars(buffer.AsSpan().Slice(offset, count).ToArray())); - _hashAlgo.TransformBlock(buffer, offset, count, buffer, offset); - } - - public byte[] Finish() - { - if (_finished) - return _hashAlgo.Hash; - _hashAlgo.TransformFinalBlock(Array.Empty(), 0, 0); - if (DisposeUnderlying) - _stream.Dispose(); - return _hashAlgo.Hash; - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs deleted file mode 100644 index 303e287..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs +++ /dev/null @@ -1,76 +0,0 @@ -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Services; -using Microsoft.AspNetCore.Mvc; -using System.Globalization; -using System.Text; - -namespace MareSynchronosStaticFilesServer.Utils; - -public class RequestBlockFileListResult : IActionResult -{ - private readonly Guid _requestId; - private readonly RequestQueueService _requestQueueService; - private readonly MareMetrics _mareMetrics; - private readonly IEnumerable _fileList; - private readonly IConfigurationService _configurationService; - - public RequestBlockFileListResult(Guid requestId, RequestQueueService requestQueueService, MareMetrics mareMetrics, IEnumerable fileList, - IConfigurationService configurationService) - { - _requestId = requestId; - _requestQueueService = requestQueueService; - _mareMetrics = mareMetrics; - _mareMetrics.IncGauge(MetricsAPI.GaugeCurrentDownloads); - _fileList = fileList; - _configurationService = configurationService; - } - - public async Task ExecuteResultAsync(ActionContext context) - { - try - { - ArgumentNullException.ThrowIfNull(context); - - var useSSI = _configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseSSI), false); - - context.HttpContext.Response.StatusCode = 200; - - if (useSSI) - context.HttpContext.Response.ContentType = _configurationService.GetValue(nameof(StaticFilesServerConfiguration.SSIContentType)); - else - context.HttpContext.Response.ContentType = "application/octet-stream"; - - string ssiFilePrefix = null; - - if (useSSI) - ssiFilePrefix = _configurationService.GetValue(nameof(StaticFilesServerConfiguration.XAccelRedirectPrefix)); - - foreach (var file in _fileList) - { - if (useSSI) - { - var internalName = Path.Combine(ssiFilePrefix, file.Name); - await context.HttpContext.Response.WriteAsync( - "#" + file.Name + ":" + file.Length.ToString(CultureInfo.InvariantCulture) + "#" - + "", Encoding.ASCII); - } - else - { - await context.HttpContext.Response.WriteAsync("#" + file.Name + ":" + file.Length.ToString(CultureInfo.InvariantCulture) + "#", Encoding.ASCII); - await context.HttpContext.Response.SendFileAsync(file.FullName); - } - } - } - catch - { - throw; - } - finally - { - _requestQueueService.FinishRequest(_requestId); - _mareMetrics.DecGauge(MetricsAPI.GaugeCurrentDownloads); - } - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs deleted file mode 100644 index b9103a6..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs +++ /dev/null @@ -1,25 +0,0 @@ -using MareSynchronosShared.Metrics; -using MareSynchronosShared.Services; -using MareSynchronosShared.Utils.Configuration; -using MareSynchronosStaticFilesServer.Services; - -namespace MareSynchronosStaticFilesServer.Utils; - -public class RequestBlockFileListResultFactory -{ - private readonly MareMetrics _metrics; - private readonly RequestQueueService _requestQueueService; - private readonly IConfigurationService _configurationService; - - public RequestBlockFileListResultFactory(MareMetrics metrics, RequestQueueService requestQueueService, IConfigurationService configurationService) - { - _metrics = metrics; - _requestQueueService = requestQueueService; - _configurationService = configurationService; - } - - public RequestBlockFileListResult Create(Guid requestId, IEnumerable fileList) - { - return new RequestBlockFileListResult(requestId, _requestQueueService, _metrics, fileList, _configurationService); - } -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/TeeStream.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/TeeStream.cs deleted file mode 100644 index aed9355..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/TeeStream.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace MareSynchronosStaticFilesServer.Utils; - -// Writes data read from one stream out to a second stream -public class TeeStream : Stream -{ - private readonly Stream _inStream; - private readonly Stream _outStream; - public bool DisposeUnderlying = true; - - public Stream InStream { get => _inStream; } - public Stream OutStream { get => _outStream; } - - public TeeStream(Stream inStream, Stream outStream) - { - _inStream = inStream; - _outStream = outStream; - } - - protected override void Dispose(bool disposing) - { - if (!DisposeUnderlying) - return; - _inStream.Dispose(); - _outStream.Dispose(); - } - - public override bool CanRead => _inStream.CanRead; - public override bool CanSeek => _inStream.CanSeek; - public override bool CanWrite => false; - public override long Length => _inStream.Length; - - public override long Position - { - get => _inStream.Position; - set => _inStream.Position = value; - } - - public override void Flush() - { - _inStream.Flush(); - _outStream.Flush(); - } - - public override int Read(byte[] buffer, int offset, int count) - { - int n = _inStream.Read(buffer, offset, count); - if (n > 0) - _outStream.Write(buffer, offset, n); - return n; - } - - public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) - { - int n = await _inStream.ReadAsync(buffer, offset, count, cancellationToken); - if (n > 0) - await _outStream.WriteAsync(buffer, offset, n); - return n; - } - - public override long Seek(long offset, SeekOrigin origin) - { - return _inStream.Seek(offset, origin); - } - - public override void SetLength(long value) - { - _inStream.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException(); - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/UserQueueEntry.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/UserQueueEntry.cs deleted file mode 100644 index 5646eca..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/UserQueueEntry.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MareSynchronosStaticFilesServer.Utils; - -public class UserQueueEntry -{ - public UserQueueEntry(UserRequest userRequest, DateTime expirationDate) - { - UserRequest = userRequest; - ExpirationDate = expirationDate; - } - - public void MarkActive() - { - IsActive = true; - ActivationDate = DateTime.UtcNow; - } - - public UserRequest UserRequest { get; } - public DateTime ExpirationDate { get; } - public bool IsActive { get; private set; } = false; - public DateTime ActivationDate { get; private set; } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/UserRequest.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/UserRequest.cs deleted file mode 100644 index f64def1..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/UserRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MareSynchronosStaticFilesServer.Utils; - -public record UserRequest(Guid RequestId, string User, List FileIds) -{ - public bool IsCancelled { get; set; } = false; -} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/appsettings.Development.json b/MareSynchronosServer/MareSynchronosStaticFilesServer/appsettings.Development.json deleted file mode 100644 index 770d3e9..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DetailedErrors": true, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/appsettings.json b/MareSynchronosServer/MareSynchronosStaticFilesServer/appsettings.json deleted file mode 100644 index 0cade29..0000000 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/appsettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Port=5432;Database=mare;Username=postgres" - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "Kestrel": { - "Endpoints": { - "Http": { - "Url": "http://+:5001" - }, - "Gprc": { - "Protocols": "Http2", - "Url": "http://+:5003" - } - } - }, - "MareSynchronos": { - "ForcedDeletionOfFilesAfterHours": -1, - "CacheSizeHardLimitInGiB": -1, - "UnusedFileRetentionPeriodInDays": 7, - "CacheDirectory": "G:\\ServerTest", - "ServiceAddress": "http://localhost:5002", - "RemoteCacheSourceUri": "" - }, - "AllowedHosts": "*" -}