From 92444ccf759ceb766bf42619ad1a1d3b2fc23927 Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Sat, 7 Mar 2020 01:36:25 +0100 Subject: [PATCH] GetFiles and GetFolder by folder path --- Oqtane.Client/Services/FileService.cs | 23 +++++++++++-- Oqtane.Client/Services/FolderService.cs | 24 ++++++++++++-- .../Services/Interfaces/IFileService.cs | 1 + .../Services/Interfaces/IFolderService.cs | 2 ++ Oqtane.Server/Controllers/FileController.cs | 32 ++++++++++++++++++- Oqtane.Server/Controllers/FolderController.cs | 27 ++++++++++++++++ 6 files changed, 104 insertions(+), 5 deletions(-) diff --git a/Oqtane.Client/Services/FileService.cs b/Oqtane.Client/Services/FileService.cs index 3a3bc8a8..d377d62e 100644 --- a/Oqtane.Client/Services/FileService.cs +++ b/Oqtane.Client/Services/FileService.cs @@ -1,9 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Logging; using Microsoft.JSInterop; using Oqtane.Models; using Oqtane.Shared; @@ -12,12 +14,14 @@ namespace Oqtane.Services { public class FileService : ServiceBase, IFileService { + + private readonly ILogger _logger; private readonly HttpClient _http; private readonly SiteState _siteState; 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, ILogger Logger) { _http = http; _siteState = siteState; @@ -40,6 +44,21 @@ namespace Oqtane.Services return await _http.GetJsonAsync>(apiurl + "?folder=" + Folder); } + public async Task> GetFilesAsync(int siteId, string folderPath) + { + try + { + if (!folderPath.EndsWith("\\")) folderPath += "\\"; + var path = WebUtility.UrlEncode(folderPath); + return await _http.GetJsonAsync>($"{apiurl}/{siteId}/{path}"); + } + catch (Exception e) + { + _logger.LogDebug(e,"Folder not found: {path}"); + } + return null; + } + public async Task GetFileAsync(int FileId) { return await _http.GetJsonAsync(apiurl + "/" + FileId.ToString()); diff --git a/Oqtane.Client/Services/FolderService.cs b/Oqtane.Client/Services/FolderService.cs index 762ff7d8..630231fe 100644 --- a/Oqtane.Client/Services/FolderService.cs +++ b/Oqtane.Client/Services/FolderService.cs @@ -6,6 +6,9 @@ using Microsoft.AspNetCore.Components; using System.Collections.Generic; using Oqtane.Shared; using System; +using System.Diagnostics.CodeAnalysis; +using System.Net; +using Microsoft.Extensions.Logging; namespace Oqtane.Services { @@ -14,12 +17,14 @@ namespace Oqtane.Services private readonly HttpClient _http; private readonly SiteState _siteState; private readonly NavigationManager _navigationManager; - - public FolderService(HttpClient http, SiteState siteState, NavigationManager navigationManager) + private readonly ILogger _logger; + + public FolderService(HttpClient http, SiteState siteState, NavigationManager navigationManager, ILogger logger) { _http = http; _siteState = siteState; _navigationManager = navigationManager; + _logger = logger; } private string apiurl @@ -38,6 +43,21 @@ namespace Oqtane.Services { return await _http.GetJsonAsync(apiurl + "/" + FolderId.ToString()); } + + public async Task GetFolderAsync(int siteId, [NotNull]string folderPath) + { + try + { + if (!folderPath.EndsWith("\\")) folderPath += "\\"; + var path = WebUtility.UrlEncode(folderPath); + return await _http.GetJsonAsync($"{apiurl}/{siteId}/{path}"); + } + catch (Exception e) + { + _logger.LogDebug(e,"Folder not found: {path}"); + } + return null; + } public async Task AddFolderAsync(Folder Folder) { 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..35da2162 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -14,6 +14,7 @@ using System.Threading.Tasks; using Oqtane.Security; using System.Linq; using System.Drawing; +using System.Net; namespace Oqtane.Controllers { @@ -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}")] 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)]