示例#1
0
 private async Task <Wallet> GenerateWalletAsync(WalletGenerationRequest request)
 {
     var wallet = Wallet.Create(
         _encryptionService,
         request.Id,
         request.ProtocolCode,
         request.NetworkType switch
     {
         NetworkType.Private => Swisschain.Sirius.Sdk.Primitives.NetworkType.Private,
         NetworkType.Test => Swisschain.Sirius.Sdk.Primitives.NetworkType.Test,
         NetworkType.Public => Swisschain.Sirius.Sdk.Primitives.NetworkType.Public,
         _ => throw new InvalidEnumArgumentException(nameof(request.NetworkType),
                                                     (int)request.NetworkType,
                                                     typeof(NetworkType))
     },
        public async Task InsertOrUpdateAsync(WalletGenerationRequest walletGenerationRequest)
        {
            await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options);

            var affectedRowsCount = await context.WalletGenerationRequests
                                    .Where(entity => entity.Id == walletGenerationRequest.Id &&
                                           entity.UpdatedAt <= walletGenerationRequest.UpdatedAt)
                                    .UpdateAsync(x => new WalletGenerationRequest
            {
                Id                     = walletGenerationRequest.Id,
                TenantId               = walletGenerationRequest.TenantId,
                VaultId                = walletGenerationRequest.VaultId,
                VaultType              = walletGenerationRequest.VaultType,
                BlockchainId           = walletGenerationRequest.BlockchainId,
                NetworkType            = walletGenerationRequest.NetworkType,
                ProtocolCode           = walletGenerationRequest.ProtocolCode,
                Component              = walletGenerationRequest.Component,
                State                  = walletGenerationRequest.State,
                RejectionReason        = walletGenerationRequest.RejectionReason,
                RejectionReasonMessage = walletGenerationRequest.RejectionReasonMessage,
                CreatedAt              = walletGenerationRequest.CreatedAt,
                UpdatedAt              = walletGenerationRequest.UpdatedAt
            });

            if (affectedRowsCount == 0)
            {
                try
                {
                    context.WalletGenerationRequests.Add(walletGenerationRequest);
                    await context.SaveChangesAsync();
                }
                catch (DbUpdateException exception) when(exception.InnerException is PostgresException pgException &&
                                                         pgException.SqlState == PostgresErrorCodes.UniqueViolation)
                {
                    // ignore
                }
            }
        }
    }