using System; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Web.Models; using Microsoft.AspNetCore.Http; namespace gehGassi.Web.Services { /// /// Schnittstellenbeschreibung für einen Service der die gewählte Zeitzone des aktuell angemeldeten Benutzers zurückgibt /// public interface ICurrentTimeZoneService { /// /// Gibt die Zeitzone des aktuell angemeldeten Benutzers zurück /// /// Zeitzonen-ID Task GetAsync(); /// /// Konvertiert ein DateTimeOffset in ein Datum das der aktuellen Auswahl des Benutzers entspricht /// /// Datetimeoffset das konvertiert werden soll /// Task GetLocalTimeAsync(DateTimeOffset date); /// /// Gibt das Offset des aktuellen Benutzers anhand der gewählten Zeitzone zurück /// /// Offset als Timespan Task GetOffsetAsync(); } /// /// Service der die gewählte Zeitzone des aktuell angemeldeten Benutzers zurückgibt /// public class CurrentTimeZoneService : ICurrentTimeZoneService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IUserService _userService; /// /// Erstellt eine Instanz /// /// Instanz eines IHttpContextAccessor /// Instanz eines IUserService public CurrentTimeZoneService(IHttpContextAccessor httpContextAccessor, IUserService userService) { _httpContextAccessor = httpContextAccessor; _userService = userService; } /// /// Gibt die Zeitzone des aktuell angemeldeten Benutzers zurück /// /// Zeitzonen-ID public async Task GetAsync() { if (_httpContextAccessor?.HttpContext?.User?.Identity != null && _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated) { var user = await _userService.GetByUsernameAsync(_httpContextAccessor.HttpContext.User.Identity.Name); if (user != null && !string.IsNullOrWhiteSpace(user.TimeZoneId)) return user.TimeZoneId; } return TimeZoneInfo.Local.Id; } /// /// Konvertiert ein DateTimeOffset in ein Datum das der aktuellen Auswahl des Benutzers entspricht /// /// Datetimeoffset das konvertiert werden soll /// public async Task GetLocalTimeAsync(DateTimeOffset date) { if (_httpContextAccessor?.HttpContext?.User?.Identity != null && _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated) { var user = await _userService.GetByUsernameAsync(_httpContextAccessor.HttpContext.User.Identity.Name); if (user != null && !string.IsNullOrWhiteSpace(user.TimeZoneId)) { var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById((user.TimeZoneId)); var converted = date.ToOffset(timeZoneInfo.GetUtcOffset(date)); return converted; } } return date; } /// /// Gibt das Offset des aktuellen Benutzers anhand der gewählten Zeitzone zurück /// /// Offset als Timespan public async Task GetOffsetAsync() { if (_httpContextAccessor?.HttpContext?.User?.Identity != null && _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated) { var user = await _userService.GetByUsernameAsync(_httpContextAccessor.HttpContext.User.Identity.Name); if (user != null && !string.IsNullOrWhiteSpace(user.TimeZoneId)) { var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById((user.TimeZoneId)); return timeZoneInfo.GetUtcOffset(DateTimeOffset.UtcNow); } } return new TimeSpan(); } } }