private async Task <bool> SetupCloudscribeCore(HttpResponse response)
        {
            bool result = true;

            if (!schemaHasBeenCreated)
            {
                if (canAlterSchema)
                {
                    schemaHasBeenCreated = await CreateInitialSchema(response, "cloudscribe-core");

                    if (schemaHasBeenCreated)
                    {
                        //recheck
                        needCoreSchemaUpgrade = setupManager.NeedsUpgrade("cloudscribe-core");
                    }
                }
            }

            if (
                (schemaHasBeenCreated) &&
                (needCoreSchemaUpgrade) &&
                (canAlterSchema)
                )
            {
                needCoreSchemaUpgrade = await UpgradeSchema(response, "cloudscribe-core");
            }

            if (!CoreSystemIsReady())
            {
                return(false);
            }

            existingSiteCount = setupManager.ExistingSiteCount();

            if (existingSiteCount == 0)
            {
                await WritePageContent(response,
                                       "CreatingSite" //SetupResources.CreatingSiteMessage
                                       , true);

                SiteSettings newSite = await siteManager.CreateNewSite(true);

                await WritePageContent(response,
                                       "CreatingRolesAndAdminUser" //SetupResources.CreatingRolesAndAdminUserMessage
                                       , true);

                result = await siteManager.CreateRequiredRolesAndAdminUser(newSite);
            }

            //TODO dbSiteSettingsEx.EnsureSettings(); add to ISiteRepository


            return(result);
        }
        private async Task <bool> SetupCloudscribeCore(HttpResponse response)
        {
            bool result = true;

            if (!schemaHasBeenCreated)
            {
                if (canAlterSchema)
                {
                    schemaHasBeenCreated = await CreateInitialSchema(response, "cloudscribe-core");

                    if (schemaHasBeenCreated)
                    {
                        //recheck
                        needCoreSchemaUpgrade = setupManager.NeedsUpgrade("cloudscribe-core");
                    }
                }
            }

            if (
                (schemaHasBeenCreated) &&
                (needCoreSchemaUpgrade) &&
                (canAlterSchema)
                )
            {
                needCoreSchemaUpgrade = await UpgradeSchema(response, "cloudscribe-core");
            }

            if (!CoreSystemIsReady())
            {
                return(false);
            }

            existingSiteCount = await siteManager.ExistingSiteCount();

            if (existingSiteCount == 0)
            {
                await WritePageContent(response,
                                       "CreatingSite" //SetupResources.CreatingSiteMessage
                                       , true);

                SiteSettings newSite = await siteManager.CreateNewSite(true);

                await WritePageContent(response,
                                       "CreatingRolesAndAdminUser" //SetupResources.CreatingRolesAndAdminUserMessage
                                       , true);

                result = await siteManager.CreateRequiredRolesAndAdminUser(newSite);
            }
            else
            {
                // check here if count of users is 0
                // if something went wrong with creating admin user
                // setup page should try to correct it on subsequent runs
                // ie create an admin user if no users exist
                if (response.HttpContext.Request.Host.HasValue)
                {
                    ISiteSettings site = await siteManager.Fetch(response.HttpContext.Request.Host.Value);

                    if (site != null)
                    {
                        int roleCount = await siteManager.GetRoleCount(site.SiteId);

                        bool roleResult = true;
                        if (roleCount == 0)
                        {
                            roleResult = await siteManager.EnsureRequiredRoles(site);
                        }

                        if (roleResult)
                        {
                            int userCount = await siteManager.GetUserCount(site.SiteId);

                            if (userCount == 0)
                            {
                                await siteManager.CreateAdminUser(site);
                            }
                        }
                    }
                }
            }



            //TODO dbSiteSettingsEx.EnsureSettings(); add to ISiteRepository


            return(result);
        }
        public async Task <ActionResult> NewSite(SiteBasicSettingsViewModel model)
        {
            ViewData["Title"] = "Create New Site";

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            bool addHostName = false;

            if (multiTenantOptions.Mode == MultiTenantMode.FolderName)
            {
                if (string.IsNullOrEmpty(model.SiteFolderName))
                {
                    ModelState.AddModelError("foldererror", "Folder name is required.");

                    return(View(model));
                }

                ISiteFolder folder = await siteManager.GetSiteFolder(model.SiteFolderName);

                if (folder != null)
                {
                    ModelState.AddModelError("foldererror", "The selected folder name is already in use on another site.");

                    return(View(model));
                }
            }
            else
            {
                ISiteHost host;

                if (!string.IsNullOrEmpty(model.HostName))
                {
                    model.HostName = model.HostName.Replace("https://", string.Empty).Replace("http://", string.Empty);

                    host = await siteManager.GetSiteHost(model.HostName);

                    if (host != null)
                    {
                        ModelState.AddModelError("hosterror", "The selected host/domain name is already in use on another site.");

                        return(View(model));
                    }

                    addHostName = true;
                }
            }

            SiteSettings newSite = new SiteSettings();

            // only the first site created by setup page should be a server admin site
            newSite.IsServerAdminSite = false;

            newSite.SiteName = model.SiteName;

            if (multiTenantOptions.Mode == MultiTenantMode.FolderName)
            {
                newSite.SiteFolderName = model.SiteFolderName;
            }
            else if (addHostName)
            {
                newSite.PreferredHostName = model.HostName;
            }

            newSite.SiteIsClosed        = model.IsClosed;
            newSite.SiteIsClosedMessage = model.ClosedMessage;

            //Site.SiteRepository.Save(newSite);
            bool result = await siteManager.CreateNewSite(newSite);

            result = await siteManager.CreateRequiredRolesAndAdminUser(newSite);

            if ((result) && (multiTenantOptions.Mode == MultiTenantMode.FolderName))
            {
                bool folderResult = await siteManager.EnsureSiteFolder(newSite);

                // for folder sites we need routes that match the folder
                // which are normally created during app startup
                // can we add routes here? or do we need to force the app to recycle?
                // this seems to work, but we really do need to restart
                // so that the per folder authentication gets setup too
                //cloudscribe.Web.Routing.RouteRegistrar.AddDefaultRouteForNewSiteFolder(folder.FolderName);

                //startup.TriggerStartup();
                //http://stackoverflow.com/questions/31339896/replacement-httpruntime-unloadappdomain-in-asp-net-5
            }

            if (result && addHostName)
            {
                bool hostResult = await siteManager.AddHost(
                    newSite.SiteGuid,
                    newSite.SiteId,
                    model.HostName);
            }

            if (result)
            {
                this.AlertSuccess(string.Format("Basic site settings for <b>{0}</b> were successfully created.",
                                                newSite.SiteName), true);
            }

            return(RedirectToAction("SiteList", new { pageNumber = model.ReturnPageNumber }));
        }