using AutoMapper;
using gehGassi.Core.Interfaces;
using gehGassi.Web.Helper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.IO;
using System.Threading.Tasks;
using System;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Processing;
namespace gehGassi.Web.Controllers.WebsiteApi
{
///
/// Basis-Controller für die Website-API
///
public class WebSiteApiBaseController : Controller
{
public IMapper Mapper { get; }
public IOptions LocalizationOptions { get; }
public IUserService UserService { get; }
private IFileService _fileService;
protected IFileService FileService => _fileService ??= HttpContext?.RequestServices.GetService();
///
/// Erstellt eine Instanz
///
/// Instanz eines IMapper
/// Instanz von LocalizationOptions
/// Instanz eines IUserService
public WebSiteApiBaseController(IMapper mapper, IOptions localizationOptions, IUserService userService)
{
Mapper = mapper;
LocalizationOptions = localizationOptions;
UserService = userService;
}
///
/// Gibt die Basis-Adresse für URLS zurück
///
///
internal string GetBaseAddress()
{
var baseAddress = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}";
#if DEBUG
baseAddress = "http://10.0.0.31:54763";
#endif
return baseAddress;
}
///
/// Erstellt ein Thumbnail basierend auf der Breite
///
/// Container
/// Dateiname
/// Größe für Breite und Höhe
/// Task
internal async Task GenerateThumbnailByWidth(string container, string filename, int size)
{
try
{
using (var imgStream = await FileService.GetAsStreamAsync(container, filename))
{
using (var img = await Image.LoadAsync(imgStream))
{
img.Mutate(x => x.Resize(new ResizeOptions() { Mode = ResizeMode.Max, Size = new Size(size) }));
var format = img.DetectEncoder(filename);
await using (var memStream = new MemoryStream())
{
await img.SaveAsync(memStream, format);
memStream.Position = 0;
await FileService.StoreAsync(container, $"thumbnails/{size}/{filename}", memStream);
}
}
}
}
catch
{
}
}
///
/// Löschen eines Thumbnails für ein Bild
///
/// Container
/// Dateiname
/// Größe für Breite und Höhe
/// Task
internal async Task RemoveThumbnail(string container, string fileName, int size)
{
try
{
var file = await FileService.GetAsync(container, $"thumbnails/{size}/{fileName}");
if (file != null)
{
await FileService.DeleteAsync(container, $"thumbnails/{size}/{fileName}");
}
}
catch
{
}
}
///
/// Gibt den Offset zwischen der Server- und der Client-Zeit zurück
///
///
protected int GetClientDateOffset()
{
var compareDate = DateTimeOffset.UtcNow;
var dateOffset = 0;
try
{
if (Request.Headers.ContainsKey("clientTime"))
{
var requestHeader = Request.Headers["clientTime"];
DateTimeOffset clientDate;
if (DateTimeOffset.TryParse(requestHeader, null, System.Globalization.DateTimeStyles.RoundtripKind, out clientDate))
{
//var clientDate = DateTimeOffset.Parse(Request.Headers["clientTime"], null, System.Globalization.DateTimeStyles.RoundtripKind);
dateOffset = (int)(compareDate - clientDate).TotalSeconds;
}
else
{
System.Diagnostics.Debug.WriteLine($"ClientOffset header Problem: {Request.Headers["clientTime"]}");
}
}
//System.Diagnostics.Debug.WriteLine($"ClientOffset in seconds: {dateOffset}");
}
catch { }
return dateOffset;
}
}
}