public void Handle(CreateClassDiagramNewVersionCommand command)
        {
            var queryResult   = _specificationItemWithClassDiagramsQueryHandler.Handle(command.Id.Value);
            var latestVersion = queryResult.ClassDiagrams.FirstOrDefault(s => s.IsLastVersion);

            foreach (var oldRequirementVersion in queryResult.ClassDiagrams)
            {
                oldRequirementVersion.IsLastVersion = false;
            }

            var package = _packageRepository.Get(command.PackageId.Value);

            if (!package.Active)
            {
                throw new Exception(Sentences.thisPackageWasRemoved);
            }

            var classDiagram = new ClassDiagram();

            classDiagram.Id = command.Id.Value;
            classDiagram.SpecificationItem = queryResult.SpecificationItem;
            classDiagram.ProjectId         = latestVersion.ProjectId;
            classDiagram.Version           = latestVersion.Version + 1;
            classDiagram.IsLastVersion     = true;
            classDiagram.Identifier        = latestVersion.Identifier;

            _classDiagramItemsPersister.Persist(classDiagram, command);

            var oldToNewClassesIds = new Dictionary <Guid, Guid>();

            foreach (var classEntity in classDiagram.Classes)
            {
                var oldId = classEntity.Id;
                var newId = Guid.NewGuid();
                classEntity.Id            = newId;
                oldToNewClassesIds[oldId] = newId;
            }

            foreach (var relation in classDiagram.Relationships)
            {
                relation.SourceId = oldToNewClassesIds[relation.SourceId];
                relation.TargetId = oldToNewClassesIds[relation.TargetId];
            }

            _classDiagramRepository.Add(classDiagram);
        }
        public void Handle(CreateClassDiagramCommand command)
        {
            var id = Guid.NewGuid();

            var projectId = _currentProjectContextId.Get();

            if (projectId == null)
            {
                throw new Exception(Sentences.noProjectInContext);
            }

            var package = _packageRepository.Get(command.PackageId.Value);

            if (!package.Active)
            {
                throw new Exception(Sentences.thisPackageWasRemoved);
            }

            var nextId = _classDiagramNextIdQueryHandler.Handle(projectId.Value);

            var specificationItem = new SpecificationItem();

            specificationItem.Id        = id;
            specificationItem.Active    = true;
            specificationItem.Type      = SpecificationItemType.ClassDiagram;
            specificationItem.PackageId = command.PackageId.Value;
            specificationItem.Label     = $"CD{nextId}";

            var classDiagram = new ClassDiagram();

            classDiagram.Id = id;
            classDiagram.SpecificationItem = specificationItem;
            classDiagram.ProjectId         = projectId.Value;
            classDiagram.Version           = 1;
            classDiagram.IsLastVersion     = true;
            classDiagram.Identifier        = nextId;

            _classDiagramItemsPersister.Persist(classDiagram, command);

            _classDiagramRepository.Add(classDiagram);
            _specifiationItemRepository.Add(specificationItem);
        }