using System.ComponentModel.DataAnnotations; using System.IO; using Luticate2.Utils.Dbo.Basic; using Luticate2.Utils.Dbo.FsFiles; using Luticate2.Utils.Dbo.PaginatedRequest; using Luticate2.Utils.Dbo.Result; using Luticate2.Utils.Interfaces; using Luticate2.Utils.Utils; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Options; namespace Luticate2.Utils.Controllers { public abstract class LuFsFilesCrudController : LuController where TBusiness : ILuCrudInterface { protected readonly TBusiness Business; protected LuFsFilesCrudController(IOptions luUtilsOptionsDbo, TBusiness business) : base(luUtilsOptionsDbo) { Business = business; } protected abstract string GetBasePath(); [HttpGet] [Route("[controller]/{id}/raw")] public virtual IActionResult GetSingleByIdRaw([Required]string id, bool forceDownload = false) { var get = Business.GetSingleById(id); if (get.Status == LuStatus.NotFound) { return StatusCode(404); } if (!get) { throw new LuResultException(get.To()); } string type; var contentTypeProvider = new FileExtensionContentTypeProvider(); if (!contentTypeProvider.TryGetContentType(id, out type)) { type = "application/octet-stream"; } var fullPath = Path.Combine(new FileInfo(GetBasePath()).FullName, get.Data.Path); var stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read); if (forceDownload) { return File(stream, type, get.Data.Path); } return new FileStreamResult(stream, type); } [HttpGet] [Route("[controller]/{id}")] public virtual LuApiWrapperDbo GetSingleById([Required]string id) { return Handle(Business.GetSingleById(id)); } [HttpPost] [Route("[controller]")] public LuApiWrapperDbo AddDbo([Required]IFormFile file, string path) { return Handle(Business.AddDbo(new LuFsFilesAddDbo { File = file.OpenReadStream(), Path = string.IsNullOrEmpty(path) ? file.FileName : path })); } [HttpGet] [Route("[controller]")] public virtual LuApiWrapperDbo> GetMultiple([Required]LuPaginatedRequestDbo request) { return Handle(Business.GetMultiple(request)); } [HttpPost] [Route("[controller]/{id}")] public virtual LuApiWrapperDbo EditSingleByIdDbo([Required]string id, IFormFile file, string path) { return Handle(Business.EditSingleByIdDbo(id, new LuFsFilesAddDbo { File = file?.OpenReadStream(), Path = path })); } [HttpDelete] [Route("[controller]/{id}")] public virtual LuApiWrapperDbo Delete([Required]string id) { return Handle(Business.DeleteSingleByIdDbo(id)); } } }