/// <summary> /// Read Content from given URL in arg /// </summary> /// <param name="arg"></param> /// <param name="processContentPart">Whether to process the content</param> /// <returns></returns> protected dynamic HandleContentRequest(dynamic arg, bool processContentPart) { var url = (string)arg.path; if (url == null) { url = "/"; } if (url.StartsWith("/") == false) { url = "/" + url; } url = url.ToLowerInvariant(); // invalid admin links if (url.StartsWith("/admin", StringComparison.InvariantCultureIgnoreCase)) { return(404); } // invalid system links if (url.StartsWith("/_", StringComparison.InvariantCultureIgnoreCase)) { return(404); } // invalid table get request if (url.StartsWith("/tables", StringComparison.InvariantCultureIgnoreCase)) { return(404); } IContent requestedContent = null; // see if the url is collection request or content request var parts = url.Split('/'); url = ContentModule.RewriteUrl(this.Context, arg, url); var subSiteName = (string)this.Context.Items[ContextItems.SubSite]; // can be /products/product1 if (parts.Length > 2 && parts[1].EndsWith("s")) { // seems to be a collection var typeName = parts[1].Substring(0, parts[1].Length - 1); var datatype = this.SiteDatabase.DataType.FromName(typeName); var contentUrl = url; // edit url when using subsite example: convert "/products/..." to "/products/subSiteName/..." // for products, blogs (end with 's') and etc if (!string.IsNullOrEmpty(subSiteName)) { contentUrl = string.Join("/", "/" + parts[1], subSiteName); contentUrl = contentUrl + "/" + string.Join("/", parts.Skip(2).ToArray()); } var result = this.SiteDatabase.Query(typeName, string.Format("Url eq '{0}'", contentUrl)).FirstOrDefault(); if (result != null) { // convert it to IContent if (result is IContent) { requestedContent = result as IContent; requestedContent = ContentModule.MapPage(this.Context, requestedContent); } else { requestedContent = JObject.FromObject(result).ToObject <Page>(); (requestedContent as Page).SetTableName(typeName); } } } // change url to subsite url ex: /contact to /micronics.in.th/contact if (!string.IsNullOrEmpty(subSiteName)) { url = "/" + subSiteName + url; } // if it is not table, use content table instead if (requestedContent == null) { requestedContent = ContentModule.GetPage(this.SiteDatabase, url); } if (requestedContent == null) { // won't generate path which contains extension // as user might be requesting file if (string.IsNullOrEmpty(Path.GetExtension(url)) == false) { return(404); } // only admin can generate if (this.CurrentUser.HasClaim("admin") == false) { return(404); } requestedContent = ContentModule.CreatePage(this.SiteDatabase, url); } if (string.IsNullOrEmpty((string)requestedContent.RequiredClaims) == false) { var required = ((string)requestedContent.RequiredClaims).Split(','); var user = this.Context.CurrentUser as NcbUser; if (required.Any(c => user.HasClaim(c)) == false) { // user does not have any required claims if (this.Context.CurrentUser.UserName == NcbUser.Anonymous) { return(401); } return(403); } } string source = null; if (this.Request.Cookies.ContainsKey("source") == true) { source = this.Request.Cookies["source"]; } if (string.IsNullOrEmpty(requestedContent.Layout)) { requestedContent.Layout = "Content"; } this.GenerateLayoutPage(this.CurrentSite, requestedContent); ContentModule.ProcessPage(this.Context, requestedContent); this.SendPageView(requestedContent); if (processContentPart) { ContentModule.ProcessContentPart(this.Context, requestedContent); } return(requestedContent); }
/// <summary> /// Initialize things that can share between requests /// </summary> /// <param name="ctx"></param> public void GlobalInitialize(NancyContext ctx) { ContentModule._SiteContent = ContentModule.GetPage(ctx.GetSiteDatabase(), "/", true); ContentModule.ProcessContentPart(ctx, ContentModule._SiteContent); }