Ejemplo n.º 1
0
        public ActionResult Edit(Guid id, MetaReportModel model, List <MetaReportItemModel> items, string button)
        {
            using (DBEntities context = Settings.CreateDataContext())
            {
                if (!ModelState.IsValid)
                {
                    return(View(model));
                }

                MetaReport target = null;
                if (model.Id != Guid.Empty)
                {
                    target = MetaReportHelper.Get(model.Id, context);
                    if (target == null)
                    {
                        ModelState.AddModelError("", "Запись не найдена!");
                        return(View(model));
                    }
                }
                else
                {
                    target    = new MetaReport();
                    target.Id = Guid.NewGuid();
                    context.AddToMetaReport(target);
                }

                MetaReportModel.CreateMap();
                Mapper.Map(model, target);

                if (items != null)
                {
                    SyncReportItems(target, items, context);
                }

                try
                {
                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    var sb = new StringBuilder(Resources.Resource.SaveError + ": " + ex.Message);
                    if (ex.InnerException != null)
                    {
                        sb.AppendLine(ex.InnerException.Message);
                    }
                    ModelState.AddModelError("", sb.ToString());
                    return(View(model));
                }

                if (button == "SaveAndExit")
                {
                    return(RedirectToAction("Index"));
                }
                else
                {
                    return(RedirectToAction("Edit", new { target.Id }));
                }
            }
        }
Ejemplo n.º 2
0
        public ActionResult Edit(Guid id, MetaReportModel model, List<MetaReportItemModel> items, string button)
        {
            using (DBEntities context = Settings.CreateDataContext())
            {
                if (!ModelState.IsValid)
                {
                    return View(model);
                }

                MetaReport target = null;
                if (model.Id != Guid.Empty)
                {
                    target = MetaReportHelper.Get(model.Id, context);
                    if (target == null)
                    {
                        ModelState.AddModelError("", "Запись не найдена!");
                        return View(model);
                    }
                }
                else
                {
                    target = new MetaReport();
                    target.Id = Guid.NewGuid();
                    context.AddToMetaReport(target);
                }

                MetaReportModel.CreateMap();
                Mapper.Map(model, target);

                if (items != null)
                    SyncReportItems(target, items, context);

                try
                {
                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    var sb = new StringBuilder(Resources.Resource.SaveError + ": " + ex.Message);
                    if (ex.InnerException != null)
                        sb.AppendLine(ex.InnerException.Message);
                    ModelState.AddModelError("", sb.ToString());
                    return View(model);
                }

                if (button == "SaveAndExit")
                    return RedirectToAction("Index");
                else
                    return RedirectToAction("Edit", new { target.Id });
            }
        }
Ejemplo n.º 3
0
        private void SaveDefinition(CustomiseReportModel model, MetaReport metaReport)
        {
            try
            {
                // Prepare XML
                XmlDocument meta = new XmlDocument();

                var ns = ""; // urn:pvims-org:v3

                XmlNode      rootNode = null;
                XmlAttribute attrib;

                XmlDeclaration xmlDeclaration = meta.CreateXmlDeclaration("1.0", "UTF-8", null);
                meta.AppendChild(xmlDeclaration);

                rootNode = meta.CreateElement("MetaReport", ns);

                attrib           = meta.CreateAttribute("Type");
                attrib.InnerText = model.ReportType.ToString();
                rootNode.Attributes.Append(attrib);

                attrib           = meta.CreateAttribute("CoreEntity");
                attrib.InnerText = model.CoreEntity.ToString();
                rootNode.Attributes.Append(attrib);

                meta.AppendChild(rootNode);

                var encodedName       = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(model.ReportName, false);
                var encodedDefinition = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(model.ReportDefinition, false);

                metaReport.MetaDefinition   = meta.InnerXml;
                metaReport.ReportDefinition = encodedDefinition;
                metaReport.ReportName       = encodedName;
                metaReport.ReportStatus     = (MetaReportStatus)model.ReportStatus;

                if (model.MetaReportId == 0)
                {
                    _unitOfWork.Repository <MetaReport>().Save(metaReport);
                }
                else
                {
                    _unitOfWork.Repository <MetaReport>().Update(metaReport);
                }
                _unitOfWork.Complete();
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("ReportName", String.Format("<li>ERROR: {0}...</li>", ex.Message));
            }
        }
Ejemplo n.º 4
0
        private void ExtractMetaDataForCustom(MetaReport metaReport, CustomiseReportModel model)
        {
            int tempi;

            XmlDocument meta = new XmlDocument();

            meta.LoadXml(metaReport.MetaDefinition);

            // Unpack structures
            XmlNode      rootNode   = meta.SelectSingleNode("//MetaReport");
            XmlAttribute typeAttr   = rootNode.Attributes["Type"];
            XmlAttribute entityAttr = rootNode.Attributes["CoreEntity"];

            model.CoreEntity = entityAttr != null?int.TryParse(entityAttr.Value, out tempi) ? Convert.ToInt32(entityAttr.Value) : 0 : 0;

            model.ReportType = typeAttr != null?int.TryParse(typeAttr.Value, out tempi) ? Convert.ToInt32(typeAttr.Value) : 0 : 0;

            model.ViewType = model.ReportType == 1 ? Models.ViewType.List : Models.ViewType.Summary;
        }
Ejemplo n.º 5
0
        public ActionResult Edit(Guid?id)
        {
            if (id.HasValue)
            {
                MetaReport obj = MetaReportHelper.Get(id.Value);
                if (obj == null)
                {
                    return(MessageHelper.FormedContentObjectNotFound());
                }

                MetaReportModel.CreateMap();
                MetaReportModel model = Mapper.Map <MetaReport, MetaReportModel>(obj);
                return(View(model));
            }
            else
            {
                return(View(new MetaReportModel()));
            }
        }
Ejemplo n.º 6
0
        protected void Page_Init(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.IsInRole("ReporterAdmin"))
            {
                _isPublisher = true;
            }

            if (Request.QueryString["id"] != null)
            {
                _id = Convert.ToInt32(Request.QueryString["id"]);
                if (_id > 0)
                {
                    _metaReport = _db.MetaReports.Single(mr => mr.Id == _id);

                    // Prepare report
                    PrepareStructures();

                    RenderFilters();
                    RenderColumns();
                }
            }
            else
            {
                throw new Exception("id not passed as parameter");
            }

            //txtSearchFrom.Value = DateTime.Today.AddDays(-7).ToString("yyyy-MM-dd");
            //txtSearchTo.Value = DateTime.Today.ToString("yyyy-MM-dd");

            //ListItem item;
            //var facilityList = (from f in UnitOfWork.Repository<Facility>().Queryable() orderby f.FacilityName ascending select f).ToList();

            //foreach (Facility fac in facilityList)
            //{
            //    item = new ListItem();
            //    item.Text = fac.FacilityName;
            //    item.Value = fac.Id.ToString();
            //    ddlFacility.Items.Add(item);
            //}
        }
Ejemplo n.º 7
0
        private void SyncReportItems(MetaReport target, List <MetaReportItemModel> itemModel, DBEntities context)
        {
            MetaReportItemModel.CreateMap();
            var reportItems = context.MetaReportItem.Where(c => c.MetaReportId == target.Id).ToList();

            foreach (var item in itemModel)
            {
                var reportItem = reportItems.FirstOrDefault(c => c.Id == item.Id);
                if (reportItem == null)
                {
                    reportItem = new MetaReportItem()
                    {
                        Id = item.Id
                    };
                    Mapper.Map(item, reportItem);
                    reportItem.MetaReportId = target.Id;
                    context.MetaReportItem.AddObject(reportItem);
                }
                else
                {
                    Mapper.Map(item, reportItem);
                    reportItem.MetaReportId = target.Id;
                }
            }

            for (int i = 0; i < reportItems.Count; i++)
            {
                var reportItem = reportItems[i];
                var item       = itemModel.FirstOrDefault(c => c.Id == reportItem.Id);
                if (item == null)
                {
                    context.MetaReportItem.DeleteObject(reportItems[i]);
                    reportItems.RemoveAt(i);
                    i--;
                }
            }
        }
Ejemplo n.º 8
0
        private void SaveDefinitionForAttribute(MetaReportAttributeModel model, MetaReport metaReport)
        {
            try
            {
                // Prepare XML
                XmlDocument meta = new XmlDocument();

                var ns = ""; // urn:pvims-org:v3

                XmlNode      rootNode = null;
                XmlNode      mainNode = null;
                XmlNode      subNode  = null;
                XmlAttribute attrib;

                XmlDeclaration xmlDeclaration = meta.CreateXmlDeclaration("1.0", "UTF-8", null);
                meta.AppendChild(xmlDeclaration);

                rootNode = meta.CreateElement("MetaReport", ns);

                attrib           = meta.CreateAttribute("Type");
                attrib.InnerText = model.ReportType.ToString();
                rootNode.Attributes.Append(attrib);

                attrib           = meta.CreateAttribute("CoreEntity");
                attrib.InnerText = model.CoreEntity.ToString();
                rootNode.Attributes.Append(attrib);

                if (model.ReportType == 2)
                {
                    mainNode = meta.CreateElement("Summary", ns);

                    foreach (MetaReportAttributeModel.ListItem strat in model.StratifyItems)
                    {
                        subNode          = meta.CreateElement("SummaryItem", ns);
                        attrib           = meta.CreateAttribute("MetaColumnId");
                        attrib.InnerText = strat.MetaColumnId.ToString();
                        subNode.Attributes.Append(attrib);

                        attrib           = meta.CreateAttribute("DisplayName");
                        attrib.InnerText = strat.DisplayName;
                        subNode.Attributes.Append(attrib);

                        attrib           = meta.CreateAttribute("AttributeName");
                        attrib.InnerText = strat.AttributeName;
                        subNode.Attributes.Append(attrib);

                        mainNode.AppendChild(subNode);
                    }

                    rootNode.AppendChild(mainNode);
                }
                else
                {
                    mainNode = meta.CreateElement("List", ns);

                    foreach (MetaReportAttributeModel.ListItem list in model.ListItems)
                    {
                        subNode          = meta.CreateElement("ListItem", ns);
                        attrib           = meta.CreateAttribute("MetaColumnId");
                        attrib.InnerText = list.MetaColumnId.ToString();
                        subNode.Attributes.Append(attrib);

                        attrib           = meta.CreateAttribute("DisplayName");
                        attrib.InnerText = list.DisplayName;
                        subNode.Attributes.Append(attrib);

                        attrib           = meta.CreateAttribute("AttributeName");
                        attrib.InnerText = list.AttributeName;
                        subNode.Attributes.Append(attrib);

                        mainNode.AppendChild(subNode);
                    }

                    rootNode.AppendChild(mainNode);
                }

                mainNode = meta.CreateElement("Filter", ns);

                foreach (MetaReportAttributeModel.FilterItem filter in model.FilterItems)
                {
                    subNode          = meta.CreateElement("FilterItem", ns);
                    attrib           = meta.CreateAttribute("MetaColumnId");
                    attrib.InnerText = filter.MetaColumnId.ToString();
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("AttributeName");
                    attrib.InnerText = filter.AttributeName;
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("Operator");
                    attrib.InnerText = filter.Operator;
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("Relation");
                    attrib.InnerText = filter.Relation;
                    subNode.Attributes.Append(attrib);

                    mainNode.AppendChild(subNode);
                }

                rootNode.AppendChild(mainNode);
                meta.AppendChild(rootNode);

                metaReport.MetaDefinition = meta.InnerXml;

                string sql = string.Empty;
                if (model.ReportType == 2)
                {
                    sql = PrepareSummaryQueryForPublication(model);
                }
                else
                {
                    sql = PrepareListQueryForPublication(model);
                }
                metaReport.SQLDefinition = sql;

                _unitOfWork.Repository <MetaReport>().Update(metaReport);
                _unitOfWork.Complete();
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("ReportName", String.Format("<li>ERROR: {0}...</li>", ex.Message));
            }
        }
Ejemplo n.º 9
0
        private void ExtractMetaDataForAttribute(MetaReport metaReport, MetaReportAttributeModel model)
        {
            int tempi;

            XmlDocument meta = new XmlDocument();

            meta.LoadXml(metaReport.MetaDefinition);

            // Unpack structures
            XmlNode      rootNode   = meta.SelectSingleNode("//MetaReport");
            XmlAttribute typeAttr   = rootNode.Attributes["Type"];
            XmlAttribute entityAttr = rootNode.Attributes["CoreEntity"];

            var coreId = entityAttr != null?int.TryParse(entityAttr.Value, out tempi) ? Convert.ToInt32(entityAttr.Value) : 0 : 0;

            model.CoreEntity        = coreId;
            model.CoreEntityDisplay = _unitOfWork.Repository <MetaTable>().Queryable().Single(mt => mt.Id == coreId).TableName;
            var typeId = typeAttr != null?int.TryParse(typeAttr.Value, out tempi) ? Convert.ToInt32(typeAttr.Value) : 0 : 0;

            model.ReportType        = typeId;
            model.ReportTypeDisplay = typeId == 1 ? "List" : "Summary";

            XmlNode mainNode;

            // List or summary
            if (typeId == 1)
            {
                mainNode = rootNode.SelectSingleNode("//List");
                if (mainNode != null)
                {
                    foreach (XmlNode subNode in mainNode.ChildNodes)
                    {
                        MetaReportAttributeModel.ListItem list = new MetaReportAttributeModel.ListItem();
                        list.MetaColumnId  = Convert.ToInt32(subNode.Attributes["MetaColumnId"].Value);
                        list.AttributeName = subNode.Attributes.GetNamedItem("AttributeName").Value;
                        list.DisplayName   = subNode.Attributes.GetNamedItem("DisplayName").Value;
                        model.ListItems.Add(list);
                    }
                }
            }
            else
            {
                mainNode = rootNode.SelectSingleNode("//Summary");
                if (mainNode != null)
                {
                    foreach (XmlNode subNode in mainNode.ChildNodes)
                    {
                        MetaReportAttributeModel.ListItem strat = new MetaReportAttributeModel.ListItem();
                        strat.MetaColumnId  = Convert.ToInt32(subNode.Attributes["MetaColumnId"].Value);
                        strat.AttributeName = subNode.Attributes.GetNamedItem("AttributeName").Value;
                        strat.DisplayName   = subNode.Attributes.GetNamedItem("DisplayName").Value;
                        model.StratifyItems.Add(strat);
                    }
                }
            }

            // filter
            mainNode = rootNode.SelectSingleNode("//Filter");
            if (mainNode != null)
            {
                foreach (XmlNode subNode in mainNode.ChildNodes)
                {
                    MetaReportAttributeModel.FilterItem filter = new MetaReportAttributeModel.FilterItem();
                    filter.MetaColumnId  = Convert.ToInt32(subNode.Attributes["MetaColumnId"].Value);
                    filter.AttributeName = subNode.Attributes.GetNamedItem("AttributeName").Value;
                    filter.Operator      = subNode.Attributes.GetNamedItem("Operator").Value;
                    filter.Relation      = subNode.Attributes.GetNamedItem("Relation").Value;
                    model.FilterItems.Add(filter);
                }
            }
        }
Ejemplo n.º 10
0
        public ActionResult CustomiseReport(CustomiseReportModel model)
        {
            ViewBag.MenuItem = CurrentMenuItem;

            var metaReport = _unitOfWork.Repository <MetaReport>()
                             .Queryable()
                             .SingleOrDefault(r => r.Id == model.MetaReportId);

            if (metaReport == null)
            {
                metaReport = new MetaReport();
            }

            ValidateDefinition(model);

            if (ModelState.IsValid)
            {
                SaveDefinition(model, metaReport);

                HttpCookie cookie = new HttpCookie("PopUpMessage");
                cookie.Value = "Report saved successfully";
                Response.Cookies.Add(cookie);

                return(Redirect("/Reports/Index"));
            }

            ViewBag.CoreEntities = new List <SelectListItem> {
                new SelectListItem {
                    Value = "0", Text = "", Selected = true
                }
            };
            ViewBag.CoreEntities.AddRange(_unitOfWork.Repository <MetaTable>().Queryable()
                                          .OrderBy(mt => mt.FriendlyName).Select(mt => new SelectListItem {
                Value = mt.Id.ToString(), Text = mt.FriendlyName
            }).ToList());

            ViewBag.ReportTypes = new[]
            {
                new SelectListItem {
                    Value = "0", Text = ""
                },
                new SelectListItem {
                    Value = "1", Text = "List", Selected = true
                },
                new SelectListItem {
                    Value = "2", Text = "Summary"
                }
            };

            ViewBag.ReportStatuses = new[]
            {
                new SelectListItem {
                    Value = "0", Text = ""
                },
                new SelectListItem {
                    Value = "2", Text = "Unpublished", Selected = true
                },
                new SelectListItem {
                    Value = "1", Text = "Published"
                }
            };

            return(View(model));
        }
Ejemplo n.º 11
0
        private void SyncReportItems(MetaReport target, List<MetaReportItemModel> itemModel, DBEntities context)
        {
            MetaReportItemModel.CreateMap();
            var reportItems = context.MetaReportItem.Where(c => c.MetaReportId == target.Id).ToList();

            foreach (var item in itemModel)
            {
                var reportItem = reportItems.FirstOrDefault(c => c.Id == item.Id);
                if (reportItem == null)
                {
                    reportItem = new MetaReportItem()
                    {
                        Id = item.Id
                    };
                    Mapper.Map(item, reportItem);
                    reportItem.MetaReportId = target.Id;
                    context.MetaReportItem.AddObject(reportItem);

                }
                else
                {
                    Mapper.Map(item, reportItem);
                    reportItem.MetaReportId = target.Id;
                }
            }

            for (int i = 0; i < reportItems.Count; i++)
            {
                var reportItem = reportItems[i];
                var item = itemModel.FirstOrDefault(c => c.Id == reportItem.Id);
                if (item == null)
                {
                    context.MetaReportItem.DeleteObject(reportItems[i]);
                    reportItems.RemoveAt(i);
                    i--;
                }
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        ///  Prepare an XML definition containing details of the report (including attributes)
        /// </summary>
        /// <param name="metaReportForAttributeUpdate">The meta report attribute payload</param>
        /// <param name="metaReport">The meta report being updated</param>
        /// <returns></returns>
        private void PrepareMetaDefinitionForAttribute(MetaReportForAttributeUpdateDto metaReportForAttributeUpdate,
                                                       MetaReport metaReport)
        {
            // Prepare XML
            XmlDocument meta = new XmlDocument();

            var ns = ""; // urn:pvims-org:v3

            XmlNode      rootNode = null;
            XmlNode      mainNode = null;
            XmlNode      subNode  = null;
            XmlAttribute attrib;

            XmlDeclaration xmlDeclaration = meta.CreateXmlDeclaration("1.0", "UTF-8", null);

            meta.AppendChild(xmlDeclaration);

            rootNode = meta.CreateElement("MetaReport", ns);

            attrib           = meta.CreateAttribute("Type");
            attrib.InnerText = metaReportForAttributeUpdate.ReportType.ToString();
            rootNode.Attributes.Append(attrib);

            attrib           = meta.CreateAttribute("CoreEntity");
            attrib.InnerText = metaReportForAttributeUpdate.CoreEntity.ToString();
            rootNode.Attributes.Append(attrib);

            if (metaReportForAttributeUpdate.ReportType == MetaReportTypes.Summary)
            {
                mainNode = meta.CreateElement("Summary", ns);

                foreach (var attribute in metaReportForAttributeUpdate.Attributes)
                {
                    subNode          = meta.CreateElement("SummaryItem", ns);
                    attrib           = meta.CreateAttribute("DisplayName");
                    attrib.InnerText = attribute.DisplayName;
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("Aggregate");
                    attrib.InnerText = attribute.Aggregate;
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("AttributeName");
                    attrib.InnerText = attribute.AttributeName;
                    subNode.Attributes.Append(attrib);

                    mainNode.AppendChild(subNode);
                }

                rootNode.AppendChild(mainNode);
            }
            else
            {
                mainNode = meta.CreateElement("List", ns);

                foreach (var attribute in metaReportForAttributeUpdate.Attributes)
                {
                    subNode          = meta.CreateElement("ListItem", ns);
                    attrib           = meta.CreateAttribute("DisplayName");
                    attrib.InnerText = attribute.DisplayName;
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("Aggregate");
                    attrib.InnerText = string.Empty;
                    subNode.Attributes.Append(attrib);

                    attrib           = meta.CreateAttribute("AttributeName");
                    attrib.InnerText = attribute.AttributeName;
                    subNode.Attributes.Append(attrib);

                    mainNode.AppendChild(subNode);
                }

                rootNode.AppendChild(mainNode);
            }

            mainNode = meta.CreateElement("Filter", ns);

            foreach (var filter in metaReportForAttributeUpdate.Filters)
            {
                subNode          = meta.CreateElement("FilterItem", ns);
                attrib           = meta.CreateAttribute("AttributeName");
                attrib.InnerText = filter.AttributeName;
                subNode.Attributes.Append(attrib);

                attrib           = meta.CreateAttribute("Operator");
                attrib.InnerText = filter.Operator;
                subNode.Attributes.Append(attrib);

                attrib           = meta.CreateAttribute("Relation");
                attrib.InnerText = filter.Relation;
                subNode.Attributes.Append(attrib);

                mainNode.AppendChild(subNode);
            }

            rootNode.AppendChild(mainNode);
            meta.AppendChild(rootNode);

            metaReport.MetaDefinition = meta.InnerXml;

            string sql = string.Empty;

            if (metaReportForAttributeUpdate.ReportType == MetaReportTypes.Summary)
            {
                sql = PrepareSummaryQueryForPublication(metaReportForAttributeUpdate);
            }
            else
            {
                sql = PrepareListQueryForPublication(metaReportForAttributeUpdate);
            }
            metaReport.SqlDefinition = sql;
        }
Ejemplo n.º 13
0
        public async Task <IActionResult> CreateMetaReport(
            [FromBody] MetaReportForUpdateDto metaReportForUpdate)
        {
            if (metaReportForUpdate == null)
            {
                ModelState.AddModelError("Message", "Unable to locate payload for new request");
            }

            if (Regex.Matches(metaReportForUpdate.ReportName, @"[a-zA-Z0-9 ]").Count < metaReportForUpdate.ReportName.Length)
            {
                ModelState.AddModelError("Message", "Report name contains invalid characters (Enter A-Z, a-z, 0-9, space)");
            }

            var coreEntityFromRepo = await _metaTableRepository.GetAsync(f => f.TableName == metaReportForUpdate.CoreEntity);

            if (coreEntityFromRepo == null)
            {
                ModelState.AddModelError("Message", "Unable to locate core entity");
            }

            if (!string.IsNullOrWhiteSpace(metaReportForUpdate.ReportDefinition))
            {
                if (Regex.Matches(metaReportForUpdate.ReportDefinition, @"[-a-zA-Z0-9 .,]").Count < metaReportForUpdate.ReportDefinition.Length)
                {
                    ModelState.AddModelError("Message", "Report definition contains invalid characters (Enter A-Z, a-z, 0-9, space, hyphen, period, comma)");
                }
            }

            if (!string.IsNullOrWhiteSpace(metaReportForUpdate.Breadcrumb))
            {
                if (Regex.Matches(metaReportForUpdate.Breadcrumb, @"[-a-zA-Z0-9 .,]").Count < metaReportForUpdate.Breadcrumb.Length)
                {
                    ModelState.AddModelError("Message", "Bread crumb contains invalid characters (Enter A-Z, a-z, 0-9, space, hyphen, period, comma)");
                }
            }

            if (_unitOfWork.Repository <MetaReport>().Queryable().
                Where(l => l.ReportName == metaReportForUpdate.ReportName)
                .Count() > 0)
            {
                ModelState.AddModelError("Message", "Item with same name already exists");
            }

            if (ModelState.IsValid)
            {
                var newMetaReport = new MetaReport()
                {
                    ReportName       = metaReportForUpdate.ReportName,
                    ReportDefinition = metaReportForUpdate.ReportDefinition,
                    Breadcrumb       = metaReportForUpdate.Breadcrumb,
                    IsSystem         = false,
                    MetaReportGuid   = Guid.NewGuid(),
                    ReportStatus     = metaReportForUpdate.ReportStatus,
                    MetaDefinition   = PrepareMetaDefinition(metaReportForUpdate)
                };

                _metaReportRepository.Save(newMetaReport);

                var mappedMetaReport = await GetMetaReportAsync <MetaReportIdentifierDto>(newMetaReport.Id);

                if (mappedMetaReport == null)
                {
                    return(StatusCode(500, "Unable to locate newly added item"));
                }

                return(CreatedAtAction("GetMetaReportByIdentifier",
                                       new
                {
                    id = mappedMetaReport.Id
                }, CreateLinksForMetaReport <MetaReportIdentifierDto>(mappedMetaReport)));
            }

            return(BadRequest(ModelState));
        }