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  }