From 809946685a5ff85ca7dd1b16ad2ecaa4f2aef76c Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Sun, 16 Aug 2020 19:00:49 -0400 Subject: [PATCH] resolved #604 - added support for renaming files and moving to a different folder. Also added support for renaming folders and moving to a different parent folder. --- .../Modules/Admin/Files/Details.razor | 111 ++++++++++++++++++ Oqtane.Client/Modules/Admin/Files/Edit.razor | 26 +++- Oqtane.Client/Modules/Admin/Files/Index.razor | 2 + Oqtane.Server/Controllers/FileController.cs | 14 ++- Oqtane.Server/Controllers/FolderController.cs | 21 +++- Oqtane.Server/Repository/FileRepository.cs | 16 ++- Oqtane.Server/Repository/FolderRepository.cs | 15 ++- .../Repository/Interfaces/IFileRepository.cs | 1 + .../Interfaces/IFolderRepository.cs | 1 + 9 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 Oqtane.Client/Modules/Admin/Files/Details.razor diff --git a/Oqtane.Client/Modules/Admin/Files/Details.razor b/Oqtane.Client/Modules/Admin/Files/Details.razor new file mode 100644 index 00000000..6b4b14aa --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Files/Details.razor @@ -0,0 +1,111 @@ +@namespace Oqtane.Modules.Admin.Files +@inherits ModuleBase +@inject IFileService FileService +@inject IFolderService FolderService +@inject NavigationManager NavigationManager + +@if (_folders != null) +{ + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + Cancel +
+
+ +} + +@code { + private int _fileId = -1; + private string _name; + private List _folders; + private int _folderId = -1; + private int _size; + private string _createdBy; + private DateTime _createdOn; + private string _modifiedBy; + private DateTime _modifiedOn; + + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + + public override string Title => "File Management"; + + protected override async Task OnInitializedAsync() + { + try + { + _folders = await FolderService.GetFoldersAsync(PageState.Site.SiteId); + _fileId = Int32.Parse(PageState.QueryString["id"]); + File file = await FileService.GetFileAsync(_fileId); + if (file != null) + { + _name = file.Name; + _folderId = file.FolderId; + _size = file.Size; + _createdBy = file.CreatedBy; + _createdOn = file.CreatedOn; + _modifiedBy = file.ModifiedBy; + _modifiedOn = file.ModifiedOn; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading File {FileId} {Error}", _fileId, ex.Message); + AddModuleMessage("Error Loading File", MessageType.Error); + } + } + + private async Task SaveFile() + { + try + { + if (_name.IsPathOrFileValid()) + { + File file = await FileService.GetFileAsync(_fileId); + file.Name = _name; + file.FolderId = _folderId; + file = await FileService.UpdateFileAsync(file); + await logger.LogInformation("File Saved {File}", file); + NavigationManager.NavigateTo(NavigateUrl()); + } + else + { + AddModuleMessage("File Name Not Valid", MessageType.Warning); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving File {FileId} {Error}", _fileId, ex.Message); + AddModuleMessage("Error Saving File", MessageType.Error); + } + } +} diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor index 5d42485b..2c502690 100644 --- a/Oqtane.Client/Modules/Admin/Files/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor @@ -123,7 +123,7 @@ AddModuleMessage("Folder Name Not Valid.", MessageType.Warning); return; } - + try { Folder folder; @@ -174,7 +174,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Folder {FolderId} {Error}", _folderId, ex.Message); - AddModuleMessage("Error Saving Module", MessageType.Error); + AddModuleMessage("Error Saving Folder", MessageType.Error); } } @@ -182,9 +182,25 @@ { try { - await FolderService.DeleteFolderAsync(_folderId); - await logger.LogInformation("Folder Deleted {Folder}", _folderId); - AddModuleMessage("Folder Deleted", MessageType.Success); + bool isparent = false; + foreach (Folder folder in _folders) + { + if (folder.ParentId == _folderId) + { + isparent = true; + break; + } + } + if (!isparent) + { + await FolderService.DeleteFolderAsync(_folderId); + await logger.LogInformation("Folder Deleted {Folder}", _folderId); + NavigationManager.NavigateTo(NavigateUrl()); + } + else + { + AddModuleMessage("Folder Has Child Folders And Cannot Be Deleted", MessageType.Warning); + } } catch (Exception ex) { diff --git a/Oqtane.Client/Modules/Admin/Files/Index.razor b/Oqtane.Client/Modules/Admin/Files/Index.razor index 1c5f5783..ccb8a135 100644 --- a/Oqtane.Client/Modules/Admin/Files/Index.razor +++ b/Oqtane.Client/Modules/Admin/Files/Index.razor @@ -28,6 +28,7 @@
+     Name Modified @@ -35,6 +36,7 @@ Size
+ @context.Name @context.ModifiedOn diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index f03e52c3..c96f6891 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -135,8 +135,20 @@ namespace Oqtane.Controllers [Authorize(Roles = Constants.RegisteredRole)] public Models.File Put(int id, [FromBody] Models.File file) { - if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Folder, file.Folder.FolderId, PermissionNames.Edit)) + if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Folder, file.FolderId, PermissionNames.Edit)) { + file.Folder = _folders.GetFolder(file.FolderId); + Models.File _file = _files.GetFile(id, false); + if (_file.Name != file.Name || _file.FolderId != file.FolderId) + { + string folderpath = GetFolderPath(file.Folder); + if (!Directory.Exists(folderpath)) + { + Directory.CreateDirectory(folderpath); + } + System.IO.File.Move(Path.Combine(GetFolderPath(_file.Folder), _file.Name), Path.Combine(folderpath, file.Name)); + } + file.Extension = Path.GetExtension(file.Name).ToLower().Replace(".", ""); file = _files.UpdateFile(file); _logger.Log(LogLevel.Information, this, LogFunction.Update, "File Updated {File}", file); } diff --git a/Oqtane.Server/Controllers/FolderController.cs b/Oqtane.Server/Controllers/FolderController.cs index 9564734c..b1bebcfd 100644 --- a/Oqtane.Server/Controllers/FolderController.cs +++ b/Oqtane.Server/Controllers/FolderController.cs @@ -11,20 +11,25 @@ using Oqtane.Extensions; using Oqtane.Infrastructure; using Oqtane.Repository; using Oqtane.Security; +using Microsoft.AspNetCore.Hosting; namespace Oqtane.Controllers { [Route("{alias}/api/[controller]")] public class FolderController : Controller { + private readonly IWebHostEnvironment _environment; private readonly IFolderRepository _folders; private readonly IUserPermissions _userPermissions; + private readonly ITenantResolver _tenants; private readonly ILogManager _logger; - public FolderController(IFolderRepository folders, IUserPermissions userPermissions, ILogManager logger) + public FolderController(IWebHostEnvironment environment, IFolderRepository folders, IUserPermissions userPermissions, ITenantResolver tenants, ILogManager logger) { + _environment = environment; _folders = folders; _userPermissions = userPermissions; + _tenants = tenants; _logger = logger; } @@ -143,12 +148,19 @@ namespace Oqtane.Controllers { if (folder.IsPathValid()) { - if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null) + if (folder.ParentId != null) { Folder parent = _folders.GetFolder(folder.ParentId.Value); folder.Path = Utilities.PathCombine(parent.Path, folder.Name); } folder.Path = Utilities.PathCombine(folder.Path, Path.DirectorySeparatorChar.ToString()); + + Models.Folder _folder = _folders.GetFolder(id, false); + if (_folder.Path != folder.Path && Directory.Exists(GetFolderPath(_folder))) + { + Directory.Move(GetFolderPath(_folder), GetFolderPath(folder)); + } + folder = _folders.UpdateFolder(folder); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Folder Updated {Folder}", folder); } @@ -211,5 +223,10 @@ namespace Oqtane.Controllers HttpContext.Response.StatusCode = 401; } } + + private string GetFolderPath(Folder folder) + { + return Utilities.PathCombine(_environment.ContentRootPath, "Content", "Tenants", _tenants.GetTenant().TenantId.ToString(), "Sites", folder.SiteId.ToString(), folder.Path); + } } } diff --git a/Oqtane.Server/Repository/FileRepository.cs b/Oqtane.Server/Repository/FileRepository.cs index f532bb6e..0e5fa798 100644 --- a/Oqtane.Server/Repository/FileRepository.cs +++ b/Oqtane.Server/Repository/FileRepository.cs @@ -45,7 +45,21 @@ namespace Oqtane.Repository public File GetFile(int fileId) { - File file = _db.File.Where(item => item.FileId == fileId).Include(item => item.Folder).FirstOrDefault(); + return GetFile(fileId, true); + } + + public File GetFile(int fileId, bool tracking) + { + File file; + if (tracking) + { + file = _db.File.Where(item => item.FileId == fileId).Include(item => item.Folder).FirstOrDefault(); + + } + else + { + file = _db.File.AsNoTracking().Where(item => item.FileId == fileId).Include(item => item.Folder).FirstOrDefault(); + } if (file != null) { IEnumerable permissions = _permissions.GetPermissions(EntityNames.Folder, file.FolderId).ToList(); diff --git a/Oqtane.Server/Repository/FolderRepository.cs b/Oqtane.Server/Repository/FolderRepository.cs index 56b42c7b..dbaed6c1 100644 --- a/Oqtane.Server/Repository/FolderRepository.cs +++ b/Oqtane.Server/Repository/FolderRepository.cs @@ -47,7 +47,20 @@ namespace Oqtane.Repository public Folder GetFolder(int folderId) { - Folder folder = _db.Folder.Find(folderId); + return GetFolder(folderId, true); + } + + public Folder GetFolder(int folderId, bool tracking) + { + Folder folder; + if (tracking) + { + folder = _db.Folder.Where(item => item.FolderId == folderId).FirstOrDefault(); + } + else + { + folder = _db.Folder.AsNoTracking().Where(item => item.FolderId == folderId).FirstOrDefault(); + } if (folder != null) { folder.Permissions = _permissions.GetPermissionString(EntityNames.Folder, folder.FolderId); diff --git a/Oqtane.Server/Repository/Interfaces/IFileRepository.cs b/Oqtane.Server/Repository/Interfaces/IFileRepository.cs index 19715187..7ef99025 100644 --- a/Oqtane.Server/Repository/Interfaces/IFileRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IFileRepository.cs @@ -9,6 +9,7 @@ namespace Oqtane.Repository File AddFile(File file); File UpdateFile(File file); File GetFile(int fileId); + File GetFile(int fileId, bool tracking); void DeleteFile(int fileId); } } diff --git a/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs b/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs index 65256184..52b67e5b 100644 --- a/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs @@ -9,6 +9,7 @@ namespace Oqtane.Repository Folder AddFolder(Folder folder); Folder UpdateFolder(Folder folder); Folder GetFolder(int folderId); + Folder GetFolder(int folderId, bool tracking); Folder GetFolder(int siteId, string path); void DeleteFolder(int folderId); }