using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using RSecurityBackend.Models.Auth.Memory; using RSecurityBackend.Models.Generic; using RSecurityBackend.Models.Image; using RSecurityBackend.Services; using System; using System.IO; using System.Net; using System.Threading.Tasks; namespace RSecurityBackend.Controllers { /// /// Generic Image Provider /// [Produces("application/json")] [Route("api/rimages")] public abstract class RImageControllerBase : Controller { /// /// returns image stream /// /// /// [HttpGet("{id}.jpg")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FileStreamResult))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task Get(Guid id) { RServiceResult img = await _pictureFileService.GetImage(id); if (!string.IsNullOrEmpty(img.ExceptionString)) return BadRequest(img.ExceptionString); if (img.Result == null) return NotFound(); Response.GetTypedHeaders().LastModified = img.Result.LastModified; var requestHeaders = Request.GetTypedHeaders(); if (requestHeaders.IfModifiedSince.HasValue && requestHeaders.IfModifiedSince.Value >= img.Result.LastModified) { return StatusCode(StatusCodes.Status304NotModified); } RServiceResult imgPath = _pictureFileService.GetImagePath(img.Result); if (!string.IsNullOrEmpty(imgPath.ExceptionString)) return BadRequest(imgPath.ExceptionString); return new FileStreamResult(new FileStream(imgPath.Result, FileMode.Open, FileAccess.Read), "image/jpeg"); } /// /// temporary api for uploading temporary images /// /// [HttpPost] [Authorize(Policy = SecurableItem.AuditLogEntityShortName + ":" + SecurableItem.ViewOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(Guid))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] [ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))] public async Task UploadImage() { try { if (!Request.Form.TryGetValue("path", out Microsoft.Extensions.Primitives.StringValues path)) { return BadRequest("path is null"); } IFormFile file = Request.Form.Files[0]; RServiceResult image = await _pictureFileService.Add(file, null, file.FileName, path); if (!string.IsNullOrEmpty(image.ExceptionString)) { return BadRequest(image.ExceptionString); } image = await _pictureFileService.Store(image.Result); if (!string.IsNullOrEmpty(image.ExceptionString)) { return BadRequest(image.ExceptionString); } return Ok(image.Result.Id); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// constructor /// /// /// public RImageControllerBase(IImageFileService pictureFileService) { _pictureFileService = pictureFileService; } /// /// Artifact Service /// protected readonly IImageFileService _pictureFileService; } }