using System; using System.ComponentModel; using System.IO; using System.Security.Claims; using System.Threading.Tasks; using AutoMapper; using Azure.Core; using Domain.Identity; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Services.Identity; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.Processing; using Image = SixLabors.ImageSharp.Image; namespace Api.Controllers { [Route("api/[controller]/[action]")] [ApiController] [EnableCors("AllowAll")] public class BaseController : ControllerBase { private readonly AutoMapper.IMapper _mapper; private readonly IWebHostEnvironment _environment; private readonly IAuthService authService; private readonly IServiceProvider serviceProvider; //response messages public BaseController(IServiceProvider serviceProvider) { _mapper = serviceProvider.GetService(); _environment = serviceProvider.GetService(); authService = serviceProvider.GetService(); } public IMapper Mapper => _mapper; private T GetClaim(string type) { var value = User.FindFirstValue(type) ?? ""; var converter = TypeDescriptor.GetConverter(typeof(T)); try { return (T)converter.ConvertFromString(value); } catch { return default; } } private Account _currentAccount; public Account CurrentAccount { get { if (_currentAccount == null) _currentAccount = authService.GetByUsername(CurrentClaim.Username); return _currentAccount; } } private CustomUser GetUser() { return new CustomUser { Id = GetClaim(ITokenIssuer.Claims.Id), Name = GetClaim(ITokenIssuer.Claims.Name), Username = GetClaim(ITokenIssuer.Claims.Username), Roles = GetClaim(ClaimTypes.Role).Split(',') }; } public CustomUser CurrentClaim => GetUser(); /// /// get images as byte array and returns maximun 1000 pixle base64 /// /// /// [ApiExplorerSettings(IgnoreApi = true)] public byte[] ResizeImage(byte[] inStream, int maxWidth = 1000) { using (var ms = new MemoryStream()) { using (Image image = Image.Load(inStream)) { if (image.Width < maxWidth) { image.SaveAsPng(ms); return ms.ToArray(); } var ratio = (double)(maxWidth) / image.Width; int width = image.Width; int height = (int)(image.Height * ratio); image.Mutate(x => x.Resize(width, height)); image.SaveAsPng(ms); return ms.ToArray(); } } } [ApiExplorerSettings(IgnoreApi = true)] private string GetUniqueFileName(string fileName) { fileName = Path.GetFileName(fileName); return string.Concat(Path.GetFileNameWithoutExtension(fileName) , "_" , Guid.NewGuid().ToString().AsSpan(0, 4) , Path.GetExtension(fileName)); } /// /// Saves base64 as a PNG with max 1500px width or height /// /// base64 image /// New file=empty /// File Name(all of files stores in UploadedFiles folder [ApiExplorerSettings(IgnoreApi = true)] protected string SaveImageFromBase64(string fileContent, string fileName = "") { fileName = string.IsNullOrEmpty(fileName) ? Guid.NewGuid().ToString() + ".png" : fileName; string outputPath = $"{_environment.ContentRootPath}\\UploadedFiles\\"; if (!System.IO.Directory.Exists(outputPath)) System.IO.Directory.CreateDirectory(outputPath); // Decode Base64 string to byte array byte[] imageBytes = Convert.FromBase64String(fileContent); using (MemoryStream ms = new MemoryStream(imageBytes)) using (Image image = Image.Load(ms)) { // Resize if width > 1500, keeping aspect ratio if (image.Width >= image.Height) { if (image.Width > 1500) { int newWidth = 1500; int newHeight = (int)((double)newWidth / image.Width * image.Height); image.Mutate(x => x.Resize(newWidth, newHeight)); } } else { if (image.Height > 1500) { int newHeight = 1500; int newWidth = (int)((double)newHeight / image.Height * image.Width); image.Mutate(x => x.Resize(newWidth, newHeight)); } } // Save as PNG image.Save($"{outputPath}{fileName}", new PngEncoder()); return fileName; } } } public class CustomUser { public string Name { get; set; } public string Username { get; set; } public Guid Id { get; set; } public string[] Roles { get; set; } } }