Inheritance: IDisposable
        public TriggerDeploymentResponse Post(TriggerDeployment request)
        {
            using (var session = DocumentStore.OpenSession())
            {
                var environment = session.Query<Environment>().FirstOrDefault(e => e.Name == request.Environment);

                if (environment == null)
                {
                    throw HttpError.NotFound("Environment {0} not found.".Fmt(request.Environment));
                }

                var deploymentInfo = new Deployment()
                {
                    EnvironmentId = "environments/" + environment.Id,
                    RequestedAt = DateTime.UtcNow,
                };

                var packageInfo = session.Load<Package>("packages/{0}/{1}".Fmt(request.PackageId, request.Version));

                deploymentInfo.Package = packageInfo;
                deploymentInfo.Status = DeployStatus.Deploying;
                session.Store(deploymentInfo);

                session.SaveChanges();

                using (var workspace = new Workspace(FileSystem, ServerSettings))
                {
                    var neutralPackagePath = PackageDownloader.Downloaad(request.PackageId, request.Version, workspace.TempWorkDir);

                    workspace.UpdateSources();

                    var packageManager = new PackageManager(workspace.EnviornmentPath);
                    var configuredPackage = packageManager.ConfigurePackageByEnvironment(neutralPackagePath, request.Environment, workspace.TempWorkDir);
                    packageManager.DeployPackage(configuredPackage);
                    deploymentInfo.FinishedAt = DateTime.UtcNow;
                    deploymentInfo.Status = DeployStatus.Successful;
                    session.SaveChanges();

                    return new TriggerDeploymentResponse();
                }
            }
        }
        private EnvironmentVariablesDto GetEnvironment(string name, bool fetchVariables)
        {
            using (var session = DocumentStore.OpenSession())
            {
                var environment = session.Query<Environment>().FirstOrDefault(e => e.Name == name);

                if (environment == null)
                {
                    throw HttpError.NotFound("Environment {0} not found.".Fmt(name));
                }

                using (var workspace = new Workspace(FileSystem, ServerSettings))
                {
                    var result = new EnvironmentVariablesDto()
                    {
                        Environment = environment.ToDto()
                    };

                    if (fetchVariables)
                    {
                        workspace.UpdateSources();

                        var provider = new EnvironmentProvider();

                        try
                        {
                            var serializedEnvironment = provider.GetEnvironmentFromFile(Path.Combine(workspace.EnviornmentPath, name + ".xml"));

                            var resolver = new VariableResolver(serializedEnvironment.Variables);

                            result.Variables = new List<VariableDto>();
                            result.Variables.AddRange(serializedEnvironment.Variables.Select(v => new VariableDto()
                            {
                                Name = v.Name,
                                Value = v.Value,
                                Resolved = resolver.TransformVariables(v.Value)
                            }));

                            if (resolver.VariableUsageList.Any(v => v.IsMissingValue))
                            {
                                result.MissingVariables =
                                    new List<string>(resolver.VariableUsageList.Where(v => v.IsMissingValue).Select(v => v.Variable.Name));
                            }
                        }
                        catch (FileNotFoundException e)
                        {
                            result.Variables = new List<VariableDto>();
                            result.Warning = "No xml file found for this environment!";
                        }
                    }

                    return result;
                }
            }
        }