Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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);
        }