예제 #1
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByDataIds <TView>(
            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> >();
                Expression <Func <MixRelatedAttributeData, bool> > predicate = m => m.Specificulture == culture && dataIds.Contains(m.DataId) &&
                                                                               m.ParentType == MixEnums.MixAttributeSetDataType.Post.ToString();
                foreach (var id in dataIds)
                {
                    Expression <Func <MixRelatedAttributeData, bool> > pre = m => m.DataId == id;

                    predicate = ReflectionHelper.CombineExpression(
                        predicate
                        , pre
                        , Heart.Enums.MixHeartEnums.ExpressionMethod.And);
                }
                var getRelatedData = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetModelListByAsync(
                    predicate
                    , orderByPropertyName = "CreatedDateTime", direction, pageSize, pageIndex
                    , _context : context, _transaction : transaction
                    );

                if (getRelatedData.IsSucceed)
                {
                    foreach (var item in getRelatedData.Data.Items)
                    {
                        if (int.TryParse(item.ParentId, out int postId))
                        {
                            var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync(
                                m => m.Specificulture == item.Specificulture && m.Id == postId
                                , context, transaction);

                            if (getData.IsSucceed)
                            {
                                result = new RepositoryResponse <PaginationModel <TView> >()
                                {
                                    IsSucceed = true,
                                    Data      = new PaginationModel <TView>()
                                    {
                                        Items     = new List <TView>(),
                                        PageIndex = pageIndex ?? 0,
                                        PageSize  = pageSize
                                    }
                                };
                                result.Data.Items.Add(getData.Data);
                            }
                        }
                    }
                    result.Data.TotalItems = getRelatedData.Data.TotalItems;
                    result.Data.TotalPage  = getRelatedData.Data.TotalPage;
                }
                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();
                }
            }
        }
예제 #2
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>(string culture, string attributeSetName
                                                                                                               , RequestPaging request, string keyword
                                                                                                               , Dictionary <string, Microsoft.Extensions.Primitives.StringValues> queryDictionary = 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
            {
                Expression <Func <MixAttributeSetValue, bool> > attrPredicate =
                    m => m.Specificulture == culture && m.AttributeSetName == attributeSetName &&
                    (!request.FromDate.HasValue ||
                     (m.CreatedDateTime >= request.FromDate.Value)
                    ) &&
                    (!request.ToDate.HasValue ||
                     (m.CreatedDateTime <= request.ToDate.Value)
                    )
                ;
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = null;
                RepositoryResponse <PaginationModel <TView> >   result       = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                };
                var filterType = queryDictionary.FirstOrDefault(q => q.Key == "filterType");
                var tasks      = new List <Task <RepositoryResponse <TView> > >();
                if (queryDictionary != null)
                {
                    foreach (var q in queryDictionary)
                    {
                        if (!string.IsNullOrEmpty(q.Key) && q.Key != "attributeSetId" && q.Key != "attributeSetName" && q.Key != "filterType" && !string.IsNullOrEmpty(q.Value))
                        {
                            if (!string.IsNullOrEmpty(filterType.Value) && filterType.Value == "equal")
                            {
                                Expression <Func <MixAttributeSetValue, bool> > pre = m =>
                                                                                      m.AttributeFieldName == q.Key && m.StringValue == (q.Value.ToString());
                                if (valPredicate != null)
                                {
                                    valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                                }
                                else
                                {
                                    valPredicate = pre;
                                }
                            }
                            else
                            {
                                Expression <Func <MixAttributeSetValue, bool> > pre =
                                    m => m.AttributeFieldName == q.Key &&
                                    (EF.Functions.Like(m.StringValue, $"%{q.Value.ToString()}%"));
                                if (valPredicate != null)
                                {
                                    valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                                }
                                else
                                {
                                    valPredicate = pre;
                                }
                            }
                        }
                    }
                    if (valPredicate != null)
                    {
                        attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, attrPredicate, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                }
                // Loop queries string => predicate
                if (!string.IsNullOrEmpty(keyword))
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeSetName == attributeSetName && m.Specificulture == culture && m.StringValue.Contains(keyword);
                    attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(attrPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                }

                var query   = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                var dataIds = query.ToList();
                if (query != null)
                {
                    Expression <Func <MixAttributeSetData, bool> > predicate = m => dataIds.Any(id => m.Id == id);
                    result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync(
                        predicate, request.OrderBy, request.Direction, request.PageSize, request.PageIndex, null, null, context, transaction);
                }
                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();
                }
            }
        }
예제 #3
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByDataId <TView>(
            string dataId
            , string culture                         = null
            , string orderByPropertyName             = "CreatedDateTime"
            , Heart.Enums.DisplayDirection direction = Heart.Enums.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.GetAppSetting <string>("DefaultCulture");
                var getRelatedData = await MixDatabaseDataAssociations.ReadViewModel.Repository.GetModelListByAsync(
                    m => m.Specificulture == culture && m.DataId == dataId &&
                    m.ParentType == MixDatabaseParentType.Post
                    , orderByPropertyName = "CreatedDateTime", direction, pageSize, pageIndex
                    , _context : context, _transaction : transaction
                    );

                var result = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                    {
                        Items     = new List <TView>(),
                        PageIndex = pageIndex ?? 0,
                        PageSize  = pageSize
                    }
                };
                if (getRelatedData.IsSucceed)
                {
                    foreach (var item in getRelatedData.Data.Items)
                    {
                        if (int.TryParse(item.ParentId, out int postId))
                        {
                            var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync(
                                m => m.Specificulture == item.Specificulture && m.Id == postId
                                , context, transaction);

                            if (getData.IsSucceed)
                            {
                                result.Data.Items.Add(getData.Data);
                            }
                        }
                    }
                    result.Data.TotalItems = getRelatedData.Data.TotalItems;
                    result.Data.TotalPage  = getRelatedData.Data.TotalPage;
                }
                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #4
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;
                int startModuleId = MixModules.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data;
                //var pages = MixFileRepository.Instance.GetFile(MixConstants.CONST_FILE_PAGES, MixFolders.JsonDataFolder, true, "{}");
                //var obj = JObject.Parse(pages.Content);
                //var initPages = obj["data"].ToObject<JArray>();
                foreach (var item in Pages)
                {
                    // store old id => update to related data if save success
                    var oldId = item.Id;
                    item.CreatedBy = CreatedBy;
                    // TODO: Id > 7 => not system init page
                    if (!context.MixPage.Any(p => p.SeoName == item.SeoName))
                    {
                        startId++;
                        item.Id = startId;

                        item.CreatedDateTime = DateTime.UtcNow;
                        item.ThemeName       = ThemeName;

                        item.Specificulture = destCulture;
                        var saveResult = await item.SaveModelAsync(false, context, transaction);

                        if (!saveResult.IsSucceed)
                        {
                            result.IsSucceed = false;
                            result.Exception = saveResult.Exception;
                            result.Errors    = saveResult.Errors;
                            break;
                        }
                    }
                    if (!dicPageIds.Any(m => m.Key == item.Id))
                    {
                        dicPageIds.Add(oldId, 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)
                {
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
            return(result);
        }
예제 #5
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 ? 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.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>(MixAppSettingKeywords.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>(MixAppSettingKeywords.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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #6
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();
                }
            }
        }
예제 #7
0
        public void LoadData(int?pageSize             = null, int?pageIndex = null
                             , SioCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <SioCmsContext> .InitTransaction(_context, _transaction, out SioCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                pageSize  = pageSize > 0 ? pageSize : PageSize;
                pageIndex = pageIndex ?? 0;
                Expression <Func <SioPageModule, bool> >  dataExp    = null;
                Expression <Func <SioPageArticle, bool> > articleExp = null;
                Expression <Func <SioPageProduct, bool> > productExp = null;
                foreach (var item in Modules)
                {
                    item.Module.LoadData(pageSize: pageSize, pageIndex: pageIndex, _context: context, _transaction: transaction);
                }
                switch (Type)
                {
                case SioPageType.ListArticle:
                    articleExp = n => n.CategoryId == Id && n.Specificulture == Specificulture;
                    break;

                case SioPageType.ListProduct:
                    productExp = n => n.CategoryId == Id && n.Specificulture == Specificulture;
                    break;

                default:
                    dataExp    = m => m.CategoryId == Id && m.Specificulture == Specificulture;
                    articleExp = n => n.CategoryId == Id && n.Specificulture == Specificulture;
                    productExp = m => m.CategoryId == Id && m.Specificulture == Specificulture;
                    break;
                }

                if (articleExp != null)
                {
                    var getArticles = SioPageArticles.ReadViewModel.Repository
                                      .GetModelListBy(articleExp
                                                      , SioService.GetConfig <string>(SioConstants.ConfigurationKeyword.OrderBy), 0
                                                      , pageSize, pageIndex
                                                      , _context: context, _transaction: transaction);
                    if (getArticles.IsSucceed)
                    {
                        Articles = getArticles.Data;
                    }
                }
                if (productExp != null)
                {
                    var getProducts = SioPageProducts.ReadViewModel.Repository
                                      .GetModelListBy(productExp
                                                      , SioService.GetConfig <string>(SioConstants.ConfigurationKeyword.OrderBy), 0
                                                      , pageSize, pageIndex
                                                      , _context: context, _transaction: transaction);
                    if (getProducts.IsSucceed)
                    {
                        Products = getProducts.Data;
                    }
                }
            }
            catch (Exception ex)
            {
                UnitOfWorkHelper <SioCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction);
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Dispose();
                }
            }
        }
예제 #8
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;
                int startModuleId = MixModules.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data;
                //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)
                {
                    // TODO: Id > 7 => not system init page
                    if (!context.MixPage.Any(p => p.SeoName == item.SeoName))
                    {
                        // store old id => update to related data if save success
                        var oldId = item.Id;

                        startId++;
                        dicPageIds.Add(oldId, startId);

                        item.Id = startId;

                        item.CreatedDateTime = DateTime.UtcNow;
                        item.ThemeName       = ThemeName;

                        if (item.ModuleNavs != null)
                        {
                            foreach (var nav in item.ModuleNavs)
                            {
                                startModuleId++;
                                dicModuleIds.Add(nav.Module.Id, startModuleId);

                                nav.Module.Id = startModuleId;

                                nav.PageId   = startId;
                                nav.ModuleId = startModuleId;
                            }
                        }

                        //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;
                        }
                    }
                }
                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.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
            return(result);
        }
예제 #9
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();
                }
            }
        }
예제 #10
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByValueIds <TView>(
            List <string> valueIds
            , 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 Data
                Expression <Func <MixAttributeSetValue, bool> > predicate = m => m.Specificulture == culture &&
                                                                            m.Status == MixEnums.MixContentStatus.Published;
                foreach (var item in valueIds)
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.Id == item;

                    predicate = ReflectionHelper.CombineExpression(
                        predicate
                        , pre
                        , Heart.Enums.MixHeartEnums.ExpressionMethod.And);
                }
                var getVal = await MixAttributeSetValues.ReadViewModel.Repository.GetModelListByAsync(predicate, context, transaction);

                if (getVal.IsSucceed)
                {
                    var dataIds = getVal.Data.Select(m => m.DataId).Distinct();
                    if (dataIds.Count() == 1)
                    {
                        result = await GetPostListByDataIds <TView>(
                            dataIds : dataIds.ToList(),
                            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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #11
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPost <TView>(
            string keyword
            , List <string> dataIds
            , List <int> pageIds         = null
            , 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");
                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 (dataIds.Count > 0)
                {
                    var searchPostByDataIds = SearchPostByDataIdsPredicate(dataIds, culture, context);
                    postPredicate = searchPostByDataIds.AndAlso(postPredicate);
                }

                if (pageIds != null && pageIds.Count > 0)
                {
                    var searchPostByPageIds = SearchPostByPageIdsPredicate(pageIds, culture, context);
                    postPredicate = searchPostByPageIds.AndAlso(postPredicate);
                }

                if (!typeof(MixPost).GetProperties().Any(p => p.Name.ToLower() == orderByPropertyName.ToLower()))
                {
                    var postIds        = context.MixPost.Where(postPredicate).Select(p => p.Id);
                    var orderedPostIds = context.MixRelatedAttributeData.Where(
                        m => m.Specificulture == culture && postIds.Any(p => p.ToString() == m.ParentId))
                                         .Join(context.MixAttributeSetValue, r => r.DataId, v => v.DataId, (r, v) => new { r, v })
                                         .OrderBy(rv => rv.v.StringValue)
                                         .Select(rv => rv.r.ParentId);
                    postPredicate = p => orderedPostIds.Distinct().Any(o => o == p.Id.ToString() && p.Specificulture == culture);
                }

                return(await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync(
                           postPredicate
                           , orderByPropertyName, direction
                           , pageSize, pageIndex
                           , _context : context, _transaction : transaction));
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #12
0
        /// <summary>
        /// Saves the model.
        /// </summary>
        /// <param name="isSaveSubModels">if set to <c>true</c> [is save sub models].</param>
        /// <param name="_context">The context.</param>
        /// <param name="_transaction">The transaction.</param>
        /// <returns></returns>
        public virtual RepositoryResponse <TView> SaveModel(bool isSaveSubModels = false, TDbContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <TDbContext> .InitTransaction(_context, _transaction, out TDbContext context, out IDbContextTransaction transaction, out bool isRoot);

            RepositoryResponse <TView> result = new RepositoryResponse <TView>()
            {
                IsSucceed = true
            };

            Validate(context, transaction);
            if (IsValid)
            {
                try
                {
                    ParseModel(context, transaction);
                    result = Repository.SaveModel((TView)this, _context: context, _transaction: transaction);

                    // Save sub Models
                    if (result.IsSucceed && isSaveSubModels)
                    {
                        var saveResult = SaveSubModels(Model, context, transaction);
                        if (!saveResult.IsSucceed)
                        {
                            result.Errors.AddRange(saveResult.Errors);
                            result.Exception = saveResult.Exception;
                        }
                        result.IsSucceed = result.IsSucceed && saveResult.IsSucceed;
                    }

                    UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction);

                    return(result);
                }
                catch (Exception ex)
                {
                    return(UnitOfWorkHelper <TDbContext> .HandleException <TView>(ex, isRoot, transaction));
                }
                finally
                {
                    if (result.IsSucceed && IsCache)
                    {
                        RemoveCache(Model, context, transaction).ConfigureAwait(true).GetAwaiter();
                    }
                    if (isRoot)
                    {
                        //if current Context is Root
                        UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                    }
                }
            }
            else
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                }
                return(new RepositoryResponse <TView>()
                {
                    IsSucceed = false,
                    Data = null,
                    Errors = Errors
                });
            }
        }
예제 #13
0
        /// <summary>
        /// Clones the asynchronous.
        /// </summary>
        /// <param name="model"></param>
        /// <param name="cloneCultures">The clone cultures.</param>
        /// <param name="_context">The context.</param>
        /// <param name="_transaction">The transaction.</param>
        /// <returns></returns>
        public virtual async Task <RepositoryResponse <List <TView> > > CloneAsync(TModel model, List <SupportedCulture> cloneCultures
                                                                                   , TDbContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <TDbContext> .InitTransaction(_context, _transaction, out TDbContext context, out IDbContextTransaction transaction, out bool isRoot);

            RepositoryResponse <List <TView> > result = new RepositoryResponse <List <TView> >()
            {
                IsSucceed = true,
                Data      = new List <TView>()
            };

            try
            {
                if (cloneCultures != null)
                {
                    foreach (var culture in cloneCultures)
                    {
                        string desSpecificulture = culture.Specificulture;

                        TModel m           = (TModel)context.Entry(model).CurrentValues.ToObject();
                        Type   myType      = typeof(TModel);
                        var    myFieldInfo = myType.GetProperty("Specificulture");
                        myFieldInfo.SetValue(m, desSpecificulture);
                        bool isExist = Repository.CheckIsExists(m, _context: context, _transaction: transaction);

                        if (isExist)
                        {
                            result.IsSucceed = true;
                        }
                        else
                        {
                            context.Entry(m).State = EntityState.Added;
                            await context.SaveChangesAsync();

                            var cloneSubResult = await CloneSubModelsAsync(m, cloneCultures, context, transaction).ConfigureAwait(false);

                            if (!cloneSubResult.IsSucceed)
                            {
                                cloneSubResult.Errors.AddRange(cloneSubResult.Errors);
                                cloneSubResult.Exception = cloneSubResult.Exception;
                            }

                            result.IsSucceed = result.IsSucceed && cloneSubResult.IsSucceed && cloneSubResult.IsSucceed;
                        }
                        _ = this.SendNotifyAsync(this, RepositoryAction.Clone, result.IsSucceed);
                    }
                    UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction);

                    return(result);
                }
                else
                {
                    return(result);
                }
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <TDbContext> .HandleException <List <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #14
0
        public static RepositoryResponse <AdditionalViewModel> LoadAdditionalData(
            MixDatabaseParentType parentType,
            string parentId,
            string databaseName,
            string culture         = null,
            MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            culture = culture ?? MixService.GetConfig <string>("DefaultCulture");
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var dataId = context.MixRelatedAttributeData.FirstOrDefault(
                    m => m.AttributeSetName == databaseName && m.ParentType == parentType && m.ParentId == parentId && m.Specificulture == culture)?.DataId;
                if (!string.IsNullOrEmpty(dataId))
                {
                    return(AdditionalViewModel.Repository.GetSingleModel(
                               m => m.Id == dataId && m.Specificulture == culture
                               , context, transaction));
                }
                else
                {
                    // Init default data
                    var getAttrSet = MixAttributeSets.UpdateViewModel.Repository.GetSingleModel(
                        m => m.Name == databaseName
                        , context, transaction);
                    if (getAttrSet.IsSucceed)
                    {
                        AdditionalViewModel result = new AdditionalViewModel()
                        {
                            Specificulture   = culture,
                            AttributeSetId   = getAttrSet.Data.Id,
                            AttributeSetName = getAttrSet.Data.Name,
                            Status           = MixContentStatus.Published,
                            Fields           = getAttrSet.Data.Fields,
                            ParentType       = parentType,
                            ParentId         = parentId
                        };
                        result.ExpandView(context, transaction);
                        return(new RepositoryResponse <AdditionalViewModel>()
                        {
                            IsSucceed = true,
                            Data = result
                        });
                    }
                    return(new RepositoryResponse <AdditionalViewModel>());
                }
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <AdditionalViewModel>(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #15
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPost <TView>(
            string keyword
            , List <string> dataIds
            , List <int> pageIds         = null
            , 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 = SearchPostByDataIds(dataIds, culture, context);
                if (pageIds != null && pageIds.Count > 0)
                {
                    postIds.AddRange(SearchPostByPageIds(pageIds, culture, context));
                    postIds = postIds.Distinct().ToList();
                }
                // Load Posts

                if (postIds != null && postIds.Count > 0)
                {
                    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}%"))) &&
                                                                       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();
                }
            }
        }
예제 #16
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetModelistByMeta <TView>(
            string culture, string metaName, string metaValue
            , string orderByPropertyName, int direction, int?pageSize, int?pageIndex
            , 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
            {
                var result = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                    {
                        PageIndex = pageIndex.HasValue ? pageIndex.Value : 0,
                        PageSize  = pageSize
                    }
                };
                var tasks = new List <Task <RepositoryResponse <TView> > >();
                // Get Tag
                var getVal = await MixAttributeSetValues.ReadViewModel.Repository.GetSingleModelAsync(m => m.AttributeSetName == metaName && m.StringValue == metaValue
                                                                                                      , context, transaction);

                if (getVal.IsSucceed)
                {
                    var getRelatedData = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetModelListByAsync(
                        m => m.Specificulture == culture && m.Id == getVal.Data.DataId &&
                        m.ParentType == (int)MixEnums.MixAttributeSetDataType.Post
                        , orderByPropertyName, direction, pageIndex, pageSize
                        , _context : context, _transaction : transaction
                        );

                    if (getRelatedData.IsSucceed)
                    {
                        foreach (var item in getRelatedData.Data.Items)
                        {
                            if (int.TryParse(item.ParentId, out int postId))
                            {
                                var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync(
                                    m => m.Specificulture == item.Specificulture && m.Id == postId
                                    , context, transaction);

                                if (getData.IsSucceed)
                                {
                                    result.Data.Items.Add(getData.Data);
                                }
                            }
                        }
                        result.Data.TotalItems = getRelatedData.Data.TotalItems;
                        result.Data.TotalPage  = getRelatedData.Data.TotalPage;
                    }
                    //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();
                }
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = m => m.Specificulture == culture && m.AttributeSetName == metaName && m.StringValue == metaValue;

                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();
                }
            }
        }
예제 #17
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetModelistByAddictionalField <TView>(
            string fieldName, string value, string culture
            , string orderByPropertyName = "CreatedDateTime", Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc
            , int?pageSize           = null, int?pageIndex = 0
            , 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
            {
                var result = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                    {
                        PageIndex = pageIndex.HasValue ? pageIndex.Value : 0,
                        PageSize  = pageSize
                    }
                };
                var tasks = new List <Task <RepositoryResponse <TView> > >();
                // Get Value
                var dataIds = await context.MixAttributeSetValue.Where(
                    m => m.AttributeSetName == MixConstants.AttributeSetName.ADDITIONAL_FIELD_POST && m.Specificulture == culture &&
                    m.StringValue == value && m.AttributeFieldName == fieldName)
                              .Select(m => m.DataId)?.ToListAsync();

                if (dataIds != null && dataIds.Count > 0)
                {
                    var getRelatedData = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetModelListByAsync(
                        m => dataIds.Contains(m.DataId)
                        , orderByPropertyName, direction, pageSize, pageIndex
                        , _context : context, _transaction : transaction
                        );

                    if (getRelatedData.IsSucceed)
                    {
                        foreach (var item in getRelatedData.Data.Items)
                        {
                            if (int.TryParse(item.ParentId, out int postId))
                            {
                                var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync(
                                    m => m.Specificulture == item.Specificulture && m.Id == postId
                                    , context, transaction);

                                if (getData.IsSucceed)
                                {
                                    result.Data.Items.Add(getData.Data);
                                }
                            }
                        }
                        result.Data.TotalItems = getRelatedData.Data.TotalItems;
                        result.Data.TotalPage  = getRelatedData.Data.TotalPage;
                    }
                }

                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();
                }
            }
        }
예제 #18
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>(string culture, HttpRequest request, 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
            {
                var queryDictionary  = request.Query.ToList();
                var 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);
                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, pageSize, pageIndex, null, null, context, transaction);

                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();
                }
            }
        }
예제 #19
0
        public static async Task <RepositoryResponse <AdditionalViewModel> > GetAdditionalData(
            MixEnums.MixAttributeSetDataType parentType, int parentId,
            HttpRequest request, string culture = null,
            MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                // Additional Data is sub data of page / post / module only
                culture = culture ?? MixService.GetConfig <string>("DefaultCulture");
                var databaseName = request.Query["databaseName"].ToString();
                var dataId       = (await context.MixRelatedAttributeData.FirstOrDefaultAsync(
                                        m => m.AttributeSetName == databaseName && m.ParentType == parentType.ToString() && m.ParentId == parentId.ToString() && m.Specificulture == culture))?.DataId;
                if (!string.IsNullOrEmpty(dataId))
                {
                    return(await AdditionalViewModel.Repository.GetSingleModelAsync(
                               m => m.Id == dataId && m.Specificulture == culture
                               , context, transaction));
                }
                else
                {
                    // Init default data
                    var getAttrSet = await Lib.ViewModels.MixAttributeSets.UpdateViewModel.Repository.GetSingleModelAsync(
                        m => m.Name == request.Query["databaseName"].ToString()
                        , context, transaction);

                    if (getAttrSet.IsSucceed)
                    {
                        AdditionalViewModel result = new AdditionalViewModel()
                        {
                            Specificulture   = culture,
                            AttributeSetId   = getAttrSet.Data.Id,
                            AttributeSetName = getAttrSet.Data.Name,
                            Status           = MixEnums.MixContentStatus.Published,
                            Fields           = getAttrSet.Data.Fields,
                            ParentType       = parentType
                        };
                        result.ExpandView(context, transaction);
                        return(new RepositoryResponse <AdditionalViewModel>()
                        {
                            IsSucceed = true,
                            Data = result
                        });
                    }
                }
                return(new RepositoryResponse <AdditionalViewModel>());
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <AdditionalViewModel>(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #20
0
        public override Task RemoveCache(MixAttributeSetValue model, MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            Task result = null;
            var  tasks  = new List <Task>();

            try
            {
                var navs = context.MixRelatedAttributeData.Where(m => m.Id == model.DataId && m.Specificulture == model.Specificulture);
                if (navs != null)
                {
                    foreach (var item in navs)
                    {
                        switch (item.ParentType)
                        {
                        case 0:
                            break;

                        case 1:
                            break;

                        case 2:
                            int.TryParse(item.ParentId, out int postId);
                            var post = context.MixPost.FirstOrDefault(m => m.Id == postId && m.Specificulture == Specificulture);
                            if (post != null)
                            {
                                tasks.Add(MixPosts.ReadViewModel.Repository.RemoveCache(post, context, transaction));
                            }
                            break;

                        case 3:
                            int.TryParse(item.ParentId, out int pageId);
                            var page = context.MixPage.FirstOrDefault(m => m.Id == pageId && m.Specificulture == Specificulture);
                            if (page != null)
                            {
                                tasks.Add(MixPages.ReadViewModel.Repository.RemoveCache(page, context, transaction));
                            }
                            break;

                        case 4:
                            int.TryParse(item.ParentId, out int moduleId);
                            var module = context.MixModule.FirstOrDefault(m => m.Id == moduleId && m.Specificulture == Specificulture);
                            if (module != null)
                            {
                                tasks.Add(MixModules.ReadListItemViewModel.Repository.RemoveCache(module, context, transaction));
                            }
                            break;

                        case 5:
                            break;

                        default:
                            break;
                        }
                    }
                }
                tasks.Add(base.RemoveCache(model, context, transaction));
                result = Task.WhenAll(tasks);
                result.Wait();
                return(result);
            }
            catch (Exception ex)
            {
                UnitOfWorkHelper <MixCmsContext> .HandleException <UpdateViewModel>(ex, isRoot, transaction);

                return(Task.FromException(ex));
            }
            finally
            {
                if (isRoot && (result.Status == TaskStatus.RanToCompletion || result.Status == TaskStatus.Canceled || result.Status == TaskStatus.Faulted))
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }
예제 #21
0
        public async Task <RepositoryResponse <bool> > ImportAsync(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
            {
                if (Configurations != null && Configurations.Count > 0)
                {
                    result = await ImportConfigurationsAsync(destCulture, context, transaction);
                }
                if (result.IsSucceed && Languages != null && Languages.Count > 0)
                {
                    result = await ImportLanguagesAsync(destCulture, context, transaction);
                }
                if (result.IsSucceed && Pages != null && Pages.Count > 0)
                {
                    result = await ImportPagesAsync(destCulture, context, transaction);
                }
                if (result.IsSucceed && Modules != null && Modules.Count > 0)
                {
                    result = await ImportModulesAsync(destCulture, context, transaction);
                }

                if (result.IsSucceed && ModuleDatas.Count > 0)
                {
                    result = await ImportModuleDatas(destCulture, context, transaction);
                }
                if (result.IsSucceed && Posts != null && Posts.Count > 0)
                {
                    result = await ImportPostsAsync(destCulture, context, transaction);
                }
                if (result.IsSucceed && AttributeSets != null && AttributeSets.Count > 0)
                {
                    result = await ImportAttributeSetsAsync(context, transaction);
                }
                if (result.IsSucceed && AttributeSetDatas.Count > 0)
                {
                    result = await ImportAttributeSetDatas(destCulture, context, transaction);
                }
                if (result.IsSucceed && RelatedData.Count > 0)
                {
                    result = await ImportRelatedDatas(destCulture, context, transaction);
                }

                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)
                {
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
            return(result);
        }
예제 #22
0
        public static async Task <RepositoryResponse <List <TView> > > FilterByKeywordAsync <TView>(string culture, string attributeSetName
                                                                                                    , string filterType, string fieldName, string keyword
                                                                                                    , 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
            {
                Expression <Func <MixAttributeSetValue, bool> > attrPredicate = m => m.Specificulture == culture && m.AttributeSetName == attributeSetName;
                Expression <Func <MixAttributeSetValue, bool> > valPredicate  = null;
                RepositoryResponse <List <TView> > result = new RepositoryResponse <List <TView> >()
                {
                    IsSucceed = true,
                    Data      = new List <TView>()
                };
                if (filterType == "equal")
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == fieldName && m.StringValue == keyword;
                    if (valPredicate != null)
                    {
                        valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                    else
                    {
                        valPredicate = pre;
                    }
                }
                else
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == fieldName && m.StringValue.Contains(keyword);
                    if (valPredicate != null)
                    {
                        valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                    else
                    {
                        valPredicate = pre;
                    }
                }
                if (valPredicate != null)
                {
                    attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, attrPredicate, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                }

                var query   = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                var dataIds = query.ToList();
                if (query != null)
                {
                    Expression <Func <MixAttributeSetData, bool> > predicate = m => dataIds.Any(id => m.Id == id);
                    result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync(
                        predicate, context, transaction);
                }
                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <List <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Dispose();
                }
            }
        }
예제 #23
0
        public void LoadData(int?articleId            = null, int?productId = null, int?categoryId = 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 <MixModuleArticle, bool> > articleExp = null;
                Expression <Func <MixModuleProduct, bool> > productExp = null;
                switch (Type)
                {
                case MixModuleType.Content:
                case MixModuleType.Data:
                    dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture;
                    //articleExp = 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.CategoryId == categoryId);
                    articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture;
                    productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture;
                    break;

                case MixModuleType.SubArticle:
                    dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.ArticleId == articleId);
                    break;

                case MixModuleType.SubProduct:
                    dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.ProductId == productId);
                    break;

                case MixModuleType.ListArticle:
                    articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture;
                    break;

                case MixModuleType.ListProduct:
                    productExp = n => n.ModuleId == Id && n.Specificulture == Specificulture;
                    break;

                default:
                    dataExp    = m => m.ModuleId == Id && m.Specificulture == Specificulture;
                    articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture;
                    productExp = m => m.ModuleId == Id && m.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 (articleExp != null)
                {
                    var getArticles = MixModuleArticles.ReadViewModel.Repository
                                      .GetModelListBy(articleExp
                                                      , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0
                                                      , pageSize, pageIndex
                                                      , _context: context, _transaction: transaction);
                    if (getArticles.IsSucceed)
                    {
                        Articles = getArticles.Data;
                    }
                }
                if (productExp != null)
                {
                    var getProducts = MixModuleProducts.ReadViewModel.Repository
                                      .GetModelListBy(productExp
                                                      , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0
                                                      , PageSize, pageIndex
                                                      , _context: context, _transaction: transaction);
                    if (getProducts.IsSucceed)
                    {
                        Products = getProducts.Data;
                    }
                }
            }
            catch (Exception ex)
            {
                UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction);
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Dispose();
                }
            }
        }
예제 #24
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)
                {
                    // store old id => update to related data if save success
                    var oldId = item.Id;

                    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
                    {
                        // update new id to related attribute data
                        var related = RelatedData.Where(
                            m => m.ParentType == (int)MixEnums.MixAttributeSetDataType.Page && m.ParentId == oldId.ToString());
                        foreach (var r in related)
                        {
                            r.ParentId = item.Id.ToString();
                        }
                        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);
        }
예제 #25
0
        public static Task <RepositoryResponse <List <TView> > > FilterByValueAsync <TView>(string culture, string attributeSetName
                                                                                            , Dictionary <string, Microsoft.Extensions.Primitives.StringValues> queryDictionary
                                                                                            , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
            where TView : ODataViewModelBase <MixCmsContext, MixAttributeSetData, TView>
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = m => m.Specificulture == culture && m.AttributeSetName == attributeSetName;
                RepositoryResponse <List <TView> > result = new RepositoryResponse <List <TView> >()
                {
                    IsSucceed = true,
                    Data      = new List <TView>()
                };
                var tasks = new List <Task <RepositoryResponse <TView> > >();

                // Loop queries string => predicate
                foreach (var q in queryDictionary)
                {
                    if (!string.IsNullOrEmpty(q.Key) && !string.IsNullOrEmpty(q.Value))
                    {
                        Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == q.Key && m.StringValue.Contains(q.Value);
                        valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                }
                var query = context.MixAttributeSetValue.Where(valPredicate).Select(m => m.DataId).Distinct().ToList();
                if (query != null)
                {
                    foreach (var item in query)
                    {
                        tasks.Add(Task.Run(async() =>
                        {
                            var resp = await ODataDefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetSingleModelAsync(
                                m => m.Id == item && m.Specificulture == culture);
                            return(resp);
                        }));
                    }
                    var continuation = Task.WhenAll(tasks);
                    continuation.Wait();
                    if (continuation.Status == TaskStatus.RanToCompletion)
                    {
                        foreach (var data in continuation.Result)
                        {
                            if (data.IsSucceed)
                            {
                                result.Data.Add(data.Data);
                            }
                            else
                            {
                                result.Errors.AddRange(data.Errors);
                            }
                        }
                    }
                    // Display information on faulted tasks.
                    else
                    {
                        foreach (var t in tasks)
                        {
                            result.Errors.Add($"Task {t.Id}: {t.Status}");
                        }
                    }
                }
                return(Task.FromResult(result));
            }
            catch (Exception ex)
            {
                return(Task.FromResult(UnitOfWorkHelper <MixCmsContext> .HandleException <List <TView> >(ex, isRoot, transaction)));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }
예제 #26
0
        //public override List<Task> GenerateRelatedData(MixCmsContext context, IDbContextTransaction transaction)
        //{
        //    var tasks = new List<Task>();
        //    tasks.Add(Task.Run(() =>
        //    {
        //        AttributeData.Data.RemoveCache(AttributeData.Data.Model, context, transaction);
        //    }));
        //    foreach (var item in AttributeData.Data.Values)
        //    {
        //        tasks.Add(Task.Run(() =>
        //        {
        //            item.RemoveCache(item.Model, context, transaction);
        //        }));
        //    }
        //    // Remove parent Pages
        //    var relatedPages = context.MixPageModule.Include(m => m.MixPage).Where(d => d.Specificulture == Specificulture && (d.ModuleId == Id))
        //        .AsEnumerable();
        //    foreach (var item in relatedPages)
        //    {
        //        tasks.Add(Task.Run(() =>
        //        {
        //            MixPageModules.ReadMvcViewModel.Repository.RemoveCache(item, context, transaction);
        //        }));

        //        tasks.Add(Task.Run(() =>
        //        {
        //            MixPages.ReadViewModel.Repository.RemoveCache(item.MixPage, context, transaction);
        //        }));
        //    }

        //    return tasks;
        //}

        #endregion Async

        #endregion Overrides

        #region Expand
        public static async Task <RepositoryResponse <JObject> > SaveByModuleName(string culture, string createdBy, string name, string formName, JObject obj
                                                                                  , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var getModule = await Repository.GetSingleModelAsync(m => m.Specificulture == culture && m.Name == name, context, transaction);

                string dataId = obj["id"]?.Value <string>();
                if (getModule.IsSucceed)
                {
                    // Get Attribute set
                    var getAttrSet = await Lib.ViewModels.MixAttributeSets.ReadViewModel.Repository.GetSingleModelAsync(m => m.Name == formName, context, transaction);

                    if (getAttrSet.IsSucceed)
                    {
                        // Save attr data + navigation
                        MixAttributeSetDatas.UpdateViewModel data = new MixAttributeSetDatas.UpdateViewModel()
                        {
                            Id               = dataId,
                            CreatedBy        = createdBy,
                            AttributeSetId   = getAttrSet.Data.Id,
                            AttributeSetName = getAttrSet.Data.Name,
                            Specificulture   = culture,
                            Data             = obj
                        };

                        // Create navigation module - attr data
                        var getNavigation = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetSingleModelAsync(
                            m => m.ParentId == getModule.Data.Id.ToString() && m.ParentType == MixEnums.MixAttributeSetDataType.Module.ToString() && m.Specificulture == culture
                            , context, transaction);

                        if (!getNavigation.IsSucceed)
                        {
                            data.RelatedData.Add(new MixRelatedAttributeDatas.UpdateViewModel()
                            {
                                ParentId       = getModule.Data.Id.ToString(),
                                Specificulture = culture,
                                ParentType     = MixAttributeSetDataType.Module
                            });
                        }
                        var portalResult = await data.SaveModelAsync(true, context, transaction);

                        UnitOfWorkHelper <MixCmsContext> .HandleTransaction(portalResult.IsSucceed, isRoot, transaction);

                        return(new RepositoryResponse <JObject>()
                        {
                            IsSucceed = portalResult.IsSucceed,
                            Data = portalResult.Data?.Data,
                            Exception = portalResult.Exception,
                            Errors = portalResult.Errors
                        });
                    }
                    else
                    {
                        return(new RepositoryResponse <JObject>()
                        {
                            IsSucceed = false,
                            Status = (int)MixEnums.ResponseStatus.BadRequest
                        });
                    }
                }
                else
                {
                    return(new RepositoryResponse <JObject>()
                    {
                        IsSucceed = false,
                        Status = (int)MixEnums.ResponseStatus.BadRequest
                    });
                }
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <JObject>(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }
예제 #27
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>(HttpRequest request, 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
            {
                var queryDictionary  = request.Query.ToList();
                var attributeSetName = request.Query["filterType"].ToString();
                var culture          = request.Query["culture"].ToString();
                var keyword          = request.Query["keyword"].ToString();
                var filterType       = request.Query["filterType"].ToString();
                var orderBy          = request.Query["orderBy"].ToString();
                int.TryParse(request.Query["direction"], out int direction);
                int.TryParse(request.Query["pageIndex"], out int pageIndex);
                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   = int.TryParse(request.Query["status"], out int status);
                var  tasks      = new List <Task <RepositoryResponse <TView> > >();
                var  getfields  = await MixAttributeFields.ReadViewModel.Repository.GetModelListByAsync(m => m.AttributeSetName == attributeSetName, context, transaction);

                var fields = getfields.IsSucceed ? getfields.Data : new List <MixAttributeFields.ReadViewModel>();
                Expression <Func <MixAttributeSetValue, bool> > attrPredicate =
                    m => m.Specificulture == culture && m.AttributeSetName == attributeSetName &&
                    (!isStatus || (m.Status == status)) &&
                    (!isFromDate || (m.CreatedDateTime >= fromDate)) &&
                    (!isToDate || (m.CreatedDateTime <= toDate))
                ;
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = null;
                RepositoryResponse <PaginationModel <TView> >   result       = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                };

                if (queryDictionary != null)
                {
                    // 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 = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                            }
                            else
                            {
                                valPredicate = pre;
                            }
                        }
                    }
                    else // filter by specific field name
                    {
                        foreach (var q in queryDictionary)
                        {
                            if (fields.Any(f => f.Name == q.Key) && !string.IsNullOrEmpty(q.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 = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                                }
                                else
                                {
                                    valPredicate = pre;
                                }
                            }
                        }
                    }
                    if (valPredicate != null)
                    {
                        attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, attrPredicate, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                }

                var query   = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                var dataIds = query.ToList();
                if (query != null)
                {
                    Expression <Func <MixAttributeSetData, bool> > predicate = m => dataIds.Any(id => m.Id == id);
                    result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync(
                        predicate, orderBy, direction, pageSize, pageIndex, null, null, context, transaction);
                }
                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();
                }
            }
        }
예제 #28
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPosts <TView>(
            SearchPostQueryModel searchPostData,
            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
            {
                Expression <Func <MixDatabaseDataValue, bool> > valPredicate   = null;
                Expression <Func <MixDatabaseDataValue, bool> > catePredicate  = GetCategoryPredicate(searchPostData);
                Expression <Func <MixDatabaseDataValue, bool> > tagPredicate   = GetTagPredicate(searchPostData);
                Expression <Func <MixDatabaseDataValue, bool> > queryPredicate = GetQueryPredicate(searchPostData);

                valPredicate = valPredicate
                               .AndAlsoIf(queryPredicate != null, queryPredicate)
                               .AndAlsoIf(catePredicate != null, catePredicate)
                               .AndAlsoIf(tagPredicate != null, tagPredicate);

                if (valPredicate != null)
                {
                    return(await SearchPostByValue <TView>(valPredicate, searchPostData, context, transaction));
                }
                else
                {
                    Expression <Func <MixPost, bool> > predicate = BuildPostExpression(searchPostData);

                    if (searchPostData.PagingData.OrderBy.StartsWith("additionalData."))
                    {
                        return(GetSortedPostByValue <TView>(predicate, searchPostData, context, transaction));
                    }

                    if (searchPostData.PageId.HasValue)
                    {
                        return(GetSortedPostByPage <TView>(predicate, searchPostData, context, transaction));
                    }

                    return(await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync(
                               predicate,
                               searchPostData.PagingData.OrderBy,
                               searchPostData.PagingData.Direction,
                               searchPostData.PagingData.PageSize,
                               searchPostData.PagingData.PageIndex,
                               null, null,
                               context,
                               transaction));
                }
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }