Files
dokku-ui/internal/server/api/github.go
2023-04-25 14:33:14 +08:00

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
}