package webhooks
import (
"encoding/json"
"io"
"net/http"
"os"
"github.com/labstack/echo/v4"
svix "github.com/svix/svix-webhooks/go"
"pollo/lib"
)
// Types
type ClerkEventEmail struct {
EmailAddress string `json:"email_address"`
}
type ClerkEventData struct {
EmailAddresses []ClerkEventEmail `json:"email_addresses,omitempty"`
Id string `json:"id"`
}
type ClerkEvent struct {
Data ClerkEventData
Type string
}
// Event Handlers
func userCreatedHandler(event ClerkEvent) {
welcomeEmail := `
Thank you for making an pollo account!
There are a number of apps this account give you access to!
- Pollo: https://pollo.pollo/
`
lib.SendEmail(event.Data.EmailAddresses[0].EmailAddress, "apps@atri.dad", "Atri's Apps", welcomeEmail, "Welcome to Atri's Apps!")
}
// Main Handler/Router
func ClerkWebhookHandler(c echo.Context) error {
secret := os.Getenv("CLERK_WEBHOOK_SECRET")
wh, err := svix.NewWebhook(secret)
if err != nil {
return c.String(http.StatusBadRequest, "Unknown Validation Error")
}
headers := c.Request().Header
payload, err := io.ReadAll(c.Request().Body)
if err != nil {
return c.String(http.StatusBadRequest, "Failed to read request body!")
}
err = wh.Verify(payload, headers)
if err != nil {
return c.String(http.StatusBadRequest, "Cannot validate webhook authenticity!")
}
var parsed ClerkEvent
err = json.Unmarshal(payload, &parsed)
if err != nil {
return c.String(http.StatusBadRequest, "Invalid Json!")
}
switch parsed.Type {
case "user.created":
userCreatedHandler(parsed)
}
return c.String(http.StatusOK, "Success!")
}