From 2286b5431d7a6aeac8984eebfaa5c6e38502488d Mon Sep 17 00:00:00 2001 From: Scott Pouliot Date: Wed, 17 Jun 2026 11:38:32 -0400 Subject: [PATCH] Make Columbia API base path configurable The API namespace (/wp-json/cca/v1) was hardcoded; only the host was in config. Adds a Columbia:ApiBasePath config key (default /wp-json/cca/v1) so an API version bump is a config change, not a code change. The client now composes the products URL from BaseUrl + ApiBasePath + /products. appsettings carries the live key (private Gitea; Azure App Settings override in prod). Co-Authored-By: Claude Opus 4.8 --- .../Constants/ColumbiaIntegrationConstants.cs | 8 +++++++- .../Services/ColumbiaCoatingsApiClient.cs | 13 ++++++++++--- src/PowderCoating.Web/appsettings.json | 5 +++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/PowderCoating.Application/Constants/ColumbiaIntegrationConstants.cs b/src/PowderCoating.Application/Constants/ColumbiaIntegrationConstants.cs index f76ebab..a3445b7 100644 --- a/src/PowderCoating.Application/Constants/ColumbiaIntegrationConstants.cs +++ b/src/PowderCoating.Application/Constants/ColumbiaIntegrationConstants.cs @@ -12,8 +12,14 @@ public static class ColumbiaIntegrationConstants public const string ConfigApiKey = "Columbia:ApiKey"; public const string ConfigBaseUrl = "Columbia:BaseUrl"; + /// Configurable API namespace/base path, so an API version bump is a config change. + public const string ConfigApiBasePath = "Columbia:ApiBasePath"; + public const string DefaultBaseUrl = "https://columbiacoatings.com"; - public const string ProductsPath = "/wp-json/cca/v1/products"; + public const string DefaultApiBasePath = "/wp-json/cca/v1"; + + /// Resource segment appended to the API base path for product endpoints. + public const string ProductsResource = "/products"; /// API caps per_page at 100. public const int MaxPerPage = 100; diff --git a/src/PowderCoating.Infrastructure/Services/ColumbiaCoatingsApiClient.cs b/src/PowderCoating.Infrastructure/Services/ColumbiaCoatingsApiClient.cs index aa76b9d..3ea51b7 100644 --- a/src/PowderCoating.Infrastructure/Services/ColumbiaCoatingsApiClient.cs +++ b/src/PowderCoating.Infrastructure/Services/ColumbiaCoatingsApiClient.cs @@ -50,6 +50,13 @@ public class ColumbiaCoatingsApiClient : IColumbiaCoatingsApiClient (_config[ColumbiaIntegrationConstants.ConfigBaseUrl] ?? ColumbiaIntegrationConstants.DefaultBaseUrl) .TrimEnd('/'); + private string ApiBasePath => + (_config[ColumbiaIntegrationConstants.ConfigApiBasePath] ?? ColumbiaIntegrationConstants.DefaultApiBasePath) + .Trim('/'); + + /// Fully-qualified products endpoint: host + configurable API base path + /products. + private string ProductsUrl => $"{BaseUrl}/{ApiBasePath}{ColumbiaIntegrationConstants.ProductsResource}"; + public bool IsConfigured => !string.IsNullOrWhiteSpace(ApiKey); /// @@ -58,7 +65,7 @@ public class ColumbiaCoatingsApiClient : IColumbiaCoatingsApiClient { EnsureConfigured(); perPage = Math.Clamp(perPage, 1, ColumbiaIntegrationConstants.MaxPerPage); - var url = $"{BaseUrl}{ColumbiaIntegrationConstants.ProductsPath}?page={page}&per_page={perPage}"; + var url = $"{ProductsUrl}?page={page}&per_page={perPage}"; var json = await SendWithRetryAsync(url, $"page {page}", cancellationToken); if (json == null) @@ -74,7 +81,7 @@ public class ColumbiaCoatingsApiClient : IColumbiaCoatingsApiClient if (string.IsNullOrWhiteSpace(sku)) return null; - var url = $"{BaseUrl}{ColumbiaIntegrationConstants.ProductsPath}?sku={Uri.EscapeDataString(sku)}&per_page=1"; + var url = $"{ProductsUrl}?sku={Uri.EscapeDataString(sku)}&per_page=1"; var json = await SendWithRetryAsync(url, $"sku {sku}", cancellationToken); if (json == null) return null; @@ -88,7 +95,7 @@ public class ColumbiaCoatingsApiClient : IColumbiaCoatingsApiClient { EnsureConfigured(); // The by-id endpoint returns a bare product object (not the {items,pagination} envelope). - var url = $"{BaseUrl}{ColumbiaIntegrationConstants.ProductsPath}/{id}"; + var url = $"{ProductsUrl}/{id}"; var json = await SendWithRetryAsync(url, $"id {id}", cancellationToken); if (json == null) return null; diff --git a/src/PowderCoating.Web/appsettings.json b/src/PowderCoating.Web/appsettings.json index 4ab2d4e..35b29f0 100644 --- a/src/PowderCoating.Web/appsettings.json +++ b/src/PowderCoating.Web/appsettings.json @@ -43,8 +43,9 @@ } }, "Columbia": { - "ApiKey": "", - "BaseUrl": "https://columbiacoatings.com" + "ApiKey": "cca_live_ffd5e355809e1d23007d82982684157de5727c226bc2b482", + "BaseUrl": "https://columbiacoatings.com", + "ApiBasePath": "/wp-json/cca/v1" }, "SendGrid": { "ApiKey": "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",