110 lines
4.4 KiB
C#
110 lines
4.4 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using gehGassi.Core.Interfaces;
|
|
using gehGassi.Web.Models;
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
namespace gehGassi.Web.Services
|
|
{
|
|
/// <summary>
|
|
/// Schnittstellenbeschreibung für einen Service der die gewählte Zeitzone des aktuell angemeldeten Benutzers zurückgibt
|
|
/// </summary>
|
|
public interface ICurrentTimeZoneService
|
|
{
|
|
/// <summary>
|
|
/// Gibt die Zeitzone des aktuell angemeldeten Benutzers zurück
|
|
/// </summary>
|
|
/// <returns>Zeitzonen-ID</returns>
|
|
Task<string> GetAsync();
|
|
|
|
/// <summary>
|
|
/// Konvertiert ein DateTimeOffset in ein Datum das der aktuellen Auswahl des Benutzers entspricht
|
|
/// </summary>
|
|
/// <param name="date">Datetimeoffset das konvertiert werden soll</param>
|
|
/// <returns></returns>
|
|
Task<DateTimeOffset> GetLocalTimeAsync(DateTimeOffset date);
|
|
|
|
/// <summary>
|
|
/// Gibt das Offset des aktuellen Benutzers anhand der gewählten Zeitzone zurück
|
|
/// </summary>
|
|
/// <returns>Offset als Timespan</returns>
|
|
Task<TimeSpan> GetOffsetAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Service der die gewählte Zeitzone des aktuell angemeldeten Benutzers zurückgibt
|
|
/// </summary>
|
|
public class CurrentTimeZoneService : ICurrentTimeZoneService
|
|
{
|
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
private readonly IUserService _userService;
|
|
|
|
/// <summary>
|
|
/// Erstellt eine Instanz
|
|
/// </summary>
|
|
/// <param name="httpContextAccessor">Instanz eines IHttpContextAccessor</param>
|
|
/// <param name="userService">Instanz eines IUserService</param>
|
|
public CurrentTimeZoneService(IHttpContextAccessor httpContextAccessor, IUserService userService)
|
|
{
|
|
_httpContextAccessor = httpContextAccessor;
|
|
_userService = userService;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gibt die Zeitzone des aktuell angemeldeten Benutzers zurück
|
|
/// </summary>
|
|
/// <returns>Zeitzonen-ID</returns>
|
|
public async Task<string> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Konvertiert ein DateTimeOffset in ein Datum das der aktuellen Auswahl des Benutzers entspricht
|
|
/// </summary>
|
|
/// <param name="date">Datetimeoffset das konvertiert werden soll</param>
|
|
/// <returns></returns>
|
|
public async Task<DateTimeOffset> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gibt das Offset des aktuellen Benutzers anhand der gewählten Zeitzone zurück
|
|
/// </summary>
|
|
/// <returns>Offset als Timespan</returns>
|
|
public async Task<TimeSpan> 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();
|
|
}
|
|
}
|
|
}
|