...

Source file src/edge-infra.dev/pkg/f8n/devinfra/jack/plugin/deleted_issue/handler.go

Documentation: edge-infra.dev/pkg/f8n/devinfra/jack/plugin/deleted_issue

     1  package deletedissue
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/google/go-github/v47/github"
     7  
     8  	"edge-infra.dev/pkg/f8n/devinfra/jack/constants"
     9  	guestservices "edge-infra.dev/pkg/f8n/devinfra/jack/guest_services"
    10  
    11  	"edge-infra.dev/pkg/f8n/devinfra/jack/plugin"
    12  )
    13  
    14  func init() {
    15  	plugin.RegisterIssueHandler(constants.PluginDeletedIssues, handleIssue)
    16  }
    17  
    18  func handleIssue(hp plugin.HandlerParams, ce github.IssuesEvent) {
    19  	hp.Log.WithName(constants.PluginDeletedIssues)
    20  
    21  	switch action := ce.GetAction(); action {
    22  	case "deleted":
    23  		if err := deleteIssue(hp, ce); err != nil {
    24  			hp.Log.Error(err, "Error in deleting issue")
    25  		}
    26  	}
    27  }
    28  
    29  func deleteIssue(hp plugin.HandlerParams, event github.IssuesEvent) error {
    30  	client := hp.Client
    31  	log := hp.Log
    32  
    33  	issueBody := event.GetIssue().GetBody()
    34  	issueTitle := event.GetIssue().GetTitle()
    35  	issueNumber := event.GetIssue().GetNumber()
    36  	issueCommenter := event.GetSender().GetLogin()
    37  	repoName := event.GetRepo().GetName()
    38  	repoOwner := event.GetRepo().GetOwner().GetLogin()
    39  	repoID := event.GetRepo().GetID()
    40  
    41  	log.Info(fmt.Sprintf("Deleting issue %v", issueNumber))
    42  
    43  	sender := guestservices.ParentChild{}
    44  	sender.New(issueBody, event.GetIssue().Labels, constants.Preamble, constants.Postamble, repoID)
    45  
    46  	listToRemove := append(sender.List.Parent, sender.List.Child...)
    47  
    48  	// If the list is empty exit
    49  	if len(listToRemove) == 0 {
    50  		return nil
    51  	}
    52  
    53  	// Go through each issue tracked by jackbot and remove the deleted issue from their list
    54  	// Leave a comment on each issue that the issue was deleted
    55  	for _, toRemove := range listToRemove {
    56  		// Get the linked issue
    57  		foundParent, _, err := client.Issues().Get(hp.Ctx, repoOwner, repoName, toRemove.Number)
    58  		if err != nil {
    59  			log.Error(err, "Failed to get issues")
    60  			continue
    61  		}
    62  
    63  		receiver := guestservices.ParentChild{}
    64  		receiver.New(foundParent.GetBody(), foundParent.Labels, constants.Preamble, constants.Postamble, repoID)
    65  
    66  		receiver.Remove(issueNumber, repoID)
    67  		receiverBody := receiver.ToString()
    68  		parentNumber := foundParent.GetNumber()
    69  
    70  		log.Info(fmt.Sprintf("Removing %v from %v", issueNumber, parentNumber))
    71  
    72  		// Use the edited body to update the issue
    73  		githubIssueBody := &github.IssueRequest{Body: github.String(receiverBody)}
    74  		_, _, err = client.Issues().Edit(hp.Ctx, repoOwner, repoName, parentNumber, githubIssueBody)
    75  		if err != nil {
    76  			log.Error(err, "Failed to update issue desc")
    77  			continue
    78  		}
    79  
    80  		// Create the comment
    81  		msg := fmt.Sprintf("```#%d - %s``` was deleted by @%s and has been removed from this issue.", issueNumber, issueTitle, issueCommenter)
    82  		prComment := github.IssueComment{
    83  			Body: &msg,
    84  		}
    85  
    86  		// Add a new comment from jackbot that a linked issue was deleted
    87  		if _, _, err := client.Issues().CreateComment(hp.Ctx, repoOwner, repoName, parentNumber, &prComment); err != nil {
    88  			log.Error(err, "Failed to comment on pull request")
    89  			return err
    90  		}
    91  	}
    92  
    93  	return nil
    94  }
    95  

View as plain text