feat(webhooks): add Deck card sync preset with vector indexing
Nextcloud Deck PR #7910 added IWebhookCompatibleEvent to CardCreated/ Updated/DeletedEvent and BoardUpdatedEvent, so Deck can finally emit real-time webhooks via core's webhook_listeners app. Wire this into the existing preset → parser → DocumentTask pipeline that already backs Notes / Calendar / Tables / Forms / Files sync. - Add deck_sync preset (app=deck, 4 events) and drop the stale "Deck does not support webhooks" comment. - Teach webhook_parser to convert Deck card events into DocumentTask(doc_type=deck_card, operation=index|delete) with stack_id metadata. BoardUpdatedEvent logs delivery at INFO and returns None — the polling scanner reconciles affected cards. - Cover three new unit tests for the deck create/delete/board-update paths plus symmetric fail-open tests for missing card.id / node.id in _parse_deck_event and _parse_file_event. The astrolabe admin UI auto-discovers the new preset via filter_presets_by_installed_apps(); no astrolabe-side wiring is required for it to appear in the Webhook Management card grid. Note: requires Deck ≥1.18.x (where PR #7910 lands); the preset is hidden when the Deck app isn't installed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
0c499de6ab
commit
fdcbd7bd3f
@@ -43,11 +43,18 @@ TABLES_EVENT_ROW_DELETED = "OCA\\Tables\\Event\\RowDeletedEvent"
|
||||
# Forms webhook events (Nextcloud 30+)
|
||||
FORMS_EVENT_FORM_SUBMITTED = "OCA\\Forms\\Events\\FormSubmittedEvent"
|
||||
|
||||
# NOTE: Deck and Contacts do NOT support webhooks
|
||||
# Their event classes do not implement IWebhookCompatibleEvent interface.
|
||||
# Alternative sync strategies:
|
||||
# - Deck: Use polling with ETag-based change detection
|
||||
# - Contacts: Use CardDAV sync-token mechanism for efficient syncing
|
||||
# Deck webhook events (require nextcloud/deck PR #7910, which adds
|
||||
# IWebhookCompatibleEvent to these event classes). BoardUpdatedEvent only
|
||||
# carries a board ID and is used as a fan-out signal; the polling scanner
|
||||
# reconciles affected cards.
|
||||
DECK_EVENT_CARD_CREATED = "OCA\\Deck\\Event\\CardCreatedEvent"
|
||||
DECK_EVENT_CARD_UPDATED = "OCA\\Deck\\Event\\CardUpdatedEvent"
|
||||
DECK_EVENT_CARD_DELETED = "OCA\\Deck\\Event\\CardDeletedEvent"
|
||||
DECK_EVENT_BOARD_UPDATED = "OCA\\Deck\\Event\\BoardUpdatedEvent"
|
||||
|
||||
# NOTE: Contacts does NOT support webhooks — its event classes do not
|
||||
# implement IWebhookCompatibleEvent. Use CardDAV sync-token mechanism for
|
||||
# efficient syncing.
|
||||
|
||||
|
||||
WEBHOOK_PRESETS: Dict[str, WebhookPreset] = {
|
||||
@@ -138,6 +145,29 @@ WEBHOOK_PRESETS: Dict[str, WebhookPreset] = {
|
||||
},
|
||||
],
|
||||
},
|
||||
"deck_sync": {
|
||||
"name": "Deck Sync",
|
||||
"description": "Real-time synchronization for Deck cards (create, update, delete) and board updates",
|
||||
"app": "deck",
|
||||
"events": [
|
||||
{
|
||||
"event": DECK_EVENT_CARD_CREATED,
|
||||
"filter": {},
|
||||
},
|
||||
{
|
||||
"event": DECK_EVENT_CARD_UPDATED,
|
||||
"filter": {},
|
||||
},
|
||||
{
|
||||
"event": DECK_EVENT_CARD_DELETED,
|
||||
"filter": {},
|
||||
},
|
||||
{
|
||||
"event": DECK_EVENT_BOARD_UPDATED,
|
||||
"filter": {},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user