MCPcopy Create free account
hub / github.com/bytebase/bytebase / RejectIssue

Method RejectIssue

backend/api/v1/issue_service.go:688–795  ·  view source on GitHub ↗

RejectIssue rejects a issue.

(ctx context.Context, req *connect.Request[v1pb.RejectIssueRequest])

Source from the content-addressed store, hash-verified

686
687// RejectIssue rejects a issue.
688func (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 {

Callers

nothing calls this directly

Calls 15

getIssueMessageMethod · 0.95
isUserReviewerMethod · 0.95
convertToIssueMethod · 0.95
FindRejectedRoleFunction · 0.92
FindNextPendingRoleFunction · 0.92
FormatUserEmailFunction · 0.92
BBErrorFunction · 0.92
NewProjectFunction · 0.92
NewIssueFunction · 0.92
GetUserFromContextFunction · 0.85
ErrorfMethod · 0.80

Tested by

no test coverage detected