package common /* * This file is part of Autogits. * * Copyright © 2024 SUSE LLC * * Autogits is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 2 of the License, or (at your option) any later * version. * * Autogits is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Foobar. If not, see . */ import ( "fmt" "runtime/debug" "slices" "strings" ) const RequestType_CreateBrachTag = "create" const RequestType_DeleteBranchTag = "delete" const RequestType_Fork = "fork" const RequestType_Issue = "issues" const RequestType_IssueAssign = "issue_assign" const RequestType_IssueComment = "issue_comment" const RequestType_IssueLabel = "issue_label" const RequestType_IssueMilestone = "issue_milestone" const RequestType_Push = "push" const RequestType_Repository = "repository" const RequestType_Release = "release" const RequestType_PR = "pull_request" const RequestType_PRAssign = "pull_request_assign" const RequestType_PRLabel = "pull_request_label" const RequestType_PRComment = "pull_request_comment" const RequestType_PRMilestone = "pull_request_milestone" const RequestType_PRSync = "pull_request_sync" const RequestType_PRReviewAccepted = "pull_request_review_approved" const RequestType_PRReviewRejected = "pull_request_review_rejected" const RequestType_PRReviewRequest = "pull_request_review_request" const RequestType_PRReviewComment = "pull_request_review_comment" const RequestType_Wiki = "wiki" type RequestProcessor interface { ProcessFunc(*Request) error } type RabbitMQGiteaEventsProcessor struct { Handlers map[string]RequestProcessor Orgs []string c *RabbitConnection } func (gitea *RabbitMQGiteaEventsProcessor) Connection() *RabbitConnection { if gitea.c == nil { gitea.c = &RabbitConnection{} } return gitea.c } func (gitea *RabbitMQGiteaEventsProcessor) GenerateTopics() []string { topics := make([]string, 0, len(gitea.Handlers)*len(gitea.Orgs)) scope := "suse" if gitea.c.RabbitURL.Hostname() == "rabbit.opensuse.org" { scope = "opensuse" } for _, org := range gitea.Orgs { for requestType, _ := range gitea.Handlers { topics = append(topics, fmt.Sprintf("%s.src.%s.%s.#", scope, org, requestType)) } } slices.Sort(topics) return slices.Compact(topics) } func (gitea *RabbitMQGiteaEventsProcessor) ProcessRabbitMessage(msg RabbitMessage) error { route := strings.Split(msg.RoutingKey, ".") if len(route) > 3 { reqType := route[3] org := route[2] if !slices.Contains(gitea.Orgs, org) { LogInfo("Got event for unhandeled org:", org) return nil } LogDebug("org:", org, "type:", reqType) if handler, found := gitea.Handlers[reqType]; found { req, err := ParseRequestJSON(reqType, msg.Body) if err != nil { LogError("Error parsing request JSON:", err) return nil } else { LogDebug("processing req", req.Type) // h.Request = req ProcessEvent(handler, req) } } } return fmt.Errorf("Invalid routing key: %s", route) } func ProcessEvent(f RequestProcessor, request *Request) { defer func() { if r := recover(); r != nil { LogError("panic caught") if err, ok := r.(error); !ok { LogError(err) } LogError(string(debug.Stack())) } }() if err := f.ProcessFunc(request); err != nil { LogError(err) } }