Try your search with a different keyword or use * as a wildcard.
using Nop.Data;
using Nop.Plugin.Payments.PayPalCommerce.Domain;
namespace Nop.Plugin.Payments.PayPalCommerce.Services;
/// <summary>
/// Represents the payment token service
/// </summary>
public class PayPalTokenService
{
#region Fields
private readonly IRepository<PayPalToken> _tokenRepository;
#endregion
#region Ctor
public PayPalTokenService(IRepository<PayPalToken> tokenRepository)
{
_tokenRepository = tokenRepository;
}
#endregion
#region Methods
/// <summary>
/// Get all payment tokens
/// </summary>
/// <param name="clientId">Client identifier</param>
/// <param name="customerId">Customer identifier; pass 0 to load all tokens</param>
/// <param name="vaultId">Vault identifier; pass null to load all tokens</param>
/// <param name="vaultCustomerId">Vault customer identifier; pass null to load all tokens</param>
/// <param name="type">Token type; pass null to load all tokens</param>
/// <returns>
/// A task that represents the asynchronous operation
/// The task result contains the list of payment tokens
/// </returns>
public async Task<IList<PayPalToken>> GetAllTokensAsync(string clientId, int customerId = 0,
string vaultId = null, string vaultCustomerId = null, string type = null)
{
return await _tokenRepository.GetAllAsync(query =>
{
query = query.Where(token => token.ClientId == clientId);
if (customerId > 0)
query = query.Where(token => token.CustomerId == customerId);
if (!string.IsNullOrEmpty(vaultId))
query = query.Where(token => token.VaultId == vaultId);
if (!string.IsNullOrEmpty(vaultCustomerId))
query = query.Where(token => token.VaultCustomerId == vaultCustomerId);
if (!string.IsNullOrEmpty(type))
query = query.Where(token => token.Type == type);
return query;
}, null);
}
/// <summary>
/// Get a customer payment token
/// </summary>
/// <param name="clientId">Client identifier</param>
/// <param name="customerId">Customer identifier; pass 0 to load all tokens</param>
/// <param name="vaultId">Vault identifier; pass null to load all tokens</param>
/// <returns>
/// A task that represents the asynchronous operation
/// The task result contains the payment token
/// </returns>
public async Task<PayPalToken> GetTokenAsync(string clientId, int customerId = 0, string vaultId = null)
{
var tokens = await GetAllTokensAsync(clientId, customerId, vaultId);
return tokens.FirstOrDefault();
}
/// <summary>
/// Get a payment token by identifier
/// </summary>
/// <param name="id">Token identifier</param>
/// <returns>
/// A task that represents the asynchronous operation
/// The task result contains the payment token
/// </returns>
public async Task<PayPalToken> GetByIdAsync(int id)
{
return await _tokenRepository.GetByIdAsync(id, null);
}
/// <summary>
/// Insert the payment token
/// </summary>
/// <param name="token">Payment token</param>
/// <returns>A task that represents the asynchronous operation</returns>
public async Task InsertAsync(PayPalToken token)
{
//whether a token with such parameters already exists
var tokens = await GetAllTokensAsync(token.ClientId, token.CustomerId);
var existingToken = tokens
.FirstOrDefault(existing => existing.VaultId == token.VaultId && existing.VaultCustomerId == token.VaultCustomerId);
if (existingToken is not null)
{
//then just update transaction id
if (!string.Equals(existingToken.TransactionId, token.TransactionId, StringComparison.InvariantCultureIgnoreCase))
{
existingToken.TransactionId = token.TransactionId;
await UpdateAsync(existingToken);
}
return;
}
//don't insert tokens with no customer identifier
if (token.CustomerId == 0)
return;
if (!tokens.Any())
token.IsPrimaryMethod = true;
//or insert a new one
await _tokenRepository.InsertAsync(token, false);
}
/// <summary>
/// Update the payment token
/// </summary>
/// <param name="token">Payment token</param>
/// <returns>A task that represents the asynchronous operation</returns>
public async Task UpdateAsync(PayPalToken token)
{
await _tokenRepository.UpdateAsync(token, false);
}
/// <summary>
/// Delete the payment token
/// </summary>
/// <param name="token">Payment token</param>
/// <returns>A task that represents the asynchronous operation</returns>
public async Task DeleteAsync(PayPalToken token)
{
await _tokenRepository.DeleteAsync(token, false);
//mark one of the remaining tokens as default
var tokens = await GetAllTokensAsync(token.ClientId, token.CustomerId);
if (tokens.Any(existing => existing.IsPrimaryMethod))
return;
var existingToken = tokens.FirstOrDefault();
if (existingToken is null)
return;
existingToken.IsPrimaryMethod = true;
await UpdateAsync(existingToken);
}
/// <summary>
/// Delete payment tokens
/// </summary>
/// <param name="token">Payment tokens</param>
/// <returns>A task that represents the asynchronous operation</returns>
public async Task DeleteAsync(IList<PayPalToken> tokens)
{
await _tokenRepository.DeleteAsync(tokens, false);
}
#endregion
}