github.com/samcontesse/bitbucket-cascade-merge@v0.0.0-20230227091349-c5ec053235b5/handler.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "net/http" 6 ) 7 8 type EventHandler struct { 9 channel chan<- PullRequestEvent 10 } 11 12 func (e EventHandler) Handle() http.Handler { 13 return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { 14 var event PullRequestEvent 15 16 err := json.NewDecoder(request.Body).Decode(&event) 17 18 if err != nil || event.PullRequest == nil { 19 writer.WriteHeader(http.StatusBadRequest) 20 return 21 } 22 23 // take only merged state 24 if event.PullRequest.State != Merged { 25 writer.WriteHeader(http.StatusUnprocessableEntity) 26 return 27 } 28 29 // notify the channel 30 select { 31 case e.channel <- event: 32 writer.WriteHeader(http.StatusCreated) 33 default: 34 writer.WriteHeader(http.StatusTooManyRequests) 35 } 36 }) 37 } 38 39 func (e EventHandler) CheckToken(token string, next http.Handler) http.Handler { 40 return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { 41 if token != request.URL.Query().Get("token") { 42 writer.WriteHeader(http.StatusForbidden) 43 return 44 } 45 next.ServeHTTP(writer, request) 46 }) 47 } 48 49 func NewEventHandler(c chan PullRequestEvent) *EventHandler { 50 return &EventHandler{channel: c} 51 }