public HttpResponseMessage GetFeed(int moduleId, int tabId, string template, string mediaType) { ModuleController mc = new ModuleController(); IEnumerable <IDataItem> dataList = new List <IDataItem>(); var module = new OpenContentModuleInfo(moduleId, tabId); var manifest = module.Settings.Template.Manifest; if (!OpenContentUtils.HasAllUsersViewPermissions(PortalSettings, module.ViewModule)) { return(Request.CreateResponse(HttpStatusCode.Unauthorized)); } var rssTemplate = new FileUri(module.Settings.TemplateDir, template + ".hbs"); string source = File.ReadAllText(rssTemplate.PhysicalFilePath); bool useLucene = module.Settings.Template.Manifest.Index; if (useLucene) { var indexConfig = OpenContentUtils.GetIndexConfig(module.Settings.Template); QueryBuilder queryBuilder = new QueryBuilder(indexConfig); queryBuilder.Build(module.Settings.Query, PortalSettings.UserMode != PortalSettings.Mode.Edit, UserInfo.UserID, DnnLanguageUtils.GetCurrentCultureCode(), UserInfo.Social.Roles); IDataSource ds = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource); var dsContext = OpenContentUtils.CreateDataContext(module, UserInfo.UserID); var dsItems = ds.GetAll(dsContext, queryBuilder.Select); dataList = dsItems.Items; } var mf = new ModelFactoryMultiple(dataList, null, module.Settings.TemplateDir.PhysicalFullDirectory, manifest, null, null, module, PortalSettings); dynamic model = mf.GetModelAsDictionary(false, true); HandlebarsEngine hbEngine = new HandlebarsEngine(); string res = hbEngine.Execute(source, model); var response = new HttpResponseMessage(); response.Content = new StringContent(res); response.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType); return(response); }
public HttpResponseMessage GetExcel(int moduleId, int tabId, string template, string fileName) { ModuleController mc = new ModuleController(); IEnumerable <IDataItem> dataList = new List <IDataItem>(); var module = new OpenContentModuleInfo(moduleId, tabId); var manifest = module.Settings.Template.Manifest; if (!OpenContentUtils.HasAllUsersViewPermissions(PortalSettings, module.ViewModule)) { return(Request.CreateResponse(HttpStatusCode.Unauthorized)); } bool useLucene = module.Settings.Template.Manifest.Index; if (useLucene) { var indexConfig = OpenContentUtils.GetIndexConfig(module.Settings.Template); QueryBuilder queryBuilder = new QueryBuilder(indexConfig); queryBuilder.Build(module.Settings.Query, PortalSettings.UserMode != PortalSettings.Mode.Edit, UserInfo.UserID, DnnLanguageUtils.GetCurrentCultureCode(), UserInfo.Social.Roles); IDataSource ds = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource); var dsContext = OpenContentUtils.CreateDataContext(module, UserInfo.UserID); var dsItems = ds.GetAll(dsContext, queryBuilder.Select); dataList = dsItems.Items; } var mf = new ModelFactoryMultiple(dataList, null, module.Settings.TemplateDir.PhysicalFullDirectory, manifest, null, null, module, PortalSettings); dynamic model = mf.GetModelAsDictionary(true); var rssTemplate = new FileUri(module.Settings.TemplateDir, template + ".hbs"); string source = rssTemplate.FileExists ? FileUriUtils.ReadFileFromDisk(rssTemplate) : GenerateCsvTemplateFromModel(model, rssTemplate); HandlebarsEngine hbEngine = new HandlebarsEngine(); string res = hbEngine.Execute(source, model); var fileBytes = ExcelUtils.OutputFile(res); return(ExcelUtils.CreateExcelResponseMessage(fileName, fileBytes)); }
public static List <OpenContentUrlRule> GetRules(int portalId) { object padlock = new object(); lock (padlock) { List <OpenContentUrlRule> rules = new List <OpenContentUrlRule>(); //#if DEBUG // decimal speed; // string mess; // var stopwatch = new System.Diagnostics.Stopwatch(); // stopwatch.Start(); //#endif var purgeResult = UrlRulesCaching.PurgeExpiredItems(portalId); var portalCacheKey = UrlRulesCaching.GeneratePortalCacheKey(portalId, null); var portalRules = UrlRulesCaching.GetCache(portalId, portalCacheKey, purgeResult.ValidCacheItems); if (portalRules != null && portalRules.Count > 0) { //#if DEBUG // stopwatch.Stop(); // speed = stopwatch.Elapsed.Milliseconds; // mess = $"PortalId: {portalId}. Time elapsed: {stopwatch.Elapsed.Milliseconds}ms. All Cached. PurgedItems: {purgeResult.PurgedItemCount}. Speed: {speed}"; // Log.Logger.Error(mess); //#endif return(portalRules); } Dictionary <string, Locale> dicLocales = LocaleController.Instance.GetLocales(portalId); var modules = DnnUtils.GetDnnOpenContentModules(portalId).ToList(); var cachedModules = 0; var nonCached = 0; foreach (var module in modules) { try { if (module.IsListMode() && module.Settings.Template.Detail != null && ((!module.Settings.IsOtherModule && module.Settings.DetailTabId <= 0) || (module.Settings.DetailTabId == module.TabId) ) ) { var dsContext = OpenContentUtils.CreateDataContext(module); dsContext.Agent = "OpenContentUrlProvider.GetRules()"; var cacheKey = UrlRulesCaching.GenerateModuleCacheKey(module.TabId, module.ModuleId, dsContext.ModuleId, null); List <OpenContentUrlRule> moduleRules = UrlRulesCaching.GetCache(portalId, cacheKey, purgeResult.ValidCacheItems); if (moduleRules != null && moduleRules.Count > 0) { rules.AddRange(moduleRules); cachedModules += 1; continue; } nonCached += 1; moduleRules = new List <OpenContentUrlRule>(); IDataSource ds = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource); var dataList = ds.GetAll(dsContext, null).Items.ToList(); if (dataList.Count() > 1000) { Log.Logger.Warn($"Module {module.DataModule.ModuleID} (portal/tab {module.DataModule.PortalID}/{module.DataModule.TabID}) has >1000 items. We are not making sluggs for them as this would be too inefficient"); continue; } var physicalTemplateFolder = module.Settings.TemplateDir.PhysicalFullDirectory + "\\"; HandlebarsEngine hbEngine = new HandlebarsEngine(); if (!string.IsNullOrEmpty(module.Settings.Manifest.DetailUrl)) { hbEngine.Compile(module.Settings.Manifest.DetailUrl); } foreach (KeyValuePair <string, Locale> key in dicLocales) { string cultureCode = key.Value.Code; string ruleCultureCode = (dicLocales.Count > 1 ? cultureCode : null); ModelFactoryMultiple mf = new ModelFactoryMultiple(dataList, module.Settings.Data, physicalTemplateFolder, module.Settings.Template.Manifest, module.Settings.Template, module.Settings.Template.Main, module, portalId, cultureCode); //dynamic model = mf.GetModelAsDynamic(true); //dynamic items = model.Items; IEnumerable <Dictionary <string, object> > items = mf.GetModelAsDictionaryList(); //Log.Logger.Debug("OCUR/" + PortalId + "/" + module.TabID + "/" + MainTabId + "/" + module.ModuleID + "/" + MainModuleId + "/" + CultureCode + "/" + dataList.Count() + "/" + module.ModuleTitle); //foreach (IDataItem content in dataList) foreach (Dictionary <string, object> content in items) { string id = (content["Context"] as Dictionary <string, object>)["Id"].ToString(); string url = "content-" + id; if (!string.IsNullOrEmpty(module.Settings.Manifest.DetailUrl)) { try { //ModelFactory mf = new ModelFactory(content, settings.Data, physicalTemplateFolder, settings.Template.Manifest, settings.Template, settings.Template.Main, module, PortalId, CultureCode, MainTabId, MainModuleId); //dynamic model = mf.GetModelAsDynamic(true); url = hbEngine.Execute(content); url = HttpUtility.HtmlDecode(url).CleanupUrl(); } catch (Exception ex) { Log.Logger.Error("Failed to generate url for opencontent item " + id, ex); } } if (!string.IsNullOrEmpty(url)) { var rule = new OpenContentUrlRule { CultureCode = ruleCultureCode, TabId = module.GetDetailTabId(), Parameters = "id=" + id, Url = url }; var reducedRules = rules.Where(r => r.CultureCode == rule.CultureCode && r.TabId == rule.TabId).ToList(); bool ruleExist = reducedRules.Any(r => r.Parameters == rule.Parameters); if (!ruleExist) { if (reducedRules.Any(r => r.Url == rule.Url)) { rule.Url = id + "-" + url; } rules.Add(rule); moduleRules.Add(rule); } } } } UrlRulesCaching.SetCache(portalId, UrlRulesCaching.GenerateModuleCacheKey(module.TabId, module.ModuleId, dsContext.ModuleId, null), new TimeSpan(1, 0, 0, 0), moduleRules); } } catch (Exception ex) { Log.Logger.Error("Failed to generate url for opencontent module " + module.ViewModule.ModuleID, ex); } } UrlRulesCaching.SetCache(portalId, portalCacheKey, new TimeSpan(1, 0, 0, 0), rules); //#if DEBUG // stopwatch.Stop(); // speed = (cachedModules + nonCached) == 0 ? -1 : stopwatch.Elapsed.Milliseconds / (cachedModules + nonCached); // mess = $"PortalId: {portalId}. Time elapsed: {stopwatch.Elapsed.Milliseconds}ms. Module Count: {modules.Count()}. Relevant Modules: {cachedModules + nonCached}. CachedModules: {cachedModules}. PurgedItems: {purgeResult.PurgedItemCount}. Speed: {speed}"; // Log.Logger.Error(mess); // Console.WriteLine(mess); //#endif return(rules); } }
public HttpResponseMessage List(RequestDTO req) { try { OpenContentModuleInfo module = new OpenContentModuleInfo(ActiveModule); JObject reqOptions = null; if (!string.IsNullOrEmpty(req.options)) { reqOptions = JObject.Parse(req.options); } if (module.IsListMode()) { var indexConfig = OpenContentUtils.GetIndexConfig(module.Settings.Template); QueryBuilder queryBuilder = new QueryBuilder(indexConfig); bool isEditable = ActiveModule.CheckIfEditable(PortalSettings); queryBuilder.Build(module.Settings.Query, !isEditable, UserInfo.UserID, DnnLanguageUtils.GetCurrentCultureCode(), UserInfo.Social.Roles); JplistQueryBuilder.MergeJpListQuery(indexConfig, queryBuilder.Select, req.StatusLst, DnnLanguageUtils.GetCurrentCultureCode()); IDataItems dsItems; if (queryBuilder.DefaultNoResults && queryBuilder.Select.IsQueryEmpty) { dsItems = new DefaultDataItems() { Items = new List <DefaultDataItem>(), Total = 0 }; } else { IDataSource ds = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource); var dsContext = OpenContentUtils.CreateDataContext(module, UserInfo.UserID, false, reqOptions); dsItems = ds.GetAll(dsContext, queryBuilder.Select); } var mf = new ModelFactoryMultiple(dsItems.Items, module, PortalSettings); mf.Options = reqOptions; var model = mf.GetModelAsJson(false, req.onlyItems); //model["luceneQuery"] = dsItems.DebugInfo; if (LogContext.IsLogActive) { LogContext.Log(ActiveModule.ModuleID, "RequestContext", "IsEditable", isEditable); LogContext.Log(ActiveModule.ModuleID, "RequestContext", "UserRoles", PortalSettings.UserInfo.Social.Roles.Select(r => r.RoleName)); LogContext.Log(ActiveModule.ModuleID, "RequestContext", "CurrentUserId", PortalSettings.UserId); var logKey = "Query"; LogContext.Log(ActiveModule.ModuleID, logKey, "select", queryBuilder.Select); LogContext.Log(ActiveModule.ModuleID, logKey, "debuginfo", dsItems.DebugInfo); LogContext.Log(ActiveModule.ModuleID, logKey, "model", model); model["Logs"] = JToken.FromObject(LogContext.Current.ModuleLogs(ActiveModule.ModuleID)); } var res = new ResultDTO() { data = model, count = dsItems.Total }; return(Request.CreateResponse(HttpStatusCode.OK, res)); } else { return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "not supported because not in multi items template ")); } } catch (Exception exc) { Log.Logger.Error(exc); return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc)); } }
public HttpResponseMessage Get(string entity, int pageIndex, int pageSize, string filter = null, string sort = null) { try { var collection = entity; //if (entity == "items") collection = AppConfig.DEFAULT_COLLECTION; // backward compatibility RestSelect restSelect = new RestSelect() { PageIndex = pageIndex, PageSize = pageSize }; if (!string.IsNullOrEmpty(filter)) { restSelect.Query = JsonConvert.DeserializeObject <RestGroup>(filter); } if (!string.IsNullOrEmpty(sort)) { restSelect.Sort = JsonConvert.DeserializeObject <List <RestSort> >(sort); } ModuleInfo activeModule = ActiveModule; OpenContentSettings settings = activeModule.OpenContentSettings(); OpenContentModuleInfo module = new OpenContentModuleInfo(ActiveModule); JObject reqOptions = null; if (module.IsListMode()) { var indexConfig = OpenContentUtils.GetIndexConfig(settings.TemplateDir, collection); QueryBuilder queryBuilder = new QueryBuilder(indexConfig); bool isEditable = ActiveModule.CheckIfEditable(PortalSettings); queryBuilder.Build(settings.Query, !isEditable, UserInfo.UserID, DnnLanguageUtils.GetCurrentCultureCode(), UserInfo.Social.Roles); RestQueryBuilder.MergeQuery(indexConfig, queryBuilder.Select, restSelect, DnnLanguageUtils.GetCurrentCultureCode()); IDataItems dsItems; if (queryBuilder.DefaultNoResults && queryBuilder.Select.IsQueryEmpty) { dsItems = new DefaultDataItems() { Items = new List <DefaultDataItem>(), Total = 0 }; } else { IDataSource ds = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource); var dsContext = OpenContentUtils.CreateDataContext(module, UserInfo.UserID, false, reqOptions); dsContext.Collection = collection; dsItems = ds.GetAll(dsContext, queryBuilder.Select); } var mf = new ModelFactoryMultiple(dsItems.Items, module, PortalSettings, collection); mf.Options = reqOptions; var model = mf.GetModelAsJson(false); var res = new JObject(); res["meta"] = new JObject(); if (LogContext.IsLogActive) { var logKey = "Query"; LogContext.Log(activeModule.ModuleID, logKey, "select", queryBuilder.Select); LogContext.Log(activeModule.ModuleID, logKey, "debuginfo", dsItems.DebugInfo); LogContext.Log(activeModule.ModuleID, logKey, "model", model); res["meta"]["logs"] = JToken.FromObject(LogContext.Current.ModuleLogs(activeModule.ModuleID)); if (restSelect != null) { //res["meta"]["select"] = JObject.FromObject(restSelect); } } foreach (var item in model["Items"] as JArray) { item["id"] = item["Context"]["Id"]; JsonUtils.IdJson(item); } res[entity] = model[collection]; res["meta"]["total"] = dsItems.Total; return(Request.CreateResponse(HttpStatusCode.OK, res)); } else { return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "not supported because not in multi items template ")); } } catch (Exception exc) { Log.Logger.Error(exc); return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc)); } }
public HttpResponseMessage GetExcelByQuery(int moduleId, int tabId, string queryName, string filter = null, string sort = null) { RestSelect restSelect = new RestSelect() { PageIndex = 0, PageSize = 100000 }; if (!string.IsNullOrEmpty(filter)) { restSelect.Query = JsonConvert.DeserializeObject <RestGroup>(filter); } if (!string.IsNullOrEmpty(sort)) { restSelect.Sort = JsonConvert.DeserializeObject <List <RestSort> >(sort); } IEnumerable <IDataItem> dataList = new List <IDataItem>(); var module = OpenContentModuleConfig.Create(moduleId, tabId, PortalSettings); var manifest = module.Settings.Template.Manifest; if (!module.HasAllUsersViewPermissions()) { return(Request.CreateResponse(HttpStatusCode.Unauthorized)); } string filename = queryName; bool useLucene = module.Settings.Template.Manifest.Index; if (useLucene) { var indexConfig = OpenContentUtils.GetIndexConfig(module.Settings.Template); QueryBuilder queryBuilder = new QueryBuilder(indexConfig); queryBuilder.Build(module.Settings.Query, true, UserInfo.UserID, DnnLanguageUtils.GetCurrentCultureCode(), UserInfo.Social.Roles.FromDnnRoles()); RestQueryBuilder.MergeQuery(indexConfig, queryBuilder.Select, restSelect, DnnLanguageUtils.GetCurrentCultureCode()); IDataSource ds = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource); var dsContext = OpenContentUtils.CreateDataContext(module, UserInfo.UserID); if (string.IsNullOrEmpty(queryName)) { var dsItems = ds.GetAll(dsContext, queryBuilder.Select); dataList = dsItems.Items; filename = dsContext.Collection; } else { var qds = ds as IDataQueries; var query = qds?.GetQueries(dsContext).SingleOrDefault(q => q.Name == queryName); if (query != null) { var dsItems = query.GetAll(dsContext, queryBuilder.Select); dataList = dsItems.Items; } } } var mf = new ModelFactoryMultiple(dataList, null, manifest, null, null, module); dynamic model = mf.GetModelAsDictionary(true); var rssTemplate = new FileUri(module.Settings.TemplateDir, filename + "-excel.hbs"); string source = rssTemplate.FileExists ? FileUriUtils.ReadFileFromDisk(rssTemplate) : GenerateTemplateFromModel(model, rssTemplate); HandlebarsEngine hbEngine = new HandlebarsEngine(); string res = hbEngine.Execute(source, model); var fileBytes = ExcelUtils.CreateExcel(res); return(ExcelUtils.CreateExcelResponseMessage(filename + ".xlsx", fileBytes)); }