DD.WellWorkover.Cloud/AsbCloudInfrastructure/Services/TimeZoneService.cs

71 lines
2.3 KiB
C#
Raw Normal View History

using AsbCloudApp.Data;
2022-04-11 18:00:34 +05:00
using AsbCloudApp.Services;
2021-11-22 11:30:08 +05:00
using System.Net.Http;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
2024-08-19 10:01:07 +05:00
namespace AsbCloudInfrastructure.Services;
public class TimezoneService : ITimezoneService
2021-11-22 11:30:08 +05:00
{
2024-08-19 10:01:07 +05:00
private class TimeZoneInfo
2021-11-22 11:30:08 +05:00
{
2024-08-19 10:01:07 +05:00
public string? Sunrise { get; set; }
public double Lng { get; set; }
public double Lat { get; set; }
public string? CountryCode { get; set; }
public double GmtOffset { get; set; }
public double RawOffset { get; set; }
public string? Sunset { get; set; }
public string? TimezoneId { get; set; }
public double DstOffset { get; set; }
public string? CountryName { get; set; }
public string? Time { get; set; }
}
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
private const string timezoneApiUrl = "http://api.geonames.org/timezoneJSON";
private const string timezoneApiUserName = "asbautodrilling";
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
public SimpleTimezoneDto? GetOrDefaultByCoordinates(double latitude, double longitude)
=> GetOrDefaultByCoordinatesAsync(latitude, longitude, default).Result;
2024-08-19 10:01:07 +05:00
public async Task<SimpleTimezoneDto?> GetOrDefaultByCoordinatesAsync(double latitude, double longitude, CancellationToken token)
{
var lat = latitude.ToString(System.Globalization.CultureInfo.InvariantCulture);
var lng = longitude.ToString(System.Globalization.CultureInfo.InvariantCulture);
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
var url =
$"{timezoneApiUrl}?lat={lat}&lng={lng}&username={timezoneApiUserName}";
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
using var client = new HttpClient();
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
var response = await client.GetAsync(url, token)
.ConfigureAwait(false);
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
var responseJson = await response.Content.ReadAsStringAsync(token)
.ConfigureAwait(false);
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
if (!(responseJson.Contains("timezoneId") && responseJson.Contains("dstOffset")))
return null;
2021-11-22 11:30:08 +05:00
2024-08-19 10:01:07 +05:00
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
var timezoneInfo = JsonSerializer.Deserialize<TimeZoneInfo>(responseJson, options);
2022-04-11 18:00:34 +05:00
2024-08-19 10:01:07 +05:00
if(timezoneInfo is null)
return null;
2023-04-18 16:16:11 +05:00
2024-08-19 10:01:07 +05:00
return new SimpleTimezoneDto
{
Hours = timezoneInfo.DstOffset,
IsOverride = false,
TimezoneId = timezoneInfo.TimezoneId,
};
}
2021-11-22 11:30:08 +05:00
}