Wiki

Clone wiki

Boot.Multitenancy / Domain administration.

#Administration of domain I needed a way to fast and easy create and edit new domains and their databases. I created a solution that is using the DatabaseSection class. See below.

#!c#
    public class AdminController : Controller
    {
        public ActionResult Index()
        {
            var domains = DatabaseCollectionReader.conf.DatabaseSections.ToList();
            var dm = new DataModel();

            if(domains.Any())
                dm.Domains.AddRange(domains.Select(d=> d.Name));

            return View(dm);
        }


        /// <summary>
        /// Edit selected DatabaseSection
        /// </summary>
        /// <param name="id">The id of the DatabaseSetion</param>
        /// <returns></returns>
        public ActionResult Edit(string id)
        {
            var domain = DatabaseCollectionReader.conf.DatabaseSections.Where(d => d.Name == id).First();

            if(domain==null)
                ModelState.AddModelError("Configuration is not selected.", "Enter a valid configuration.");

            return View(domain); //Fallback to default configuration.
        }

        [HttpPost]
        public ActionResult Edit(DatabaseSection section)
        {
            var domain = DatabaseCollectionReader.conf.DatabaseSections.Where(d=> d.Name==section.Name).First();            
            domain.Theme = section.Theme;
            domain.Domains = section.Domains;
            domain.Connectionstring = section.Connectionstring;
            domain.DbType = section.DbType;
            domain.Properties = section.Properties;
            domain.AutoPersist = true; // For now
            domain.CurrentConfiguration.Save();

            return RedirectToAction("edit", new { id= section.Name } );
        } 


        /// <summary>
        /// Create View.
        /// </summary>
        /// <returns></returns>
        public ActionResult Create()
        {
            return View(new DatabaseSection());
        }

        [HttpPost]
        public ActionResult Create(DatabaseSection section)
        {
            if (ModelState.IsValid)
            {

                if (string.IsNullOrEmpty(section.Connectionstring) && section.DbType == DbType.SqlCe) 
                    section.Connectionstring = string.Format(@"Data Source=|DataDirectory|\{0}.sdf;Persist Security Info=False;", 
                        section.Name.ToLower().Replace(" ",""));

                DatabaseCollectionReader.conf.Databases.Add(section);
                section.CurrentConfiguration.Save();
                //Need to Reboot
                Boot.Multitenancy.Host.Restart();
            }

            return RedirectToAction("edit", new { id = section.Name });
        }

        /// <summary>
        /// Removes a DatabaseSection from Collection.
        /// </summary>
        /// <param name="section">The section to remove.</param>
        /// <returns>Redirects to Index View</returns>
        public ActionResult Delete(string id)
        {
            //Just removes it from configuration, doesn't delete database.
            var section = DatabaseCollectionReader.conf.DatabaseSections.Where(d => d.Name == id).First();
            DatabaseCollectionReader.conf.Databases.Remove(section);
            section.CurrentConfiguration.Save();

            return RedirectToAction("Index");
        }
    }

    public class DataModel
    {
        public List<string> Domains { get; set; } = new List<string>();
    }

##And the view The cshtml is mostly the same in create/edit view. Just copy paste.

#!#html

@model Boot.Multitenancy.Configuration.DatabaseSection

<!--In Create View: @using (Html.BeginForm("create", "admin"))-->
@using (Html.BeginForm("edit", "admin")) 
{
<div class="container">
    <div class="row">
        <div class="col-md-4" style="padding-top: 30px;">
            <b>Menu</b><br />
            <a href="/admin/create">Create new Tenant</a><br />
            <a href="/admin">List Tenants</a>
        </div>
        <div class="col-md-8" style="padding-top: 30px;padding-bottom: 50px;">
            <div class="container">
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.Name)</div>
                    <div class="col-md-4">
                        @Html.DisplayFor(m => m.Name) 
                        @Html.HiddenFor(m=> m.Name) <!--In Create View, change to Html.EditorFor(m=> m.Name)-->
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.AutoPersist)</div>
                    <div class="col-md-4">@Html.EditorFor(m => m.AutoPersist)</div>
                </div>
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.Theme)</div>
                    <div class="col-md-4">@Html.EditorFor(m => m.Theme)</div>
                </div>
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.Connectionstring)</div>
                    <div class="col-md-4">@Html.EditorFor(m => m.Connectionstring)</div>
                </div>
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.DbType)</div>
                    <div class="col-md-4">@Html.EditorFor(m => m.DbType)</div>
                    <!--Replace above in create view: @Html.DropDownList("DBType", new SelectList(new[] { "SqlCe", "SqlServer2008", "MySql5" }, 1))-->
                </div>
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.Domains)</div>
                    <div class="col-md-4">@Html.EditorFor(m => m.Domains)</div>
                </div>
                <div class="row">
                    <div class="col-md-4">@Html.LabelFor(m => m.Properties)</div>
                    <div class="col-md-4">@Html.EditorFor(m => m.Properties)</div>
                </div>
                <div class="row">
                    <div class="col-md-8">&nbsp;</div>
                    <div class="col-md-4"><input type="submit" value="Save" /></div>
                </div>
            </div>
        </div>
    </div>
</div>
}

Updated