public IActionResult UpdateSitemapNode([FromBody] SitemapNodeSubmit node, [FromQuery] Guid?appId = null, [FromQuery] Guid?areaId = null)
        {
            var response = new ResponseModel();

            response.Message = "Success";
            response.Success = true;

            if (node == null)
            {
                response.Message = "Wrong object model submitted. Could not restore!";
                response.Success = false;
                return(Json(response));
            }
            if (appId == null)
            {
                response.Message = "Application Id needs to be submitted as 'appId' query string";
                response.Success = false;
                return(Json(response));
            }

            if (areaId == null)
            {
                response.Message = "Area Id needs to be submitted as 'areaId' query string";
                response.Success = false;
                return(Json(response));
            }

            if (node.Id == null || node.Id == Guid.Empty)
            {
                response.Message = "Node Id needs to be submitted";
                response.Success = false;
                return(Json(response));
            }

            var appSrv  = new AppService();
            var pageSrv = new PageService();

            try
            {
                appSrv.UpdateAreaNode(node.Id, areaId ?? Guid.Empty, node.Name, node.Label, node.LabelTranslations,
                                      node.IconClass, node.Url, (int)node.Type, node.EntityId, node.Weight, node.Access, node.EntityListPages, node.EntityCreatePages, node.EntityDetailsPages, node.EntityManagePages);

                var allAppPages = pageSrv.GetAppControlledPages(appId ?? Guid.Empty);

                var currentAttachedNodePages    = allAppPages.FindAll(x => x.NodeId == node.Id).Select(x => x.Id).ToList();
                var currentAttachedPagesHashSet = new HashSet <Guid>();
                foreach (var pageId in currentAttachedNodePages)
                {
                    currentAttachedPagesHashSet.Add(pageId);
                }

                //Process submitted page Ids
                if (node.Pages == null)
                {
                    node.Pages = new List <Guid>();
                }
                foreach (var pageId in node.Pages)
                {
                    var page = pageSrv.GetPage(pageId);
                    if (page == null)
                    {
                        throw new Exception("Page not found");
                    }
                    if (page.NodeId == null)
                    {
                        pageSrv.UpdatePage(page.Id, page.Name, page.Label, page.LabelTranslations, page.IconClass, page.System, page.Weight,
                                           page.Type, page.AppId, page.EntityId, node.Id, areaId, page.IsRazorBody, page.RazorBody, page.Layout);
                    }
                    else if (page.NodeId == node.Id)
                    {
                        currentAttachedPagesHashSet.Remove(page.Id);
                    }
                }

                //Detach pages that were not submitted
                foreach (var pageId in currentAttachedPagesHashSet)
                {
                    var page = pageSrv.GetPage(pageId);
                    if (page == null)
                    {
                        throw new Exception("Page not found");
                    }
                    pageSrv.UpdatePage(page.Id, page.Name, page.Label, page.LabelTranslations, page.IconClass, page.System, page.Weight,
                                       page.Type, page.AppId, page.EntityId, null, null, page.IsRazorBody, page.RazorBody, page.Layout);
                }
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;
                response.Success = false;
                return(Json(response));
            }

            var newSitemap = appSrv.GetApplication(appId ?? Guid.Empty).Sitemap;
            var initData   = new EntityRecord();

            initData["sitemap"]        = appSrv.OrderSitemap(newSitemap);
            initData["node_page_dict"] = PageUtils.GetNodePageDictionary(appId);
            response.Object            = initData;

            return(Json(response));
        }
        public IActionResult CreateSitemapNode([FromBody] SitemapNodeSubmit node, [FromQuery] Guid?appId = null, [FromQuery] Guid?areaId = null)
        {
            var response = new ResponseModel();

            response.Message = "Success";
            response.Success = true;

            if (node == null)
            {
                response.Message = "Wrong object model submitted. Could not restore!";
                response.Success = false;
                return(Json(response));
            }
            if (appId == null)
            {
                response.Message = "Application Id needs to be submitted as 'appId' query string";
                response.Success = false;
                return(Json(response));
            }
            if (areaId == null)
            {
                response.Message = "Area Id needs to be submitted as 'areaId' query string";
                response.Success = false;
                return(Json(response));
            }

            if (node.Id == Guid.Empty)
            {
                node.Id = Guid.NewGuid();
            }

            var appSrv  = new AppService();
            var pageSrv = new PageService();

            try
            {
                appSrv.CreateAreaNode(node.Id, areaId ?? Guid.Empty, node.Name, node.Label, node.LabelTranslations,
                                      node.IconClass, node.Url, (int)node.Type, node.EntityId, node.Weight, node.Access, node.EntityListPages, node.EntityCreatePages, node.EntityDetailsPages, node.EntityManagePages);
                if (node.Pages == null)
                {
                    node.Pages = new List <Guid>();
                }
                foreach (var pageId in node.Pages)
                {
                    var page = pageSrv.GetPage(pageId);
                    if (page == null)
                    {
                        throw new Exception("Page not found");
                    }
                    pageSrv.UpdatePage(page.Id, page.Name, page.Label, page.LabelTranslations, page.IconClass, page.System, page.Weight,
                                       page.Type, page.AppId, page.EntityId, node.Id, areaId, page.IsRazorBody, page.RazorBody, page.Layout);
                }
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;
                response.Success = false;
                return(Json(response));
            }

            var newSitemap = appSrv.GetApplication(appId ?? Guid.Empty).Sitemap;
            var initData   = new EntityRecord();

            initData["sitemap"]        = appSrv.OrderSitemap(newSitemap);
            initData["node_page_dict"] = PageUtils.GetNodePageDictionary(appId);
            response.Object            = initData;

            return(Json(response));
        }