/// <summary>
 /// Create fetch request
 /// </summary>
 /// <param name="model"></param>
 public FinishNewKeyPairRequestResponseApiModel(FinishNewKeyPairRequestResultModel model)
 {
     Request = model.Request != null ?
               new CertificateRequestRecordApiModel(model.Request) : null;
     Certificate = model.Certificate != null ?
                   new X509CertificateApiModel(model.Certificate) : null;
     PrivateKey = model != null ?
                  new PrivateKeyApiModel(model.PrivateKey) : null;
 }
        /// <inheritdoc/>
        public async Task <FinishNewKeyPairRequestResultModel> FinishNewKeyPairRequestAsync(
            string requestId, VaultOperationContextModel context, CancellationToken ct)
        {
            if (string.IsNullOrEmpty(requestId))
            {
                throw new ArgumentNullException(nameof(requestId));
            }
            var request = await _repo.FindAsync(requestId, ct);

            if (request == null)
            {
                throw new ResourceNotFoundException("Request not found");
            }
            try {
                var entity = await _entities.FindEntityAsync(request.Entity.Id);

                if (entity != null)
                {
                    throw new ResourceInvalidStateException("Entity removed.");
                }
                var result = new FinishNewKeyPairRequestResultModel {
                    Request = request.Record
                };
                if (request.Record.State == CertificateRequestState.Completed)
                {
                    result.Certificate = request.Certificate;
                    // get private key
                    if (request.KeyHandle != null)
                    {
                        var handle = Try.Op(
                            () => _serializer.DeserializeHandle(request.KeyHandle));
                        if (handle != null)
                        {
                            var privateKey = await Try.Async(
                                () => _keys.ExportKeyAsync(handle, ct));

                            result.PrivateKey = privateKey.ToServiceModel();
                            await Try.Async(
                                () => _keys.DeleteKeyAsync(handle, ct));
                        }
                    }
                }
                return(result);
            }
            finally {
                if (request.Record.State == CertificateRequestState.Completed)
                {
                    // Accept
                    await _broker.NotifyAllAsync(
                        l => l.OnCertificateRequestAcceptedAsync(request));

                    _logger.Information("Key pair response accepted and finished.");
                }
            }
        }
 /// <summary>
 /// Create fetch request
 /// </summary>
 /// <param name="model"></param>
 public static FinishNewKeyPairRequestResponseApiModel ToApiModel(
     this FinishNewKeyPairRequestResultModel model)
 {
     if (model == null)
     {
         return(null);
     }
     return(new FinishNewKeyPairRequestResponseApiModel {
         Request = model.Request.ToApiModel(),
         Certificate = model.Certificate.ToApiModel(),
         PrivateKey = model.PrivateKey.ToApiModel()
     });
 }