private string GetUrlFromModel(AddDeploymentJobModel model, Company company)
 {
     if (model.ServerUrlOptions == ServerUrlOptions.Other)
     {
         return(model.ServerUrl);
     }
     if (model.ServerUrlOptions == ServerUrlOptions.Production)
     {
         // Newer version (2.0 and up) will use the load balanced URL
         // Version 1.x still uses the old one
         return(string.Format(model.RevisionId.StartsWith("1.")
             ? "https://services.taxihail.com/{0}/api/"
             : "https://api.taxihail.com/{0}/api/", company.CompanyKey));
     }
     if (model.ServerUrlOptions == ServerUrlOptions.Staging)
     {
         return(string.Format("http://staging.taxihail.com/{0}/api/", company.CompanyKey));
     }
     if (model.ServerUrlOptions == ServerUrlOptions.Dev)
     {
         return(string.Format("http://test.taxihail.biz:8181/{0}/api/", company.CompanyKey));
     }
     if (model.ServerUrlOptions == ServerUrlOptions.Arro)
     {
         return(string.Format("https://api.goarro.com/{0}/api/", company.CompanyKey));
     }
     return(null);
 }
        public ActionResult DeployCustomer(DeployCustomerModel model)
        {
            if (model.DeployOptions == DeployOptions.Both || model.DeployOptions == DeployOptions.MobileApp)
            {
                var job = new AddDeploymentJobModel {
                    Android = true, CallBox = false, CompanyId = model.CompanyKey, CreateType = (int)DeploymentJobType.DeployClient, Database = false, IosAdhoc = true, IosAppStore = true, BlackBerry = false, RevisionId = model.RevisionId, ServerUrlOptions = model.ServerUrlOptions
                };

                var environments = new MongoRepository <Environment>();
                job.ServerId = environments.Single(e => e.Name == "MobileBuildServer").Id;
                AddDeploymentJob(job);
            }

            if (model.DeployOptions == DeployOptions.Both || model.DeployOptions == DeployOptions.Server)
            {
                var rev = new MongoRepository <Revision>().GetById(model.RevisionId);

                var  tagComponents           = rev.Tag.Split('.');
                bool useNewDeploymentService = (tagComponents.Length == 3) && (tagComponents[1] == "5") && (int.Parse(tagComponents[2]) >= 25);

                var job = new AddDeploymentJobModel {
                    Android = false, CallBox = false, CompanyId = model.CompanyKey, CreateType = (int)DeploymentJobType.DeployServer, Database = true, IosAdhoc = false, IosAppStore = false, BlackBerry = false, RevisionId = model.RevisionId, ServerUrlOptions = model.ServerUrlOptions
                };
                var environments = new MongoRepository <Environment>();
                job.ServerId = model.ServerUrlOptions == ServerUrlOptions.Production ? environments.Single(e => e.Name == "ProductionV2").Id : environments.Single(e => e.Name == "Staging").Id;
                AddDeploymentJob(job);
            }

            return(RedirectToAction("Index"));
        }
        private AddDeploymentJobModel GetAddJobModel(System.Func <Environment, bool> predicate)
        {
            var model = new AddDeploymentJobModel();

            var companies   = new MongoRepository <Company>();
            var companyList = companies.OrderBy(c => c.CompanyName).Select(c => new SelectListItem
            {
                Value = c.CompanyKey,
                Text  = c.CompanyName + " (" + c.CompanyKey + ")"
            }).ToList();

            companyList.Add(new SelectListItem {
                Value = _allCompaniesKey, Text = "** All companies ** - USE CAREFULLY"
            });
            model.ModelForView.Company = companyList;

            var companyDetailsList = companies.OrderBy(c => c.CompanyName).Select(c => new CompanyDetailsModel
            {
                CompanyKey                 = c.CompanyKey,
                CompanyDisplayName         = c.CompanyName + " (" + c.CompanyKey + ")",
                LastKnownProductionVersion = c.LastKnownProductionVersion,
                LastKnownStagingVersion    = c.LastKnownStagingVersion
            }).ToList();

            model.ModelForView.CompanyDetails = companyDetailsList;

            var environments = new MongoRepository <Environment>();

            model.ModelForView.Environment =
                environments.ToArray().Where(predicate).OrderBy(e => e.Name).Select(e => new SelectListItem
            {
                Value = e.Id,
                Text  = e.GetDisplay()
            });

            var revisions = new MongoRepository <Revision>();

            model.ModelForView.Revision = revisions.Where(r => !r.Hidden && !r.Inactive).OrderBy(r => r.Tag).Select(r => new SelectListItem
            {
                Value = r.Id,
                Text  = string.Format("{0} ({1})", r.Tag, r.Commit)
            });
            model.Database = true;
            return(model);
        }
        public ActionResult DeployClient(AddDeploymentJobModel model, FormCollection form)
        {
            foreach (var key in form.AllKeys)
            {
                if (key.StartsWith("checkbox_"))
                {
                    // FormCollection will have "true,false" value for checked checkbox
                    var isCompanySelected = form[key].Contains("true");

                    if (isCompanySelected)
                    {
                        var companyId = key.Replace("checkbox_", string.Empty);
                        model.SelectedCompaniesId.Add(companyId);
                    }
                }
            }
            AddDeploymentJob(model);
            return(RedirectToAction("Index"));
        }
        private void AddDeploymentJob(AddDeploymentJobModel model, string email = null)
        {
            Action <Company> addACompanyAction = company =>
            {
                var user = _session.Users.SingleOrDefault(x => x.UserName == User.Identity.Name);

                var userDisplayName = user != null ? user.CatchAll["Name"].AsString : "Unknown";

                var deploy = new DeploymentJob
                {
                    Id        = Guid.NewGuid().ToString(),
                    Date      = DateTime.Now,
                    Company   = company,
                    UserEmail = User.Identity.Name,
                    UserName  = userDisplayName
                };
                var environments = new MongoRepository <Environment>();

                deploy.Server = environments.Single(e => e.Id == model.ServerId);
                var revisions = new MongoRepository <Revision>();
                deploy.Revision = revisions.Single(r => r.Id == model.RevisionId);

                var createType = (DeploymentJobType)model.CreateType;

                deploy.ServerSide = createType == DeploymentJobType.ServerPackage ||
                                    createType == DeploymentJobType.DeployServer;
                deploy.ClientSide = !deploy.ServerSide;
                deploy.Type       = createType;

                if (deploy.ServerSide && (createType == DeploymentJobType.ServerPackage))
                {
                    deploy.ServerSide = false;
                    deploy.Database   = false;
                }
                else if (deploy.ServerSide)
                {
                    deploy.Database = model.Database;
                }
                else
                {
                    deploy.ServerUrl = GetUrlFromModel(model, company);
                    if (string.IsNullOrWhiteSpace(deploy.ServerUrl))
                    {
                        throw new InvalidOperationException("Server url must be set");
                    }
                    deploy.Android     = model.Android;
                    deploy.CallBox     = model.CallBox;
                    deploy.IosAdhoc    = model.IosAdhoc;
                    deploy.IosAppStore = model.IosAppStore;
                    deploy.BlackBerry  = model.BlackBerry;
                }


                company.LastKnownProductionVersion = null;
                company.LastKnownStagingVersion    = null;

                new MongoRepository <Company>().Update(company);

                Repository.Add(deploy);
            };


            var companies = new MongoRepository <Company>();

            if (model.CompanyId == _allCompaniesKey)
            {
                foreach (var company in companies.Where(c => (c.Status == AppStatus.Production) || (c.Status == AppStatus.TestingNewVersion)))
                {
                    addACompanyAction(company);
                }
            }
            else if (model.CreateType == (int)DeploymentJobType.ServerPackage)
            {
                var company = companies.Single(c => c.CompanyKey == "TaxiHailDemo");
                addACompanyAction(company);
            }
            else if (model.SelectedCompaniesId.Any())
            {
                foreach (var companyId in model.SelectedCompaniesId)
                {
                    var company = companies.Single(c => c.CompanyKey == companyId);
                    addACompanyAction(company);
                }
            }
            else
            {
                var company = companies.Single(c => c.CompanyKey == model.CompanyId);
                addACompanyAction(company);
            }
        }
 public ActionResult CreateServerPackage(AddDeploymentJobModel model)
 {
     AddDeploymentJob(model);
     return(RedirectToAction("Index"));
 }