diff --git a/Oqtane.Client/Services/FileService.cs b/Oqtane.Client/Services/FileService.cs index 3a3bc8a8..265ccb67 100644 --- a/Oqtane.Client/Services/FileService.cs +++ b/Oqtane.Client/Services/FileService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Threading; @@ -17,7 +18,8 @@ namespace Oqtane.Services private readonly NavigationManager _navigationManager; private readonly IJSRuntime _jsRuntime; - public FileService(HttpClient http, SiteState siteState, NavigationManager navigationManager, IJSRuntime jsRuntime) + public FileService(HttpClient http, SiteState siteState, NavigationManager navigationManager, + IJSRuntime jsRuntime) { _http = http; _siteState = siteState; @@ -40,6 +42,13 @@ namespace Oqtane.Services return await _http.GetJsonAsync>(apiurl + "?folder=" + Folder); } + public async Task> GetFilesAsync(int siteId, string folderPath) + { + if (!folderPath.EndsWith("\\")) folderPath += "\\"; + var path = WebUtility.UrlEncode(folderPath); + return await _http.GetJsonAsync>($"{apiurl}/{siteId}/{path}"); + } + public async Task GetFileAsync(int FileId) { return await _http.GetJsonAsync(apiurl + "/" + FileId.ToString()); @@ -62,7 +71,8 @@ namespace Oqtane.Services public async Task UploadFileAsync(string Url, int FolderId) { - return await _http.GetJsonAsync(apiurl + "/upload?url=" + WebUtility.UrlEncode(Url) + "&folderid=" + FolderId.ToString()); + return await _http.GetJsonAsync(apiurl + "/upload?url=" + WebUtility.UrlEncode(Url) + "&folderid=" + + FolderId.ToString()); } public async Task UploadFilesAsync(int FolderId, string[] Files, string Id) @@ -98,8 +108,10 @@ namespace Oqtane.Services } } } + attempts += 1; } + if (!success) { result = result.Substring(0, result.Length - 1); diff --git a/Oqtane.Client/Services/FolderService.cs b/Oqtane.Client/Services/FolderService.cs index 762ff7d8..a457b021 100644 --- a/Oqtane.Client/Services/FolderService.cs +++ b/Oqtane.Client/Services/FolderService.cs @@ -6,6 +6,8 @@ using Microsoft.AspNetCore.Components; using System.Collections.Generic; using Oqtane.Shared; using System; +using System.Diagnostics.CodeAnalysis; +using System.Net; namespace Oqtane.Services { @@ -22,41 +24,47 @@ namespace Oqtane.Services _navigationManager = navigationManager; } - private string apiurl - { - get { return CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Folder"); } - } + private string ApiUrl => CreateApiUrl(_siteState.Alias, _navigationManager.Uri, "Folder"); public async Task> GetFoldersAsync(int SiteId) { - List folders = await _http.GetJsonAsync>(apiurl + "?siteid=" + SiteId.ToString()); + List folders = await _http.GetJsonAsync>(ApiUrl + "?siteid=" + SiteId.ToString()); folders = GetFoldersHierarchy(folders); return folders; } public async Task GetFolderAsync(int FolderId) { - return await _http.GetJsonAsync(apiurl + "/" + FolderId.ToString()); + return await _http.GetJsonAsync(ApiUrl + "/" + FolderId.ToString()); + } + + public async Task GetFolderAsync(int siteId, [NotNull] string folderPath) + { + if (!folderPath.EndsWith("\\")) folderPath += "\\"; + var path = WebUtility.UrlEncode(folderPath); + return await _http.GetJsonAsync($"{ApiUrl}/{siteId}/{path}"); } public async Task AddFolderAsync(Folder Folder) { - return await _http.PostJsonAsync(apiurl, Folder); + return await _http.PostJsonAsync(ApiUrl, Folder); } public async Task UpdateFolderAsync(Folder Folder) { - return await _http.PutJsonAsync(apiurl + "/" + Folder.FolderId.ToString(), Folder); + return await _http.PutJsonAsync(ApiUrl + "/" + Folder.FolderId.ToString(), Folder); } public async Task UpdateFolderOrderAsync(int SiteId, int FolderId, int? ParentId) { - await _http.PutJsonAsync(apiurl + "/?siteid=" + SiteId.ToString() + "&folderid=" + FolderId.ToString() + "&parentid=" + ((ParentId == null) ? "" : ParentId.ToString()), null); + await _http.PutJsonAsync( + ApiUrl + "/?siteid=" + SiteId.ToString() + "&folderid=" + FolderId.ToString() + "&parentid=" + + ((ParentId == null) ? "" : ParentId.ToString()), null); } public async Task DeleteFolderAsync(int FolderId) { - await _http.DeleteAsync(apiurl + "/" + FolderId.ToString()); + await _http.DeleteAsync(ApiUrl + "/" + FolderId.ToString()); } private static List GetFoldersHierarchy(List Folders) @@ -77,10 +85,11 @@ namespace Oqtane.Services level = folder.Level; children = Folders.Where(item => item.ParentId == folder.FolderId); } + foreach (Folder child in children) { child.Level = level + 1; - child.HasChildren = Folders.Where(item => item.ParentId == child.FolderId).Any(); + child.HasChildren = Folders.Any(item => item.ParentId == child.FolderId); hierarchy.Add(child); GetPath(folders, child); } @@ -89,13 +98,14 @@ namespace Oqtane.Services GetPath(Folders, null); // add any non-hierarchical items to the end of the list - foreach(Folder folder in Folders) + foreach (Folder folder in Folders) { if (hierarchy.Find(item => item.FolderId == folder.FolderId) == null) { hierarchy.Add(folder); } } + return hierarchy; } } diff --git a/Oqtane.Client/Services/Interfaces/IFileService.cs b/Oqtane.Client/Services/Interfaces/IFileService.cs index 2a6234b6..c3107e6a 100644 --- a/Oqtane.Client/Services/Interfaces/IFileService.cs +++ b/Oqtane.Client/Services/Interfaces/IFileService.cs @@ -17,5 +17,6 @@ namespace Oqtane.Services Task UploadFilesAsync(string Folder, string[] Files, string FileUploadName); Task DownloadFileAsync(int FileId); + Task> GetFilesAsync(int siteId, string folderPath); } } diff --git a/Oqtane.Client/Services/Interfaces/IFolderService.cs b/Oqtane.Client/Services/Interfaces/IFolderService.cs index d91e253e..bbad463c 100644 --- a/Oqtane.Client/Services/Interfaces/IFolderService.cs +++ b/Oqtane.Client/Services/Interfaces/IFolderService.cs @@ -1,5 +1,6 @@ using Oqtane.Models; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace Oqtane.Services @@ -12,5 +13,6 @@ namespace Oqtane.Services Task UpdateFolderAsync(Folder Folder); Task UpdateFolderOrderAsync(int SiteId, int FolderId, int? ParentId); Task DeleteFolderAsync(int FolderId); + Task GetFolderAsync(int siteId, [NotNull]string folderPath); } } diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index 418c0829..d1606eaa 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -14,6 +14,7 @@ using System.Threading.Tasks; using Oqtane.Security; using System.Linq; using System.Drawing; +using System.Net; namespace Oqtane.Controllers { @@ -45,8 +46,8 @@ namespace Oqtane.Controllers int folderid; if (int.TryParse(folder, out folderid)) { - Folder Folder = _folders.GetFolder(folderid); - if (Folder != null && _userPermissions.IsAuthorized(User, "Browse", Folder.Permissions)) + Folder f = _folders.GetFolder(folderid); + if (f != null && _userPermissions.IsAuthorized(User, "Browse", f.Permissions)) { files = _files.GetFiles(folderid).ToList(); } @@ -67,6 +68,35 @@ namespace Oqtane.Controllers } return files; } + + // GET: api//siteId/folderPath + [HttpGet("{siteId}/{path}")] + public IEnumerable Get(int siteId, string path) + { + var folderPath = WebUtility.UrlDecode(path); + Folder folder = _folders.GetFolder(siteId, folderPath); + List files; + if (folder != null) + if (_userPermissions.IsAuthorized(User, "Browse", folder.Permissions)) + { + files = _files.GetFiles(folder.FolderId).ToList(); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Read, "User Not Authorized To Access Folder {folder}", + folder); + HttpContext.Response.StatusCode = 401; + return null; + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Read, "Folder not found {path}", + path); + HttpContext.Response.StatusCode = 401; + return null; + } + return files; + } // GET api//5 [HttpGet("{id}")] @@ -109,17 +139,17 @@ namespace Oqtane.Controllers [Authorize(Roles = Constants.RegisteredRole)] public void Delete(int id) { - Models.File File = _files.GetFile(id); - if (_userPermissions.IsAuthorized(User, "Folder", File.Folder.FolderId, "Edit")) + Models.File file = _files.GetFile(id); + if (_userPermissions.IsAuthorized(User, "Folder", file.Folder.FolderId, "Edit")) { _files.DeleteFile(id); - string filepath = Path.Combine(GetFolderPath(File.Folder) + File.Name); + string filepath = Path.Combine(GetFolderPath(file.Folder) + file.Name); if (System.IO.File.Exists(filepath)) { System.IO.File.Delete(filepath); } - _logger.Log(LogLevel.Information, this, LogFunction.Delete, "File Deleted {File}", File); + _logger.Log(LogLevel.Information, this, LogFunction.Delete, "File Deleted {File}", file); } else { @@ -410,4 +440,4 @@ namespace Oqtane.Controllers return file; } } -} \ No newline at end of file +} diff --git a/Oqtane.Server/Controllers/FolderController.cs b/Oqtane.Server/Controllers/FolderController.cs index cbb48fb8..4b076e7f 100644 --- a/Oqtane.Server/Controllers/FolderController.cs +++ b/Oqtane.Server/Controllers/FolderController.cs @@ -5,6 +5,7 @@ using Oqtane.Repository; using Oqtane.Models; using Oqtane.Shared; using System.Linq; +using System.Net; using Oqtane.Infrastructure; using Oqtane.Security; @@ -56,6 +57,32 @@ namespace Oqtane.Controllers } } + [HttpGet("{siteId}/{path}")] + public Folder GetByPath(int siteId, string path) + { + var folderPath = WebUtility.UrlDecode(path); + Folder folder = _folders.GetFolder(siteId, folderPath); + if (folder != null) + if (_userPermissions.IsAuthorized(User, "Browse", folder.Permissions)) + { + return folder; + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Read, "User Not Authorized To Access Folder {Folder}", + folder); + HttpContext.Response.StatusCode = 401; + return null; + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Read, "Folder not found {path}", + path); + HttpContext.Response.StatusCode = 401; + return null; + } + } + // POST api/ [HttpPost] [Authorize(Roles = Constants.RegisteredRole)]