From 5807e1b35eeeee5c4e660d09e52d8b3228a62dcb Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Mon, 29 Jun 2026 15:43:15 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20HttpClientFactory=20=EC=83=9D=EB=AA=85?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=20=EB=B6=88=EC=9D=BC=EC=B9=98(Scope=20Captur?= =?UTF-8?q?e)=20=EB=AC=B8=EC=A0=9C=EB=A5=BC=20=ED=9A=8C=ED=94=BC=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20CRM=20API=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=96=B8=ED=8A=B8=EC=97=90=20=EC=A7=81=EC=A0=91=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=A3=BC=EC=9E=85=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=84=EB=A9=B4=20=EA=B0=9C=ED=8E=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TaxBaik.Web/Program.cs | 15 +++++---------- .../IConsultingActivityBrowserClient.cs | 16 +++++++++++++++- .../AdminClients/IContractBrowserClient.cs | 18 +++++++++++++++++- .../IRevenueTrackingBrowserClient.cs | 18 +++++++++++++++++- .../ITaxFilingScheduleBrowserClient.cs | 17 ++++++++++++++++- .../AdminClients/ITaxProfileBrowserClient.cs | 18 +++++++++++++++++- TaxBaik.Web/Services/AdminDashboardClient.cs | 6 +++--- 7 files changed, 90 insertions(+), 18 deletions(-) diff --git a/TaxBaik.Web/Program.cs b/TaxBaik.Web/Program.cs index 64c20cc..9fe1141 100644 --- a/TaxBaik.Web/Program.cs +++ b/TaxBaik.Web/Program.cs @@ -246,32 +246,27 @@ builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri(apiBaseUrl); -}) - .AddHttpMessageHandler(); +}); builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri(apiBaseUrl); -}) - .AddHttpMessageHandler(); +}); builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri(apiBaseUrl); -}) - .AddHttpMessageHandler(); +}); builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri(apiBaseUrl); -}) - .AddHttpMessageHandler(); +}); builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri(apiBaseUrl); -}) - .AddHttpMessageHandler(); +}); // UI & 캐시 (MudBlazor Theme Customization) builder.Services.AddMudServices(config => diff --git a/TaxBaik.Web/Services/AdminClients/IConsultingActivityBrowserClient.cs b/TaxBaik.Web/Services/AdminClients/IConsultingActivityBrowserClient.cs index 5096236..503d53b 100644 --- a/TaxBaik.Web/Services/AdminClients/IConsultingActivityBrowserClient.cs +++ b/TaxBaik.Web/Services/AdminClients/IConsultingActivityBrowserClient.cs @@ -14,15 +14,24 @@ public interface IConsultingActivityBrowserClient Task DeleteAsync(int id, CancellationToken ct = default); } -public class ConsultingActivityBrowserClient(HttpClient httpClient, ILogger logger) +public class ConsultingActivityBrowserClient(HttpClient httpClient, ITokenStore tokenStore, ILogger logger) : IConsultingActivityBrowserClient { private const string BaseUrl = "/api/consultingactivity"; + private void EnsureAuthHeader() + { + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) + httpClient.DefaultRequestHeaders.Authorization = new("Bearer", tokenStore.AccessToken); + else + httpClient.DefaultRequestHeaders.Authorization = null; + } + public async Task> GetAllAsync(CancellationToken ct = default) { try { + EnsureAuthHeader(); return await httpClient.GetFromJsonAsync>($"{BaseUrl}", ct) ?? []; } catch (Exception ex) @@ -36,6 +45,7 @@ public class ConsultingActivityBrowserClient(HttpClient httpClient, ILogger>($"{BaseUrl}/client/{clientId}", ct) ?? []; } catch (Exception ex) @@ -49,6 +59,7 @@ public class ConsultingActivityBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/pending-followups", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -66,6 +77,7 @@ public class ConsultingActivityBrowserClient(HttpClient httpClient, ILogger logger) +public class ContractBrowserClient(HttpClient httpClient, ITokenStore tokenStore, ILogger logger) : IContractBrowserClient { private const string BaseUrl = "/api/contract"; + private void EnsureAuthHeader() + { + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) + httpClient.DefaultRequestHeaders.Authorization = new("Bearer", tokenStore.AccessToken); + else + httpClient.DefaultRequestHeaders.Authorization = null; + } + public async Task> GetAllAsync(CancellationToken ct = default) { try { + EnsureAuthHeader(); return await httpClient.GetFromJsonAsync>($"{BaseUrl}", ct) ?? []; } catch (Exception ex) @@ -38,6 +47,7 @@ public class ContractBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/{id}", ct); } catch (Exception ex) @@ -51,6 +61,7 @@ public class ContractBrowserClient(HttpClient httpClient, ILogger>($"{BaseUrl}/client/{clientId}", ct) ?? []; } catch (Exception ex) @@ -64,6 +75,7 @@ public class ContractBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/active", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -80,6 +92,7 @@ public class ContractBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/expiring?daysAhead={daysAhead}", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -96,6 +109,7 @@ public class ContractBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/mrr", ct); if (response.TryGetProperty("mrr", out var mrrValue)) return System.Text.Json.JsonSerializer.Deserialize(mrrValue.GetRawText()); @@ -113,6 +127,7 @@ public class ContractBrowserClient(HttpClient httpClient, ILogger logger) +public class RevenueTrackingBrowserClient(HttpClient httpClient, ITokenStore tokenStore, ILogger logger) : IRevenueTrackingBrowserClient { private const string BaseUrl = "/api/revenuetracking"; + private void EnsureAuthHeader() + { + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) + httpClient.DefaultRequestHeaders.Authorization = new("Bearer", tokenStore.AccessToken); + else + httpClient.DefaultRequestHeaders.Authorization = null; + } + public async Task> GetAllAsync(CancellationToken ct = default) { try { + EnsureAuthHeader(); return await httpClient.GetFromJsonAsync>($"{BaseUrl}", ct) ?? []; } catch (Exception ex) @@ -38,6 +47,7 @@ public class RevenueTrackingBrowserClient(HttpClient httpClient, ILogger>($"{BaseUrl}/client/{clientId}", ct) ?? []; } catch (Exception ex) @@ -51,6 +61,7 @@ public class RevenueTrackingBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/pending", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -67,6 +78,7 @@ public class RevenueTrackingBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/monthly?year={year}&month={month}", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -83,6 +95,7 @@ public class RevenueTrackingBrowserClient(HttpClient httpClient, ILogger( $"{BaseUrl}/total?startDate={startDate:yyyy-MM-dd}&endDate={endDate:yyyy-MM-dd}", ct); if (response.TryGetProperty("total", out var totalValue)) @@ -101,6 +114,7 @@ public class RevenueTrackingBrowserClient(HttpClient httpClient, ILogger logger) +public class TaxFilingScheduleBrowserClient(HttpClient httpClient, ITokenStore tokenStore, ILogger logger) : ITaxFilingScheduleBrowserClient { private const string BaseUrl = "/api/taxfilingschedule"; + private void EnsureAuthHeader() + { + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) + httpClient.DefaultRequestHeaders.Authorization = new("Bearer", tokenStore.AccessToken); + else + httpClient.DefaultRequestHeaders.Authorization = null; + } + public async Task> GetAllAsync(CancellationToken ct = default) { try { + EnsureAuthHeader(); return await httpClient.GetFromJsonAsync>($"{BaseUrl}", ct) ?? []; } catch (Exception ex) @@ -37,6 +46,7 @@ public class TaxFilingScheduleBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/{id}", ct); } catch (Exception ex) @@ -50,6 +60,7 @@ public class TaxFilingScheduleBrowserClient(HttpClient httpClient, ILogger>($"{BaseUrl}/client/{clientId}", ct) ?? []; } catch (Exception ex) @@ -63,6 +74,7 @@ public class TaxFilingScheduleBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/upcoming?daysAhead={daysAhead}", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -80,6 +92,7 @@ public class TaxFilingScheduleBrowserClient(HttpClient httpClient, ILogger logger) : ITaxProfileBrowserClient +public class TaxProfileBrowserClient(HttpClient httpClient, ITokenStore tokenStore, ILogger logger) : ITaxProfileBrowserClient { private const string BaseUrl = "/api/taxprofile"; + private void EnsureAuthHeader() + { + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) + httpClient.DefaultRequestHeaders.Authorization = new("Bearer", tokenStore.AccessToken); + else + httpClient.DefaultRequestHeaders.Authorization = null; + } + public async Task> GetAllAsync(CancellationToken ct = default) { try { + EnsureAuthHeader(); return await httpClient.GetFromJsonAsync>($"{BaseUrl}", ct) ?? []; } catch (Exception ex) @@ -38,6 +47,7 @@ public class TaxProfileBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/{id}", ct); } catch (Exception ex) @@ -51,6 +61,7 @@ public class TaxProfileBrowserClient(HttpClient httpClient, ILogger>($"{BaseUrl}/client/{clientId}", ct) ?? []; } catch (Exception ex) @@ -64,6 +75,7 @@ public class TaxProfileBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/high-risk", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -80,6 +92,7 @@ public class TaxProfileBrowserClient(HttpClient httpClient, ILogger($"{BaseUrl}/upcoming-filings?daysAhead={daysAhead}", ct); if (response.TryGetProperty("data", out var data)) return System.Text.Json.JsonSerializer.Deserialize>(data.GetRawText()) ?? []; @@ -97,6 +110,7 @@ public class TaxProfileBrowserClient(HttpClient httpClient, ILogger GetSummaryAsync(CancellationToken ct = default)