Exemplo n.º 1
0
        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();
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
 public AttributeDataViewModel(MixAttributeSetData model, MixCmsContext _context = null, IDbContextTransaction _transaction = null) : base(model, _context, _transaction)
 {
     CacheConnectionString = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION);
 }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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);
 }
Exemplo n.º 7
0
        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
                });
            }
        }
Exemplo n.º 8
0
        public virtual async Task <ActionResult> ClearCacheAsync()
        {
            await MixService.RemoveCacheAsync(typeof(TModel));

            return(NoContent());
        }
Exemplo n.º 9
0
        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();
                }
            }
        }
Exemplo n.º 10
0
        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());
            }
        }
Exemplo n.º 11
0
        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)
                    });
                }
            }
        }
Exemplo n.º 12
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);
        }
Exemplo n.º 13
0
        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
            });
        }
Exemplo n.º 14
0
 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));
 }
Exemplo n.º 15
0
 public MixerView()
     : base(MixService.TestMixer())
 {
     InitializeComponent();
 }
Exemplo n.º 16
0
 public static string GetAssetFolder(string culture)
 {
     return($"/{MixConstants.Folder.FileFolder}/{MixConstants.Folder.TemplatesAssetFolder}/{MixService.GetConfig<string>(MixConstants.ConfigurationKeyword.ThemeFolder, culture)}");
 }
Exemplo n.º 17
0
        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());
                }
            }
        }
Exemplo n.º 18
0
        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);
            }
        }
Exemplo n.º 19
0
 public void SendMail([FromBody] JObject model)
 {
     MixService.SendMail(model.Value <string>("subject"), model.Value <string>("body"), MixService.GetConfig <string>("ContactEmail", _lang));
 }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
        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);
        }
Exemplo n.º 22
0
        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);
        }
Exemplo n.º 23
0
        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)));
                }
            }
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
0
 /// <summary>
 /// Gets the language.
 /// </summary>
 protected void GetLanguage()
 {
     _lang = RouteData?.Values["culture"] != null ? RouteData.Values["culture"].ToString() : MixService.GetConfig <string>("Language");
 }
Exemplo n.º 26
0
        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);
Exemplo n.º 27
0
 public AttributeDataViewModel() : base()
 {
     CacheConnectionString = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION);
 }
Exemplo n.º 28
0
        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();
            }
        }
Exemplo n.º 29
0
        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);
                }
            }
        }
Exemplo n.º 30
0
        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();
                }
            }
        }