public Task SaveOrUpdate(Task task, IEnumerable <int> attachedFileIds, bool notifyResponsible, bool isImport) { if (task == null) { throw new ArgumentNullException("task"); } if (task.Project == null) { throw new Exception("task.Project"); } // check guests responsibles foreach (var responsible in task.Responsibles) { if (ProjectSecurity.IsVisitor(responsible)) { ProjectSecurity.CreateGuestSecurityException(); } } var milestone = task.Milestone != 0 ? milestoneDao.GetById(task.Milestone) : null; var milestoneResponsible = milestone != null ? milestone.Responsible : Guid.Empty; var removeResponsibles = new List <Guid>(); var inviteToResponsibles = new List <Guid>(); task.LastModifiedBy = SecurityContext.CurrentAccount.ID; task.LastModifiedOn = TenantUtil.DateTimeNow(); var isNew = task.ID == default(int); //Task is new if (isNew) { if (task.CreateBy == default(Guid)) { task.CreateBy = SecurityContext.CurrentAccount.ID; } if (task.CreateOn == default(DateTime)) { task.CreateOn = TenantUtil.DateTimeNow(); } ProjectSecurity.DemandCreateTask(task.Project); task = taskDao.Save(task); inviteToResponsibles.AddRange(task.Responsibles.Distinct()); } else { var oldTask = GetByID(new[] { task.ID }).FirstOrDefault(); if (oldTask == null) { throw new ArgumentNullException("task"); } var newResponsibles = task.Responsibles.Distinct().ToList(); var oldResponsibles = oldTask.Responsibles.Distinct().ToList(); removeResponsibles.AddRange(oldResponsibles.Where(p => !newResponsibles.Contains(p))); inviteToResponsibles.AddRange(newResponsibles.Where(participant => !oldResponsibles.Contains(participant))); //changed task ProjectSecurity.DemandEdit(oldTask); task = taskDao.Save(task); } if (attachedFileIds != null && attachedFileIds.Any()) { foreach (var attachedFileId in attachedFileIds) { AttachFile(task, attachedFileId, false); } } var senders = new HashSet <Guid>(task.Responsibles) { task.Project.Responsible, milestoneResponsible, task.CreateBy }; senders.Remove(Guid.Empty); foreach (var subscriber in senders) { Subscribe(task, subscriber); } inviteToResponsibles.RemoveAll(r => r.Equals(Guid.Empty)); removeResponsibles.RemoveAll(r => r.Equals(Guid.Empty)); NotifyTask(task, inviteToResponsibles, removeResponsibles, isNew, notifyResponsible); return(task); }
public Task SaveOrUpdate(Task task, IEnumerable <int> attachedFileIds, bool notifyResponsible, bool isImport) { if (task == null) { throw new ArgumentNullException("task"); } if (task.Project == null) { throw new Exception("task.Project"); } var milestone = task.Milestone != 0 ? _milestoneDao.GetById(task.Milestone) : null; var milestoneResponsible = milestone != null ? milestone.Responsible : Guid.Empty; task.LastModifiedBy = SecurityContext.CurrentAccount.ID; task.LastModifiedOn = TenantUtil.DateTimeNow(); var isNew = task.ID == default(int); //Task is new if (isNew) { if (task.CreateBy == default(Guid)) { task.CreateBy = SecurityContext.CurrentAccount.ID; } if (task.CreateOn == default(DateTime)) { task.CreateOn = TenantUtil.DateTimeNow(); } ProjectSecurity.DemandCreateTask(task.Project); task = _taskDao.Save(task); TimeLinePublisher.Task(task, milestone, isImport ? EngineResource.ActionText_Imported : EngineResource.ActionText_Create, UserActivityConstants.ContentActionType, UserActivityConstants.NormalContent, true); } else { //changed task ProjectSecurity.DemandEdit(GetByID(new[] { task.ID }).FirstOrDefault()); task = _taskDao.Save(task); TimeLinePublisher.Task(task, milestone, EngineResource.ActionText_Update, UserActivityConstants.ActivityActionType, UserActivityConstants.NormalActivity); } if (attachedFileIds != null && attachedFileIds.Count() > 0) { foreach (var attachedFileId in attachedFileIds) { _fileEngine.AttachFileToTask(task.ID, attachedFileId); } } //Object id for sender var objectID = task.UniqID + "_" + task.Project.ID; var senders = new HashSet <Guid>(task.Responsibles) { task.Project.Responsible, milestoneResponsible, task.CreateBy, task.Responsible }; senders.Remove(Guid.Empty); var subscriptionProvider = NotifySource.Instance.GetSubscriptionProvider(); var recipientsProvider = NotifySource.Instance.GetRecipientsProvider(); var recipients = senders .Select(r => recipientsProvider.GetRecipient(r.ToString())) .Where(r => r != null && !IsUnsubscribedToTask(task, r.ID)) .ToList(); foreach (var recipient in recipients) { subscriptionProvider.Subscribe(NotifyConstants.Event_NewCommentForTask, objectID, recipient); } recipients.RemoveAll(r => r.ID == SecurityContext.CurrentAccount.ID.ToString()); if (isNew) { NotifyTaskCreated(task, recipients, milestoneResponsible, notifyResponsible); } else { NotifyTaskEdited(task, notifyResponsible); } return(task); }