using System.IO; using System.Threading.Tasks; using API.Data; using API.Entities.Enums; using API.Extensions; using API.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace API.Controllers { /// /// Responsible for servicing up images stored in the DB /// public class ImageController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly IDirectoryService _directoryService; /// public ImageController(IUnitOfWork unitOfWork, IDirectoryService directoryService) { _unitOfWork = unitOfWork; _directoryService = directoryService; } /// /// Returns cover image for Chapter /// /// /// [HttpGet("chapter-cover")] public async Task GetChapterCoverImage(int chapterId) { var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.ChapterRepository.GetChapterCoverImageAsync(chapterId)); if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image"); var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", ""); Response.AddCacheHeader(path); return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path)); } /// /// Returns cover image for Volume /// /// /// [HttpGet("volume-cover")] public async Task GetVolumeCoverImage(int volumeId) { var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.VolumeRepository.GetVolumeCoverImageAsync(volumeId)); if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image"); var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", ""); Response.AddCacheHeader(path); return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path)); } /// /// Returns cover image for Series /// /// Id of Series /// [HttpGet("series-cover")] public async Task GetSeriesCoverImage(int seriesId) { var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.SeriesRepository.GetSeriesCoverImageAsync(seriesId)); if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image"); var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", ""); Response.AddCacheHeader(path); return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path)); } /// /// Returns cover image for Collection Tag /// /// /// [HttpGet("collection-cover")] public async Task GetCollectionCoverImage(int collectionTagId) { var path = Path.Join(_directoryService.CoverImageDirectory, await _unitOfWork.CollectionTagRepository.GetCoverImageAsync(collectionTagId)); if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"No cover image"); var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", ""); Response.AddCacheHeader(path); return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path)); } /// /// Returns image for a given bookmark page /// /// This request is served unauthenticated, but user must be passed via api key to validate /// /// Starts at 0 /// API Key for user. Needed to authenticate request /// [HttpGet("bookmark")] public async Task GetBookmarkImage(int chapterId, int pageNum, string apiKey) { var userId = await _unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey); var bookmark = await _unitOfWork.UserRepository.GetBookmarkForPage(pageNum, chapterId, userId); if (bookmark == null) return BadRequest("Bookmark does not exist"); var bookmarkDirectory = (await _unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.BookmarkDirectory)).Value; var file = new FileInfo(Path.Join(bookmarkDirectory, bookmark.FileName)); var format = Path.GetExtension(file.FullName).Replace(".", ""); Response.AddCacheHeader(file.FullName); return PhysicalFile(file.FullName, "image/" + format, Path.GetFileName(file.FullName)); } /// /// Returns a temp coverupload image /// /// Filename of file. This is used with upload/upload-by-url /// [AllowAnonymous] [HttpGet("cover-upload")] public ActionResult GetCoverUploadImage(string filename) { var path = Path.Join(_directoryService.TempDirectory, filename); if (string.IsNullOrEmpty(path) || !_directoryService.FileSystem.File.Exists(path)) return BadRequest($"File does not exist"); var format = _directoryService.FileSystem.Path.GetExtension(path).Replace(".", ""); Response.AddCacheHeader(path); return PhysicalFile(path, "image/" + format, _directoryService.FileSystem.Path.GetFileName(path)); } } }