RejectIssue rejects a issue.
(ctx context.Context, req *connect.Request[v1pb.RejectIssueRequest])
| 686 | |
| 687 | // RejectIssue rejects a issue. |
| 688 | func (s *IssueService) RejectIssue(ctx context.Context, req *connect.Request[v1pb.RejectIssueRequest]) (*connect.Response[v1pb.Issue], error) { |
| 689 | issue, err := s.getIssueMessage(ctx, req.Msg.Name) |
| 690 | if err != nil { |
| 691 | return nil, err |
| 692 | } |
| 693 | project, err := s.store.GetProject(ctx, &store.FindProjectMessage{Workspace: common.GetWorkspaceIDFromContext(ctx), ResourceID: &issue.ProjectID}) |
| 694 | if err != nil { |
| 695 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get project")) |
| 696 | } |
| 697 | if project == nil { |
| 698 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("project %s not found", issue.ProjectID)) |
| 699 | } |
| 700 | payload := issue.Payload |
| 701 | if payload.Approval == nil { |
| 702 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("issue payload approval is nil")) |
| 703 | } |
| 704 | if !payload.Approval.ApprovalFindingDone { |
| 705 | return nil, connect.NewError(connect.CodeFailedPrecondition, errors.Errorf("approval template finding is not done")) |
| 706 | } |
| 707 | if payload.Approval.ApprovalTemplate == nil { |
| 708 | return nil, connect.NewError(connect.CodeInternal, errors.New("approval template is required")) |
| 709 | } |
| 710 | |
| 711 | rejectedRole := utils.FindRejectedRole(payload.Approval) |
| 712 | if rejectedRole != "" { |
| 713 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("cannot reject because the issue has been rejected")) |
| 714 | } |
| 715 | |
| 716 | role := utils.FindNextPendingRole(payload.Approval) |
| 717 | if role == "" { |
| 718 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("the issue has been approved")) |
| 719 | } |
| 720 | |
| 721 | user, ok := GetUserFromContext(ctx) |
| 722 | if !ok { |
| 723 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found")) |
| 724 | } |
| 725 | |
| 726 | canApprove := s.isUserReviewer(ctx, issue, role, user) |
| 727 | if !canApprove { |
| 728 | return nil, connect.NewError(connect.CodePermissionDenied, errors.Errorf("cannot reject because the user does not have the required permission")) |
| 729 | } |
| 730 | |
| 731 | if !project.Setting.GetAllowSelfApproval() && issue.CreatorEmail == user.Email { |
| 732 | return nil, connect.NewError(connect.CodePermissionDenied, errors.Errorf("cannot reject because self-approval is not allowed for this project")) |
| 733 | } |
| 734 | |
| 735 | payload.Approval.Approvers = append(payload.Approval.Approvers, &storepb.IssuePayloadApproval_Approver{ |
| 736 | Status: storepb.IssuePayloadApproval_Approver_REJECTED, |
| 737 | Principal: common.FormatUserEmail(user.Email), |
| 738 | }) |
| 739 | |
| 740 | issue, err = s.store.UpdateIssue(ctx, issue.ProjectID, issue.UID, &store.UpdateIssueMessage{ |
| 741 | PayloadUpsert: &storepb.Issue{ |
| 742 | Approval: payload.Approval, |
| 743 | }, |
| 744 | }) |
| 745 | if err != nil { |
nothing calls this directly
no test coverage detected