Allow user saves storage path and max size to be configurable in settings
parent
4476fbed5f
commit
4d7d0df9c0
|
@ -18,12 +18,14 @@ namespace LANCommander.Controllers.Api
|
||||||
private readonly GameSaveService GameSaveService;
|
private readonly GameSaveService GameSaveService;
|
||||||
private readonly GameService GameService;
|
private readonly GameService GameService;
|
||||||
private readonly UserManager<User> UserManager;
|
private readonly UserManager<User> UserManager;
|
||||||
|
private readonly LANCommanderSettings Settings;
|
||||||
|
|
||||||
public GameSavesController(GameSaveService gameSaveService, GameService gameService, UserManager<User> userManager)
|
public GameSavesController(GameSaveService gameSaveService, GameService gameService, UserManager<User> userManager)
|
||||||
{
|
{
|
||||||
GameSaveService = gameSaveService;
|
GameSaveService = gameSaveService;
|
||||||
GameService = gameService;
|
GameService = gameService;
|
||||||
UserManager = userManager;
|
UserManager = userManager;
|
||||||
|
Settings = SettingService.GetSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id}")]
|
[HttpGet("{id}")]
|
||||||
|
@ -65,7 +67,7 @@ namespace LANCommander.Controllers.Api
|
||||||
public async Task<IActionResult> Upload(Guid id, [FromForm] SaveUpload save)
|
public async Task<IActionResult> Upload(Guid id, [FromForm] SaveUpload save)
|
||||||
{
|
{
|
||||||
// Arbitrary file size limit of 25MB
|
// Arbitrary file size limit of 25MB
|
||||||
if (save.File.Length > (ByteSizeLib.ByteSize.BytesInMebiByte * 25))
|
if (save.File.Length > (ByteSizeLib.ByteSize.BytesInMebiByte * Settings.UserSaves.MaxSize))
|
||||||
return BadRequest("Save file archive is too large");
|
return BadRequest("Save file archive is too large");
|
||||||
|
|
||||||
var game = await GameService.Get(id);
|
var game = await GameService.Get(id);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using LANCommander.Services;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace LANCommander.Data.Models
|
namespace LANCommander.Data.Models
|
||||||
|
@ -19,7 +20,9 @@ namespace LANCommander.Data.Models
|
||||||
|
|
||||||
public string GetUploadPath()
|
public string GetUploadPath()
|
||||||
{
|
{
|
||||||
return Path.Combine("Saves", UserId.ToString(), GameId.ToString(), Id.ToString());
|
var settings = SettingService.GetSettings();
|
||||||
|
|
||||||
|
return Path.Combine(settings.UserSaves.StoragePath, UserId.ToString(), GameId.ToString(), Id.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using Microsoft.AspNetCore.Identity;
|
using LANCommander.Services;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
@ -53,7 +54,9 @@ namespace LANCommander.Data.Models
|
||||||
|
|
||||||
public string GetGameSaveUploadPath()
|
public string GetGameSaveUploadPath()
|
||||||
{
|
{
|
||||||
return Path.Combine("Saves", Id.ToString());
|
var settings = SettingService.GetSettings();
|
||||||
|
|
||||||
|
return Path.Combine(settings.UserSaves.StoragePath, Id.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
public LANCommanderTheme Theme { get; set; } = LANCommanderTheme.Light;
|
public LANCommanderTheme Theme { get; set; } = LANCommanderTheme.Light;
|
||||||
|
|
||||||
public LANCommanderAuthenticationSettings Authentication { get; set; } = new LANCommanderAuthenticationSettings();
|
public LANCommanderAuthenticationSettings Authentication { get; set; } = new LANCommanderAuthenticationSettings();
|
||||||
|
public LANCommanderUserSaveSettings UserSaves { get; set; } = new LANCommanderUserSaveSettings();
|
||||||
public LANCommanderArchiveSettings Archives { get; set; } = new LANCommanderArchiveSettings();
|
public LANCommanderArchiveSettings Archives { get; set; } = new LANCommanderArchiveSettings();
|
||||||
public LANCommanderIPXRelaySettings IPXRelay { get; set; } = new LANCommanderIPXRelaySettings();
|
public LANCommanderIPXRelaySettings IPXRelay { get; set; } = new LANCommanderIPXRelaySettings();
|
||||||
}
|
}
|
||||||
|
@ -32,6 +33,12 @@
|
||||||
public int PasswordRequiredLength { get; set; } = 8;
|
public int PasswordRequiredLength { get; set; } = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class LANCommanderUserSaveSettings
|
||||||
|
{
|
||||||
|
public string StoragePath { get; set; } = "Saves";
|
||||||
|
public int MaxSize { get; set; } = 25;
|
||||||
|
}
|
||||||
|
|
||||||
public class LANCommanderArchiveSettings
|
public class LANCommanderArchiveSettings
|
||||||
{
|
{
|
||||||
public bool EnablePatching { get; set; } = false;
|
public bool EnablePatching { get; set; } = false;
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
var totalStorageSize = drives.Where(d => d.IsReady && d.Name == root).Sum(d => d.TotalSize);
|
var totalStorageSize = drives.Where(d => d.IsReady && d.Name == root).Sum(d => d.TotalSize);
|
||||||
var totalAvailableFreeSpace = drives.Where(d => d.IsReady && d.Name == root).Sum(d => d.AvailableFreeSpace);
|
var totalAvailableFreeSpace = drives.Where(d => d.IsReady && d.Name == root).Sum(d => d.AvailableFreeSpace);
|
||||||
var totalUploadDirectorySize = new DirectoryInfo(settings.Archives.StoragePath).EnumerateFiles().Sum(f => f.Length);
|
var totalUploadDirectorySize = new DirectoryInfo(settings.Archives.StoragePath).EnumerateFiles().Sum(f => f.Length);
|
||||||
var totalSaveDirectorySize = new DirectoryInfo("Saves").EnumerateFiles().Sum(f => f.Length);
|
var totalSaveDirectorySize = new DirectoryInfo(settings.UserSaves.StoragePath).EnumerateFiles().Sum(f => f.Length);
|
||||||
|
|
||||||
Data = new object[]
|
Data = new object[]
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
<MenuItem RouterLink="/Settings/General">General</MenuItem>
|
<MenuItem RouterLink="/Settings/General">General</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Users">Users</MenuItem>
|
<MenuItem RouterLink="/Settings/Users">Users</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Authentication">Authentication</MenuItem>
|
<MenuItem RouterLink="/Settings/Authentication">Authentication</MenuItem>
|
||||||
|
<MenuItem RouterLink="/Settings/Archives">User Saves</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Archives">Archives</MenuItem>
|
<MenuItem RouterLink="/Settings/Archives">Archives</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/IPXRelay">IPX Relay</MenuItem>
|
<MenuItem RouterLink="/Settings/IPXRelay">IPX Relay</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Tools" RouterMatch="@NavLinkMatch.Prefix">Tools</MenuItem>
|
<MenuItem RouterLink="/Settings/Tools" RouterMatch="@NavLinkMatch.Prefix">Tools</MenuItem>
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
@page "/Settings/UserSaves"
|
||||||
|
@using LANCommander.Components.FileManagerComponents;
|
||||||
|
@using LANCommander.Models;
|
||||||
|
@layout SettingsLayout
|
||||||
|
@inject SettingService SettingService
|
||||||
|
@inject IMessageService MessageService
|
||||||
|
@attribute [Authorize(Roles = "Administrator")]
|
||||||
|
|
||||||
|
<PageHeader Title="User Saves" />
|
||||||
|
|
||||||
|
<div style="padding: 0 24px;">
|
||||||
|
<Form Model="Settings" Layout="@FormLayout.Vertical">
|
||||||
|
<FormItem Label="Storage Path">
|
||||||
|
<FilePicker Root="@RootPath" EntrySelectable="x => x is FileManagerDirectory" @bind-Value="@context.UserSaves.StoragePath" OkText="Select Path" Title="Choose Path" OnSelected="OnPathSelected" />
|
||||||
|
</FormItem>
|
||||||
|
|
||||||
|
<FormItem Label="Max Size (MB)">
|
||||||
|
<AntDesign.InputNumber @bind-Value="context.UserSaves.MaxSize" Min="1" DefaultValue="25" />
|
||||||
|
</FormItem>
|
||||||
|
|
||||||
|
<FormItem>
|
||||||
|
<Button OnClick="Save" Type="@ButtonType.Primary">Save</Button>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
LANCommanderSettings Settings;
|
||||||
|
|
||||||
|
string RootPath = Path.GetPathRoot(Directory.GetCurrentDirectory());
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
Settings = SettingService.GetSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Save()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SettingService.SaveSettings(Settings);
|
||||||
|
MessageService.Success("Settings saved!");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
MessageService.Error("An unknown error occurred.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPathSelected(string path)
|
||||||
|
{
|
||||||
|
var appPath = Directory.GetCurrentDirectory();
|
||||||
|
|
||||||
|
if (path != null && path.StartsWith(appPath))
|
||||||
|
path = path.Substring(appPath.Length).TrimStart(Path.DirectorySeparatorChar).TrimEnd(Path.DirectorySeparatorChar);
|
||||||
|
|
||||||
|
Settings.UserSaves.StoragePath = path;
|
||||||
|
}
|
||||||
|
}
|
|
@ -190,8 +190,8 @@ if (!Directory.Exists(settings.Archives.StoragePath))
|
||||||
if (!Directory.Exists("Icon"))
|
if (!Directory.Exists("Icon"))
|
||||||
Directory.CreateDirectory("Icon");
|
Directory.CreateDirectory("Icon");
|
||||||
|
|
||||||
if (!Directory.Exists("Saves"))
|
if (!Directory.Exists(settings.UserSaves.StoragePath))
|
||||||
Directory.CreateDirectory("Saves");
|
Directory.CreateDirectory(settings.UserSaves.StoragePath);
|
||||||
|
|
||||||
if (!Directory.Exists("Snippets"))
|
if (!Directory.Exists("Snippets"))
|
||||||
Directory.CreateDirectory("Snippets");
|
Directory.CreateDirectory("Snippets");
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
using LANCommander.Data;
|
using LANCommander.Data;
|
||||||
using LANCommander.Data.Models;
|
using LANCommander.Data.Models;
|
||||||
using LANCommander.Helpers;
|
using LANCommander.Helpers;
|
||||||
|
using LANCommander.Models;
|
||||||
|
|
||||||
namespace LANCommander.Services
|
namespace LANCommander.Services
|
||||||
{
|
{
|
||||||
public class GameSaveService : BaseDatabaseService<GameSave>
|
public class GameSaveService : BaseDatabaseService<GameSave>
|
||||||
{
|
{
|
||||||
private readonly SettingService SettingService;
|
private readonly LANCommanderSettings Settings;
|
||||||
|
|
||||||
public GameSaveService(DatabaseContext dbContext, IHttpContextAccessor httpContextAccessor, SettingService settingService) : base(dbContext, httpContextAccessor)
|
public GameSaveService(DatabaseContext dbContext, IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
{
|
{
|
||||||
SettingService = settingService;
|
Settings = SettingService.GetSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task Delete(GameSave entity)
|
public override Task Delete(GameSave entity)
|
||||||
|
@ -36,14 +37,14 @@ namespace LANCommander.Services
|
||||||
var save = Get(gs => gs.Id == id).FirstOrDefault();
|
var save = Get(gs => gs.Id == id).FirstOrDefault();
|
||||||
|
|
||||||
if (save == null)
|
if (save == null)
|
||||||
return null;;
|
return null;
|
||||||
|
|
||||||
return GetSavePath(save);
|
return GetSavePath(save);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetSavePath(GameSave save)
|
public string GetSavePath(GameSave save)
|
||||||
{
|
{
|
||||||
return Path.Combine("Save", save.UserId.ToString(), $"{save.Id}.zip");
|
return Path.Combine(Settings.UserSaves.StoragePath, save.UserId.ToString(), $"{save.Id}.zip");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue