mirror of
https://github.com/multica-ai/multica.git
synced 2026-06-17 03:38:32 +02:00
- Add migration 106: CREATE INDEX CONCURRENTLY on member(user_id, workspace_id) - Rewrite ListWorkspaces to drive from member table with explicit fields - Regenerate all sqlc code with v1.31.1 (intentional version upgrade) Co-authored-by: multica-agent <github@multica.ai>
474 lines
15 KiB
Go
474 lines
15 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
||
// versions:
|
||
// sqlc v1.31.1
|
||
// source: webhook_delivery.sql
|
||
|
||
package db
|
||
|
||
import (
|
||
"context"
|
||
|
||
"github.com/jackc/pgx/v5/pgtype"
|
||
)
|
||
|
||
const bumpWebhookDeliveryAttempt = `-- name: BumpWebhookDeliveryAttempt :one
|
||
UPDATE webhook_delivery
|
||
SET attempt_count = attempt_count + 1,
|
||
last_attempt_at = now()
|
||
WHERE id = $1
|
||
RETURNING id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at
|
||
`
|
||
|
||
// On duplicate detection, bump attempt_count and refresh last_attempt_at on
|
||
// the existing delivery so the UI / operator can see retry pressure without
|
||
// creating a new row per attempt.
|
||
func (q *Queries) BumpWebhookDeliveryAttempt(ctx context.Context, id pgtype.UUID) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, bumpWebhookDeliveryAttempt, id)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|
||
|
||
const createWebhookDelivery = `-- name: CreateWebhookDelivery :one
|
||
|
||
INSERT INTO webhook_delivery (
|
||
workspace_id, autopilot_id, trigger_id, provider, event,
|
||
dedupe_key, dedupe_source, signature_status, status,
|
||
selected_headers, content_type, raw_body,
|
||
replayed_from_delivery_id
|
||
) VALUES (
|
||
$1, $2, $3, $4, $5,
|
||
$9, $10, $6, $7,
|
||
$8, $11, $12,
|
||
$13
|
||
) RETURNING id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at
|
||
`
|
||
|
||
type CreateWebhookDeliveryParams struct {
|
||
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
||
AutopilotID pgtype.UUID `json:"autopilot_id"`
|
||
TriggerID pgtype.UUID `json:"trigger_id"`
|
||
Provider string `json:"provider"`
|
||
Event string `json:"event"`
|
||
SignatureStatus string `json:"signature_status"`
|
||
Status string `json:"status"`
|
||
SelectedHeaders []byte `json:"selected_headers"`
|
||
DedupeKey pgtype.Text `json:"dedupe_key"`
|
||
DedupeSource pgtype.Text `json:"dedupe_source"`
|
||
ContentType pgtype.Text `json:"content_type"`
|
||
RawBody []byte `json:"raw_body"`
|
||
ReplayedFromDeliveryID pgtype.UUID `json:"replayed_from_delivery_id"`
|
||
}
|
||
|
||
// =====================
|
||
// Webhook Delivery
|
||
// =====================
|
||
// Inserts a delivery row. On dedupe-key collision the unique partial index
|
||
// (trigger_id, dedupe_key) raises 23505 and the handler treats it as
|
||
// "duplicate" rather than an error.
|
||
func (q *Queries) CreateWebhookDelivery(ctx context.Context, arg CreateWebhookDeliveryParams) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, createWebhookDelivery,
|
||
arg.WorkspaceID,
|
||
arg.AutopilotID,
|
||
arg.TriggerID,
|
||
arg.Provider,
|
||
arg.Event,
|
||
arg.SignatureStatus,
|
||
arg.Status,
|
||
arg.SelectedHeaders,
|
||
arg.DedupeKey,
|
||
arg.DedupeSource,
|
||
arg.ContentType,
|
||
arg.RawBody,
|
||
arg.ReplayedFromDeliveryID,
|
||
)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|
||
|
||
const getWebhookDelivery = `-- name: GetWebhookDelivery :one
|
||
SELECT id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at FROM webhook_delivery
|
||
WHERE id = $1
|
||
`
|
||
|
||
func (q *Queries) GetWebhookDelivery(ctx context.Context, id pgtype.UUID) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, getWebhookDelivery, id)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|
||
|
||
const getWebhookDeliveryByTriggerAndDedupe = `-- name: GetWebhookDeliveryByTriggerAndDedupe :one
|
||
SELECT id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at FROM webhook_delivery
|
||
WHERE trigger_id = $1
|
||
AND dedupe_key = $2
|
||
ORDER BY (status IN ('rejected', 'failed')), created_at DESC
|
||
LIMIT 1
|
||
`
|
||
|
||
type GetWebhookDeliveryByTriggerAndDedupeParams struct {
|
||
TriggerID pgtype.UUID `json:"trigger_id"`
|
||
DedupeKey pgtype.Text `json:"dedupe_key"`
|
||
}
|
||
|
||
// Looks up the existing delivery for a (trigger, dedupe_key) pair so that
|
||
// duplicate requests return the original delivery_id / autopilot_run_id.
|
||
// The partial unique index excludes terminal-but-not-successful statuses
|
||
// (`rejected`, `failed`), so multiple such rows can coexist for the same
|
||
// key. Prefer non-terminal rows in the lookup: without the ORDER BY we
|
||
// could return a stale rejection / failure even after the operator fixed
|
||
// the cause and a fresh dispatch succeeded.
|
||
func (q *Queries) GetWebhookDeliveryByTriggerAndDedupe(ctx context.Context, arg GetWebhookDeliveryByTriggerAndDedupeParams) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, getWebhookDeliveryByTriggerAndDedupe, arg.TriggerID, arg.DedupeKey)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|
||
|
||
const getWebhookDeliveryInWorkspace = `-- name: GetWebhookDeliveryInWorkspace :one
|
||
SELECT id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at FROM webhook_delivery
|
||
WHERE id = $1 AND workspace_id = $2
|
||
`
|
||
|
||
type GetWebhookDeliveryInWorkspaceParams struct {
|
||
ID pgtype.UUID `json:"id"`
|
||
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
||
}
|
||
|
||
// Workspace-scoped read for authenticated detail / replay endpoints.
|
||
func (q *Queries) GetWebhookDeliveryInWorkspace(ctx context.Context, arg GetWebhookDeliveryInWorkspaceParams) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, getWebhookDeliveryInWorkspace, arg.ID, arg.WorkspaceID)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|
||
|
||
const listWebhookDeliveriesByAutopilot = `-- name: ListWebhookDeliveriesByAutopilot :many
|
||
SELECT
|
||
d.id, d.workspace_id, d.autopilot_id, d.trigger_id, d.provider, d.event,
|
||
d.dedupe_key, d.dedupe_source, d.signature_status, d.status,
|
||
d.attempt_count, d.content_type, d.response_status,
|
||
d.autopilot_run_id, d.replayed_from_delivery_id, d.error,
|
||
d.received_at, d.last_attempt_at, d.created_at
|
||
FROM webhook_delivery d
|
||
JOIN autopilot a ON a.id = d.autopilot_id
|
||
WHERE d.autopilot_id = $1
|
||
AND a.workspace_id = $2
|
||
ORDER BY d.created_at DESC
|
||
LIMIT $3 OFFSET $4
|
||
`
|
||
|
||
type ListWebhookDeliveriesByAutopilotParams struct {
|
||
AutopilotID pgtype.UUID `json:"autopilot_id"`
|
||
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
||
Limit int32 `json:"limit"`
|
||
Offset int32 `json:"offset"`
|
||
}
|
||
|
||
type ListWebhookDeliveriesByAutopilotRow struct {
|
||
ID pgtype.UUID `json:"id"`
|
||
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
||
AutopilotID pgtype.UUID `json:"autopilot_id"`
|
||
TriggerID pgtype.UUID `json:"trigger_id"`
|
||
Provider string `json:"provider"`
|
||
Event string `json:"event"`
|
||
DedupeKey pgtype.Text `json:"dedupe_key"`
|
||
DedupeSource pgtype.Text `json:"dedupe_source"`
|
||
SignatureStatus string `json:"signature_status"`
|
||
Status string `json:"status"`
|
||
AttemptCount int32 `json:"attempt_count"`
|
||
ContentType pgtype.Text `json:"content_type"`
|
||
ResponseStatus pgtype.Int4 `json:"response_status"`
|
||
AutopilotRunID pgtype.UUID `json:"autopilot_run_id"`
|
||
ReplayedFromDeliveryID pgtype.UUID `json:"replayed_from_delivery_id"`
|
||
Error pgtype.Text `json:"error"`
|
||
ReceivedAt pgtype.Timestamptz `json:"received_at"`
|
||
LastAttemptAt pgtype.Timestamptz `json:"last_attempt_at"`
|
||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||
}
|
||
|
||
// Workspace-scoped via the join so a runId from another workspace cannot
|
||
// leak. Newest first, paged by limit/offset.
|
||
//
|
||
// Projection: large columns (`raw_body`, `selected_headers`, `response_body`)
|
||
// are deliberately excluded. A 100-row page × 256 KiB raw_body would be
|
||
// 25 MiB of bytes pulled from Postgres just to be dropped in the JSON
|
||
// encoder — Deliveries tab would hit that on every reload. Detail views
|
||
// fetch the full row via GetWebhookDelivery / GetWebhookDeliveryInWorkspace.
|
||
func (q *Queries) ListWebhookDeliveriesByAutopilot(ctx context.Context, arg ListWebhookDeliveriesByAutopilotParams) ([]ListWebhookDeliveriesByAutopilotRow, error) {
|
||
rows, err := q.db.Query(ctx, listWebhookDeliveriesByAutopilot,
|
||
arg.AutopilotID,
|
||
arg.WorkspaceID,
|
||
arg.Limit,
|
||
arg.Offset,
|
||
)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer rows.Close()
|
||
items := []ListWebhookDeliveriesByAutopilotRow{}
|
||
for rows.Next() {
|
||
var i ListWebhookDeliveriesByAutopilotRow
|
||
if err := rows.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.ContentType,
|
||
&i.ResponseStatus,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
); err != nil {
|
||
return nil, err
|
||
}
|
||
items = append(items, i)
|
||
}
|
||
if err := rows.Err(); err != nil {
|
||
return nil, err
|
||
}
|
||
return items, nil
|
||
}
|
||
|
||
const updateWebhookDeliveryDispatched = `-- name: UpdateWebhookDeliveryDispatched :one
|
||
UPDATE webhook_delivery
|
||
SET status = $2,
|
||
autopilot_run_id = $3,
|
||
response_status = $4,
|
||
response_body = $5,
|
||
last_attempt_at = now()
|
||
WHERE id = $1
|
||
RETURNING id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at
|
||
`
|
||
|
||
type UpdateWebhookDeliveryDispatchedParams struct {
|
||
ID pgtype.UUID `json:"id"`
|
||
Status string `json:"status"`
|
||
AutopilotRunID pgtype.UUID `json:"autopilot_run_id"`
|
||
ResponseStatus pgtype.Int4 `json:"response_status"`
|
||
ResponseBody pgtype.Text `json:"response_body"`
|
||
}
|
||
|
||
// Finalises a delivery that successfully created (or skipped to) an
|
||
// autopilot_run. response_status is the HTTP status we returned, recorded
|
||
// alongside so the operator can correlate logs.
|
||
func (q *Queries) UpdateWebhookDeliveryDispatched(ctx context.Context, arg UpdateWebhookDeliveryDispatchedParams) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, updateWebhookDeliveryDispatched,
|
||
arg.ID,
|
||
arg.Status,
|
||
arg.AutopilotRunID,
|
||
arg.ResponseStatus,
|
||
arg.ResponseBody,
|
||
)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|
||
|
||
const updateWebhookDeliveryTerminal = `-- name: UpdateWebhookDeliveryTerminal :one
|
||
UPDATE webhook_delivery
|
||
SET status = $2,
|
||
error = $3,
|
||
response_status = $4,
|
||
response_body = $5,
|
||
last_attempt_at = now()
|
||
WHERE id = $1
|
||
RETURNING id, workspace_id, autopilot_id, trigger_id, provider, event, dedupe_key, dedupe_source, signature_status, status, attempt_count, selected_headers, content_type, raw_body, response_status, response_body, autopilot_run_id, replayed_from_delivery_id, error, received_at, last_attempt_at, created_at
|
||
`
|
||
|
||
type UpdateWebhookDeliveryTerminalParams struct {
|
||
ID pgtype.UUID `json:"id"`
|
||
Status string `json:"status"`
|
||
Error pgtype.Text `json:"error"`
|
||
ResponseStatus pgtype.Int4 `json:"response_status"`
|
||
ResponseBody pgtype.Text `json:"response_body"`
|
||
}
|
||
|
||
// Finalises a delivery without an autopilot_run link — rejected, ignored,
|
||
// failed. Separate query so callers can't accidentally drop the run_id when
|
||
// they only meant to set status/error.
|
||
func (q *Queries) UpdateWebhookDeliveryTerminal(ctx context.Context, arg UpdateWebhookDeliveryTerminalParams) (WebhookDelivery, error) {
|
||
row := q.db.QueryRow(ctx, updateWebhookDeliveryTerminal,
|
||
arg.ID,
|
||
arg.Status,
|
||
arg.Error,
|
||
arg.ResponseStatus,
|
||
arg.ResponseBody,
|
||
)
|
||
var i WebhookDelivery
|
||
err := row.Scan(
|
||
&i.ID,
|
||
&i.WorkspaceID,
|
||
&i.AutopilotID,
|
||
&i.TriggerID,
|
||
&i.Provider,
|
||
&i.Event,
|
||
&i.DedupeKey,
|
||
&i.DedupeSource,
|
||
&i.SignatureStatus,
|
||
&i.Status,
|
||
&i.AttemptCount,
|
||
&i.SelectedHeaders,
|
||
&i.ContentType,
|
||
&i.RawBody,
|
||
&i.ResponseStatus,
|
||
&i.ResponseBody,
|
||
&i.AutopilotRunID,
|
||
&i.ReplayedFromDeliveryID,
|
||
&i.Error,
|
||
&i.ReceivedAt,
|
||
&i.LastAttemptAt,
|
||
&i.CreatedAt,
|
||
)
|
||
return i, err
|
||
}
|