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();
}
}
}