public async Task <DeploymentTarget> GetDeploymentTargetAsync(
            [NotNull] string deploymentTargetId,
            CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrWhiteSpace(deploymentTargetId))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(deploymentTargetId));
            }

            using (IQuerySession session = _documentStore.QuerySession())
            {
                try
                {
                    DeploymentTargetData deploymentTargetData = await session.Query <DeploymentTargetData>()
                                                                .SingleOrDefaultAsync(target =>
                                                                                      target.Id.Equals(deploymentTargetId, StringComparison.OrdinalIgnoreCase),
                                                                                      cancellationToken);

                    DeploymentTarget deploymentTarget = MapDataToTarget(deploymentTargetData);

                    return(deploymentTarget);
                }
                catch (Exception ex) when(!ex.IsFatal())
                {
                    _logger.Warning(ex, "Could not get deployment target with id {Id}", deploymentTargetId);
                    return(DeploymentTarget.None);
                }
            }
        }
        public async Task <UpdateDeploymentTargetResult> Handle(
            UpdateDeploymentTarget request,
            CancellationToken cancellationToken)
        {
            using (IDocumentSession session = _documentStore.OpenSession())
            {
                DeploymentTargetData data =
                    await session.LoadAsync <DeploymentTargetData>(request.Id, cancellationToken);

                if (data is null)
                {
                    return(new UpdateDeploymentTargetResult(new ValidationError("Not found")));
                }

                data.PackageId               = request.PackageId;
                data.Url                     = request.Url;
                data.IisSiteName             = request.IisSiteName;
                data.AllowExplicitPreRelease = request.AllowExplicitPreRelease;
                data.NuGetPackageSource      = request.NugetPackageSource;
                data.NuGetConfigFile         = request.NugetConfigFile;
                data.AutoDeployEnabled       = request.AutoDeployEnabled;
                data.PublishSettingsXml      = request.PublishSettingsXml;
                data.TargetDirectory         = request.TargetDirectory;
                data.WebConfigTransform      = request.WebConfigTransform;
                data.ExcludedFilePatterns    = request.ExcludedFilePatterns;
                data.Enabled                 = request.Enabled;
                session.Store(data);

                await session.SaveChangesAsync(cancellationToken);
            }

            _logger.Information("Updated target with id {Id}", request.Id);

            return(new UpdateDeploymentTargetResult());
        }
        private static DeploymentTarget MapDataToTarget(DeploymentTargetData deploymentTargetData)
        {
            if (deploymentTargetData is null)
            {
                return(null);
            }

            var deploymentTargetAsync = new DeploymentTarget(
                deploymentTargetData.Id,
                deploymentTargetData.Name,
                deploymentTargetData.PackageId ?? Core.Constants.NotAvailable,
                deploymentTargetData.PublishSettingsXml,
                deploymentTargetData.AllowExplicitPreRelease,
                uri: deploymentTargetData.Url?.ToString(),
                nuGetConfigFile: deploymentTargetData.NuGetConfigFile,
                nuGetPackageSource: deploymentTargetData.NuGetPackageSource,
                iisSiteName: deploymentTargetData.IisSiteName,
                autoDeployEnabled: deploymentTargetData.AutoDeployEnabled,
                targetDirectory: deploymentTargetData.TargetDirectory,
                webConfigTransform: deploymentTargetData.WebConfigTransform,
                excludedFilePatterns: deploymentTargetData.ExcludedFilePatterns,
                enabled: deploymentTargetData.Enabled);

            return(deploymentTargetAsync);
        }
        public async Task <CreateTargetResult> Handle(CreateTarget request, CancellationToken cancellationToken)
        {
            if (!request.IsValid)
            {
                return(new CreateTargetResult(new ValidationError("Invalid")));
            }

            using (IDocumentSession session = _documentStore.OpenSession())
            {
                var data = new DeploymentTargetData
                {
                    Id   = request.Id,
                    Name = request.Name
                };

                session.Store(data);

                await session.SaveChangesAsync(cancellationToken);
            }

            _logger.Information("Created target with id {Id}", request.Id);

            return(new CreateTargetResult(request.Id));
        }