package deletedissue import ( "fmt" "github.com/google/go-github/v47/github" "edge-infra.dev/pkg/f8n/devinfra/jack/constants" guestservices "edge-infra.dev/pkg/f8n/devinfra/jack/guest_services" "edge-infra.dev/pkg/f8n/devinfra/jack/plugin" ) func init() { plugin.RegisterIssueHandler(constants.PluginDeletedIssues, handleIssue) } func handleIssue(hp plugin.HandlerParams, ce github.IssuesEvent) { hp.Log.WithName(constants.PluginDeletedIssues) switch action := ce.GetAction(); action { case "deleted": if err := deleteIssue(hp, ce); err != nil { hp.Log.Error(err, "Error in deleting issue") } } } func deleteIssue(hp plugin.HandlerParams, event github.IssuesEvent) error { client := hp.Client log := hp.Log issueBody := event.GetIssue().GetBody() issueTitle := event.GetIssue().GetTitle() issueNumber := event.GetIssue().GetNumber() issueCommenter := event.GetSender().GetLogin() repoName := event.GetRepo().GetName() repoOwner := event.GetRepo().GetOwner().GetLogin() repoID := event.GetRepo().GetID() log.Info(fmt.Sprintf("Deleting issue %v", issueNumber)) sender := guestservices.ParentChild{} sender.New(issueBody, event.GetIssue().Labels, constants.Preamble, constants.Postamble, repoID) listToRemove := append(sender.List.Parent, sender.List.Child...) // If the list is empty exit if len(listToRemove) == 0 { return nil } // Go through each issue tracked by jackbot and remove the deleted issue from their list // Leave a comment on each issue that the issue was deleted for _, toRemove := range listToRemove { // Get the linked issue foundParent, _, err := client.Issues().Get(hp.Ctx, repoOwner, repoName, toRemove.Number) if err != nil { log.Error(err, "Failed to get issues") continue } receiver := guestservices.ParentChild{} receiver.New(foundParent.GetBody(), foundParent.Labels, constants.Preamble, constants.Postamble, repoID) receiver.Remove(issueNumber, repoID) receiverBody := receiver.ToString() parentNumber := foundParent.GetNumber() log.Info(fmt.Sprintf("Removing %v from %v", issueNumber, parentNumber)) // Use the edited body to update the issue githubIssueBody := &github.IssueRequest{Body: github.String(receiverBody)} _, _, err = client.Issues().Edit(hp.Ctx, repoOwner, repoName, parentNumber, githubIssueBody) if err != nil { log.Error(err, "Failed to update issue desc") continue } // Create the comment msg := fmt.Sprintf("```#%d - %s``` was deleted by @%s and has been removed from this issue.", issueNumber, issueTitle, issueCommenter) prComment := github.IssueComment{ Body: &msg, } // Add a new comment from jackbot that a linked issue was deleted if _, _, err := client.Issues().CreateComment(hp.Ctx, repoOwner, repoName, parentNumber, &prComment); err != nil { log.Error(err, "Failed to comment on pull request") return err } } return nil }