gehgassi_backend/gehGassi.Web/Services/CurrentTimeZoneService.cs

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