public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByValueId <TView>( string valueId , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { PageIndex = pageIndex.HasValue ? pageIndex.Value : 0, PageSize = pageSize } }; // Get Tag var getVal = await MixAttributeSetValues.ReadViewModel.Repository.GetSingleModelAsync( m => m.Specificulture == culture && m.Status == MixEnums.MixContentStatus.Published.ToString() && m.Id == valueId , context, transaction); if (getVal.IsSucceed) { result = await GetPostListByDataId <TView>( dataId : getVal.Data.DataId, culture : culture, orderByPropertyName : orderByPropertyName, direction : direction, pageSize : pageSize, pageIndex : pageIndex, _context : context, _transaction : transaction); //var query = context.MixRelatedAttributeData.Where(m=> m.Specificulture == culture // && m.Id == getVal.Data.DataId && m.ParentId == parentId && m.ParentType == (int) MixEnums.MixAttributeSetDataType.Post) // .Select(m => m.ParentId).Distinct().ToList(); } return(result); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root context.Database.CloseConnection(); transaction.Dispose(); context.Dispose(); } } }
/// <summary> /// Gets the language. /// </summary> protected void GetLanguage() { _lang = RouteData?.Values["culture"] != null ? RouteData.Values["culture"].ToString() : MixService.GetConfig <string>("Language"); ViewBag.culture = _lang; _domain = string.Format("{0}://{1}", Request.Scheme, Request.Host); }
public AttributeDataViewModel(MixAttributeSetData model, MixCmsContext _context = null, IDbContextTransaction _transaction = null) : base(model, _context, _transaction) { CacheConnectionString = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); }
public static async Task <RepositoryResponse <string> > ExportTheme( int id, SiteStructureViewModel data, string culture, string scheme, string host) { var getTheme = await ReadViewModel.Repository.GetSingleModelAsync( theme => theme.Id == id).ConfigureAwait(false); //path to temporary folder string tempPath = $"{MixFolders.WebRootPath}/{MixFolders.ExportFolder}/Themes/{getTheme.Data.Name}/temp"; string outputPath = $"{MixFolders.ExportFolder}/Themes/{getTheme.Data.Name}"; data.ThemeName = getTheme.Data.Name; data.Specificulture = culture; var result = data.ExportSelectedItemsAsync(); if (result.IsSucceed) { string domain = MixService.GetConfig <string>(MixAppSettingKeywords.Domain); string accessFolder = $"{MixFolders.SiteContentAssetsFolder}/{getTheme.Data.Name}/assets"; string content = JObject.FromObject(data).ToString() .Replace(accessFolder, "[ACCESS_FOLDER]") .Replace($"/{culture}/", "/[CULTURE]/") .Replace($"/{data.ThemeName}/", "/[THEME_NAME]/"); if (!string.IsNullOrEmpty(domain)) { content = content.Replace(domain, string.Empty); } string filename = $"schema"; var file = new FileViewModel() { Filename = filename, Extension = MixFileExtensions.Json, FileFolder = $"{tempPath}/Data", Content = content }; // Delete Existing folder MixFileRepository.Instance.DeleteWebFolder(outputPath); // Copy current templates file MixFileRepository.Instance.CopyDirectory($"{getTheme.Data.TemplateFolder}", $"{tempPath}/Templates"); // Copy current assets files MixFileRepository.Instance.CopyDirectory($"{MixFolders.WebRootPath}/{getTheme.Data.AssetFolder}", $"{tempPath}/Assets"); // Copy current uploads files MixFileRepository.Instance.CopyDirectory($"{MixFolders.WebRootPath}/{getTheme.Data.UploadsFolder}", $"{tempPath}/Uploads"); // Save Site Structures MixFileRepository.Instance.SaveFile(file); // Zip to [theme_name].zip ( wwwroot for web path) string filePath = MixFileRepository.Instance.ZipFolder($"{tempPath}", outputPath, $"{getTheme.Data.Name}-{Guid.NewGuid()}"); // Delete temp folder MixFileRepository.Instance.DeleteWebFolder($"{outputPath}/Assets"); MixFileRepository.Instance.DeleteWebFolder($"{outputPath}/Uploads"); MixFileRepository.Instance.DeleteWebFolder($"{outputPath}/Templates"); MixFileRepository.Instance.DeleteWebFolder($"{outputPath}/Data"); return(new RepositoryResponse <string>() { IsSucceed = !string.IsNullOrEmpty(outputPath), Data = $"{scheme}://{host}/{filePath}" }); } else { return(result); } }
protected async Task <List <TView> > GetListAsync <TView>(Expression <Func <TModel, bool> > predicate, string key, ODataQueryOptions <TModel> queryOptions) where TView : ODataViewModelBase <TDbContext, TModel, TView> { if (queryOptions.Filter != null) { ODataHelper <TModel> .ParseFilter(queryOptions.Filter.FilterClause.Expression, ref predicate); } int? top = queryOptions.Top?.Value; var skip = queryOptions.Skip?.Value ?? 0; RequestPaging request = new RequestPaging() { PageIndex = 0, PageSize = top.HasValue ? top + top * (skip / top + 1) : null, OrderBy = queryOptions.OrderBy?.RawValue //Top = queryOptions.Top?.Value, //Skip = queryOptions.Skip?.Value }; var cacheKey = $"odata_{_lang}_{typeof(TView).FullName}_{key}_{SeoHelper.GetSEOString(queryOptions.Filter?.RawValue, '_')}_ps-{request.PageSize}"; List <TView> data = null; if (MixService.GetConfig <bool>("IsCache")) { var getData = await MixCacheService.GetAsync <RepositoryResponse <PaginationModel <TView> > >(cacheKey); if (getData != null) { data = getData.Data.Items; } } if (data == null) { if (predicate != null) { var getData = await ODataDefaultRepository <TDbContext, TModel, TView> .Instance.GetModelListByAsync(predicate, request.OrderBy, request.Direction, request.PageSize, request.PageIndex, request.Skip, request.Top).ConfigureAwait(false); if (getData.IsSucceed) { await MixCacheService.SetAsync(cacheKey, getData); data = getData.Data.Items; } } else { var getData = await ODataDefaultRepository <TDbContext, TModel, TView> .Instance.GetModelListAsync( request.OrderBy, request.Direction, request.PageSize, request.PageIndex , null, null).ConfigureAwait(false); if (getData.IsSucceed) { await MixCacheService.SetAsync(cacheKey, getData); data = getData.Data.Items; } } } return(data); }
override protected void GetLanguage() { _lang = RouteData?.Values["culture"] != null ? RouteData.Values["culture"].ToString() : MixService.GetAppSetting <string>(MixAppSettingKeywords.DefaultCulture); _domain = string.Format("{0}://{1}", Request.Scheme, Request.Host); }
public override void ExpandView(MixCmsContext _context = null, IDbContextTransaction _transaction = null) { if (Id == 0) { ExtraFields = MixService.GetConfig <string>("DefaultPostAttr"); } Cultures = LoadCultures(Specificulture, _context, _transaction); UrlAliases = GetAliases(_context, _transaction); if (!string.IsNullOrEmpty(this.Tags)) { ListTag = JArray.Parse(this.Tags); } // Parsing Extra Properties fields Columns = new List <ModuleFieldViewModel>(); JArray arrField = !string.IsNullOrEmpty(ExtraFields) ? JArray.Parse(ExtraFields) : new JArray(); foreach (var field in arrField) { ModuleFieldViewModel thisField = new ModuleFieldViewModel() { Name = CommonHelper.ParseJsonPropertyName(field["name"].ToString()), Title = field["title"]?.ToString(), Options = field["options"] != null ? field["options"].Value <JArray>() : new JArray(), Priority = field["priority"] != null ? field["priority"].Value <int>() : 0, DataType = (MixDataType)(int)field["dataType"], Width = field["width"] != null ? field["width"].Value <int>() : 3, IsUnique = field["isUnique"] != null ? field["isUnique"].Value <bool>() : true, IsRequired = field["isRequired"] != null ? field["isRequired"].Value <bool>() : true, IsDisplay = field["isDisplay"] != null ? field["isDisplay"].Value <bool>() : true, IsSelect = field["isSelect"] != null ? field["isSelect"].Value <bool>() : false, IsGroupBy = field["isGroupBy"] != null ? field["isGroupBy"].Value <bool>() : false, }; Columns.Add(thisField); } // Parsing Extra Properties value Properties = new List <ExtraProperty>(); if (!string.IsNullOrEmpty(ExtraProperties)) { JArray arr = JArray.Parse(ExtraProperties); foreach (JToken item in arr) { Properties.Add(item.ToObject <ExtraProperty>()); } } //Get Templates this.Templates = this.Templates ?? MixTemplates.UpdateViewModel.Repository.GetModelListBy( t => t.Theme.Id == ActivedTheme && t.FolderType == this.TemplateFolderType).Data; View = MixTemplates.UpdateViewModel.GetTemplateByPath(Template, Specificulture, MixTemplateFolders.Posts, _context, _transaction); this.Template = $"{this.View?.FileFolder}/{this.View?.FileName}"; var getPagePost = MixPagePosts.ReadViewModel.GetPagePostNavAsync(Id, Specificulture, _context, _transaction); if (getPagePost.IsSucceed) { this.Pages = getPagePost.Data; this.Pages.ForEach(c => { c.IsActived = MixPagePosts.ReadViewModel.Repository.CheckIsExists(n => n.PageId == c.PageId && n.PostId == Id, _context, _transaction); }); } var getModulePost = MixModulePosts.ReadViewModel.GetModulePostNavAsync(Id, Specificulture, _context, _transaction); if (getModulePost.IsSucceed) { this.Modules = getModulePost.Data; this.Modules.ForEach(c => { c.IsActived = MixModulePosts.ReadViewModel.Repository.CheckIsExists(n => n.ModuleId == c.ModuleId && n.PostId == Id, _context, _transaction); }); } var otherModules = MixModules.ReadListItemViewModel.Repository.GetModelListBy( m => (m.Type == (int)MixModuleType.Content || m.Type == (int)MixModuleType.ListPost) && m.Specificulture == Specificulture && !Modules.Any(n => n.ModuleId == m.Id && n.Specificulture == m.Specificulture) , "CreatedDateTime", Heart.Enums.MixHeartEnums.DisplayDirection.Desc, null, 0, _context, _transaction); foreach (var item in otherModules.Data.Items) { Modules.Add(new MixModulePosts.ReadViewModel() { ModuleId = item.Id, Image = item.Image, PostId = Id, Description = Title }); } // Medias var getPostMedia = MixPostMedias.ReadViewModel.Repository.GetModelListBy(n => n.PostId == Id && n.Specificulture == Specificulture, _context, _transaction); if (getPostMedia.IsSucceed) { MediaNavs = getPostMedia.Data.OrderBy(p => p.Priority).ToList(); MediaNavs.ForEach(n => n.IsActived = true); } // Modules var getPostModule = MixPostModules.ReadViewModel.Repository.GetModelListBy( n => n.PostId == Id && n.Specificulture == Specificulture, _context, _transaction); if (getPostModule.IsSucceed) { ModuleNavs = getPostModule.Data.OrderBy(p => p.Priority).ToList(); foreach (var item in ModuleNavs) { item.IsActived = true; item.Module.LoadData(postId: Id, _context: _context, _transaction: _transaction); } } // Related Posts PostNavs = GetRelated(_context, _transaction); var otherPosts = MixPosts.ReadListItemViewModel.Repository.GetModelListBy( m => m.Id != Id && m.Specificulture == Specificulture && !PostNavs.Any(n => n.SourceId == Id) , "CreatedDateTime", Heart.Enums.MixHeartEnums.DisplayDirection.Desc, 10, 0, _context, _transaction); foreach (var item in otherPosts.Data.Items) { PostNavs.Add(new MixPostPosts.ReadViewModel() { SourceId = Id, Image = item.ImageUrl, DestinationId = item.Id, Description = item.Title }); } }
public virtual async Task <ActionResult> ClearCacheAsync() { await MixService.RemoveCacheAsync(typeof(TModel)); return(NoContent()); }
public void LoadData(int?postId = null, int?productId = null, int?pageId = null , int?pageSize = null, int?pageIndex = 0 , MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { pageSize = pageSize > 0 ? PageSize : PageSize; pageIndex = pageIndex ?? 0; Expression <Func <MixModuleData, bool> > dataExp = null; Expression <Func <MixModulePost, bool> > postExp = null; switch (Type) { case MixModuleType.Content: case MixModuleType.Data: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; //postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; //productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; break; case MixModuleType.SubPage: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.PageId == pageId); postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; case MixModuleType.SubPost: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.PostId == postId); break; case MixModuleType.ListPost: postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; default: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; } if (dataExp != null) { var getDataResult = MixModuleDatas.ReadViewModel.Repository .GetModelListBy( dataExp , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getDataResult.IsSucceed) { getDataResult.Data.JsonItems = new List <JObject>(); getDataResult.Data.Items.ForEach(d => getDataResult.Data.JsonItems.Add(d.JItem)); Data = getDataResult.Data; } } if (postExp != null) { var getPosts = MixModulePosts.ReadViewModel.Repository .GetModelListBy(postExp , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getPosts.IsSucceed) { Posts = getPosts.Data; } } } catch (Exception ex) { UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction); } finally { if (isRoot) { //if current Context is Root context.Dispose(); } } }
async System.Threading.Tasks.Task <IActionResult> PageAsync(string seoName)//Expression<Func<MixPage, bool>> predicate, int? pageIndex = null, int pageSize = 10) { // Home Page int.TryParse(Request.Query["pageSize"], out int pageSize); int.TryParse(Request.Query["pageIndex"], out int pageIndex); var getPage = new RepositoryResponse <Lib.ViewModels.MixPages.ReadMvcViewModel>(); var cacheKey = $"page_{_culture}_{seoName}_{pageSize}_{pageIndex}"; var data = _memoryCache.Get <Lib.ViewModels.MixPages.ReadMvcViewModel>(cacheKey); if (data != null) { getPage.IsSucceed = true; getPage.Data = data; } else { Expression <Func <MixPage, bool> > predicate; if (string.IsNullOrEmpty(seoName)) { predicate = p => p.Type == (int)MixPageType.Home && p.Status == (int)MixContentStatus.Published && p.Specificulture == _culture; } else { predicate = p => p.SeoName == seoName && p.Status == (int)MixContentStatus.Published && p.Specificulture == _culture; } getPage = await Lib.ViewModels.MixPages.ReadMvcViewModel.Repository.GetSingleModelAsync(predicate); if (getPage.Data != null) { getPage.Data.LoadData(pageIndex: pageIndex, pageSize: pageSize); } _memoryCache.Set(cacheKey, getPage.Data); if (!MixConstants.cachedKeys.Contains(cacheKey)) { MixConstants.cachedKeys.Add(cacheKey); } } if (getPage.IsSucceed && getPage.Data.View != null) { GeneratePageDetailsUrls(getPage.Data); if (!MixConstants.cachedKeys.Contains(cacheKey)) { MixConstants.cachedKeys.Add(cacheKey); } ViewData["Title"] = getPage.Data.SeoTitle; ViewData["Description"] = getPage.Data.SeoDescription; ViewData["Keywords"] = getPage.Data.SeoKeywords; ViewData["Image"] = getPage.Data.ImageUrl; ViewData["PageClass"] = getPage.Data.CssClass; getPage.LastUpdateConfiguration = MixService.GetConfig <DateTime?>("LastUpdateConfiguration"); return(View(getPage.Data)); } else { return(NotFound()); } }
public static PaginationModel <JObject> GetListData <T>(HttpRequest request, string culture = null) { culture = culture ?? MixService.GetAppSetting <string>("DefaultCulture"); string mixDatabaseName = request.Query["mixDatabaseName"].ToString().Trim(); var orderBy = "Id"; Enum.TryParse(request.Query["direction"], out Heart.Enums.DisplayDirection direction); Enum.TryParse(request.Query["filterType"], out MixCompareOperatorKind filterType); bool.TryParse(request.Query["isGroup"], out bool isGroup); int.TryParse(request.Query["pageIndex"], out int pageIndex); var isPageSize = int.TryParse(request.Query["pageSize"], out int pageSize); bool isFromDate = DateTime.TryParse(request.Query["fromDate"], out DateTime fromDate); bool isToDate = DateTime.TryParse(request.Query["toDate"], out DateTime toDate); bool isStatus = Enum.TryParse(request.Query["status"], out MixContentStatus status); var fieldQueries = !string.IsNullOrEmpty(request.Query["query"]) ? JObject.Parse(request.Query["query"]) : new JObject(); string whereSql = GetQueryString(MixRequestQueryKeywords.Specificulture, filterType, culture); whereSql = whereSql.AndAlsoIf( isFromDate, GetQueryString( MixQueryColumnName.CreatedDateTime, MixCompareOperatorKind.GreaterThanOrEqual, fromDate.ToString())); whereSql = whereSql.AndAlsoIf( isToDate, GetQueryString( MixQueryColumnName.CreatedDateTime, MixCompareOperatorKind.LessThanOrEqual, toDate.ToString())); whereSql = whereSql.AndAlsoIf( isStatus, GetQueryString( MixQueryColumnName.Status, MixCompareOperatorKind.Equal, status.ToString())); // if filter by field name or keyword => filter by attr value if (fieldQueries.Count > 0) { // filter by all fields if have keyword if (fieldQueries != null && fieldQueries.Properties().Count() > 0) // filter by specific field name { foreach (JProperty property in fieldQueries.Properties()) { whereSql = whereSql.AndAlso(GetQueryString(property.Name, filterType, fieldQueries.Value <string>(property.Name))); } } } using (var context = new MixCmsContext()) { using (var transaction = context.Database.BeginTransaction()) { var database = MixDatabases.UpdateViewModel.Repository.GetSingleModel(m => m.Name == mixDatabaseName, context, transaction).Data; string countSql = $"SELECT COUNT(*) as total FROM {MixConstants.CONST_MIXDB_PREFIX}{mixDatabaseName} WHERE {whereSql}"; string pagingSql = $" ORDER BY {orderBy} {direction} LIMIT {pageSize} OFFSET {pageIndex * pageSize}"; var count = EFCoreHelper.RawSqlQuery(countSql, context)[0].Value <int>("total"); var result = GetData(mixDatabaseName, whereSql, pagingSql, context, transaction); return(new PaginationModel <JObject>() { Items = result, PageSize = pageSize, PageIndex = pageIndex, TotalItems = result.Count, TotalPage = (count / pageSize) + (count % pageSize > 0 ? 1 : 0) }); } } }
public override RepositoryResponse <bool> SaveSubModels(MixTheme parent, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { RepositoryResponse <bool> result = new RepositoryResponse <bool>() { IsSucceed = true }; // import templates + assets if (TemplateAsset.Content != null || TemplateAsset.FileStream != null) { result = ImportTheme(_context, _transaction); } // Create default template if create new without import template assets if (Id == 0 && (TemplateAsset.Content == null && TemplateAsset.FileStream == null)) { string defaultFolder = CommonHelper.GetFullPath(new string[] { MixConstants.Folder.TemplatesFolder, Name == "Default"? "Default": MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.DefaultTemplateFolder) }); bool copyResult = FileRepository.Instance.CopyDirectory(defaultFolder, TemplateFolder); var files = FileRepository.Instance.GetFilesWithContent(TemplateFolder); //TODO: Create default asset foreach (var file in files) { MixTemplates.InitViewModel template = new MixTemplates.InitViewModel( new MixTemplate() { FileFolder = file.FileFolder, FileName = file.Filename, Content = file.Content, Extension = file.Extension, CreatedDateTime = DateTime.UtcNow, LastModified = DateTime.UtcNow, ThemeId = Model.Id, ThemeName = Model.Name, FolderType = file.FolderName, ModifiedBy = CreatedBy }, _context, _transaction); var saveResult = template.SaveModel(true, _context, _transaction); result.IsSucceed = result.IsSucceed && saveResult.IsSucceed; if (!saveResult.IsSucceed) { result.Exception = saveResult.Exception; result.Errors.AddRange(saveResult.Errors); break; } } } // Actived Theme if (result.IsSucceed && IsActived) { SystemConfigurationViewModel config = (SystemConfigurationViewModel.Repository.GetSingleModel( c => c.Keyword == MixConstants.ConfigurationKeyword.ThemeName && c.Specificulture == Specificulture , _context, _transaction)).Data; if (config == null) { config = new SystemConfigurationViewModel(new MixConfiguration() { Keyword = MixConstants.ConfigurationKeyword.ThemeName, Specificulture = Specificulture, Category = "Site", DataType = (int)DataType.Text, Description = "Cms Theme", Value = Name }, _context, _transaction) ; } else { config.Value = Name; } var saveConfigResult = config.SaveModel(false, _context, _transaction); if (!saveConfigResult.IsSucceed) { Errors.AddRange(saveConfigResult.Errors); } else { //MixCmsService.Instance.RefreshConfigurations(_context, _transaction); } result.IsSucceed = result.IsSucceed && saveConfigResult.IsSucceed; SystemConfigurationViewModel configId = (SystemConfigurationViewModel.Repository.GetSingleModel( c => c.Keyword == MixConstants.ConfigurationKeyword.ThemeId && c.Specificulture == Specificulture, _context, _transaction)).Data; if (configId == null) { configId = new SystemConfigurationViewModel(new MixConfiguration() { Keyword = MixConstants.ConfigurationKeyword.ThemeId, Specificulture = Specificulture, Category = "Site", DataType = (int)DataType.Text, Description = "Cms Theme Id", Value = Model.Id.ToString() }, _context, _transaction) ; } else { configId.Value = Model.Id.ToString(); } var saveResult = configId.SaveModel(false, _context, _transaction); if (!saveResult.IsSucceed) { Errors.AddRange(saveResult.Errors); } else { //MixCmsService.Instance.RefreshConfigurations(_context, _transaction); } result.IsSucceed = result.IsSucceed && saveResult.IsSucceed; } if (result.IsSucceed && TemplateAsset.Content != null || TemplateAsset.FileStream != null) { var files = FileRepository.Instance.GetWebFiles(AssetFolder); StringBuilder strStyles = new StringBuilder(); foreach (var css in files.Where(f => f.Extension == ".css")) { strStyles.Append($" <link href='{css.FileFolder}/{css.Filename}{css.Extension}' rel='stylesheet'/>"); } StringBuilder strScripts = new StringBuilder(); foreach (var js in files.Where(f => f.Extension == ".js")) { strScripts.Append($" <script src='{js.FileFolder}/{js.Filename}{js.Extension}'></script>"); } var layout = MixTemplates.InitViewModel.Repository.GetSingleModel( t => t.FileName == "_Layout" && t.ThemeId == Model.Id , _context, _transaction); layout.Data.Content = layout.Data.Content.Replace("<!--[STYLES]-->" , string.Format(@"{0}" , strStyles)); layout.Data.Content = layout.Data.Content.Replace("<!--[SCRIPTS]-->" , string.Format(@"{0}" , strScripts)); layout.Data.SaveModel(true, _context, _transaction); } return(result); }
public async Task <RepositoryResponse <UpdateViewModel> > Save([FromForm] string model, [FromForm] IFormFile file) { if (model != null) { var json = JObject.Parse(model); var data = json.ToObject <UpdateViewModel>(); data.Status = (MixContentStatus)Enum.Parse(typeof(MixContentStatus), MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.DefaultContentStatus)); data.Specificulture = _lang; data.File = file; var result = await base.SaveAsync <UpdateViewModel>(data, true); return(result); } return(new RepositoryResponse <UpdateViewModel>() { Status = 501 }); }
public override MixRelatedAttributeData ParseModel(MixCmsContext _context = null, IDbContextTransaction _transaction = null) { if (string.IsNullOrEmpty(Id)) { Id = Guid.NewGuid().ToString(); CreatedDateTime = DateTime.UtcNow; Status = Status == default ? Enum.Parse <MixEnums.MixContentStatus>(MixService.GetConfig <string>( MixAppSettingKeywords.DefaultContentStatus)) : Status; } return(base.ParseModel(_context, _transaction)); }
public MixerView() : base(MixService.TestMixer()) { InitializeComponent(); }
public static string GetAssetFolder(string culture) { return($"/{MixConstants.Folder.FileFolder}/{MixConstants.Folder.TemplatesAssetFolder}/{MixService.GetConfig<string>(MixConstants.ConfigurationKeyword.ThemeFolder, culture)}"); }
protected async System.Threading.Tasks.Task <IActionResult> Page(string seoName) { // Home Page int maxPageSize = MixService.GetConfig <int>("MaxPageSize"); string orderBy = MixService.GetConfig <string>("OrderBy"); int orderDirection = MixService.GetConfig <int>("OrderDirection"); int.TryParse(Request.Query["page"], out int page); int.TryParse(Request.Query["pageSize"], out int pageSize); RepositoryResponse <Lib.ViewModels.MixPages.ReadMvcViewModel> getPage = null; Expression <Func <MixPage, bool> > predicate; if (string.IsNullOrEmpty(seoName)) { predicate = p => p.Type == MixPageType.Home.ToString() && p.Status == MixContentStatus.Published && p.Specificulture == culture; } else { predicate = p => p.SeoName == seoName && p.Status == MixContentStatus.Published && p.Specificulture == culture; } getPage = await Lib.ViewModels.MixPages.ReadMvcViewModel.Repository.GetFirstModelAsync(predicate); if (getPage.IsSucceed) { if (getPage.Data != null) { maxPageSize = getPage.Data.PageSize.HasValue ? getPage.Data.PageSize.Value : maxPageSize; pageSize = (pageSize > 0 && pageSize < maxPageSize) ? pageSize : maxPageSize; getPage.Data.LoadData(pageSize: pageSize, pageIndex: page - 1); } GeneratePageDetailsUrls(getPage.Data); } if (getPage.IsSucceed) { ViewData["Title"] = getPage.Data.SeoTitle; ViewData["Description"] = getPage.Data.SeoDescription; ViewData["Keywords"] = getPage.Data.SeoKeywords; ViewData["Image"] = getPage.Data.ImageUrl; ViewData["PageClass"] = getPage.Data.CssClass; getPage.LastUpdateConfiguration = MixService.GetConfig <DateTime?>("LastUpdateConfiguration"); return(View(getPage.Data)); } else { if (seoName != "404") { return(await Page("404")); } else { return(NotFound()); } } }
public static RepositoryResponse <string> ExportAttributeToExcel(List <JObject> lstData, string sheetName , string folderPath, string fileName , List <string> headers = null) { var result = new RepositoryResponse <string>(); try { if (lstData.Count > 0) { var filenameE = fileName + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx"; // create new data table var dtable = new DataTable(); if (headers == null) { // get first item var listColumn = lstData[0].Properties(); // add column name to table foreach (var item in listColumn) { dtable.Columns.Add(item.Name, typeof(string)); } } else { foreach (var item in headers) { dtable.Columns.Add(item, typeof(string)); } } // Row value foreach (var a in lstData) { var r = dtable.NewRow(); foreach (var prop in a.Properties()) { bool isHaveValue = a.TryGetValue(prop.Name, out JToken val); if (isHaveValue) { r[prop.Name] = val.ToString(); } } dtable.Rows.Add(r); } // Save Excel file using (var pck = new ExcelPackage()) { string SheetName = sheetName != string.Empty ? sheetName : "Report"; var wsDt = pck.Workbook.Worksheets.Add(SheetName); wsDt.Cells["A1"].LoadFromDataTable(dtable, true, TableStyles.None); wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); CommonHelper.SaveFileBytes(folderPath, filenameE, pck.GetAsByteArray()); result.IsSucceed = true; result.Data = $"{MixService.GetConfig<string>("Domain")}/{folderPath}/{filenameE}"; return(result); } } else { result.Errors.Add("Can not export data of empty list"); return(result); } } catch (Exception ex) { result.Errors.Add(ex.Message); return(result); } }
public void SendMail([FromBody] JObject model) { MixService.SendMail(model.Value <string>("subject"), model.Value <string>("body"), MixService.GetConfig <string>("ContactEmail", _lang)); }
private async Task <RepositoryResponse <bool> > ImportModulesAsync(string destCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; foreach (var module in Modules) { if (result.IsSucceed) { if (!context.MixModule.Any(m => m.Name == module.Name && m.Specificulture == destCulture)) { module.Id = context.MixModule.Max(m => m.Id) + 1; if (!string.IsNullOrEmpty(module.Image)) { module.Image = module.Image.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } module.CreatedDateTime = DateTime.UtcNow; var saveResult = await module.SaveModelAsync(true, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } } else { break; } } return(result); }
public override async Task <RepositoryResponse <bool> > SaveSubModelsAsync(MixPage parent, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var result = new RepositoryResponse <bool> { IsSucceed = true }; // Save Alias //foreach (var item in UrlAliases) //{ // item.SourceId = parent.Id.ToString(); // item.Type = UrlAliasType.Page; // item.Specificulture = parent.Specificulture; // var saveResult = await item.SaveModelAsync(false, _context, _transaction); // ViewModelHelper.HandleResult(saveResult, ref result); // if (!result.IsSucceed) // { // break; // } //} // End Save Alias //Save Module Navigations if (result.IsSucceed && ModuleNavs != null) { foreach (var item in ModuleNavs) { if (!MixModules.ImportViewModel.Repository.CheckIsExists(m => m.Name == item.Module.Name && m.Specificulture == parent.Specificulture, _context, _transaction)) { // Force to create new module item.Module.Id = 0; item.Module.Specificulture = parent.Specificulture; if (!string.IsNullOrEmpty(item.Image)) { item.Image = item.Image.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", parent.Specificulture)}"); } if (!string.IsNullOrEmpty(item.Module.Image)) { item.Module.Image = item.Module.Image.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", parent.Specificulture)}"); } if (!string.IsNullOrEmpty(item.Module.Thumbnail)) { item.Module.Thumbnail = item.Module.Thumbnail.Replace("content/templates/default", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", parent.Specificulture)}"); } var saveModule = await item.Module.SaveModelAsync(true, _context, _transaction); ViewModelHelper.HandleResult(saveModule, ref result); if (!result.IsSucceed) { break; } else // Save Module Success { item.PageId = parent.Id; item.ModuleId = saveModule.Data.Id; item.Specificulture = parent.Specificulture; item.Description = saveModule.Data.Title; var saveResult = await item.SaveModelAsync(false, _context, _transaction); ViewModelHelper.HandleResult(saveResult, ref result); if (!result.IsSucceed) { break; } } } } } // End Save Module Navigations /* * // Save Parents Pages * if (result.IsSucceed) * { * foreach (var item in ParentNavs) * { * item.Id = parent.Id; * * var saveResult = await item.SaveModelAsync(false, _context, _transaction); * ViewModelHelper.HandleResult(saveResult, ref result); * } * } * // End Save Parents Pages * * // Save Children Pages * if (result.IsSucceed) * { * foreach (var item in ChildNavs) * { * item.ParentId = parent.Id; * var saveResult = await item.SaveModelAsync(false, _context, _transaction); * ViewModelHelper.HandleResult(saveResult, ref result); * } * } * // End Save Children Pages*/ return(result); }
private async Task <RepositoryResponse <bool> > ImportPagesAsync(string destCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { int startId = MixPages.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data + 1; //var pages = FileRepository.Instance.GetFile(MixConstants.CONST_FILE_PAGES, "data", true, "{}"); //var obj = JObject.Parse(pages.Content); //var initPages = obj["data"].ToObject<JArray>(); foreach (var item in Pages) { item.Id = startId; item.CreatedDateTime = DateTime.UtcNow; item.ThemeName = ThemeName; //if (_context.MixPage.Any(m=>m.Id == startId)) //(item.Id > initPages.Count) //{ // item.Id = _context.MixPage.Max(m => m.Id) + 1; // item.CreatedDateTime = DateTime.UtcNow; //} if (!string.IsNullOrEmpty(item.Image)) { item.Image = item.Image.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } if (!string.IsNullOrEmpty(item.Thumbnail)) { item.Thumbnail = item.Thumbnail.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } item.Specificulture = destCulture; var saveResult = await item.SaveModelAsync(true, context, transaction); if (!saveResult.IsSucceed) { result.IsSucceed = false; result.Exception = saveResult.Exception; result.Errors = saveResult.Errors; break; } else { startId++; } } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { var error = UnitOfWorkHelper <MixCmsContext> .HandleException <MixPages.ImportViewModel>(ex, isRoot, transaction); result.IsSucceed = false; result.Errors = error.Errors; result.Exception = error.Exception; } finally { //if current Context is Root if (isRoot) { context?.Dispose(); } } return(result); }
public async Task <ActionResult <JObject> > Details(string viewType, int?id) { string msg = string.Empty; switch (viewType) { case "portal": if (id.HasValue) { Expression <Func <MixOrder, bool> > predicate = model => model.Id == id && model.Specificulture == _lang; var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{id}", predicate); if (portalResult.IsSucceed) { portalResult.Data.DetailsUrl = MixCmsHelper.GetRouterUrl( new { culture = _lang, action = "order", portalResult.Data.Id }, Request, Url); } return(Ok(JObject.FromObject(portalResult))); } else { var model = new MixOrder() { Specificulture = _lang, Status = MixService.GetConfig <int>("DefaultStatus") }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } default: if (id.HasValue) { var beResult = await ReadViewModel.Repository.GetSingleModelAsync(model => model.Id == id && model.Specificulture == _lang).ConfigureAwait(false); if (beResult.IsSucceed) { beResult.Data.DetailsUrl = MixCmsHelper.GetRouterUrl( new { culture = _lang, action = "order", seoName = beResult.Data.Id }, Request, Url); } return(Ok(JObject.FromObject(beResult))); } else { var model = new MixOrder(); RepositoryResponse <ReadViewModel> result = new RepositoryResponse <ReadViewModel>() { IsSucceed = true, Data = new ReadViewModel(model) { Specificulture = _lang, Status = MixOrderStatus.Preview, } }; return(Ok(JObject.FromObject(result))); } } }
public async Task <RepositoryResponse <AccessTokenViewModel> > InitSuperAdmin([FromBody] MixRegisterViewModel model) { RepositoryResponse <AccessTokenViewModel> result = new RepositoryResponse <AccessTokenViewModel>(); if (ModelState.IsValid) { if (_userManager.Users.Count() == 0) { var user = new ApplicationUser { UserName = model.Username, Email = model.Email, FirstName = model.FirstName, LastName = model.LastName, Avatar = model.Avatar ?? MixService.GetConfig <string>("DefaultAvatar"), JoinDate = DateTime.UtcNow }; var createResult = await _userManager.CreateAsync(user, password : model.Password).ConfigureAwait(false); if (createResult.Succeeded) { user = await _userManager.FindByEmailAsync(model.Email).ConfigureAwait(false); await _userManager.AddToRoleAsync(user, "SuperAdmin"); model.ExpandView(); model.Id = user.Id; model.CreatedDateTime = DateTime.UtcNow; model.Avatar = model.Avatar ?? MixService.GetConfig <string>("DefaultAvatar"); // Save to cms db context await model.SaveModelAsync(); var token = await _idHelper.GenerateAccessTokenAsync(user, true); if (token != null) { result.IsSucceed = true; MixService.LoadFromDatabase(); MixService.SetConfig("InitStatus", 2); MixService.SaveSettings(); MixService.Reload(); result.Data = token; return(result); } else { return(result); } } else { foreach (var error in createResult.Errors) { result.Errors.Add(error.Description); } return(result); } } } return(result); }
/// <summary> /// Gets the language. /// </summary> protected void GetLanguage() { _lang = RouteData?.Values["culture"] != null ? RouteData.Values["culture"].ToString() : MixService.GetConfig <string>("Language"); }
public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>( HttpRequest request, string culture = null, string attributeSetName = null, MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixAttributeSetData, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var queryDictionary = request.Query.ToList(); attributeSetName = attributeSetName ?? request.Query["attributeSetName"].ToString(); var keyword = request.Query["keyword"].ToString(); var filterType = request.Query["filterType"].ToString(); var orderBy = request.Query["orderBy"].ToString(); int.TryParse(request.Query["attributeSetId"], out int attributeSetId); bool isDirection = Enum.TryParse(request.Query["direction"], out Heart.Enums.MixHeartEnums.DisplayDirection direction); int.TryParse(request.Query["pageIndex"], out int pageIndex); var isPageSize = int.TryParse(request.Query["pageSize"], out int pageSize); bool isFromDate = DateTime.TryParse(request.Query["fromDate"], out DateTime fromDate); bool isToDate = DateTime.TryParse(request.Query["toDate"], out DateTime toDate); bool isStatus = Enum.TryParse(request.Query["status"], out MixEnums.MixContentStatus status); var tasks = new List <Task <RepositoryResponse <TView> > >(); var getfields = await MixAttributeFields.ReadViewModel.Repository.GetModelListByAsync( m => m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName, context, transaction); var fields = getfields.IsSucceed ? getfields.Data : new List <MixAttributeFields.ReadViewModel>(); var fieldQueries = !string.IsNullOrEmpty(request.Query["query"]) ? JObject.Parse(request.Query["query"]) : new JObject(); // fitler list query by field name //var fieldQueries = queryDictionary?.Where(m => fields.Any(f => f.Name == m.Key)).ToList() // ?? new List<KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues>>(); Expression <Func <MixAttributeSetValue, bool> > attrPredicate = m => m.Specificulture == culture && (m.AttributeSetName == attributeSetName); // val predicate Expression <Func <MixAttributeSetValue, bool> > valPredicate = null; // Data predicate Expression <Func <MixAttributeSetData, bool> > predicate = null; // m => m.Specificulture == culture; //&& (m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName) //&& (!isStatus || (m.Status == status.ToString())) //&& (!isFromDate || (m.CreatedDateTime >= fromDate)) //&& (!isToDate || (m.CreatedDateTime <= toDate)); RepositoryResponse <PaginationModel <TView> > result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() }; // if filter by field name or keyword => filter by attr value if (fieldQueries.Count > 0 || !string.IsNullOrEmpty(keyword)) { // filter by all fields if have keyword if (!string.IsNullOrEmpty(keyword)) { foreach (var field in fields) { Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == field.Name && (filterType == "equal" && m.StringValue == keyword) || (filterType == "contain" && (EF.Functions.Like(m.StringValue, $"%{keyword}%"))); if (valPredicate != null) { valPredicate = ReflectionHelper.CombineExpression(valPredicate, pre, Heart.Enums.MixHeartEnums.ExpressionMethod.And); } else { valPredicate = pre; } } } if (fieldQueries != null && fieldQueries.Properties().Count() > 0) // filter by specific field name { foreach (var q in fieldQueries) { if (fields.Any(f => f.Name == q.Key)) { string value = q.Value.ToString(); if (!string.IsNullOrEmpty(value)) { Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == q.Key && (filterType == "equal" && m.StringValue == (q.Value.ToString())) || (filterType == "contain" && (EF.Functions.Like(m.StringValue, $"%{q.Value.ToString()}%"))); if (valPredicate != null) { valPredicate = ReflectionHelper.CombineExpression(valPredicate, pre, Heart.Enums.MixHeartEnums.ExpressionMethod.Or); } else { valPredicate = pre; } } } } } if (valPredicate != null) { attrPredicate = attrPredicate == null ? valPredicate : ReflectionHelper.CombineExpression(valPredicate, attrPredicate, Heart.Enums.MixHeartEnums.ExpressionMethod.And); } if (attrPredicate != null) { var query = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct(); var dataIds = query.ToList(); if (query != null) { Expression <Func <MixAttributeSetData, bool> > pre = m => dataIds.Any(id => m.Id == id); predicate = pre; // ReflectionHelper.CombineExpression(pre, predicate, Heart.Enums.MixHeartEnums.ExpressionMethod.And); } } } else { predicate = m => m.Specificulture == culture && (m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName) && (!isStatus || (m.Status == status.ToString())) && (!isFromDate || (m.CreatedDateTime >= fromDate)) && (!isToDate || (m.CreatedDateTime <= toDate)); } result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync( predicate, orderBy, direction, isPageSize?pageSize : default, isPageSize?pageIndex : 0, null, null, context, transaction);
public AttributeDataViewModel() : base() { CacheConnectionString = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); }
public static JProperty ToJProperty( this MixAttributeSetValue item, MixCmsContext _context, IDbContextTransaction _transaction) { UnitOfWorkHelper <MixCmsContext> .InitTransaction( _context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); switch (item.DataType) { case MixDataType.DateTime: return(new JProperty(item.AttributeFieldName, item.DateTimeValue)); case MixDataType.Date: if (!item.DateTimeValue.HasValue) { if (DateTime.TryParseExact( item.StringValue, "MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out DateTime date)) { item.DateTimeValue = date; } } return(new JProperty(item.AttributeFieldName, item.DateTimeValue)); case MixDataType.Time: return(new JProperty(item.AttributeFieldName, item.DateTimeValue)); case MixDataType.Double: return(new JProperty(item.AttributeFieldName, item.DoubleValue ?? 0)); case MixDataType.Boolean: return(new JProperty(item.AttributeFieldName, item.BooleanValue)); case MixDataType.Integer: return(new JProperty(item.AttributeFieldName, item.IntegerValue ?? 0)); case MixDataType.Reference: return(new JProperty(item.AttributeFieldName, new JArray())); case MixDataType.Upload: string domain = MixService.GetConfig <string>(MixAppSettingKeywords.Domain); string url = !string.IsNullOrEmpty(item.StringValue) ? !item.StringValue.Contains(domain) ? $"{MixService.GetConfig<string>(MixAppSettingKeywords.Domain)}{item.StringValue}" : item.StringValue : null; return(new JProperty(item.AttributeFieldName, url)); case MixDataType.Custom: case MixDataType.Duration: case MixDataType.PhoneNumber: case MixDataType.Text: case MixDataType.Html: case MixDataType.MultilineText: case MixDataType.EmailAddress: case MixDataType.Password: case MixDataType.Url: case MixDataType.ImageUrl: case MixDataType.CreditCard: case MixDataType.PostalCode: case MixDataType.Color: case MixDataType.Icon: case MixDataType.VideoYoutube: case MixDataType.TuiEditor: default: return(new JProperty(item.AttributeFieldName, item.StringValue)); } if (isRoot) { transaction.Dispose(); context.Dispose(); } }
public static async Task <RepositoryResponse <bool> > ImportData( string culture, Lib.ViewModels.MixAttributeSets.ReadViewModel attributeSet, IFormFile file) { using (var context = new MixCmsContext()) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; try { List <ImportViewModel> data = LoadFileData(culture, attributeSet, file); var fields = MixAttributeFields.UpdateViewModel.Repository.GetModelListBy(f => f.AttributeSetId == attributeSet.Id).Data; var priority = ImportViewModel.Repository.Count(m => m.AttributeSetName == attributeSet.Name && m.Specificulture == culture).Data; foreach (var item in data) { priority += 1; //item.Model.Id = Guid.NewGuid().ToString(); //item.Model.Specificulture = culture; //item.Model.CreatedDateTime = DateTime.UtcNow; //item.Model.Priority = context.MixAttributeSetData.Count() + 1; item.Priority = priority; item.Fields = fields; item.AttributeSetName = attributeSet.Name; item.Status = Enum.Parse <MixEnums.MixContentStatus>(MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.DefaultContentStatus)); item.ParseModel(); context.Entry(item.Model).State = Microsoft.EntityFrameworkCore.EntityState.Added; foreach (var val in item.Values) { val.DataId = item.Id; val.Specificulture = culture; val.ParseModel(); //val.Model.DataId = item.Id; //val.Model.CreatedDateTime = DateTime.UtcNow; //val.Model.Specificulture = culture; //val.Model.Id = Guid.NewGuid().ToString(); context.Entry(val.Model).State = Microsoft.EntityFrameworkCore.EntityState.Added; } } int tmp = await context.SaveChangesAsync(); //if (result.IsSucceed) //{ // foreach (var item in data) // { // item.GenerateCache(item.Model, item); // } //} return(result); } catch (Exception ex) { result.IsSucceed = false; result.Exception = ex; result.Errors.Add(ex.Message); return(result); } } }
public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPost <TView>( string keyword , List <string> dataIds , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() }; List <int> postIds = null; Expression <Func <MixRelatedAttributeData, bool> > predicate = m => m.Specificulture == culture && m.ParentType == MixEnums.MixAttributeSetDataType.Post.ToString(); foreach (var id in dataIds) { // Get list related post ids by data id Expression <Func <MixRelatedAttributeData, bool> > dataPredicate = m => m.Specificulture == culture && m.ParentType == MixEnums.MixAttributeSetDataType.Post.ToString() && m.DataId == id; var ids = context.MixRelatedAttributeData.Where(dataPredicate).Select(m => int.Parse(m.ParentId)).ToList(); // if first id in list => return ids if (postIds == null) { postIds = ids.Distinct().ToList(); } else { // filter ids by new data id ( for 'AND' condition) postIds = postIds.Where(m => ids.Contains(m)).Distinct().ToList(); // if there is no items => no need to filter more if (postIds.Count == 0) { break; } } } // Load Posts Expression <Func <MixPost, bool> > postPredicate = m => m.Specificulture == culture && (string.IsNullOrEmpty(keyword) || (EF.Functions.Like(m.Title, $"%{keyword}%")) || (EF.Functions.Like(m.Excerpt, $"%{keyword}%")) || (EF.Functions.Like(m.Content, $"%{keyword}%"))); if (postIds != null && postIds.Count > 0) { postPredicate = m => m.Specificulture == culture && (string.IsNullOrEmpty(keyword) || (EF.Functions.Like(m.Title, $"%{keyword}%")) || (EF.Functions.Like(m.Excerpt, $"%{keyword}%")) || (EF.Functions.Like(m.Content, $"%{keyword}%"))) && postIds.Any(n => n == m.Id); } var getPosts = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync( postPredicate , orderByPropertyName, direction , pageSize, pageIndex , _context : context, _transaction : transaction); result = getPosts; return(result); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root context.Database.CloseConnection(); transaction.Dispose(); context.Dispose(); } } }