74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"code.gitea.io/gitea/modules/structs"
|
|
"code.gitea.io/sdk/gitea"
|
|
"encoding/json"
|
|
"git.lumeweb.com/LumeWeb/gitea-github-proxy/config"
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
"net/http"
|
|
)
|
|
|
|
type webhookApi struct {
|
|
config *config.Config
|
|
logger *zap.Logger
|
|
db *gorm.DB
|
|
whm *WebhookManager
|
|
}
|
|
|
|
func newWebhookApi(cfg *config.Config, db *gorm.DB, logger *zap.Logger, whm *WebhookManager) *webhookApi {
|
|
return &webhookApi{config: cfg, db: db, logger: logger, whm: whm}
|
|
}
|
|
|
|
func (a *webhookApi) handlePullRequest(w http.ResponseWriter, r *http.Request) {
|
|
webhook := a.getWebhookData(w, r)
|
|
|
|
payload := &structs.PullRequestPayload{}
|
|
|
|
err := json.Unmarshal(webhook, payload)
|
|
if a.unmarshallError(w, err) {
|
|
return
|
|
}
|
|
|
|
a.whm.HandlePullRequest(payload, r)
|
|
}
|
|
|
|
func setupWebhookRoutes(params RouteParams) {
|
|
cfg := params.Config
|
|
db := params.Db
|
|
logger := params.Logger
|
|
r := params.R
|
|
whm := params.WebhookManager
|
|
|
|
webhookApi := newWebhookApi(cfg, db, logger, whm)
|
|
webhookRouter := r.PathPrefix("/api").Subrouter()
|
|
|
|
webhookRouter.Use(gitea.VerifyWebhookSignatureMiddleware(cfg.GiteaWebHookSecret))
|
|
webhookRouter.Use(storeWebhookDataMiddleware(logger))
|
|
|
|
webhookRouter.HandleFunc("/webhooks/pull_request", webhookApi.handlePullRequest).Methods("POST")
|
|
}
|
|
|
|
func (a *webhookApi) getWebhookData(w http.ResponseWriter, r *http.Request) []byte {
|
|
return getWebhookData(r, a.logger)
|
|
}
|
|
|
|
func (a *webhookApi) unmarshallError(w http.ResponseWriter, err error) bool {
|
|
if err != nil {
|
|
a.logger.Error("Failed to unmarshal webhook data", zap.Error(err))
|
|
http.Error(w, "Failed to unmarshal webhook data", http.StatusInternalServerError)
|
|
}
|
|
|
|
return err != nil
|
|
}
|
|
func getWebhookData(r *http.Request, logger *zap.Logger) []byte {
|
|
webhook := r.Context().Value(WEBHOOK_CONTEXT_KEY)
|
|
webhookData, ok := webhook.([]byte)
|
|
if !ok {
|
|
logger.Fatal("Failed to get webhook data from context")
|
|
}
|
|
|
|
return webhookData
|
|
}
|