From fcbc66f8f551d5c63bede785cb2795c806945b3b Mon Sep 17 00:00:00 2001 From: OlgunR Date: Mon, 20 Apr 2026 13:50:53 +0200 Subject: [PATCH] Add CancellationToken support to all API client methods All API client interfaces and implementations now accept an optional CancellationToken parameter for each method. This enables consumers to cancel HTTP requests, improving responsiveness and resource management. No changes were made to core logic or return types; only method signatures and HttpClient calls were updated to support cancellation. --- .../Services/CatalogApiClient.cs | 20 +++++++++---------- .../Services/DashboardApiClient.cs | 4 ++-- .../Services/ICatalogApiClient.cs | 10 +++++----- .../Services/IDashboardApiClient.cs | 2 +- .../Services/ILayoutApiClient.cs | 6 +++--- .../Services/IMassDataApiClient.cs | 8 ++++---- .../Services/LayoutApiClient.cs | 12 +++++------ .../Services/MassDataApiClient.cs | 16 +++++++-------- 8 files changed, 39 insertions(+), 39 deletions(-) diff --git a/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs b/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs index 0c97a9f..a1ffc8d 100644 --- a/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/CatalogApiClient.cs @@ -14,20 +14,20 @@ public class CatalogApiClient : ICatalogApiClient _httpClient = httpClient; } - public async Task> GetAllAsync() + public async Task> GetAllAsync(CancellationToken ct = default) { - var result = await _httpClient.GetFromJsonAsync>(Endpoint); + var result = await _httpClient.GetFromJsonAsync>(Endpoint, ct); return result ?? new List(); } - public async Task GetByIdAsync(int id) + public async Task GetByIdAsync(int id, CancellationToken ct = default) { - return await _httpClient.GetFromJsonAsync($"{Endpoint}/{id}"); + return await _httpClient.GetFromJsonAsync($"{Endpoint}/{id}", ct); } - public async Task> CreateAsync(CatalogWriteDto dto) + public async Task> CreateAsync(CatalogWriteDto dto, CancellationToken ct = default) { - var response = await _httpClient.PostAsJsonAsync(Endpoint, dto); + var response = await _httpClient.PostAsJsonAsync(Endpoint, dto, ct); if (response.IsSuccessStatusCode) { var payload = await response.Content.ReadFromJsonAsync(); @@ -38,9 +38,9 @@ public class CatalogApiClient : ICatalogApiClient return ApiResult.Fail(error); } - public async Task> UpdateAsync(int id, CatalogWriteDto dto) + public async Task> UpdateAsync(int id, CatalogWriteDto dto, CancellationToken ct = default) { - var response = await _httpClient.PutAsJsonAsync($"{Endpoint}/{id}", dto); + var response = await _httpClient.PutAsJsonAsync($"{Endpoint}/{id}", dto, ct); if (response.IsSuccessStatusCode) { return ApiResult.Ok(true); @@ -50,9 +50,9 @@ public class CatalogApiClient : ICatalogApiClient return ApiResult.Fail(error); } - public async Task> DeleteAsync(int id) + public async Task> DeleteAsync(int id, CancellationToken ct = default) { - var response = await _httpClient.DeleteAsync($"{Endpoint}/{id}"); + var response = await _httpClient.DeleteAsync($"{Endpoint}/{id}", ct); if (response.IsSuccessStatusCode) { return ApiResult.Ok(true); diff --git a/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs b/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs index 9ea41f8..da3e51f 100644 --- a/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/DashboardApiClient.cs @@ -13,9 +13,9 @@ public class DashboardApiClient : IDashboardApiClient _httpClient = httpClient; } - public async Task> GetAllAsync() + public async Task> GetAllAsync(CancellationToken ct = default) { - var result = await _httpClient.GetFromJsonAsync>(Endpoint); + var result = await _httpClient.GetFromJsonAsync>(Endpoint, ct); return result ?? new List(); } } diff --git a/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs b/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs index c307205..bd99820 100644 --- a/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/ICatalogApiClient.cs @@ -4,9 +4,9 @@ namespace DbFirst.BlazorWebApp.Services; public interface ICatalogApiClient { - Task> GetAllAsync(); - Task GetByIdAsync(int id); - Task> CreateAsync(CatalogWriteDto dto); - Task> UpdateAsync(int id, CatalogWriteDto dto); - Task> DeleteAsync(int id); + Task> GetAllAsync(CancellationToken ct = default); + Task GetByIdAsync(int id, CancellationToken ct = default); + Task> CreateAsync(CatalogWriteDto dto, CancellationToken ct = default); + Task> UpdateAsync(int id, CatalogWriteDto dto, CancellationToken ct = default); + Task> DeleteAsync(int id, CancellationToken ct = default); } \ No newline at end of file diff --git a/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs b/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs index fba9d7b..cb77f3d 100644 --- a/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/IDashboardApiClient.cs @@ -4,6 +4,6 @@ namespace DbFirst.BlazorWebApp.Services { public interface IDashboardApiClient { - Task> GetAllAsync(); + Task> GetAllAsync(CancellationToken ct = default); } } diff --git a/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs b/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs index a39116e..a82ea8f 100644 --- a/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/ILayoutApiClient.cs @@ -4,8 +4,8 @@ namespace DbFirst.BlazorWebApp.Services { public interface ILayoutApiClient { - Task GetAsync(string layoutType, string layoutKey, string userName); - Task UpsertAsync(LayoutDto dto); - Task DeleteAsync(string layoutType, string layoutKey, string userName); + Task GetAsync(string layoutType, string layoutKey, string userName, CancellationToken ct = default); + Task UpsertAsync(LayoutDto dto, CancellationToken ct = default); + Task DeleteAsync(string layoutType, string layoutKey, string userName, CancellationToken ct = default); } } diff --git a/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs b/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs index 13f3e95..4d23877 100644 --- a/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/IMassDataApiClient.cs @@ -4,9 +4,9 @@ namespace DbFirst.BlazorWebApp.Services { public interface IMassDataApiClient { - Task GetCountAsync(); - Task> GetAllAsync(int? skip, int? take); - Task> UpsertAsync(MassDataWriteDto dto); - Task GetByCustomerNameAsync(string customerName); + Task GetCountAsync(CancellationToken ct = default); + Task> GetAllAsync(int? skip, int? take, CancellationToken ct = default); + Task> UpsertAsync(MassDataWriteDto dto, CancellationToken ct = default); + Task GetByCustomerNameAsync(string customerName, CancellationToken ct = default); } } diff --git a/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs b/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs index ca83973..d1e5202 100644 --- a/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/LayoutApiClient.cs @@ -13,10 +13,10 @@ public class LayoutApiClient : ILayoutApiClient _httpClient = httpClient; } - public async Task GetAsync(string layoutType, string layoutKey, string userName) + public async Task GetAsync(string layoutType, string layoutKey, string userName, CancellationToken ct = default) { var url = $"{Endpoint}?layoutType={Uri.EscapeDataString(layoutType)}&layoutKey={Uri.EscapeDataString(layoutKey)}&userName={Uri.EscapeDataString(userName)}"; - var response = await _httpClient.GetAsync(url); + var response = await _httpClient.GetAsync(url, ct); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) { return null; @@ -26,9 +26,9 @@ public class LayoutApiClient : ILayoutApiClient return await response.Content.ReadFromJsonAsync(); } - public async Task UpsertAsync(LayoutDto dto) + public async Task UpsertAsync(LayoutDto dto, CancellationToken ct = default) { - var response = await _httpClient.PostAsJsonAsync(Endpoint, dto); + var response = await _httpClient.PostAsJsonAsync(Endpoint, dto, ct); if (!response.IsSuccessStatusCode) { var detail = await ApiClientHelper.ReadErrorAsync(response); @@ -39,10 +39,10 @@ public class LayoutApiClient : ILayoutApiClient return payload ?? dto; } - public async Task DeleteAsync(string layoutType, string layoutKey, string userName) + public async Task DeleteAsync(string layoutType, string layoutKey, string userName, CancellationToken ct = default) { var url = $"{Endpoint}?layoutType={Uri.EscapeDataString(layoutType)}&layoutKey={Uri.EscapeDataString(layoutKey)}&userName={Uri.EscapeDataString(userName)}"; - var response = await _httpClient.DeleteAsync(url); + var response = await _httpClient.DeleteAsync(url, ct); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) { return; diff --git a/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs b/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs index 1f45682..f054252 100644 --- a/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs +++ b/DbFirst.BlazorWebApp/Services/MassDataApiClient.cs @@ -13,13 +13,13 @@ public class MassDataApiClient : IMassDataApiClient _httpClient = httpClient; } - public async Task GetCountAsync() + public async Task GetCountAsync(CancellationToken ct = default) { - var result = await _httpClient.GetFromJsonAsync("api/massdata/count"); + var result = await _httpClient.GetFromJsonAsync("api/massdata/count", ct); return result ?? 0; } - public async Task> GetAllAsync(int? skip, int? take) + public async Task> GetAllAsync(int? skip, int? take, CancellationToken ct = default) { var query = new List(); if (skip.HasValue) @@ -32,13 +32,13 @@ public class MassDataApiClient : IMassDataApiClient } var url = query.Count == 0 ? Endpoint : $"{Endpoint}?{string.Join("&", query)}"; - var result = await _httpClient.GetFromJsonAsync>(url); + var result = await _httpClient.GetFromJsonAsync>(url, ct); return result ?? new List(); } - public async Task> UpsertAsync(MassDataWriteDto dto) + public async Task> UpsertAsync(MassDataWriteDto dto, CancellationToken ct = default) { - var response = await _httpClient.PostAsJsonAsync($"{Endpoint}/upsert", dto); + var response = await _httpClient.PostAsJsonAsync($"{Endpoint}/upsert", dto, ct); if (response.IsSuccessStatusCode) { var payload = await response.Content.ReadFromJsonAsync(); @@ -49,14 +49,14 @@ public class MassDataApiClient : IMassDataApiClient return ApiResult.Fail(error); } - public async Task GetByCustomerNameAsync(string customerName) + public async Task GetByCustomerNameAsync(string customerName, CancellationToken ct = default) { if (string.IsNullOrWhiteSpace(customerName)) { return null; } - var response = await _httpClient.GetAsync($"{Endpoint}/{Uri.EscapeDataString(customerName)}"); + var response = await _httpClient.GetAsync($"{Endpoint}/{Uri.EscapeDataString(customerName)}", ct); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) { return null;