public PlanDTO CrateTemplate(Guid planId, string userId) { PlanDO clonedPlan; using (var uow = _unitOfWorkFactory.Create()) { var plan = _planService.GetPlanByActivityId(uow, planId); clonedPlan = (PlanDO)PlanTreeHelper.CloneWithStructure(plan); } clonedPlan.PlanState = PlanState.Inactive; //linearlize tree structure var planTree = clonedPlan.GetDescendants(); var idsMap = new Dictionary <Guid, Guid>(); foreach (var planNodeDO in planTree) { var oldId = planNodeDO.Id; planNodeDO.Id = Guid.NewGuid(); planNodeDO.Fr8Account = null; planNodeDO.Fr8AccountId = null; var activity = planNodeDO as ActivityDO; if (activity != null) { activity.AuthorizationToken = null; } idsMap.Add(oldId, planNodeDO.Id); } foreach (var activity in planTree.OfType <ActivityDO>()) { activity.CrateStorage = _crateManager.EmptyStorageAsStr(); // UpdateCrateStorage(activity.CrateStorage, idsMap); } return(PlanMappingHelper.MapPlanToDto(clonedPlan)); }
public PlanDO Clone(Guid planId) { using (var uow = ObjectFactory.GetInstance <IUnitOfWork>()) { var currentUser = _security.GetCurrentAccount(uow); var targetPlan = (PlanDO)GetPlanByActivityId(uow, planId); if (targetPlan == null) { return(null); } var cloneTag = "Cloned From " + planId; //we should clone this plan for current user //let's clone the plan entirely var clonedPlan = (PlanDO)PlanTreeHelper.CloneWithStructure(targetPlan); clonedPlan.Description = clonedPlan.Name + " - " + "Customized for User " + currentUser.UserName + " on " + DateTime.Now; clonedPlan.PlanState = PlanState.Inactive; clonedPlan.Tag = cloneTag; clonedPlan.IsApp = false; // we don't want apps to duplicate when launching clonedPlan.AppLaunchURL = null; //linearlize tree structure var planTree = clonedPlan.GetDescendantsOrdered(); //let's replace old id's of cloned plan with new id's //and update account information //TODO maybe we should do something about authorization tokens too? Dictionary <Guid, PlanNodeDO> parentMap = new Dictionary <Guid, PlanNodeDO>(); foreach (var planNodeDO in planTree) { var oldId = planNodeDO.Id; planNodeDO.Id = Guid.NewGuid(); planNodeDO.Fr8Account = currentUser; //if (planNodeDO is ActivityDO) //{ // (planNodeDO as ActivityDO).AuthorizationTokenId = null; //} parentMap.Add(oldId, planNodeDO); planNodeDO.ChildNodes = new List <PlanNodeDO>(); if (planNodeDO.ParentPlanNodeId != null) { PlanNodeDO newParent; //find parent from old parent id map if (parentMap.TryGetValue(planNodeDO.ParentPlanNodeId.Value, out newParent)) { //replace parent id with parent's new id planNodeDO.ParentPlanNodeId = newParent.Id; newParent.ChildNodes.Add(planNodeDO); } else { //this should never happen throw new Exception("Unable to clone plan"); } } else { //this should be a plan because it has null ParentId uow.PlanRepository.Add(planNodeDO as PlanDO); } } //lets update all existing ids in crateStorages of new activities //there might be some fields or crates published with sourceActivityId foreach (var idMap in parentMap) { foreach (var planNodeDO in planTree) { var activity = planNodeDO as ActivityDO; if (activity == null) { continue; } var oldId = idMap.Key.ToString(); var newId = idMap.Value.Id.ToString(); activity.CrateStorage = activity.CrateStorage.Replace(oldId, newId); } } //save new cloned plan uow.SaveChanges(); return(clonedPlan); } }