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; }