using System; using System.IO; using System.Threading.Tasks; using AutoMapper; using gehGassi.Core.Interfaces; using gehGassi.Core.Services; using gehGassi.Dto.Common; using gehGassi.Web.Auth; using gehGassi.Web.Helper; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Processing; namespace gehGassi.Web.Controllers.Api { /// /// Basis-Controller für die Web-API /// public class ApiBaseController : Controller { public IMapper Mapper { get; } public IOptions LocalizationOptions { get; } public IAppUserService AppUserService { get; } private IFileService _fileService; protected IFileService FileService => _fileService ??= HttpContext?.RequestServices.GetService(); /// /// Erstellt eine Instanz /// /// Instanz eines IMapper /// Instanz von LocalizationOptions /// Instanz eines IDogOwnerService public ApiBaseController(IMapper mapper, IOptions localizationOptions, IAppUserService appUserService) { Mapper = mapper; LocalizationOptions = localizationOptions; AppUserService = appUserService; } /// /// 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; } /// /// Hilfsmethode die aus einer Anfrage Daten für die Geo-Einschränkung von Daten holt. /// Wenn Land oder Bundesland nicht gesendet wurde, dann werden diese vom DogOwner oder DogWalker geholt /// /// Anfrage mit Geo-Info /// Land und Bundesland oder leere strings, wenn nicht möglich internal async Task<(string, string)> GetGeoDataAsync(QueryDto model) { var country = model.Location.CountryCode; var state = model.Location.StateCode; if (string.IsNullOrWhiteSpace(model.Location.CountryCode) || string.IsNullOrWhiteSpace(model.Location.StateCode)) { var appUser = await AppUserService.GetAsync(User.AppUserId()); country = appUser.Address.CountryCode; state = appUser.Address.State; } return (country, state); } /// /// 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; } } }