plapkit/hook_handler.go
2024-06-25 16:52:27 -04:00

90 lines
1.9 KiB
Go

package main
import (
"encoding/json"
"log"
"net/http"
)
type HookPayload[D HookPayloadData] struct {
Type string `json:"type"`
SigningToken string `json:"signing_token"`
SystemID string `json:"system_id"`
ID string `json:"id,omitempty"`
Data D `json:"data,omitempty"`
}
type Switch struct {
ID string `json:"id"`
Timestamp string `json:"timestamp"`
Members []string `json:"members"`
}
type Message struct {
ID string `json:"id"`
Timestamp string `json:"timestamp"`
Member string `json:"member"`
}
type HookPayloadData interface {
Switch | Message | interface{}
}
type hookHandler[D HookPayloadData] func(h HookPayload[D])
var (
hookHandlers map[string]hookHandler[HookPayloadData] = map[string]hookHandler[HookPayloadData]{
"CREATE_SWITCH": handleHookCreateSwitch,
"CREATE_MESSAGE": handleHookCreateMessage,
}
)
func postGetHookToken(rw http.ResponseWriter, req *http.Request) {
if req.Method != "POST" {
errMethodNotAllowed(rw)
return
}
var payload HookPayload[HookPayloadData]
err := json.NewDecoder(req.Body).Decode(&payload)
if err != nil {
errBadRequest(rw)
return
}
if payload.SigningToken != SigningToken {
errUnauthorized(rw)
return
}
if payload.Type == "PING" {
basicOk(rw)
return
}
handler, ok := hookHandlers[payload.Type]
if !ok {
basicNoContent(rw)
return
}
go handler(payload)
}
func handleHookCreateSwitch(h HookPayload[HookPayloadData]) {
hook, ok := h.Data.(Switch)
if !ok {
log.Printf("[handleHookCreateSwitch] could not cast hook payload data to Switch, got: %v\n", h)
}
log.Printf("[handleHookCreateSwitch] got hook: %v\n", hook)
}
func handleHookCreateMessage(h HookPayload[HookPayloadData]) {
hook, ok := h.Data.(Message)
if !ok {
log.Printf("[handleHookCreateMessage] could not cast hook payload data to Message, got: %v\n", h)
}
log.Printf("[handleHookCreateMessage] got hook: %v\n", hook)
}