public bool ChangeState(IssueServiceMemberDTO issueMemberDto) { if(issueMemberDto == null) throw new ArgumentNullException("issueMemberDto"); // // Os admins podem mudar o estado de qualquer Issue, desde // que não esteja terminado Member dbAdmin = GetDbAdmin(); Issue dbIssue = _db.Query<Issue>().GetByIdIncludeAll(issueMemberDto.IssueId); // // Seguro realizar acção if (dbIssue.State == (int)StateEnum.Terminated) return false; if (dbIssue.Member != null) { dbIssue.UpdateDomainObjectFromDTO(issueMemberDto); if (issueMemberDto.State == StateEnum.Waiting) { // Caso isto aconteça então o membro a realizar a acção é o membro que aceitou o pedido dbIssue.Member = null; _notificator.NotifyClientAboutInWaitStateAgain(IssueMembersCommon.BuildNotificatorForIssue(dbIssue, dbAdmin)); } else{ dbIssue.Member = dbAdmin; if (issueMemberDto.State == StateEnum.Terminated) { _notificator.NotifyClientAboutTerminateRequest(IssueMembersCommon.BuildNotificatorForIssue(dbIssue, dbAdmin)); } } } else { dbIssue.Member = dbAdmin; dbIssue.UpdateDomainObjectFromDTO(issueMemberDto); var notificatorDto = IssueMembersCommon.BuildNotificatorForIssue(dbIssue, dbAdmin); if (issueMemberDto.State == StateEnum.InResolution) { _notificator.NotifyMembersThatRequestWasAcceptedByAnotherMember(notificatorDto); _notificator.NotifyClientAboutAcceptedRequest(notificatorDto); } if (issueMemberDto.State == StateEnum.Terminated) { _notificator.NotifyClientAboutTerminateRequest(notificatorDto); } } return true; }
public bool ChangeState(IssueServiceMemberDTO issueMemberDto) { if (issueMemberDto == null) throw new ArgumentNullException("issueMemberDto"); // // Os membros podem mudar o estado de qualquer issue desde que: // Estejam associados ao projecto desse issue e que se o estado ja foi alterado // por um membro, ele seja esse membro, ou que o issue nao esteja terminado. Member dbMember = GetDbMember(); Issue dbIssue = _db.Query<Issue>().GetByIdIncludeAll(issueMemberDto.IssueId); // verificar se sou responsavel ou worker no projecto que recebo no Dto bool iAmReponsableOrWorkingOnThisProject = _db.Query<Member>() .IsThisMemberActiveOnProject( dbMember.UserID, dbIssue.Project.ProjectID ); if (!iAmReponsableOrWorkingOnThisProject) throw new HijackedException("You are not assigned to the project of this issue"); // // O membro pertence ao projecto em questão.. if (dbIssue.State == (int)StateEnum.Terminated) return false; if (dbIssue.Member != null) { // Se estamos aqui então já foi atribuido um membro // e so o mebro associado pode mudar o estado if (dbIssue.Member.UserID != dbMember.UserID) { throw new IssueWasAlreadyTakedByAnotherMember(dbIssue.Member.Name); // Retorna o nome do membro que esta a resolver o issue } dbIssue.UpdateDomainObjectFromDTO(issueMemberDto); if (issueMemberDto.State == StateEnum.Waiting) { // Caso isto aconteça então o membro a realizar a acção é o membro que aceitou o pedido dbIssue.Member = null; _notificator.NotifyClientAboutInWaitStateAgain(IssueMembersCommon.BuildNotificatorForIssue(dbIssue, dbMember)); } else{ if(issueMemberDto.State == StateEnum.Terminated){ _notificator.NotifyClientAboutTerminateRequest(IssueMembersCommon.BuildNotificatorForIssue(dbIssue, dbMember)); } } } else { dbIssue.Member = dbMember; dbIssue.UpdateDomainObjectFromDTO(issueMemberDto); var notificatorDto = IssueMembersCommon.BuildNotificatorForIssue(dbIssue, dbMember); if (issueMemberDto.State == StateEnum.InResolution) { _notificator.NotifyMembersThatRequestWasAcceptedByAnotherMember(notificatorDto); _notificator.NotifyClientAboutAcceptedRequest(notificatorDto); } if (issueMemberDto.State == StateEnum.Terminated) { _notificator.NotifyClientAboutTerminateRequest(notificatorDto); } } return true; }
public ActionResult Edit(int id, FormCollection collection) { // // Não posso usar modelbinder devido a só depois de saber a role à // qual estou associado posso construir o objecto DTO if (User.IsInRole(LoginService.Admin)) { // // Criar objecto membro dto com os dados do Form IssueServiceMemberDTO memberDto = new IssueServiceMemberDTO(); UpdateModel(memberDto); memberDto.IssueId = id; // Obter e invocar changeState no serviço IIssueAdminService adminService = ObjectsManager.GetInstance<IIssueAdminService>(); // Verificar erros de negocio if (!adminService.ChangeState(memberDto)) { // Se estamos aqui então o estado do issue está terminado e nao pode ser alterado ModelState.AddModelError(string.Empty, "This issue is already terminated"); return RedirectToAction("Edit", new { id }); } } if (User.IsInRole(LoginService.Member)) { // // Criar objecto dto com os dados do Form IssueServiceMemberDTO memberDto = new IssueServiceMemberDTO(); UpdateModel(memberDto); memberDto.IssueId = id; // Obter e invocar changeState no serviço IIssueMemberService memberService = ObjectsManager.GetInstance<IIssueMemberService>(); // Verificar erros de negocio try { if(!memberService.ChangeState(memberDto)){ // Se estamos aqui então o estado do issue está terminado e nao pode ser alterado ModelState.AddModelError(string.Empty, "This issue is already terminated"); return RedirectToAction("Edit", new { id }); } } catch (IssueWasAlreadyTakedByAnotherMember ex) { // Se estamos aqui então o issue ja foi aceite por outro membro ModelState.AddModelError(string.Empty, string.Format("This issue is in resolution by {0}", ex.Message)); return RedirectToAction("Edit", new { id }); } } if (User.IsInRole(LoginService.Client)) { // // Criar objecto dto com os dados do Form IssueServiceClientDTO clientDto = new IssueServiceClientDTO(); if (!TryUpdateModel(clientDto)){ // Verificar erros no modelo return RedirectToAction("Edit", new { id }); } clientDto.IssueId = id; // Obter e invocar update no serviço IIssueClientService clientService = ObjectsManager.GetInstance<IIssueClientService>(); try { // Verificar erros de negocio if (!clientService.Update(clientDto)) { // Se estamos aqui então o estado do issue está terminado e nao pode ser alterado ModelState.AddModelError(string.Empty, "This issue is already terminated"); return RedirectToAction("Edit", new { id }); } } catch (ProjectDisabledException ex) { ModelState.AddModelError(string.Empty, "This project is currently disabled. You cannot update the issue"); return RedirectToAction("Edit", new { id }); } } // Sucesso ViewBag.Who = "Existing Issue"; return View("CUD", ActionEnum.Edited); }