/// <summary>
 /// Create new request
 /// </summary>
 /// <param name="model"></param>
 public StartNewKeyPairRequestApiModel(StartNewKeyPairRequestModel model)
 {
     EntityId    = model.EntityId;
     GroupId     = model.GroupId;
     SubjectName = model.SubjectName;
     DomainNames = model.DomainNames;
 }
        /// <inheritdoc/>
        public async Task<StartNewKeyPairRequestResultModel> StartNewKeyPairRequestAsync(
            StartNewKeyPairRequestModel request, VaultOperationContextModel context,
            CancellationToken ct) {

            if (request == null) {
                throw new ArgumentNullException(nameof(request));
            }
            if (string.IsNullOrEmpty(request.EntityId)) {
                throw new ArgumentNullException(nameof(request.EntityId));
            }
            if (string.IsNullOrEmpty(request.GroupId)) {
                throw new ArgumentNullException(nameof(request.GroupId));
            }
            if (string.IsNullOrEmpty(request.SubjectName)) {
                throw new ArgumentNullException(nameof(request.SubjectName));
            }
            // Get entity
            var entity = await _entities.FindEntityAsync(request.EntityId);
            if (entity == null) {
                throw new ResourceNotFoundException("Entity not found");
            }

            // Validate subject name
            var subjectList = Opc.Ua.Utils.ParseDistinguishedName(request.SubjectName);
            if (subjectList == null ||
                subjectList.Count == 0) {
                throw new ArgumentException("Invalid Subject", nameof(request.SubjectName));
            }
            if (!subjectList.Any(c => c.StartsWith("CN=", StringComparison.InvariantCulture))) {
                throw new ArgumentException("Invalid Subject, must have a common name (CN=).",
                    nameof(request.SubjectName));
            }
            entity.SubjectName = string.Join(", ", subjectList);

            // Add domain names
            if (request.DomainNames != null) {
                if (entity.Addresses == null) {
                    entity.Addresses = request.DomainNames;
                }
                else {
                    entity.Addresses.AddRange(request.DomainNames);
                }
            }

            var result = await _repo.AddAsync(new CertificateRequestModel {
                Record = new CertificateRequestRecordModel {
                    Type = CertificateRequestType.KeyPairRequest,
                    EntityId = entity.Id,
                    GroupId = request.GroupId,
                    Submitted = context.Validate(),
                },
                Entity = entity
            }, ct);
            await _broker.NotifyAllAsync(
                l => l.OnCertificateRequestSubmittedAsync(result));

            _logger.Information("New Key pair request submitted.");
            return new StartNewKeyPairRequestResultModel {
                RequestId = result.Record.RequestId
            };
        }