59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package api
|
|
|
|
import (
|
|
"github.com/google/go-github/v48/github"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/rs/zerolog/log"
|
|
"gitlab.com/texm/shokku/internal/env"
|
|
"gitlab.com/texm/shokku/internal/models"
|
|
"net/http"
|
|
)
|
|
|
|
func ReceiveGithubWebhookEvent(e *env.Env, c echo.Context) error {
|
|
var ghApp models.GithubApp
|
|
if ghErr := e.DB.First(&ghApp).Error; ghErr != nil {
|
|
log.Error().Err(ghErr).Msg("failed to retrieve github app info")
|
|
return echo.ErrInternalServerError
|
|
}
|
|
|
|
req := c.Request()
|
|
secret := []byte(ghApp.WebhookSecret)
|
|
payload, validationErr := github.ValidatePayload(req, secret)
|
|
if validationErr != nil {
|
|
return echo.ErrBadRequest
|
|
}
|
|
event, parseErr := github.ParseWebHook(github.WebHookType(req), payload)
|
|
if parseErr != nil {
|
|
log.Error().Err(parseErr).Msg("failed to parse webhook")
|
|
return echo.ErrInternalServerError
|
|
}
|
|
var err error
|
|
switch event := event.(type) {
|
|
case *github.MetaEvent:
|
|
err = processMetaEvent(e, event)
|
|
case *github.PushEvent:
|
|
err = processPushEvent(e, event)
|
|
default:
|
|
log.Error().
|
|
Interface("type", event).
|
|
Msg("received unsupported webhook event")
|
|
return echo.ErrInternalServerError
|
|
}
|
|
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusInternalServerError, err)
|
|
}
|
|
|
|
return c.NoContent(http.StatusOK)
|
|
}
|
|
|
|
func processMetaEvent(e *env.Env, event *github.MetaEvent) error {
|
|
log.Debug().Interface("event", event).Msg("got meta event")
|
|
|
|
return nil
|
|
}
|
|
|
|
func processPushEvent(e *env.Env, event *github.PushEvent) error {
|
|
return nil
|
|
}
|