lists.sr.ht/api/webhooks/webhooks.go

111 lines
2.9 KiB
Go

package webhooks
import (
"context"
"time"
"git.sr.ht/~sircmpwn/core-go/auth"
"git.sr.ht/~sircmpwn/core-go/webhooks"
sq "github.com/Masterminds/squirrel"
"github.com/google/uuid"
"git.sr.ht/~sircmpwn/lists.sr.ht/api/graph/model"
)
func deliverUserWebhook(ctx context.Context, event model.WebhookEvent,
payload model.WebhookPayload, payloadUUID uuid.UUID) {
q := webhooks.ForContext(ctx)
userID := auth.ForContext(ctx).UserID
query := sq.
Select().
From("gql_user_wh_sub sub").
Where("sub.user_id = ?", userID)
q.Schedule(ctx, query, "user", event.String(),
payloadUUID, payload)
}
func deliverListWebhook(ctx context.Context, listID int,
event model.WebhookEvent, payload model.WebhookPayload, payloadUUID uuid.UUID) {
q := webhooks.ForContext(ctx)
query := sq.
Select().
From("gql_list_wh_sub sub").
Join(`list ON list.id = sub.list_id`).
LeftJoin(`access ON
access.list_id = sub.list_id AND
access.user_id = sub.user_id`).
LeftJoin(`subscription lsub ON
lsub.list_id = sub.list_id AND
lsub.user_id = sub.user_id`).
Where(sq.And{
sq.Expr(`sub.list_id = ?`, listID),
sq.Or{
sq.Expr(`list.owner_id = sub.user_id`),
sq.Expr(`access.permissions & ? > 0`, model.ACCESS_BROWSE),
sq.Expr(`list.default_access & ? > 0`, model.ACCESS_BROWSE),
},
})
q.Schedule(ctx, query, "list", event.String(),
payloadUUID, payload)
}
func DeliverUserMailingListEvent(ctx context.Context,
event model.WebhookEvent, list *model.MailingList) {
payloadUUID := uuid.New()
payload := model.MailingListEvent{
UUID: payloadUUID.String(),
Event: event,
Date: time.Now().UTC(),
List: list,
}
deliverUserWebhook(ctx, event, &payload, payloadUUID)
}
func DeliverUserEmailEvent(ctx context.Context,
event model.WebhookEvent, email *model.Email) {
payloadUUID := uuid.New()
payload := model.EmailEvent{
UUID: payloadUUID.String(),
Event: event,
Date: time.Now().UTC(),
Email: email,
}
deliverUserWebhook(ctx, event, &payload, payloadUUID)
}
func DeliverMailingListEvent(ctx context.Context,
event model.WebhookEvent, list *model.MailingList) {
payloadUUID := uuid.New()
payload := model.MailingListEvent{
UUID: payloadUUID.String(),
Event: event,
Date: time.Now().UTC(),
List: list,
}
deliverListWebhook(ctx, list.ID, event, &payload, payloadUUID)
}
func DeliverListEmailEvent(ctx context.Context, listID int,
event model.WebhookEvent, email *model.Email) {
payloadUUID := uuid.New()
payload := model.EmailEvent{
UUID: payloadUUID.String(),
Event: event,
Date: time.Now().UTC(),
Email: email,
}
deliverListWebhook(ctx, listID, event, &payload, payloadUUID)
}
func DeliverListPatchsetEvent(ctx context.Context, listID int,
event model.WebhookEvent, patchset *model.Patchset) {
payloadUUID := uuid.New()
payload := model.PatchsetEvent{
UUID: payloadUUID.String(),
Event: event,
Date: time.Now().UTC(),
Patchset: patchset,
}
deliverListWebhook(ctx, listID, event, &payload, payloadUUID)
}