public static async Task <RepositoryResponse <bool> > ImportConfigurations(List <MixConfiguration> arrConfiguration, string destCulture)
        {
            var result = new RepositoryResponse <bool>()
            {
                IsSucceed = true
            };
            var context     = new MixCmsContext();
            var transaction = context.Database.BeginTransaction();

            try
            {
                foreach (var item in arrConfiguration)
                {
                    var lang = new SystemConfigurationViewModel(item, context, transaction);
                    lang.Specificulture = destCulture;
                    var saveResult = await lang.SaveModelAsync(false, context, transaction);

                    result.IsSucceed = result.IsSucceed && saveResult.IsSucceed;
                    if (!result.IsSucceed)
                    {
                        result.Exception = saveResult.Exception;
                        result.Errors    = saveResult.Errors;
                        break;
                    }
                }
                UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, true, transaction);
            }
            catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only
            {
                var error = UnitOfWorkHelper <MixCmsContext> .HandleException <SystemConfigurationViewModel>(ex, true, transaction);

                result.IsSucceed = false;
                result.Errors    = error.Errors;
                result.Exception = error.Exception;
            }
            finally
            {
                //if current Context is Root
                UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
            }
            return(result);
        }
예제 #2
0
        public static async System.Threading.Tasks.Task <RepositoryResponse <List <ReadViewModel> > > UpdateInfosAsync(List <MixPortalPagePortalPages.ReadViewModel> cates)
        {
            MixCmsContext context     = new MixCmsContext();
            var           transaction = context.Database.BeginTransaction();
            var           result      = new RepositoryResponse <List <ReadViewModel> >();

            try
            {
                foreach (var item in cates)
                {
                    var saveResult = await item.SaveModelAsync(false, context, transaction);

                    result.IsSucceed = saveResult.IsSucceed;
                    if (!result.IsSucceed)
                    {
                        result.Errors.AddRange(saveResult.Errors);
                        result.Exception = saveResult.Exception;
                        break;
                    }
                }
                UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, true, transaction);

                return(result);
            }
            catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only
            {
                UnitOfWorkHelper <MixCmsContext> .HandleException <ReadViewModel>(ex, true, transaction);

                return(new RepositoryResponse <List <ReadViewModel> >()
                {
                    IsSucceed = false,
                    Data = null,
                    Exception = ex
                });
            }
            finally
            {
                //if current Context is Root
                transaction.Dispose();
                UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
            }
        }
예제 #3
0
        public override async Task <RepositoryResponse <UpdateViewModel> > SaveModelAsync(bool isSaveSubModels = false, MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var result = await base.SaveModelAsync(isSaveSubModels, context, transaction);

                // if save current data success and there is related parent data
                if (result.IsSucceed && !string.IsNullOrEmpty(ParentId))
                {
                    MixRelatedAttributeDatas.UpdateViewModel nav = new MixRelatedAttributeDatas.UpdateViewModel()
                    {
                        DataId           = result.Data.Id,
                        Specificulture   = Specificulture,
                        AttributeSetId   = result.Data.AttributeSetId,
                        AttributeSetName = result.Data.AttributeSetName,
                        ParentId         = ParentId,
                        ParentType       = ParentType
                    };
                    var saveNav = await nav.SaveModelAsync(true, context, transaction);

                    result.IsSucceed = result.IsSucceed && saveNav.IsSucceed;
                    result.Errors    = saveNav.Errors;
                    result.Exception = saveNav.Exception;
                }
                UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction);

                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <UpdateViewModel>(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #4
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByPageId <TView>(
            int pageId
            , string keyword             = 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, MixPagePost, TView>
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                culture = culture ?? MixService.GetConfig <string>("DefaultCulture");
                var result = await DefaultRepository <MixCmsContext, MixPagePost, TView> .Instance.GetModelListByAsync(
                    m => m.Specificulture == culture && m.PageId == pageId &&
                    (string.IsNullOrEmpty(keyword) ||
                     (EF.Functions.Like(m.MixPost.Title, $"%{keyword}%")) ||
                     (EF.Functions.Like(m.MixPost.Excerpt, $"%{keyword}%")) ||
                     (EF.Functions.Like(m.MixPost.Content, $"%{keyword}%"))
                    )
                    , orderByPropertyName, direction, pageSize, pageIndex
                    , _context : context, _transaction : transaction
                    );

                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);
                }
            }
        }
예제 #5
0
        public static async Task <RepositoryResponse <FileViewModel> > ParseSitemapAsync()
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(null, null, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                XNamespace aw   = "http://www.sitemaps.org/schemas/sitemap/0.9";
                var        root = new XElement(aw + "urlset");

                await ParseNavigationsAsync(root, context, transaction);
                await ParsePostsDocAsync(root, context, transaction);

                string folder = $"wwwroot";
                MixFileRepository.Instance.CreateDirectoryIfNotExist(folder);
                string filename = $"sitemap";
                string filePath = $"{folder}/{filename}{MixFileExtensions.Xml}";
                root.Save(filePath);
                return(new RepositoryResponse <FileViewModel>()
                {
                    IsSucceed = true,
                    Data = new FileViewModel()
                    {
                        Extension = MixFileExtensions.Xml,
                        Filename = filename,
                        FileFolder = folder
                    }
                });
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <FileViewModel>(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #6
0
        public RepositoryResponse <string> ExportSelectedItemsAsync()
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(null, null, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

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

            try
            {
                Configurations = MixConfigurations.ImportViewModel.Repository.GetModelListBy(
                    m => m.Specificulture == Specificulture, context, transaction).Data;
                Languages = MixLanguages.ImportViewModel.Repository.GetModelListBy(
                    m => m.Specificulture == Specificulture, context, transaction).Data;

                ExportPages(context, transaction);
                ExportModules(context, transaction);
                ExportMixDatabasesAsync(context, transaction);
                ExportDatas(context, transaction);
                return(result);
            }
            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 = ex;
                return(result);
            }
            finally
            {
                //if current Context is Root
                if (isRoot)
                {
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #7
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > GetModelistByMeta <TView>(
            string metaName,
            string metaValue,
            string postType,
            PagingRequest pagingData,
            string culture                     = 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 ??= MixService.GetAppSetting <string>(MixAppSettingKeywords.DefaultCulture);
                postType ??= MixDatabaseNames.ADDITIONAL_COLUMN_POST;

                var valExp         = Expressions.GetMetaExpression(metaName, metaValue, culture);
                var searchPostData = new SearchPostQueryModel()
                {
                    PagingData     = pagingData,
                    PostType       = postType,
                    Specificulture = culture
                };
                return(await SearchPostByValue <TView>(valExp, searchPostData, 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);
                }
            }
        }
예제 #8
0
        /// <summary>
        /// Creates the model.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="_context">The context.</param>
        /// <param name="_transaction">The transaction.</param>
        /// <returns></returns>
        public virtual RepositoryResponse <TView> CreateModel(TView view
                                                              , 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
            };

            try
            {
                context.Entry(view.Model).State = EntityState.Added;
                result.IsSucceed = context.SaveChanges() > 0;
                result.Data      = view;
                UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction);

                return(result);
            }
            catch (Exception ex)
            {
                LogErrorMessage(ex);
                result.IsSucceed = false;
                result.Exception = ex;
                if (isRoot)
                {
                    transaction.Rollback();
                }
                return(result);
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #9
0
        /// <summary>
        /// Creates the model asynchronous.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="_context">The context.</param>
        /// <param name="_transaction">The transaction.</param>
        /// <returns></returns>
        public virtual async Task <RepositoryResponse <TView> > CreateModelAsync(TView view
                                                                                 , 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
            };

            try
            {
                context.Entry(view.Model).State = EntityState.Added;
                result.IsSucceed = await context.SaveChangesAsync().ConfigureAwait(false) > 0;

                result.Data = view;
                if (result.IsSucceed)
                {
                    result.Data.ParseView(false, context, transaction);
                }

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

                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <TDbContext> .HandleException <TView>(view, ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #10
0
        public static List <NavUserRoleViewModel> GetRoleNavs(string userId)
        {
            UnitOfWorkHelper <MixCmsAccountContext> .InitTransaction(
                null, null, out MixCmsAccountContext context,
                out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var query = context.AspNetRoles
                            .Include(cp => cp.AspNetUserRoles)
                            .ToList()
                            .Select(p => new NavUserRoleViewModel()
                {
                    UserId      = userId,
                    RoleId      = p.Id,
                    Description = p.Name,
                    IsActived   = context.AspNetUserRoles.Any(m => m.UserId == userId && m.RoleId == p.Id)
                })
                            .OrderBy(m => m.Priority)
                            .ToList();
                query.ForEach(m => m.ExpandView(context, transaction));
                return(query);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsAccountContext> .HandleException <List <NavUserRoleViewModel> >(
                           ex, isRoot, transaction).Data);
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsAccountContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #11
0
        /// <summary>
        /// Edits the model.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="_context">The context.</param>
        /// <param name="_transaction">The transaction.</param>
        /// <returns></returns>
        public virtual RepositoryResponse <TView> EditModel(TView view
                                                            , 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
            };

            try
            {
                context.Entry(view.Model).State = EntityState.Modified;
                result.IsSucceed = context.SaveChanges() > 0;
                result.Data      = view;
                if (result.IsSucceed)
                {
                    RemoveCacheAsync(view.Model, context, transaction).GetAwaiter().GetResult();
                }
                UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction);

                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <TDbContext> .HandleException <TView>(view, ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #12
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);
        }
예제 #13
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 && MixDatabases != null && MixDatabases.Count > 0)
                {
                    result = await ImportMixDatabasesAsync(context, transaction);
                }
                if (result.IsSucceed && MixDatabaseDatas.Count > 0)
                {
                    result = await ImportMixDatabaseDatas(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);
        }
예제 #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 <AdditionalViewModel> > GetAdditionalData(
            MixDatabaseParentType 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 && 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           = 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);
                }
            }
        }
예제 #16
0
        /// <summary>
        /// Clones the specified clone cultures.
        /// </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 RepositoryResponse <List <TView> > Clone(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;

                        //TView view = InitView();
                        TModel m           = (TModel)context.Entry(model).CurrentValues.ToObject();
                        Type   myType      = typeof(TModel);
                        var    myFieldInfo = myType.GetProperty("Specificulture");
                        myFieldInfo.SetValue(m, desSpecificulture);
                        //view.Model = m;
                        //view.ParseView(isExpand: false, _context: context, _transaction: transaction);
                        bool isExist = Repository.CheckIsExists(m, _context: context, _transaction: transaction);

                        if (isExist)
                        {
                            result.IsSucceed = true;
                            //result.Data.Add(view);
                        }
                        else
                        {
                            context.Entry(m).State = EntityState.Added;
                            context.SaveChanges();
                            var cloneSubResult = CloneSubModels(m, cloneCultures, context, transaction);
                            if (!cloneSubResult.IsSucceed)
                            {
                                cloneSubResult.Errors.AddRange(cloneSubResult.Errors);
                                cloneSubResult.Exception = cloneSubResult.Exception;
                            }

                            result.IsSucceed = result.IsSucceed && cloneSubResult.IsSucceed && cloneSubResult.IsSucceed;
                            //result.Data.Add(cloneResult.Data);
                        }
                        UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction);
                    }
                    return(result);
                }
                else
                {
                    return(result);
                }
            }
            catch (Exception ex)
            {
                result.IsSucceed = false;
                result.Exception = ex;
                return(result);
            }
            finally
            {
                if (isRoot)
                {
                    UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #17
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 MixDatabaseDataValues.ReadViewModel.Repository.GetSingleModelAsync(
                    m => m.Specificulture == culture &&
                    m.Status == MixContentStatus.Published &&
                    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.MixDatabaseDataType.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);
                }
            }
        }
예제 #18
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPostByIds <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.MixDatabaseDataAssociation.Where(
                        m => m.Specificulture == culture && postIds.Any(p => p.ToString() == m.ParentId))
                                         .Join(context.MixDatabaseDataValue, 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);
                }
            }
        }
예제 #19
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 = Cms.Lib.ViewModels.MixModuleDatas.ReadViewModel.Repository
                                        .GetModelListBy(
                        dataExp
                        , MixService.GetAppSetting <string>(MixAppSettingKeywords.SortBy
                                                            ), 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 = Cms.Lib.ViewModels.MixModulePosts.ReadViewModel.Repository
                                   .GetModelListBy(postExp
                                                   , MixService.GetAppSetting <string>(MixAppSettingKeywords.SortBy), 0
                                                   , pageSize, pageIndex
                                                   , _context: context, _transaction: transaction);
                    if (getPosts.IsSucceed)
                    {
                        Posts = getPosts.Data;
                    }
                }
            }
            catch (Exception ex)
            {
                UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <ModuleViewModel> >(ex, isRoot, transaction);
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #20
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 = ReflectionHelper.CombineExpression(valPredicate, pre, Heart.Enums.MixHeartEnums.ExpressionMethod.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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #21
0
        public static RepositoryResponse <List <MixModulePosts.ReadViewModel> > GetModulePostNavAsync(int postId, string specificulture
                                                                                                      , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var result = MixModulePosts.ReadViewModel.Repository.GetModelListBy(
                    m => m.PostId == postId && m.Specificulture == specificulture,
                    context, transaction).Data;
                var activeIds = result.Select(n => n.ModuleId);

                var inactiveNavs = context.MixModule
                                   .Where(a => a.Specificulture == specificulture &&
                                          !activeIds.Any(m => m == a.Id) &&
                                          (a.Type == (int)MixModuleType.ListPost)
                                          )
                                   .AsEnumerable()
                                   .Select(p => new MixModulePosts.ReadViewModel(
                                               new MixModulePost()
                {
                    PostId         = postId,
                    ModuleId       = p.Id,
                    Specificulture = specificulture
                },
                                               _context, _transaction)
                {
                    IsActived   = p.MixModulePost.Any(cp => cp.PostId == postId && cp.Specificulture == specificulture),
                    Description = p.Title
                });

                result.AddRange(inactiveNavs.ToList());

                return(new RepositoryResponse <List <ReadViewModel> >()
                {
                    IsSucceed = true,
                    Data = result
                });
            }
            catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only
            {
                if (isRoot)
                {
                    transaction.Rollback();
                }
                return(new RepositoryResponse <List <MixModulePosts.ReadViewModel> >()
                {
                    IsSucceed = true,
                    Data = null,
                    Exception = ex
                });
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    transaction.Dispose();
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #22
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);
                }
            }
        }
예제 #23
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);
                }
            }
        }
예제 #24
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;
                valPredicate = valPredicate.AndAlsoIf(
                    !string.IsNullOrEmpty(searchPostData.Category),
                    Expressions.GetMetaExpression(MixDatabaseNames.SYSTEM_CATEGORY, searchPostData.Category, searchPostData.Specificulture));
                valPredicate = valPredicate.AndAlsoIf(
                    !string.IsNullOrEmpty(searchPostData.Tag),
                    Expressions.GetMetaExpression(MixDatabaseNames.SYSTEM_TAG, searchPostData.Tag, searchPostData.Specificulture));

                if (valPredicate != null)
                {
                    return(await SearchPostByValue <TView>(valPredicate, searchPostData.PagingData, searchPostData.PostType, searchPostData.Specificulture, context, transaction));
                }
                else
                {
                    Expression <Func <MixPost, bool> > predicate = BuildPostExpression(searchPostData);
                    if (searchPostData.PagingData.OrderBy.StartsWith("additionalData."))
                    {
                        var total      = context.MixPost.Count(predicate);
                        var allPostIds = context.MixPost.Where(predicate)
                                         .AsEnumerable()
                                         .Select(m => m.Id);

                        var posts = IQueryableHelper.GetSortedPost(allPostIds, context, searchPostData).ToList();
                        return(new RepositoryResponse <PaginationModel <TView> >()
                        {
                            IsSucceed = true,
                            Data = new PaginationModel <TView>()
                            {
                                Items = DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetCachedData(posts, context, transaction),
                                PageSize = searchPostData.PagingData.PageSize,
                                PageIndex = searchPostData.PagingData.PageIndex
                            }
                        });
                    }
                    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);
                }
            }
        }
예제 #25
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 <MixDatabaseDataAssociation, bool> > predicate = m => m.Specificulture == culture && dataIds.Contains(m.DataId) &&
                                                                                  m.ParentType == MixDatabaseParentType.Post;
                foreach (var id in dataIds)
                {
                    Expression <Func <MixDatabaseDataAssociation, bool> > pre = m => m.DataId == id;
                    predicate = predicate.AndAlso(pre);
                }
                var getRelatedData = await MixDatabaseDataAssociations.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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #26
0
        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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #27
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPostByField <TView>(
            string fieldName, string value
            , string culture             = null
            , 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
            {
                culture ??= MixService.GetConfig <string>(MixAppSettingKeywords.DefaultCulture);
                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.MixDatabaseDataValue.Where(
                    m => m.MixDatabaseName == MixConstants.MixDatabaseName.ADDITIONAL_FIELD_POST && m.Specificulture == culture &&
                    EF.Functions.Like(m.StringValue, value) && m.MixDatabaseColumnName == fieldName)
                              .Select(m => m.DataId)?.ToListAsync();

                if (dataIds != null && dataIds.Count > 0)
                {
                    var getRelatedData = await MixDatabaseDataAssociations.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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #28
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());
                                valPredicate = valPredicate == null
                                    ? pre
                                    : valPredicate = valPredicate.AndAlso(pre);
                            }
                            else
                            {
                                Expression <Func <MixAttributeSetValue, bool> > pre =
                                    m => m.AttributeFieldName == q.Key &&
                                    (EF.Functions.Like(m.StringValue, $"%{q.Value}%"));
                                valPredicate = valPredicate == null
                                    ? pre
                                    : valPredicate = valPredicate.AndAlso(pre);
                            }
                        }
                    }
                    if (valPredicate != null)
                    {
                        attrPredicate = valPredicate.AndAlso(attrPredicate);
                    }
                }
                // 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 = attrPredicate.AndAlso(pre);
                }

                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
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #29
0
        public static async Task <PaginationModel <TView> > GetMixData <TView>(
            string mixDatabaseName,
            string culture                     = null,
            string keyword                     = null,
            string fieldName                   = null,
            string filterType                  = "contain", // or "equal"
            int?pageIndex                      = 0,
            int pageSize                       = 100,
            string orderBy                     = "Priority",
            DisplayDirection direction         = DisplayDirection.Asc,
            MixCmsContext _context             = null,
            IDbContextTransaction _transaction = null)
            where TView : ViewModelBase <MixCmsContext, MixDatabaseData, TView>
        {
            culture ??= MixService.GetAppSetting <string>(MixAppSettingKeywords.DefaultCulture);
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var getfields = await ViewModels.MixDatabaseColumns.ReadViewModel.Repository.GetModelListByAsync(
                    m => m.MixDatabaseName == mixDatabaseName, context, transaction);

                var fields = getfields.IsSucceed ? getfields.Data : new List <ViewModels.MixDatabaseColumns.ReadViewModel>();
                // Data predicate
                Expression <Func <MixDatabaseData, bool> > predicate = m => m.Specificulture == culture &&
                                                                       (m.MixDatabaseName == mixDatabaseName);

                // val predicate
                Expression <Func <MixDatabaseDataValue, bool> > attrPredicate = m => m.Specificulture == culture &&
                                                                                (m.MixDatabaseName == mixDatabaseName);

                // if filter by field name or keyword => filter by attr value
                if (!string.IsNullOrEmpty(keyword))
                {
                    // filter by all fields if have keyword
                    Expression <Func <MixDatabaseDataValue, bool> > pre = null;

                    if (!string.IsNullOrEmpty(fieldName)) // filter by specific field name
                    {
                        pre           = m => m.MixDatabaseColumnName == fieldName;
                        pre           = pre.AndAlsoIf(filterType == "equal", m => m.StringValue == keyword);
                        pre           = pre.AndAlsoIf(filterType == "contain", m => EF.Functions.Like(m.StringValue, $"%{keyword}%"));
                        attrPredicate = attrPredicate.AndAlsoIf(pre != null, pre);
                    }
                    else
                    {
                        foreach (var field in fields)
                        {
                            Expression <Func <MixDatabaseDataValue, bool> > keywordPredicate = m => m.MixDatabaseColumnName == field.Name;
                            keywordPredicate = keywordPredicate.AndAlsoIf(filterType == "equal", m => m.StringValue == keyword);
                            keywordPredicate = keywordPredicate.AndAlsoIf(filterType == "contain", m => EF.Functions.Like(m.StringValue, $"%{keyword}%"));

                            pre = pre == null
                                ? keywordPredicate
                                : pre.Or(keywordPredicate);
                        }
                        attrPredicate = attrPredicate.AndAlsoIf(pre != null, pre);
                    }

                    var valDataIds = context.MixDatabaseDataValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                    predicate = predicate.AndAlsoIf(valDataIds != null, m => valDataIds.Any(id => m.Id == id));
                }
                else
                {
                    predicate = m => m.Specificulture == culture && (m.MixDatabaseName == mixDatabaseName);
                    predicate = predicate.AndAlso(m => m.Status == MixContentStatus.Published);
                }
                var getData = await DefaultRepository <MixCmsContext, MixDatabaseData, TView> .Instance.GetModelListByAsync(
                    predicate,
                    orderBy,
                    direction,
                    pageSize,
                    pageIndex,
                    null, null,
                    context,
                    transaction);

                return(getData.Data);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return(null);
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction);
                }
            }
        }
예제 #30
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
                });
            }
        }