fix: crash on unavailable source api (#4)

* fix: crash on unavailable source api

the screen not updating because of errors

* Change temperature format if null

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit was merged in pull request #4.
This commit is contained in:
2025-08-14 17:55:40 +02:00
committed by GitHub
parent 8284ae9695
commit 32b136d4cc
11 changed files with 338 additions and 96 deletions

View File

@@ -18,10 +18,10 @@ public static class ContractExtensions
/// A <see cref="WeatherInformation"/> object populated with current weather, aurora probability, and forecast information.
/// </returns>
public static WeatherInformation ToContract(
this WeatherData weather,
string locationName,
this WeatherData? weather,
string? locationName,
AuroraForecastApiResponse? auroraForecast,
List<Models.Forecast> forecasts)
List<Models.Forecast>? forecasts)
{
return new WeatherInformation
{
@@ -58,23 +58,23 @@ public static class ContractExtensions
},
AuroraProbability = new Probability
{
Date = auroraForecast.Date,
Date = auroraForecast?.Date ?? DateTime.Now,
Calculated = new CalculatedProbability
{
Value = auroraForecast.Probability.Calculated.Value,
Colour = auroraForecast.Probability.Calculated.Colour,
Lat = auroraForecast.Probability.Calculated.Lat,
Long = auroraForecast.Probability.Calculated.Long
Value = auroraForecast?.Probability.Calculated.Value ?? 0,
Colour = auroraForecast?.Probability.Calculated.Colour ?? string.Empty,
Lat = auroraForecast?.Probability.Calculated.Lat ?? 0,
Long = auroraForecast?.Probability.Calculated.Long ?? 0
},
Colour = auroraForecast.Probability.Colour,
Value = auroraForecast.Probability.Value,
Colour = auroraForecast?.Probability.Colour ?? string.Empty,
Value = auroraForecast?.Probability.Value.ToString() ?? "No data",
HighestProbability = new Highest
{
Colour = auroraForecast.Probability.Highest.Colour,
Lat = auroraForecast.Probability.Highest.Lat,
Long = auroraForecast.Probability.Highest.Long,
Value = auroraForecast.Probability.Highest.Value,
Date = auroraForecast.Probability.Highest.Date
Colour = auroraForecast?.Probability.Highest.Colour ?? string.Empty,
Lat = auroraForecast?.Probability.Highest.Lat ?? 0,
Long = auroraForecast?.Probability.Highest.Long ?? 0,
Value = auroraForecast?.Probability.Highest.Value ?? 0,
Date = auroraForecast?.Probability.Highest.Date ?? DateTime.Now
}
}
},

View File

@@ -0,0 +1,22 @@
using MediatR;
namespace HomeApi.Extensions;
public static class MediatorExtensions
{
public static async Task<T?> TrySendAsync<T>(
this IMediator mediator,
IRequest<T> request,
CancellationToken cancellationToken) where T : class
{
try
{
return await mediator.Send(request, cancellationToken);
}
catch (OperationCanceledException) { throw; }
catch
{
return null;
}
}
}

View File

@@ -0,0 +1,23 @@
namespace HomeApi.Extensions;
public static class ServiceCallExtensions
{
public static async Task<TResult?> TryCallAsync<TService, TResult>(
this TService service,
Func<TService, Task<TResult>> action,
ILogger logger,
string errorMessage)
where TResult : class?
{
try
{
return await action(service);
}
catch (OperationCanceledException) { throw; }
catch (Exception exception)
{
logger.LogError(exception, errorMessage);
return null;
}
}
}