diff --git a/Library.Encyclopedia.API/Controllers/EncylopediaController.cs b/Library.Encyclopedia.API/Controllers/EncylopediaController.cs index fab97c7..68b3d27 100644 --- a/Library.Encyclopedia.API/Controllers/EncylopediaController.cs +++ b/Library.Encyclopedia.API/Controllers/EncylopediaController.cs @@ -28,10 +28,10 @@ public class EncylopediaController : ControllerBase /// /// /// - public EncylopediaController(ILogger logger, IApplicationDbContext dbContext, IConfiguration configuration) + public EncylopediaController(ILogger logger, IApplicationDbContext dbContext, IConfiguration configuration, IFilesAdapter filesAdapter) { _logger = logger; - this.mainDataAccess = new MainDataAccess(dbContext, configuration); + this.mainDataAccess = new MainDataAccess(dbContext, configuration, filesAdapter); } [HttpGet("Login")] diff --git a/Library.Encyclopedia.API/Controllers/FilesController.cs b/Library.Encyclopedia.API/Controllers/FilesController.cs index ce3a146..acfcb17 100644 --- a/Library.Encyclopedia.API/Controllers/FilesController.cs +++ b/Library.Encyclopedia.API/Controllers/FilesController.cs @@ -56,6 +56,7 @@ public async Task Post(Guid id, IFormFile file, string descriptio MainId = id, FileName = file.FileName, FilePath = $@"/{id}/{file.FileName}", + FileSize = file.Length, FileType = file.ContentType, FileDescription = description }; @@ -85,10 +86,36 @@ public async Task Post(Guid id, IFormFile file, string descriptio /// [HttpGet("{id}")] [Authorize(Roles = @"EncyclopediaAdministrators")] - public async Task Get(Guid id, string directory) + public IActionResult Get(string id, string name, string contentType) { try { + var stream = this.filesAdapter.DownloadFile(id, name); + return File(stream, contentType); + } + catch (Exception ex) + { + _logger.LogError(ex, $"an error has occured {ex.Message}"); + throw; + } + } + + /// + /// Delete File + /// + /// + /// + /// + /// + /// + [HttpDelete("{id}")] + [Authorize(Roles = @"EncyclopediaAdministrators")] + public async Task Delete(string id, string fileName, string fileId) + { + try + { + this.filesAdapter.DeleteFile(id, fileName); + await filesDataAccess.RemoveFiles(new List { Guid.Parse(fileId) }); return Ok(); } catch (Exception ex) diff --git a/Library.Encyclopedia.DataAccess/DataAccess/MainDataAccess.cs b/Library.Encyclopedia.DataAccess/DataAccess/MainDataAccess.cs index e3241b8..64895af 100644 --- a/Library.Encyclopedia.DataAccess/DataAccess/MainDataAccess.cs +++ b/Library.Encyclopedia.DataAccess/DataAccess/MainDataAccess.cs @@ -18,12 +18,14 @@ namespace Library.Encyclopedia.DataAccess.DataAccess public class MainDataAccess : IMainDataAccess { private IApplicationDbContext _dbcontext; + private readonly IFilesAdapter filesAdapter; private string APP_BASE_URL; - public MainDataAccess(IApplicationDbContext dbcontext, IConfiguration configuration) + public MainDataAccess(IApplicationDbContext dbcontext, IConfiguration configuration, IFilesAdapter filesAdapter) { APP_BASE_URL = configuration.GetSection("App-Base-Url").Value; _dbcontext = dbcontext; + this.filesAdapter = filesAdapter; } #region GET @@ -86,7 +88,31 @@ async Task IMainDataAccess.GetByCategoryAsync(s return result; } - else return new MainMinimizedExternalCollection(); + else + { + IEnumerable
data; + if (ascending) + data = await _dbcontext.Main.Where(s => s.Category == null) + .OrderBy(s => s.Title.ToLower()) + .ThenBy(s => s.RawDescription.ToLower()) + .Skip(offset) + .Take(pagesize) + .ToListAsync(); + else + data = await _dbcontext.Main.Where(s => s.Category == null) + + .OrderByDescending(s => s.Title.ToLower()) + .ThenByDescending(s => s.RawDescription.ToLower()) + .Skip(offset) + .Take(pagesize) + .ToListAsync(); + + var total = await _dbcontext.Main.CountAsync(s => s.Category == null); + + MainMinimizedExternalCollection result = new MainMinimizedExternalCollection(data.Minimize(previewSize), total); + + return result; + } } async Task IMainDataAccess.GetByAlphabetAsync(char startingAlphabet, int offset, int pagesize, int previewSize, bool ascending) @@ -145,7 +171,7 @@ async Task IMainDataAccess.GetByAlphabetAsync(c async Task
IMainDataAccess.GetAsync(Guid id) { - Main item = await _dbcontext.Main.Include(s => s.Files).Include(s => s.Links).FirstOrDefaultAsync(s => s.Id == id); + Main item = await _dbcontext.Main.Include(s => s.Files).Include(s => s.Links).Include(s => s.Files).FirstOrDefaultAsync(s => s.Id == id); if (item != null) { @@ -331,7 +357,7 @@ private Main ReplaceInternalLinks(Main model, bool isUpdate = false) public async Task
UpdateAsync(Guid id, MainUpdateModel model) { // find the entry - var entry = await _dbcontext.Main.Include(s => s.Links).FirstOrDefaultAsync(s => s.Id == id); + var entry = await _dbcontext.Main.Include(s => s.Links).Include(s => s.Files).FirstOrDefaultAsync(s => s.Id == id); if (entry != null) { @@ -386,11 +412,16 @@ public async Task
UpdateAsync(Guid id, MainUpdateModel model) public async Task DeleteAsync(Guid id) { // find the entry - var entry = await _dbcontext.Main.Include(s => s.Links).FirstOrDefaultAsync(s => s.Id == id); + var entry = await _dbcontext.Main.Include(s => s.Links).Include(s => s.Files).FirstOrDefaultAsync(s => s.Id == id); if (entry != null) { if (entry.Links != null && entry.Links.Any()) _dbcontext.Links.RemoveRange(entry.Links); + if (entry.Files != null && entry.Files.Any()) + { + _dbcontext.Files.RemoveRange(entry.Files); + this.filesAdapter.DeleteFiles(entry.Id.ToString()); + } _dbcontext.Main.Remove(entry); await _dbcontext.SaveChanges(); } diff --git a/Library.Encyclopedia.DataAccess/FileAccess/WindowsFileSaveAdapter.cs b/Library.Encyclopedia.DataAccess/FileAccess/WindowsFileSaveAdapter.cs index 9b408c8..9f45c17 100644 --- a/Library.Encyclopedia.DataAccess/FileAccess/WindowsFileSaveAdapter.cs +++ b/Library.Encyclopedia.DataAccess/FileAccess/WindowsFileSaveAdapter.cs @@ -18,9 +18,24 @@ public WindowsFileSaveAdapter(string networkPath) { this.networkPath = networkPath; } - public bool DownloadFile(Files file, string directory) + + public void DeleteFile(string id, string name) + { + File.Delete(Path.Combine(networkPath, id, name)); + } + + public void DeleteFiles(string id) + { + foreach (var file in Directory.GetFiles(Path.Combine(networkPath, id))) + { + File.Delete(file); + } + Directory.Delete(Path.Combine(networkPath, id)); + } + + public FileStream DownloadFile(string id, string name) { - throw new NotImplementedException(); + return File.OpenRead(Path.Combine(networkPath, id, name)); } public async Task UploadFile(Guid id, IFormFile file) diff --git a/Library.Encyclopedia.Entity/Interfaces/IFilesAdapter.cs b/Library.Encyclopedia.Entity/Interfaces/IFilesAdapter.cs index 5dd34ef..78f2d9b 100644 --- a/Library.Encyclopedia.Entity/Interfaces/IFilesAdapter.cs +++ b/Library.Encyclopedia.Entity/Interfaces/IFilesAdapter.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; +using System.IO; using System.Threading.Tasks; namespace Library.Encyclopedia.Entity.Interfaces @@ -9,6 +10,8 @@ namespace Library.Encyclopedia.Entity.Interfaces public interface IFilesAdapter { public Task UploadFile(Guid id, IFormFile file); - bool DownloadFile(Files file, string directory); + FileStream DownloadFile(string id, string name); + public void DeleteFiles(string id); + public void DeleteFile(string id, string name); } } \ No newline at end of file diff --git a/Library.Encyclopedia.Entity/Models/Files.cs b/Library.Encyclopedia.Entity/Models/Files.cs index 3c981cf..f862f9d 100644 --- a/Library.Encyclopedia.Entity/Models/Files.cs +++ b/Library.Encyclopedia.Entity/Models/Files.cs @@ -13,6 +13,8 @@ public class Files public string FileName { get; set; } [Required] public string FileType { get; set; } + [Required] + public long FileSize { get; set; } public string FileDescription { get; set; } [Required] public string FilePath { get; set; }