public ActionResult Edit(int id, int environmentId, int?machineId)
        {
            this.CheckPermission(UserRoleAction.EnvironmentChangeVariables);

            DataField dataField = this.Entities.DataField
                                  .Include("DataFieldValues.Environment")
                                  .Include("DataFieldValues.Machine")
                                  .Include("BundleVersions")
                                  .First(df => df.Id == id && !df.IsDeleted && df.Mode == DataFieldMode.Global);

            Environment environment = this.Entities.Environment.First(e => e.Id == environmentId);

            this.ViewBag.DataField   = dataField;
            this.ViewBag.Environment = environment;

            VariableEditModel model = new VariableEditModel()
            {
                Name          = dataField.Key,
                Value         = dataField.DataFieldValues.Where(v => v.EnvironmentId == environment.Id && v.MachineId == machineId).Select(v => v.Value).FirstOrDefault(),
                VariableId    = id,
                EnvironmentId = environmentId,
                MachineId     = machineId,
                IsSensitive   = dataField.IsSensitive
            };

            return(this.View(model));
        }
        public ActionResult Save(VariableEditModel model)
        {
            this.CheckPermission(UserRoleAction.EnvironmentChangeVariables);

            DataField dataField;

            if (model.VariableId == 0)
            {
                dataField           = new DataField();
                dataField.TypeId    = 1;
                dataField.Mode      = DataFieldMode.Global;
                dataField.IsDeleted = false;

                this.Entities.DataField.Add(dataField);
            }
            else
            {
                dataField = this.Entities.DataField
                            .Include("DataFieldValues.Environment")
                            .Include("DataFieldValues.Machine")
                            .Include("BundleVersions")
                            .First(df => df.Id == model.VariableId && !df.IsDeleted && df.Mode == DataFieldMode.Global);
            }

            Environment environment = this.Entities.Environment.Include("Machines").First(e => e.Id == model.EnvironmentId);

            if (model.MachineId.HasValue && environment.Machines.All(m => m.Id != model.MachineId))
            {
                return(this.Redirect("/"));
            }

            if (!this.ModelState.IsValid)
            {
                this.ViewBag.DataField   = dataField;
                this.ViewBag.Environment = environment;

                return(this.RedirectToAction("Edit", new { id = model.VariableId, environmentId = model.EnvironmentId }));
            }

            DataFieldValue value = dataField.DataFieldValues.FirstOrDefault(v => v.EnvironmentId == environment.Id && v.MachineId == model.MachineId);

            if (value == null)
            {
                value             = new DataFieldValue();
                value.DataField   = dataField;
                value.Environment = environment;
                value.MachineId   = model.MachineId;
                this.Entities.DataFieldValue.Add(value);
            }

            dataField.Key         = model.Name;
            dataField.IsSensitive = model.IsSensitive;

            value.Value = model.Value;

            this.Entities.SaveChanges();

            return(this.RedirectToAction("Details", new { id = dataField.Id }));
        }
        public ActionResult Add(int environmentId, int?machineId)
        {
            VariableEditModel model = new VariableEditModel()
            {
                EnvironmentId = environmentId
            };

            Environment environment = this.Entities.Environment.Include("Machines").First(e => e.Id == environmentId);

            if (model.MachineId.HasValue && environment.Machines.All(m => m.Id != model.MachineId))
            {
                return(this.Redirect("/"));
            }

            this.ViewBag.Environment = environment;

            return(this.View(model));
        }