77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
using System.Net.Http.Headers;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace EbayListingTool.Services;
|
|
|
|
public class CategorySuggestion
|
|
{
|
|
public string CategoryId { get; set; } = "";
|
|
public string CategoryName { get; set; } = "";
|
|
public string CategoryPath { get; set; } = "";
|
|
}
|
|
|
|
public class EbayCategoryService
|
|
{
|
|
private readonly EbayAuthService _auth;
|
|
|
|
public EbayCategoryService(EbayAuthService auth)
|
|
{
|
|
_auth = auth;
|
|
}
|
|
|
|
public async Task<List<CategorySuggestion>> GetCategorySuggestionsAsync(string query)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(query) || query.Length < 3)
|
|
return new List<CategorySuggestion>();
|
|
|
|
try
|
|
{
|
|
var token = await _auth.GetValidAccessTokenAsync();
|
|
using var http = new HttpClient();
|
|
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
|
|
http.DefaultRequestHeaders.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY_GB");
|
|
|
|
var url = $"{_auth.BaseUrl}/commerce/taxonomy/v1/category_tree/3/get_category_suggestions" +
|
|
$"?q={Uri.EscapeDataString(query)}";
|
|
|
|
var json = await http.GetStringAsync(url);
|
|
var obj = JObject.Parse(json);
|
|
|
|
var results = new List<CategorySuggestion>();
|
|
var suggestions = obj["categorySuggestions"] as JArray;
|
|
if (suggestions == null) return results;
|
|
|
|
foreach (var s in suggestions.Take(8))
|
|
{
|
|
var cat = s["category"];
|
|
if (cat == null) continue;
|
|
|
|
// Build breadcrumb path
|
|
var ancestors = s["categoryTreeNodeAncestors"] as JArray;
|
|
var path = ancestors != null
|
|
? string.Join(" > ", ancestors.Reverse().Select(a => a["categoryName"]?.ToString() ?? "")) + " > " + cat["categoryName"]
|
|
: cat["categoryName"]?.ToString() ?? "";
|
|
|
|
results.Add(new CategorySuggestion
|
|
{
|
|
CategoryId = cat["categoryId"]?.ToString() ?? "",
|
|
CategoryName = cat["categoryName"]?.ToString() ?? "",
|
|
CategoryPath = path
|
|
});
|
|
}
|
|
|
|
return results;
|
|
}
|
|
catch (InvalidOperationException)
|
|
{
|
|
return new List<CategorySuggestion>();
|
|
}
|
|
}
|
|
|
|
public async Task<string?> GetCategoryIdByKeywordAsync(string keyword)
|
|
{
|
|
var suggestions = await GetCategorySuggestionsAsync(keyword);
|
|
return suggestions.FirstOrDefault()?.CategoryId;
|
|
}
|
|
}
|