Пример #1
0
        /// <summary>
        /// Get versioned entity with specific publishing status.
        /// </summary>
        /// <typeparam name="TEntityType">Type of entity which will be filtered</typeparam>
        /// <param name="unitOfWork">Instance of unit of work</param>
        /// <param name="rootId">ID of unific root which is used as input for searching its specific version</param>
        /// <param name="publishingStatus">Searching criteria for publishing status</param>
        /// <returns></returns>
        public TEntityType GetSpecificVersionByRoot <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid rootId, PublishingStatus publishingStatus) where TEntityType : class, IVersionedVolume, new()
        {
            var publishingStatusId = PublishingStatuses[publishingStatus];
            var entityRep          = unitOfWork.GetSet <TEntityType>();

            return(entityRep.FirstOrDefault(i => i.UnificRootId == rootId && i.PublishingStatusId == publishingStatusId));
        }
Пример #2
0
        public Guid?GetVersionId <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid rootId, PublishingStatus?publishingStatus = null, bool ignoreDeleted = true) where TEntityType : class, IVersionedVolume
        {
            if (!rootId.IsAssigned())
            {
                return(null);
            }
            var  entityRep = unitOfWork.GetSet <TEntityType>();
            Guid entityId;

            if (publishingStatus == null)
            {
                // Get the latest version regardless of the publishing status - NOTE! deleted/archived is ignored
                // update 12.9.2017: bug reported PTV-2795, because DELETED was ignored, it was not possible to restore archived/deleted version
                var deletedId      = PublishingStatuses[PublishingStatus.Deleted];
                var oldPublishedId = PublishingStatuses[PublishingStatus.OldPublished];
                entityId = entityRep.Where(i =>
                                           i.UnificRootId == rootId && i.VersioningId != null && (!ignoreDeleted || (ignoreDeleted && (i.PublishingStatusId != deletedId && i.PublishingStatusId != oldPublishedId))))
                           .OrderBy(i => i.Versioning.VersionMajor).ThenBy(i => i.Versioning.VersionMinor).Select(i => i.Id).LastOrDefault();
            }
            else
            {
                var publishingStatusId = PublishingStatuses[publishingStatus.Value];
                entityId = entityRep.Where(i => i.UnificRootId == rootId && i.PublishingStatusId == publishingStatusId).Select(i => i.Id).FirstOrDefault();
            }

            if (!entityId.IsAssigned())
            {
                return(null);
            }

            return(entityId);
        }
Пример #3
0
        public TranslationDefinitions(IResolveManager resolveManager,
                                      ITranslationPrimitives translationPrimitives,
                                      ITranslationUnitOfWork unitOfWork,
                                      TranslationDirection directionDefinition,
                                      IVersioningManager versioningManager,
                                      Type typeToInstantiate = null,
                                      TOut predefinedTarget  = null,
                                      Guid?requestlanguageId = null,
                                      TranslationPolicy translationPolicies = TranslationPolicy.Defaults)
        {
            this.resolveManager            = resolveManager;
            this.translationPrimitives     = translationPrimitives;
            this.directionDefinition       = directionDefinition;
            this.typeToInstantiate         = typeToInstantiate ?? typeof(TOut);
            this.unitOfWork                = unitOfWork;
            this.targetInstance            = predefinedTarget;
            this.requestlanguageIdAssigned = requestlanguageId;
            var cacheManager = resolveManager.Resolve <ICacheManager>();

            this.languageCache         = cacheManager.LanguageCache;
            this.publishingStatusCache = cacheManager.PublishingStatusCache;
            this.versioningManager     = versioningManager;
            this.translationPolicies   = translationPolicies;
            this.entityOutSet          = unitOfWork?.GetSet <TOut>() as IQueryable <TOut>;
            if (this.unitOfWork != null && this.targetInstance != null)
            {
                var cached = unitOfWork.TranslationCloneCache.GetFromCachedSet <TOut>();
                clonedTargetApplied = cached.Any(i => i.ClonedEntity == this.targetInstance);
            }
        }
Пример #4
0
        /// <summary>
        /// Publish specified entity, check latest version and create new version with published state
        /// </summary>
        /// <typeparam name="TEntityType">Type of entity which will be promoted to published state</typeparam>
        /// <param name="unitOfWork">Unit Of Work</param>
        /// <param name="entity">Entity which will be promoted to published state</param>
        /// <param name="targetPublishingStatus">Entity which will be promoted to published state</param>
        public IList <PublishingAffectedResult> PublishVersion <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity, PublishingStatus targetPublishingStatus = PublishingStatus.Published) where TEntityType : class, IVersionedVolume, new()
        {
            var entitySet     = unitOfWork.GetSet <TEntityType>();
            var allVersions   = GetAllVersions(unitOfWork, entity);
            var currentLatest = allVersions.LastOrDefault() ?? new VersionInfo();
            var result        = new List <PublishingAffectedResult>();

            if ((currentLatest.PublishingStatusId == PublishingStatuses[targetPublishingStatus]) && (currentLatest.VersionId == entity.VersioningId))
            {
                logger.LogDebug($"Publishing not needed, already in desired target publishing state. {entity.GetType().Name}, Id: {entity.Id}");
                return(result);
            }
            Guid?originVersioning = null;

            if (targetPublishingStatus == PublishingStatus.Published)
            {
                var previousPublishedVersion = allVersions.LastOrDefault(i => i.PublishingStatusId == PublishingStatuses[PublishingStatus.Published]);
                originVersioning = previousPublishedVersion?.VersionId;
                if (previousPublishedVersion != null)
                {
                    var previousEntity = entitySet.FirstOrDefault(i => i.Id == previousPublishedVersion.EntityId);
                    result.Add(new PublishingAffectedResult()
                    {
                        Id = previousEntity.Id,
                        PublishingStatusOld = previousEntity.PublishingStatusId,
                        PublishingStatusNew = PublishingStatuses[PublishingStatus.OldPublished]
                    });
                    previousEntity.PublishingStatus   = null;
                    previousEntity.PublishingStatusId = PublishingStatuses[PublishingStatus.OldPublished];
                }
                currentLatest.VersionMajor++;
                currentLatest.VersionMinor = 0;
            }
            else
            {
                if (targetPublishingStatus == PublishingStatus.Modified)
                {
                    if (allVersions.Any(i => i.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified]))
                    {
                        throw new PublishModifiedExistsException();
                    }
                    currentLatest.VersionMinor++;
                    var versioningSet = unitOfWork.GetSet <Versioning>();
                    originVersioning = entity.VersioningId != null?versioningSet.Where(i => i.Id == entity.VersioningId).Select(i => i.PreviousVersionId).FirstOrDefault() : null;
                }
                else
                {
                    throw new InvalidOperationException($"It is not allowed to 'publish' entity to {targetPublishingStatus} state.");
                }
            }
            result.Add(new PublishingAffectedResult()
            {
                Id = entity.Id, PublishingStatusOld = entity.PublishingStatusId, PublishingStatusNew = PublishingStatuses[targetPublishingStatus]
            });
            entity.PublishingStatus   = null;
            entity.PublishingStatusId = PublishingStatuses[targetPublishingStatus];
            SetVersioning(entity, unitOfWork.GetSet <Versioning>(), currentLatest, originVersioning);
            return(result);
        }
Пример #5
0
 /// <summary>
 /// Acquire UnificRootId from versioned entity by its ID
 /// </summary>
 /// <typeparam name="T">Type of versioned entity</typeparam>
 /// <param name="unitOfWork">Instance of unit of work</param>
 /// <param name="versionedEntityId">ID of versioned entity</param>
 /// <returns></returns>
 public Guid?GetUnificRootId <T>(ITranslationUnitOfWork unitOfWork, Guid?versionedEntityId) where T : class, IVersionedVolume
 {
     if (versionedEntityId == null)
     {
         return(null);
     }
     return(unitOfWork.GetSet <T>().Where(i => i.Id == versionedEntityId).Select(i => i.UnificRootId).FirstOrDefault());
 }
Пример #6
0
 private TEntityType GetRelatedEntity <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity, VersionInfo currentLatest)
     where TEntityType : class, IVersionedVolume, new()
 {
     if (currentLatest.EntityId == entity.Id)
     {
         return(entity);
     }
     throw new PtvAppException(CoreMessages.MainPublishedEntityLocked, CoreMessages.MainPublishedEntityLockedId);
 }
Пример #7
0
        /// <summary>
        /// Get versioned entity with specific publishing status.
        /// </summary>
        /// <typeparam name="TEntityType">Type of entity which will be filtered</typeparam>
        /// <param name="unitOfWork">Instance of unit of work</param>
        /// <param name="entity">Instance of entity which is used as input for searching specific version</param>
        /// <param name="publishingStatus">Searching criteria for publishing status</param>
        /// <returns></returns>
        public TEntityType GetSpecificVersion <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity, PublishingStatus publishingStatus) where TEntityType : class, IVersionedVolume, new()
        {
            var publishingStatusId = PublishingStatuses[publishingStatus];

            if (entity.PublishingStatusId == publishingStatusId)
            {
                return(entity);
            }
            return(GetSpecificVersionByRoot <TEntityType>(unitOfWork, entity.UnificRootId, publishingStatus));
        }
Пример #8
0
        public PublishingStatus?GetLatestVersionPublishingStatus <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid rootId) where TEntityType : class, IVersionedVolume
        {
            var latestVersion = GetAllVersions <TEntityType>(unitOfWork, rootId).LastOrDefault();

            if (latestVersion != null)
            {
                return(PublishingStatuses.FirstOrDefault(x => x.Value == latestVersion.PublishingStatusId).Key);
            }
            return(null);
        }
Пример #9
0
 /// <summary>
 /// Change publishing status of language version of specific entity which is of IMultilanguagedEntity type
 /// </summary>
 /// <typeparam name="T">Type of entity</typeparam>
 /// <typeparam name="TLang">Type of langauge version relation</typeparam>
 /// <param name="unitOfWork">Unit of work instance</param>
 /// <param name="entity">Entity to change</param>
 /// <param name="statusId">status id for all languages</param>
 public void ChangeStatusOfLanguageVersion <T, TLang>(ITranslationUnitOfWork unitOfWork, T entity, Guid statusId) where T : class, IMultilanguagedEntity <TLang>, new() where TLang : class, ILanguageAvailability
 {
     if (entity == null)
     {
         return;
     }
     if (!entity.LanguageAvailabilities.Any())
     {
         unitOfWork.LoadNavigationProperty(entity, i => i.LanguageAvailabilities);
     }
     entity.LanguageAvailabilities.ForEach(langAvail =>
     {
         langAvail.StatusId = statusId;
     });
 }
Пример #10
0
        /// <summary>
        /// Change publishing status of language version of specific entity which is of IMultilanguagedEntity type
        /// </summary>
        /// <typeparam name="T">Type of entity</typeparam>
        /// <typeparam name="TLang">Type of langauge version relation</typeparam>
        /// <param name="unitOfWork">Unit of work instance</param>
        /// <param name="entity">Entity to change</param>
        /// <param name="publishingStatusTo">Target publishing status of language version</param>
        /// <param name="publishingStatusFrom">Input criteria for selecting the language versions which will be switched</param>
        /// <param name="languageGuids">Input criteria for selecting the language versions which will be switched</param>
        public void ChangeStatusOfLanguageVersion <T, TLang>(ITranslationUnitOfWork unitOfWork, T entity, PublishingStatus publishingStatusTo, IEnumerable <PublishingStatus> publishingStatusFrom = null, IEnumerable <Guid> languageGuids = null) where T : class, IMultilanguagedEntity <TLang>, new() where TLang : class, ILanguageAvailability
        {
            if (entity == null)
            {
                return;
            }
            unitOfWork.LoadNavigationProperty(entity, i => i.LanguageAvailabilities);
            var publishingStatusToId = PublishingStatuses[publishingStatusTo];
            var applyOn = languageGuids == null ? entity.LanguageAvailabilities : entity.LanguageAvailabilities.Where(i => languageGuids.Contains(i.LanguageId));

            publishingStatusFrom?.ForEach(status =>
            {
                var publishingStatusFromId = PublishingStatuses[status];
                applyOn = applyOn.Where(i => i.StatusId == publishingStatusFromId);
            });
            applyOn.ForEach(i => i.StatusId = publishingStatusToId);
        }
Пример #11
0
 /// <summary>
 /// Change publishing status of language version of specific entity which is of IMultilanguagedEntity type
 /// </summary>
 /// <typeparam name="T">Type of entity</typeparam>
 /// <typeparam name="TLang">Type of langauge version relation</typeparam>
 /// <param name="unitOfWork">Unit of work instance</param>
 /// <param name="entity">Entity to change</param>
 /// <param name="languageAvailabilities">languages to change</param>
 public void ChangeStatusOfLanguageVersion <T, TLang>(ITranslationUnitOfWork unitOfWork, T entity, IEnumerable <VmLanguageAvailabilityInfo> languageAvailabilities) where T : class, IMultilanguagedEntity <TLang>, new() where TLang : class, ILanguageAvailability
 {
     if (entity == null)
     {
         return;
     }
     if (!entity.LanguageAvailabilities.Any())
     {
         unitOfWork.LoadNavigationProperty(entity, i => i.LanguageAvailabilities);
     }
     entity.LanguageAvailabilities.ForEach(langAvail =>
     {
         var newStatusId = languageAvailabilities.FirstOrDefault(j => j.LanguageId == langAvail.LanguageId)?.StatusId;
         if (newStatusId.IsAssigned())
         {
             langAvail.StatusId = newStatusId.Value;
         }
     });
 }
Пример #12
0
        /// <summary>
        /// Get and return all available versions of entity
        /// </summary>
        /// <typeparam name="TEntityType"></typeparam>
        /// <param name="unitOfWork">Unit Of Work must be provided for correct functionality</param>
        /// <param name="unificRootId">Entity unificrootId which versions will be retrieved</param>
        /// <returns>List of available versions of specified entity</returns>
        public List <VersionInfo> GetAllVersions <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid unificRootId) where TEntityType : class, IVersionedVolume
        {
            var entityRep = unitOfWork.GetSet <TEntityType>();
            List <TEntityType> relatedEntitiesList = entityRep.Where(i => (i.UnificRootId == unificRootId) && (i.VersioningId != null)).Include(i => i.Versioning).ToList();

            return(relatedEntitiesList.Select(i => new VersionInfo()
            {
                EntityId = i.Id,
                VersionMajor = i.Versioning.VersionMajor,
                VersionMinor = i.Versioning.VersionMinor,
                Modified = i.Versioning.Modified,
                PublishingStatusId = i.PublishingStatusId,
                // ReSharper disable once PossibleInvalidOperationException
                VersionId = i.VersioningId.Value
            })
                   .OrderBy(i => i.VersionMajor)
                   .ThenBy(i => i.VersionMinor)
                   .ToList());
        }
Пример #13
0
        /// <summary>
        /// Perform cloning of entity by calling spcified definitions
        /// </summary>
        /// <param name="unitOfWork">Unit of work instance for creating requests to DB</param>
        /// <param name="entity">Instance of entity which will be cloned</param>
        /// <param name="beforeAddAction">Optional additional action which can be called before entity is added to db set</param>
        /// <param name="cloningMode"></param>
        /// <returns>Copy of entity</returns>
        public TEntity PerformCloning(ITranslationUnitOfWork unitOfWork, TEntity entity, Action <TEntity> beforeAddAction = null, CloningMode cloningMode = CloningMode.Cloning)
        {
            this.cloningMode = cloningMode;
            if (entity == null)
            {
                return(null);
            }
            this.unitOfWork = unitOfWork;
            if (this.entitySet == null)
            {
                this.entitySet = unitOfWork.GetSet <TEntity>();
            }

            source = entity;
            if (cloningMode == CloningMode.Cloning)
            {
                target = Activator.CreateInstance <TEntity>();
                BaseTranslator.TranslateWithExceptions(entity, target, foreignKeys.Select(i => i.Name));
                entityPropsDefs.PrimaryKeysDefinition.Where(i => !i.IsPrimaryAndForeign && i.Type == typeof(Guid)).ForEach(i =>
                {
                    target.SetPropertyValue(i.Name, Guid.NewGuid());
                });
            }
            CloningDefinition();
            if (cloningMode == CloningMode.Cloning)
            {
                TranslateProperties(entity, target, foreignKeys.Select(i => i.Name).Except(affectedForeignKeys));
                beforeAddAction?.Invoke(target);
                this.entitySet.Add(target);
            }
            if (cloningMode == CloningMode.Cloning || cloningMode == CloningMode.TreeCreating)
            {
                unitOfWork.TranslationCloneCache.AddToCachedSet(source, target);
            }
            if (cloningMode == CloningMode.Deleting)
            {
                this.entitySet.Remove(source);
            }
            return(target);
        }
Пример #14
0
        public IList <PublishingAffectedResult> ChangeToModified <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity, List <PublishingStatus> onlyAllowedSourceState = null) where TEntityType : class, IVersionedVolume
        {
            var result = new List <PublishingAffectedResult>();

            if (onlyAllowedSourceState != null && !onlyAllowedSourceState.Select(i => PublishingStatuses[i]).Contains(entity.PublishingStatusId))
            {
                return(result);
            }
            var entitySet      = unitOfWork.GetSet <TEntityType>();
            var modifiedExists = entitySet.Any(i => i.UnificRootId == entity.UnificRootId && (i.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified] || i.PublishingStatusId == PublishingStatuses[PublishingStatus.Draft]));

            if (modifiedExists)
            {
                throw new InvalidOperationException();
            }
            var targetPublishingStatus = PublishingStatuses[PublishingStatus.Modified];

            result.Add(new PublishingAffectedResult()
            {
                Id = entity.Id, PublishingStatusOld = entity.PublishingStatusId, PublishingStatusNew = targetPublishingStatus
            });
            entity.PublishingStatus   = null;
            entity.PublishingStatusId = targetPublishingStatus;
            var versioningSet = unitOfWork.GetSet <Versioning>();

            if (entity.VersioningId != null && entity.Versioning == null)
            {
                entity.Versioning = versioningSet.FirstOrDefault(i => i.Id == entity.VersioningId);
            }
            var allVersions = GetAllVersions(unitOfWork, entity);
            var lastVersion = allVersions.LastOrDefault() ?? new VersionInfo()
            {
                EntityId = entity.Id, VersionMajor = 0, VersionMinor = 0
            };

            lastVersion.VersionMinor++;
            SetVersioning(entity, versioningSet, lastVersion, entity.Versioning?.PreviousVersionId);
            return(result);
        }
Пример #15
0
 public bool IsAllowedForEditing <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity) where TEntityType : class, IVersionedVolume
 {
     if (entity == null)
     {
         return(false);
     }
     if (entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Draft] || entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified] || !entity.UnificRootId.IsAssigned())
     {
         return(true);
     }
     if (entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Published] ||
         (entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Deleted]))
     {
         var latestStatus = GetLatestVersionPublishingStatus <TEntityType>(unitOfWork, entity.UnificRootId);
         var allVersions  = GetAllVersions <TEntityType>(unitOfWork, entity.UnificRootId);
         if (allVersions.Any(x => x.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified]))
         {
             return(false);
         }
         return(true);
     }
     return(false);
 }
 public ArticleRepository(ITranslationUnitOfWork _unitOfWork) : base(_unitOfWork)
 {
     this.unitOfWork = _unitOfWork;
 }
Пример #17
0
        IReadOnlyList <TTranslateTo> ITranslationViewModel.TranslateAll <TTranslateFrom, TTranslateTo>(IEnumerable <TTranslateFrom> model, ITranslationUnitOfWork unitOfWork)
        {
            var translator = resolveManager.Resolve <ITranslator <TTranslateTo, TTranslateFrom> >();

            if (languageId != null)
            {
                translator.SetLanguage(languageId.Value);
            }
            translator.UnitOfWork = unitOfWork;
            return(model.Select(i => translator.TranslateVmToEntity(i)).ToList());
        }
Пример #18
0
 /// <summary>
 /// Get last modified version of entity
 /// </summary>
 /// <typeparam name="TEntityType"></typeparam>
 /// <param name="unitOfWork">Unit Of Work must be provided for correct functionality</param>
 /// <param name="unificRootId">Entity unificrootId which version will be retrieved</param>
 /// <returns>Available modified version of specified entity</returns>
 public VersionInfo GetLastModifiedVersion <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid unificRootId) where TEntityType : class, IVersionedVolume
 {
     return(GetAllVersions <TEntityType>(unitOfWork, unificRootId).LastOrDefault(x => x.PublishingStatusId == PublishingStatuses[PublishingStatus.Draft] || x.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified]));
 }
Пример #19
0
        public bool IsAllowedForEditing <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid entityId) where TEntityType : class, IVersionedVolume
        {
            var entity = unitOfWork.GetSet <TEntityType>().FirstOrDefault(i => i.Id == entityId);

            return(IsAllowedForEditing(unitOfWork, entity));
        }
Пример #20
0
        /// <summary>
        /// Change publishing status of language version of specific entity which is of IMultilanguagedEntity type
        /// </summary>
        /// <typeparam name="T">Type of entity</typeparam>
        /// <typeparam name="TLang">Type of langauge version relation</typeparam>
        /// <param name="unitOfWork">Unit of work instance</param>
        /// <param name="entityId">Entity to change</param>
        /// <param name="languageAvailabilities">languages to change</param>
        public void ChangeStatusOfLanguageVersion <T, TLang>(ITranslationUnitOfWork unitOfWork, Guid entityId, IEnumerable <VmLanguageAvailabilityInfo> languageAvailabilities) where T : class, IEntityIdentifier, IMultilanguagedEntity <TLang>, new() where TLang : class, ILanguageAvailability
        {
            var entity = unitOfWork.GetSet <T>().Include(i => i.LanguageAvailabilities).FirstOrDefault(i => i.Id == entityId);

            ChangeStatusOfLanguageVersion <T, TLang>(unitOfWork, entity, languageAvailabilities);
        }
Пример #21
0
        private TranslationDefinitions <TIn, TOut> CreateDefinition <TIn, TOut, TInstantiate>(TIn entity,
                                                                                              ITranslationUnitOfWork unitofwork, TranslationDirection translationDirection, TOut predefinedTarget) where TIn : class where TOut : class
        {
            var languageId = requestLanguage ?? languageCache.Get(RequestLanguageCode);
            var definition = new TranslationDefinitions <TIn, TOut>(resolveManager, translationPrimitives, unitofwork, translationDirection, VersioningManager,
                                                                    typeof(TInstantiate), predefinedTarget, languageId, translationPolicies);

            definition.SetTnit(entity);
            var internalAssignement = definition as ITranslationDefinitionAccessor <TIn, TOut>;

            internalAssignement?.SetLanguageInternaly(languageId, languageIsSet);
            return(definition);
        }
Пример #22
0
        TTranslateTo ITranslationViewModel.Translate <TTranslateFrom, TTranslateTo>(TTranslateFrom viewModel, ITranslationUnitOfWork unitofWork)
        {
            var translator = resolveManager.Resolve <ITranslator <TTranslateTo, TTranslateFrom> >();

            if (languageId != null)
            {
                translator.SetLanguage(languageId.Value);
            }
            translator.UnitOfWork = unitofWork;
            return(translator.TranslateVmToEntity(viewModel));
        }
Пример #23
0
 /// <summary>
 /// Get and return all available versions of entity
 /// </summary>
 /// <typeparam name="TEntityType"></typeparam>
 /// <param name="unitOfWork">Unit Of Work must be provided for correct functionality</param>
 /// <param name="entity">Entity which versions will be retrieved</param>
 /// <returns>List of available versions of specified entity</returns>
 public List <VersionInfo> GetAllVersions <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity) where TEntityType : class, IVersionedVolume
 {
     return(entity?.VersioningId == null ? new List <VersionInfo>() : GetAllVersions <TEntityType>(unitOfWork, entity.UnificRootId));
 }
Пример #24
0
        /// <summary>
        /// Perform cloning (copying) of entity
        /// </summary>
        /// <typeparam name="T">Type of entity which will be cloned</typeparam>
        /// <param name="entity">Entity which will be cloned</param>
        /// <param name="unitOfWork">Unit of work instance for calling DB operations</param>
        /// <returns>Cloned entity</returns>
        public T CloneEntity <T>(T entity, ITranslationUnitOfWork unitOfWork) where T : class
        {
            var cloner = resolveManager.Resolve <IEntityCloner <T> >();

            return(cloner.PerformCloning(unitOfWork, entity, cloningMode: CloningMode.Cloning));
        }
Пример #25
0
        /// <summary>
        /// Create requested version of entity if it is needed. Status of entity is checked, if it is already Published, then entity is copied and marked as Modified.
        /// </summary>
        /// <typeparam name="TEntityType">Type of entity which will be checked and cloned if needed.</typeparam>
        /// <param name="unitOfWork">Instance of unit of work</param>
        /// <param name="entity">Entity which will be checked and cloned if needed.</param>
        /// <param name="versioningMode">Optional parameter how versionig should work, default is Standard mode, when Modified is created in case of update operation</param>
        /// <param name="targetStatus">target status of cloned entity</param>
        /// <returns></returns>
        public TEntityType CreateEntityVersion <TEntityType>(ITranslationUnitOfWork unitOfWork, TEntityType entity, VersioningMode versioningMode = VersioningMode.Standard, PublishingStatus?targetStatus = null) where TEntityType : class, IVersionedVolume, new()
        {
            if (entity == null)
            {
                return(null);
            }
            if (!AllowedToProcessVersioned(entity))
            {
                throw new Exception(CoreMessages.CannotProcessThisVersion);
            }
            var allVersions   = GetAllVersions(unitOfWork, entity);
            var versioningSet = unitOfWork.GetSet <Versioning>();
            var currentLatest = allVersions.LastOrDefault();

            if (currentLatest == null)
            {
                var publishingStatusDraftId = PublishingStatuses[PublishingStatus.Draft];
                if ((entity.PublishingStatusId == Guid.Empty) || (entity.PublishingStatusId == publishingStatusDraftId))
                {
                    entity.PublishingStatusId = publishingStatusDraftId;
                    currentLatest             = new VersionInfo()
                    {
                        VersionMajor = 0, VersionMinor = 1
                    };
                }
                else
                {
                    currentLatest = new VersionInfo()
                    {
                        VersionMajor = 1, VersionMinor = 0
                    };
                }
                return(SetVersioning(entity, versioningSet, currentLatest));
            }
            if (versioningMode == VersioningMode.UseTheLatest)
            {
                return(GetRelatedEntity(unitOfWork, entity, currentLatest));
            }
            if (versioningMode == VersioningMode.UseDraftOrPublishedOnly)
            {
                return(GetRelatedEntity(unitOfWork, entity, allVersions.LastOrDefault(i => i.PublishingStatusId == PublishingStatuses[PublishingStatus.Published] || i.PublishingStatusId == PublishingStatuses[PublishingStatus.Draft])));
            }
            if (versioningMode == VersioningMode.UsePublishedOnly)
            {
                return(GetRelatedEntity(unitOfWork, entity, allVersions.LastOrDefault(i => i.PublishingStatusId == PublishingStatuses[PublishingStatus.Published])));
            }

            var modifiedVersions = allVersions.Where(i => (i.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified]) || (i.PublishingStatusId == PublishingStatuses[PublishingStatus.Draft])).ToList();

            if (modifiedVersions.Any() && targetStatus == null)
            {
                var modifiedVersion = modifiedVersions.LastOrDefault(i => i.EntityId == entity.Id) ?? modifiedVersions.Last();
                currentLatest.VersionMinor++;
                var verInfo = versioningSet.First(i => i.Id == modifiedVersion.VersionId);
                verInfo.VersionMinor = currentLatest.VersionMinor;
                verInfo.VersionMajor = currentLatest.VersionMajor;
                return(GetRelatedEntity(unitOfWork, entity, modifiedVersion));
            }

            if (targetStatus == PublishingStatus.Published)
            {
                var pCloned = entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Modified] || entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Draft]
                    ? entity
                    : cloningManager.CloneEntity(entity, unitOfWork);

                currentLatest.VersionMajor++;
                currentLatest.VersionMinor = 0;
                entity.PublishingStatusId  = PublishingStatuses[PublishingStatus.OldPublished];
                SetVersioning(pCloned, versioningSet, currentLatest, entity.VersioningId, true);
                pCloned.PublishingStatusId = PublishingStatuses[targetStatus.Value];
                return(pCloned);
            }

            var previousVersionId = entity.VersioningId;
            var cloned            = cloningManager.CloneEntity(entity, unitOfWork);

            currentLatest.VersionMinor++;
            SetVersioning(cloned, versioningSet, currentLatest, previousVersionId, true);
            cloned.PublishingStatusId = PublishingStatuses[PublishingStatus.Modified];
            return(cloned);
        }
Пример #26
0
        public void DeleteEntity <T>(T entity, ITranslationUnitOfWork unitOfWork) where T : class
        {
            var cloner = resolveManager.Resolve <IEntityCloner <T> >();

            cloner.PerformCloning(unitOfWork, entity, cloningMode: CloningMode.Deleting);
        }
Пример #27
0
        public bool IsEntityArchived <TEntityType>(ITranslationUnitOfWork unitOfWork, Guid entityId) where TEntityType : class, IVersionedVolume
        {
            var entity = unitOfWork.GetSet <TEntityType>().FirstOrDefault(i => i.Id == entityId);

            return(entity.PublishingStatusId == PublishingStatuses[PublishingStatus.Deleted] || entity.PublishingStatusId == PublishingStatuses[PublishingStatus.OldPublished]);
        }