2021-10-10 16:18:14 +02:00
|
|
|
package api
|
2021-10-10 15:58:03 +02:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
|
2021-10-10 16:28:59 +02:00
|
|
|
giteaSdk "gitea-sonarqube-pr-bot/internal/clients/gitea"
|
2021-10-10 16:43:37 +02:00
|
|
|
sqSdk "gitea-sonarqube-pr-bot/internal/clients/sonarqube"
|
2022-05-21 19:03:56 +02:00
|
|
|
"gitea-sonarqube-pr-bot/internal/settings"
|
2021-10-10 15:58:03 +02:00
|
|
|
webhook "gitea-sonarqube-pr-bot/internal/webhooks/gitea"
|
|
|
|
)
|
|
|
|
|
2022-05-21 18:21:05 +02:00
|
|
|
type GiteaWebhookHandlerInferface interface {
|
|
|
|
HandleSynchronize(rw http.ResponseWriter, r *http.Request)
|
|
|
|
HandleComment(rw http.ResponseWriter, r *http.Request)
|
|
|
|
}
|
|
|
|
|
2021-10-10 15:58:03 +02:00
|
|
|
type GiteaWebhookHandler struct {
|
|
|
|
giteaSdk giteaSdk.GiteaSdkInterface
|
|
|
|
sqSdk sqSdk.SonarQubeSdkInterface
|
|
|
|
}
|
|
|
|
|
2021-10-10 17:32:25 +02:00
|
|
|
func (h *GiteaWebhookHandler) parseBody(rw http.ResponseWriter, r *http.Request) ([]byte, error) {
|
2021-10-10 15:58:03 +02:00
|
|
|
if r.Body != nil {
|
|
|
|
defer r.Body.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
raw, err := ioutil.ReadAll(r.Body)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("Error reading request body %s", err.Error())
|
|
|
|
rw.WriteHeader(http.StatusInternalServerError)
|
|
|
|
io.WriteString(rw, fmt.Sprintf(`{"message": "%s"}`, err.Error()))
|
2021-10-10 17:32:25 +02:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return raw, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *GiteaWebhookHandler) HandleSynchronize(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
rw.Header().Set("Content-Type", "application/json")
|
|
|
|
|
2021-10-10 17:59:28 +02:00
|
|
|
raw, err := h.parseBody(rw, r)
|
2021-10-10 17:32:25 +02:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-05-21 19:03:56 +02:00
|
|
|
ok, err := isValidWebhook(raw, settings.Gitea.Webhook.Secret, r.Header.Get("X-Gitea-Signature"), "Gitea")
|
|
|
|
if !ok {
|
|
|
|
log.Print(err.Error())
|
|
|
|
rw.WriteHeader(http.StatusPreconditionFailed)
|
|
|
|
io.WriteString(rw, fmt.Sprint(`{"message": "Webhook validation failed. Request rejected."}`))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-10-10 17:59:28 +02:00
|
|
|
w, ok := webhook.NewPullWebhook(raw)
|
|
|
|
if !ok {
|
|
|
|
rw.WriteHeader(http.StatusUnprocessableEntity)
|
|
|
|
io.WriteString(rw, `{"message": "Error parsing POST body."}`)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := w.Validate(); err != nil {
|
|
|
|
rw.WriteHeader(http.StatusOK)
|
|
|
|
io.WriteString(rw, fmt.Sprintf(`{"message": "%s"}`, err.Error()))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-10-10 17:32:25 +02:00
|
|
|
rw.WriteHeader(http.StatusOK)
|
|
|
|
io.WriteString(rw, `{"message": "Processing data. See bot logs for details."}`)
|
2021-10-10 17:59:28 +02:00
|
|
|
|
|
|
|
w.ProcessData(h.giteaSdk, h.sqSdk)
|
2021-10-10 17:32:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (h *GiteaWebhookHandler) HandleComment(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
rw.Header().Set("Content-Type", "application/json")
|
|
|
|
|
|
|
|
raw, err := h.parseBody(rw, r)
|
|
|
|
if err != nil {
|
2021-10-10 15:58:03 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-05-21 19:03:56 +02:00
|
|
|
ok, err := isValidWebhook(raw, settings.Gitea.Webhook.Secret, r.Header.Get("X-Gitea-Signature"), "Gitea")
|
|
|
|
if !ok {
|
|
|
|
log.Print(err.Error())
|
|
|
|
rw.WriteHeader(http.StatusPreconditionFailed)
|
|
|
|
io.WriteString(rw, `{"message": "Webhook validation failed. Request rejected."}`)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-10-10 17:59:28 +02:00
|
|
|
w, ok := webhook.NewCommentWebhook(raw)
|
2021-10-10 15:58:03 +02:00
|
|
|
if !ok {
|
|
|
|
rw.WriteHeader(http.StatusUnprocessableEntity)
|
|
|
|
io.WriteString(rw, `{"message": "Error parsing POST body."}`)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := w.Validate(); err != nil {
|
|
|
|
rw.WriteHeader(http.StatusOK)
|
|
|
|
io.WriteString(rw, fmt.Sprintf(`{"message": "%s"}`, err.Error()))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
rw.WriteHeader(http.StatusOK)
|
|
|
|
io.WriteString(rw, `{"message": "Processing data. See bot logs for details."}`)
|
|
|
|
|
|
|
|
w.ProcessData(h.giteaSdk, h.sqSdk)
|
|
|
|
}
|
|
|
|
|
2022-05-21 18:21:05 +02:00
|
|
|
func NewGiteaWebhookHandler(g giteaSdk.GiteaSdkInterface, sq sqSdk.SonarQubeSdkInterface) GiteaWebhookHandlerInferface {
|
2021-10-10 15:58:03 +02:00
|
|
|
return &GiteaWebhookHandler{
|
|
|
|
giteaSdk: g,
|
|
|
|
sqSdk: sq,
|
|
|
|
}
|
|
|
|
}
|