Update payload

This commit is contained in:
2025-07-17 01:59:37 +07:00
parent 3bd22922c7
commit 4b18d43b3f
3 changed files with 45 additions and 29 deletions

View File

@@ -1,3 +1,5 @@
using Managing.Domain.Users;
namespace Managing.Application.Abstractions.Services; namespace Managing.Application.Abstractions.Services;
public interface IKaigenService public interface IKaigenService
@@ -5,16 +7,16 @@ public interface IKaigenService
/// <summary> /// <summary>
/// Debits user credits for a backtest operation /// Debits user credits for a backtest operation
/// </summary> /// </summary>
/// <param name="userName">The username to debit</param> /// <param name="user">The user to debit</param>
/// <param name="debitAmount">The amount to debit</param> /// <param name="debitAmount">The amount to debit</param>
/// <returns>The request ID for tracking</returns> /// <returns>The request ID for tracking</returns>
Task<string> DebitUserCreditsAsync(string userName, decimal debitAmount); Task<string> DebitUserCreditsAsync(User user, decimal debitAmount);
/// <summary> /// <summary>
/// Refunds user credits if debit operation fails /// Refunds user credits if debit operation fails
/// </summary> /// </summary>
/// <param name="requestId">The original request ID from debit operation</param> /// <param name="requestId">The original request ID from debit operation</param>
/// <param name="userName">The username to refund</param> /// <param name="user">The user to refund</param>
/// <returns>True if refund was successful</returns> /// <returns>True if refund was successful</returns>
Task<bool> RefundUserCreditsAsync(string requestId, string userName); Task<bool> RefundUserCreditsAsync(string requestId, User user);
} }

View File

@@ -92,7 +92,7 @@ namespace Managing.Application.Backtesting
{ {
try try
{ {
creditRequestId = await _kaigenService.DebitUserCreditsAsync(user.Name, 3); creditRequestId = await _kaigenService.DebitUserCreditsAsync(user, 3);
_logger.LogInformation("Successfully debited credits for user {UserName} with request ID {RequestId}", _logger.LogInformation("Successfully debited credits for user {UserName} with request ID {RequestId}",
user.Name, creditRequestId); user.Name, creditRequestId);
} }
@@ -127,7 +127,7 @@ namespace Managing.Application.Backtesting
{ {
try try
{ {
var refundSuccess = await _kaigenService.RefundUserCreditsAsync(creditRequestId, user.Name); var refundSuccess = await _kaigenService.RefundUserCreditsAsync(creditRequestId, user);
if (refundSuccess) if (refundSuccess)
{ {
_logger.LogInformation("Successfully refunded credits for user {UserName} after backtest failure", user.Name); _logger.LogInformation("Successfully refunded credits for user {UserName} after backtest failure", user.Name);

View File

@@ -1,6 +1,7 @@
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.Json; using System.Text.Json;
using Managing.Application.Abstractions.Services; using Managing.Application.Abstractions.Services;
using Managing.Domain.Users;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Nethereum.Signer; using Nethereum.Signer;
@@ -56,22 +57,15 @@ public class KaigenService : IKaigenService
} }
} }
public async Task<string> DebitUserCreditsAsync(string userName, decimal debitAmount) public async Task<string> DebitUserCreditsAsync(User user, decimal debitAmount)
{ {
try try
{ {
var walletAddress = GetUserWalletAddress(user);
var requestId = Guid.NewGuid().ToString(); var requestId = Guid.NewGuid().ToString();
// Create the payload for signing
var payload = new
{
RequestId = requestId,
UserName = userName,
DebitAmount = debitAmount
};
// Create the message to sign (concatenate the values) // Create the message to sign (concatenate the values)
var message = $"{requestId}{userName}{debitAmount}"; var message = $"{requestId}{walletAddress}{debitAmount}";
// Sign the message // Sign the message
var signature = SignMessage(message, _settings.PrivateKey); var signature = SignMessage(message, _settings.PrivateKey);
@@ -80,13 +74,13 @@ public class KaigenService : IKaigenService
var requestPayload = new var requestPayload = new
{ {
requestId = requestId, requestId = requestId,
userName = userName, walletAddress = walletAddress,
debitAmount = debitAmount, debitAmount = debitAmount,
signature = signature signature = signature
}; };
_logger.LogInformation("Debiting {Amount} credits for user {UserName} with request ID {RequestId}", _logger.LogInformation("Debiting {Amount} credits for user {UserName} (wallet: {WalletAddress}) with request ID {RequestId}",
debitAmount, userName, requestId); debitAmount, user.Name, walletAddress, requestId);
var response = await _httpClient.PutAsJsonAsync( var response = await _httpClient.PutAsJsonAsync(
$"{_settings.BaseUrl}{_settings.DebitEndpoint}", $"{_settings.BaseUrl}{_settings.DebitEndpoint}",
@@ -102,24 +96,26 @@ public class KaigenService : IKaigenService
} }
var result = await response.Content.ReadFromJsonAsync<KaigenResponse>(_jsonOptions); var result = await response.Content.ReadFromJsonAsync<KaigenResponse>(_jsonOptions);
_logger.LogInformation("Successfully debited {Amount} credits for user {UserName}", _logger.LogInformation("Successfully debited {Amount} credits for user {UserName} (wallet: {WalletAddress})",
debitAmount, userName); debitAmount, user.Name, walletAddress);
return requestId; return requestId;
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error debiting credits for user {UserName}", userName); _logger.LogError(ex, "Error debiting credits for user {UserName}", user.Name);
throw; throw;
} }
} }
public async Task<bool> RefundUserCreditsAsync(string requestId, string userName) public async Task<bool> RefundUserCreditsAsync(string requestId, User user)
{ {
try try
{ {
var walletAddress = GetUserWalletAddress(user);
// Create the message to sign (concatenate the values) // Create the message to sign (concatenate the values)
var message = $"{requestId}{userName}"; var message = $"{requestId}{walletAddress}";
// Sign the message // Sign the message
var signature = SignMessage(message, _settings.PrivateKey); var signature = SignMessage(message, _settings.PrivateKey);
@@ -128,12 +124,12 @@ public class KaigenService : IKaigenService
var requestPayload = new var requestPayload = new
{ {
requestId = requestId, requestId = requestId,
userName = userName, walletAddress = walletAddress,
signature = signature signature = signature
}; };
_logger.LogInformation("Refunding credits for user {UserName} with request ID {RequestId}", _logger.LogInformation("Refunding credits for user {UserName} (wallet: {WalletAddress}) with request ID {RequestId}",
userName, requestId); user.Name, walletAddress, requestId);
var response = await _httpClient.PutAsJsonAsync( var response = await _httpClient.PutAsJsonAsync(
$"{_settings.BaseUrl}{_settings.RefundEndpoint}", $"{_settings.BaseUrl}{_settings.RefundEndpoint}",
@@ -148,16 +144,34 @@ public class KaigenService : IKaigenService
return false; return false;
} }
_logger.LogInformation("Successfully refunded credits for user {UserName}", userName); _logger.LogInformation("Successfully refunded credits for user {UserName} (wallet: {WalletAddress})", user.Name, walletAddress);
return true; return true;
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error refunding credits for user {UserName}", userName); _logger.LogError(ex, "Error refunding credits for user {UserName}", user.Name);
return false; return false;
} }
} }
private string GetUserWalletAddress(User user)
{
if (user?.Accounts == null || !user.Accounts.Any())
{
throw new InvalidOperationException($"No accounts found for user {user?.Name}");
}
// Use the first account's key as the wallet address
var walletAddress = user.Accounts[0].Key;
if (string.IsNullOrEmpty(walletAddress))
{
throw new InvalidOperationException($"No wallet address found for user {user.Name}");
}
return walletAddress;
}
private string SignMessage(string message, string privateKey) private string SignMessage(string message, string privateKey)
{ {
var signer = new EthereumMessageSigner(); var signer = new EthereumMessageSigner();