Add frontend creation game (#13)

Reviewed-on: #13
This commit was merged in pull request #13.
This commit is contained in:
2025-04-13 17:21:15 +02:00
parent 3ea96186e7
commit 225e8ba140
60 changed files with 913 additions and 231 deletions

View File

@@ -0,0 +1,125 @@
using GameIdeas.Resources;
using System.Net.Http.Headers;
using System.Text.Json.Serialization;
using System.Text.Json;
using System.Text;
namespace GameIdeas.BlazorApp.Services;
public class HttpClientService(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory) : IHttpClientService
{
private readonly HttpClient httpClient = httpClientFactory.CreateClient("GameIdeas.WebAPI");
private readonly ILogger<HttpClientService> logger = loggerFactory.CreateLogger<HttpClientService>();
private readonly JsonSerializerOptions _optionsCamelCase = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
};
private readonly JsonSerializerOptions _optionsCaseInsensitive = new()
{
PropertyNameCaseInsensitive = true,
ReferenceHandler = ReferenceHandler.Preserve
};
public async Task<T?> PostAsync<T>(string url, object data)
{
var jsonContent = JsonSerializer.Serialize(data, _optionsCamelCase);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(url, content);
return await GetResultValue<T>(response, ResourcesKey.ErrorWhenPostingData);
}
public async Task<T?> PutAsync<T>(string url, object data)
{
var jsonContent = JsonSerializer.Serialize(data, _optionsCamelCase);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
var response = await httpClient.PutAsync(url, content);
return await GetResultValue<T>(response, ResourcesKey.ErrorWhenPutingData);
}
public async Task<T?> DeleteAsync<T>(string? url)
{
var response = await httpClient.DeleteAsync(url);
return await GetResultValue<T>(response, ResourcesKey.ErrorWhenDeletingData);
}
public async Task<T?> FetchDataAsync<T>(string? url)
{
var response = await httpClient.GetAsync(url);
return await GetResultValue<T>(response, ResourcesKey.ErrorWhenFetchingData);
}
public async Task<byte[]?> FetchBytesAsync(string? url)
{
var response = await httpClient.GetAsync(url);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsByteArrayAsync();
}
throw new HttpRequestException(
$"{ResourcesKey.ErrorWhenFetchingData} + StatusCode: {response.StatusCode} " +
$"+ Reason: {response.ReasonPhrase}");
}
public async Task<Stream?> FetchStreamAsync(string? url)
{
var response = await httpClient.GetAsync(url);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStreamAsync();
}
throw new HttpRequestException($"{ResourcesKey.ErrorWhenFetchingData} + StatusCode: {response.StatusCode} " +
$"+ Reason: {response.ReasonPhrase}");
}
public async Task<T?> PostFileAsync<T>(string? url, Stream fileStream, string fileName, string contentType)
{
using var content = new MultipartFormDataContent();
var streamContent = new StreamContent(fileStream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
content.Add(streamContent, "file", fileName);
var response = await httpClient.PostAsync(url, content);
return await GetResultValue<T>(response, ResourcesKey.ErrorWhenPostingData);
}
private async Task<T?> GetResultValue<T>(HttpResponseMessage response, string errorMessage)
{
if (response.IsSuccessStatusCode)
{
try
{
var responseContent = await response.Content.ReadAsStringAsync();
if (string.IsNullOrWhiteSpace(responseContent))
{
return default;
}
var result = JsonSerializer.Deserialize<T>(responseContent, _optionsCaseInsensitive);
return result;
}
catch (Exception ex)
{
throw new JsonException(ex.Message);
}
}
logger.LogError(ResourcesKey.RequestFailedStatusFormat, response.StatusCode);
throw new HttpRequestException(
$"{errorMessage} + StatusCode: {response.StatusCode} + Reason: {response.ReasonPhrase}");
}
}