Add document webhook events

Add a resource-oriented set of webhook events for the document
lifecycle. Each event carries the document plus only the sub-resource
it concerns (version, signature or approval).

Events:
- document.created / updated / archived / unarchived / deleted
- document.version.created / updated / published / rejected / deleted
- document.version.signature.requested / signed / cancelled
- document.version.approval.requested / approved / rejected / voided

Wires the new types through the migration, Go enum, GraphQL schema,
CLI, n8n nodes and the console webhooks settings UI.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
This commit is contained in:
Sacha Al Himdani
2026-06-29 20:42:50 +02:00
parent 4cdf8b7913
commit 1df4af4556
11 changed files with 944 additions and 91 deletions

View File

@@ -920,7 +920,9 @@ func (p *Documents) BulkArchive(
scope Scoper,
) error {
q := `
UPDATE documents SET status = 'ARCHIVED', archived_at = @archived_at, trust_center_visibility = 'NONE' WHERE %s AND id = ANY(@document_ids)
UPDATE documents
SET status = 'ARCHIVED', archived_at = @archived_at, trust_center_visibility = 'NONE', updated_at = @updated_at
WHERE %s AND id = ANY(@document_ids)
`
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -929,9 +931,11 @@ UPDATE documents SET status = 'ARCHIVED', archived_at = @archived_at, trust_cent
ids[i] = doc.ID
}
now := time.Now()
args := pgx.StrictNamedArgs{
"document_ids": ids,
"archived_at": time.Now(),
"archived_at": now,
"updated_at": now,
}
maps.Copy(args, scope.SQLArguments())
@@ -948,7 +952,7 @@ func (p *Documents) BulkUnarchive(
scope Scoper,
) error {
q := `
UPDATE documents SET status = 'ACTIVE', archived_at = NULL WHERE %s AND id = ANY(@document_ids)
UPDATE documents SET status = 'ACTIVE', archived_at = NULL, updated_at = @updated_at WHERE %s AND id = ANY(@document_ids)
`
q = fmt.Sprintf(q, scope.SQLFragment())
@@ -959,6 +963,7 @@ UPDATE documents SET status = 'ACTIVE', archived_at = NULL WHERE %s AND id = ANY
args := pgx.StrictNamedArgs{
"document_ids": ids,
"updated_at": time.Now(),
}
maps.Copy(args, scope.SQLArguments())

View File

@@ -0,0 +1,35 @@
-- Copyright (c) 2026 Probo Inc <hello@probo.com>.
--
-- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted, provided that the above
-- copyright notice and this permission notice appear in all copies.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-- PERFORMANCE OF THIS SOFTWARE.
ALTER TYPE webhook_event_type ADD VALUE 'document:created';
ALTER TYPE webhook_event_type ADD VALUE 'document:updated';
ALTER TYPE webhook_event_type ADD VALUE 'document:archived';
ALTER TYPE webhook_event_type ADD VALUE 'document:unarchived';
ALTER TYPE webhook_event_type ADD VALUE 'document:deleted';
ALTER TYPE webhook_event_type ADD VALUE 'document-version:created';
ALTER TYPE webhook_event_type ADD VALUE 'document-version:updated';
ALTER TYPE webhook_event_type ADD VALUE 'document-version:published';
ALTER TYPE webhook_event_type ADD VALUE 'document-version:rejected';
ALTER TYPE webhook_event_type ADD VALUE 'document-version:deleted';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-signature:requested';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-signature:signed';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-signature:cancelled';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-approval-quorum:requested';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-approval-quorum:updated';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-approval-quorum:approved';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-approval-quorum:rejected';
ALTER TYPE webhook_event_type ADD VALUE 'document-version-approval-quorum:voided';

View File

@@ -33,6 +33,28 @@ const (
WebhookEventTypeObligationCreated WebhookEventType = "obligation:created"
WebhookEventTypeObligationUpdated WebhookEventType = "obligation:updated"
WebhookEventTypeObligationDeleted WebhookEventType = "obligation:deleted"
WebhookEventTypeDocumentCreated WebhookEventType = "document:created"
WebhookEventTypeDocumentUpdated WebhookEventType = "document:updated"
WebhookEventTypeDocumentArchived WebhookEventType = "document:archived"
WebhookEventTypeDocumentUnarchived WebhookEventType = "document:unarchived"
WebhookEventTypeDocumentDeleted WebhookEventType = "document:deleted"
WebhookEventTypeDocumentVersionCreated WebhookEventType = "document-version:created"
WebhookEventTypeDocumentVersionUpdated WebhookEventType = "document-version:updated"
WebhookEventTypeDocumentVersionPublished WebhookEventType = "document-version:published"
WebhookEventTypeDocumentVersionRejected WebhookEventType = "document-version:rejected"
WebhookEventTypeDocumentVersionDeleted WebhookEventType = "document-version:deleted"
WebhookEventTypeDocumentVersionSignatureRequested WebhookEventType = "document-version-signature:requested"
WebhookEventTypeDocumentVersionSignatureSigned WebhookEventType = "document-version-signature:signed"
WebhookEventTypeDocumentVersionSignatureCancelled WebhookEventType = "document-version-signature:cancelled"
WebhookEventTypeDocumentVersionApprovalQuorumRequested WebhookEventType = "document-version-approval-quorum:requested"
WebhookEventTypeDocumentVersionApprovalQuorumUpdated WebhookEventType = "document-version-approval-quorum:updated"
WebhookEventTypeDocumentVersionApprovalQuorumApproved WebhookEventType = "document-version-approval-quorum:approved"
WebhookEventTypeDocumentVersionApprovalQuorumRejected WebhookEventType = "document-version-approval-quorum:rejected"
WebhookEventTypeDocumentVersionApprovalQuorumVoided WebhookEventType = "document-version-approval-quorum:voided"
)
var (
@@ -52,7 +74,25 @@ func (v WebhookEventType) IsValid() bool {
WebhookEventTypeUserDeleted,
WebhookEventTypeObligationCreated,
WebhookEventTypeObligationUpdated,
WebhookEventTypeObligationDeleted:
WebhookEventTypeObligationDeleted,
WebhookEventTypeDocumentCreated,
WebhookEventTypeDocumentUpdated,
WebhookEventTypeDocumentArchived,
WebhookEventTypeDocumentUnarchived,
WebhookEventTypeDocumentDeleted,
WebhookEventTypeDocumentVersionCreated,
WebhookEventTypeDocumentVersionUpdated,
WebhookEventTypeDocumentVersionPublished,
WebhookEventTypeDocumentVersionRejected,
WebhookEventTypeDocumentVersionDeleted,
WebhookEventTypeDocumentVersionSignatureRequested,
WebhookEventTypeDocumentVersionSignatureSigned,
WebhookEventTypeDocumentVersionSignatureCancelled,
WebhookEventTypeDocumentVersionApprovalQuorumRequested,
WebhookEventTypeDocumentVersionApprovalQuorumUpdated,
WebhookEventTypeDocumentVersionApprovalQuorumApproved,
WebhookEventTypeDocumentVersionApprovalQuorumRejected,
WebhookEventTypeDocumentVersionApprovalQuorumVoided:
return true
}