using System.Net.Http.Json; using Microsoft.Extensions.Logging; namespace Fengling.RiskControl.Application.Services; public class MemberIntegrationService : IMemberIntegrationService { private readonly HttpClient _httpClient; private readonly ILogger _logger; public MemberIntegrationService(HttpClient httpClient, ILogger logger) { _httpClient = httpClient; _logger = logger; } public async Task GetMemberPointsBalanceAsync(long memberId) { try { var response = await _httpClient.GetAsync($"/api/v1/members/{memberId}/points/balance"); if (!response.IsSuccessStatusCode) { _logger.LogWarning("Failed to get points balance for member {MemberId}: {StatusCode}", memberId, response.StatusCode); return 0; } var result = await response.Content.ReadFromJsonAsync(); return result?.AvailableBalance ?? 0; } catch (Exception ex) { _logger.LogError(ex, "Error getting points balance for member {MemberId}", memberId); return 0; } } public async Task DeductPointsAsync(long memberId, int points, string reason) { try { var response = await _httpClient.PostAsJsonAsync($"/api/v1/members/{memberId}/points/deduct", new { Points = points, Reason = reason }); return response.IsSuccessStatusCode; } catch (Exception ex) { _logger.LogError(ex, "Error deducting points for member {MemberId}", memberId); return false; } } public async Task AddPointsAsync(long memberId, int points, string reason) { try { var response = await _httpClient.PostAsJsonAsync($"/api/v1/members/{memberId}/points/add", new { Points = points, Reason = reason }); return response.IsSuccessStatusCode; } catch (Exception ex) { _logger.LogError(ex, "Error adding points for member {MemberId}", memberId); return false; } } public async Task GetMemberInfoAsync(long memberId) { try { var response = await _httpClient.GetAsync($"/api/v1/members/{memberId}"); if (!response.IsSuccessStatusCode) return null; return await response.Content.ReadFromJsonAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting member info for {MemberId}", memberId); return null; } } }