webhook

package
v0.0.0-...-4c48337 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 25, 2026 License: MIT Imports: 13 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var SupportedEvents = map[string]string{
	"sale.created":         "A new sale is recorded",
	"sale.updated":         "A sale is updated",
	"product.created":      "A new product is added",
	"product.updated":      "A product is updated",
	"product.low_stock":    "Product stock is low",
	"product.out_of_stock": "Product is out of stock",
	"payment.completed":    "Payment received",
	"payment.failed":       "Payment failed",
	"shop.upgraded":        "Shop plan upgraded",
}

Supported events

Functions

func FormatEventDescription

func FormatEventDescription(eventType string) string

FormatEventDescription returns human-readable event description

func GetSupportedEvents

func GetSupportedEvents() map[string]string

GetSupportedEvents returns all supported events

func Init

func Init(db *gorm.DB, workers, maxRetries int)

Init initializes the global webhook manager

func TriggerCustomerCreated

func TriggerCustomerCreated(customer *models.Customer)

func TriggerCustomerTierUpgraded

func TriggerCustomerTierUpgraded(customer *models.Customer, oldTier, newTier string)

func TriggerOrderCreated

func TriggerOrderCreated(order *models.Order, supplier *models.Supplier)

func TriggerOrderFulfilled

func TriggerOrderFulfilled(order *models.Order, supplier *models.Supplier)

func TriggerPaymentFailed

func TriggerPaymentFailed(sale *models.Sale, product *models.Product, reason string)

func TriggerPaymentReceived

func TriggerPaymentReceived(sale *models.Sale, product *models.Product, phone string)

func TriggerProductCreated

func TriggerProductCreated(product *models.Product)

func TriggerProductLowStock

func TriggerProductLowStock(product *models.Product)

func TriggerProductUpdated

func TriggerProductUpdated(product *models.Product)

func TriggerSaleCreated

func TriggerSaleCreated(sale *models.Sale, product *models.Product)

Helper functions for global access

func TriggerSaleUpdated

func TriggerSaleUpdated(sale *models.Sale, product *models.Product)

func VerifySignature

func VerifySignature(payload []byte, signature, secret string) bool

VerifySignature verifies webhook signature

Types

type Delivery

type Delivery struct {
	ID         uint       `json:"id"`
	EventID    string     `json:"event_id"`
	WebhookID  uint       `json:"webhook_id"`
	URL        string     `json:"url"`
	Status     string     `json:"status"` // pending, success, failed
	StatusCode int        `json:"status_code"`
	Response   string     `json:"response"`
	Attempts   int        `json:"attempts"`
	CreatedAt  time.Time  `json:"created_at"`
	SentAt     *time.Time `json:"sent_at"`
}

Delivery represents a webhook delivery attempt

type DeliveryRepo

type DeliveryRepo struct {
	// contains filtered or unexported fields
}

type DeliveryRepository

type DeliveryRepository interface {
	Create(delivery *Delivery) error
	Update(delivery *Delivery) error
	GetByEventID(eventID string) ([]Delivery, error)
}

DeliveryRepository interface

type DeliveryService

type DeliveryService struct {
	// contains filtered or unexported fields
}

func NewDeliveryService

func NewDeliveryService(db *gorm.DB, workers, maxRetries int) *DeliveryService

func (*DeliveryService) GetEventStatus

func (s *DeliveryService) GetEventStatus(eventID uint) (map[string]interface{}, error)

func (*DeliveryService) Start

func (s *DeliveryService) Start(ctx context.Context)

func (*DeliveryService) TriggerEvent

func (s *DeliveryService) TriggerEvent(eventType EventType, data interface{}) error

type Event

type Event struct {
	Type      string      `json:"type"`
	ShopID    uint        `json:"shop_id"`
	Timestamp time.Time   `json:"timestamp"`
	Data      interface{} `json:"data"`
}

Event represents a webhook event

type EventDelivery

type EventDelivery struct {
	ID          uint
	WebhookID   uint
	EventType   EventType
	Payload     json.RawMessage
	Attempt     int
	Status      string
	Error       string
	ScheduledAt time.Time
	DeliveredAt *time.Time
	CreatedAt   time.Time
	UpdatedAt   time.Time
}

type EventType

type EventType string
const (
	EventSaleCreated     EventType = "sale.created"
	EventSaleUpdated     EventType = "sale.updated"
	EventProductCreated  EventType = "product.created"
	EventProductUpdated  EventType = "product.updated"
	EventProductLowStock EventType = "product.low_stock"
	EventPaymentReceived EventType = "payment.received"
	EventPaymentFailed   EventType = "payment.failed"
	EventCustomerCreated EventType = "customer.created"
	EventCustomerTier    EventType = "customer.tier_upgraded"
	EventShopCreated     EventType = "shop.created"
	EventOrderCreated    EventType = "order.created"
	EventOrderFulfilled  EventType = "order.fulfilled"
)

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager wraps the delivery service for global access

func GetManager

func GetManager() *Manager

GetManager returns the global webhook manager

func (*Manager) TriggerCustomerCreated

func (m *Manager) TriggerCustomerCreated(customer *models.Customer)

TriggerCustomerCreated triggers a customer.created event

func (*Manager) TriggerCustomerTierUpgraded

func (m *Manager) TriggerCustomerTierUpgraded(customer *models.Customer, oldTier, newTier string)

TriggerCustomerTierUpgraded triggers a customer.tier_upgraded event

func (*Manager) TriggerOrderCreated

func (m *Manager) TriggerOrderCreated(order *models.Order, supplier *models.Supplier)

TriggerOrderCreated triggers an order.created event

func (*Manager) TriggerOrderFulfilled

func (m *Manager) TriggerOrderFulfilled(order *models.Order, supplier *models.Supplier)

TriggerOrderFulfilled triggers an order.fulfilled event

func (*Manager) TriggerPaymentFailed

func (m *Manager) TriggerPaymentFailed(sale *models.Sale, product *models.Product, reason string)

TriggerPaymentFailed triggers a payment.failed event

func (*Manager) TriggerPaymentReceived

func (m *Manager) TriggerPaymentReceived(sale *models.Sale, product *models.Product, phone string)

TriggerPaymentReceived triggers a payment.received event

func (*Manager) TriggerProductCreated

func (m *Manager) TriggerProductCreated(product *models.Product)

TriggerProductCreated triggers a product.created event

func (*Manager) TriggerProductLowStock

func (m *Manager) TriggerProductLowStock(product *models.Product)

TriggerProductLowStock triggers a product.low_stock event

func (*Manager) TriggerProductUpdated

func (m *Manager) TriggerProductUpdated(product *models.Product)

TriggerProductUpdated triggers a product.updated event

func (*Manager) TriggerSaleCreated

func (m *Manager) TriggerSaleCreated(sale *models.Sale, product *models.Product)

TriggerSaleCreated triggers a sale.created event

func (*Manager) TriggerSaleUpdated

func (m *Manager) TriggerSaleUpdated(sale *models.Sale, product *models.Product)

TriggerSaleUpdated triggers a sale.updated event

type Service

type Service struct {
	// contains filtered or unexported fields
}

Service handles webhook delivery

func New

func New(webhookRepo WebhookRepository, deliveryRepo DeliveryRepository) *Service

New creates a new webhook service

func (*Service) AsyncSendEvent

func (s *Service) AsyncSendEvent(shopID uint, eventType string, data interface{})

AsyncSendEvent sends event asynchronously (non-blocking)

func (*Service) SendEvent

func (s *Service) SendEvent(shopID uint, eventType string, data interface{}) error

SendEvent sends a webhook event to all subscribed webhooks

type WebhookDelivery

type WebhookDelivery struct {
	ID           uint       `gorm:"primaryKey" json:"id"`
	EventID      uint       `gorm:"index" json:"event_id"`
	WebhookURL   string     `gorm:"size:500" json:"webhook_url"`
	Status       string     `gorm:"size:20;default:pending" json:"status"`
	HTTPStatus   int        `json:"http_status"`
	ResponseBody string     `gorm:"size:1000" json:"response_body"`
	Error        string     `gorm:"size:500" json:"error"`
	Attempt      int        `gorm:"default:0" json:"attempt"`
	DeliveredAt  *time.Time `json:"delivered_at"`
	CreatedAt    time.Time  `json:"created_at"`
}

type WebhookEvent

type WebhookEvent struct {
	ID        uint       `gorm:"primaryKey" json:"id"`
	WebhookID uint       `gorm:"index" json:"webhook_id"`
	Event     EventType  `gorm:"size:50;index" json:"event"`
	Payload   string     `gorm:"type:text" json:"payload"`
	Status    string     `gorm:"size:20;default:pending" json:"status"`
	Attempts  int        `gorm:"default:0" json:"attempts"`
	Error     string     `gorm:"size:500" json:"error"`
	SentAt    *time.Time `json:"sent_at"`
	CreatedAt time.Time  `json:"created_at"`
	UpdatedAt time.Time  `json:"updated_at"`
}

type WebhookRepository

type WebhookRepository interface {
	GetByShopIDAndEvent(shopID uint, event string) ([]models.Webhook, error)
	GetActiveByShop(shopID uint) ([]models.Webhook, error)
}

WebhookRepository interface

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL