Architektura
Integracja działa jako plugin - connector social_media/meta + Noe App.
- Connector:
Connect::Connectorkind=social_media/meta - UI:
app/src/noe/appstore/meta_social_integration.svelte - Backend:
app/src/connect/connector/social_media/meta.rb - Dokumentacja:
docs/llm/apps/meta_integration.md
Dane w connectorze
connector.config["pages"][page_id] = {
page_name, page_access_token, app_secret, verify_token, ig_account_id
} # system, read-only
connector.fields["pages"][page_id] = {
desk_id, category_id, active, instagram_active
} # user-editable
Routing wiadomości
-
Connect::DataObjectobject_name=fb_mid- dedup Messenger (object_id = mid) -
Connect::DataObjectobject_name=fb_comment_id- dedup komentarzy (object_id = comment_id) -
Connect::DataObjectobject_name=fb_thread- routing reply komentarza do ticketa (object_id = top_comment_id) -
Connect::DataObjectobject_name=fb_sender- routing DM nadawcy do otwartego ticketa (object_id = psid) -
ticket.config["meta"]- outgoing routing (sender_id, page_id, kind, top_comment_id)
Webhook endpoints
POST /connect/connector/{code}/webhook_facebook # FB Messenger + komentarze
POST /connect/connector/{code}/webhook_instagram # Instagram DM
GET /connect/connector/{code}/webhook_facebook # verify (hub.verify_token)
GET /connect/connector/{code}/webhook_instagram # verify
Verify: connector.config["pages"][page_id]["verify_token"]
HMAC: X-Hub-Signature-256 z app_secret per strona.
OAuth
GET /connect/connector/{code}/oauth_start?desk_id=X
GET /connect/connector/{code}/oauth_callback
State w connector.config["oauth_states"] z TTL 10 min.
Outgoing (agent odpowiada)
Account::Webhook target_kind=connector, source_type=Helpdesk::Comment, kind=create
-> dispatch_webhook_event -> MessengerSender lub CommentReplier
Credentials
Globalne: Rails.application.credentials.dig(:meta, :app_id / :app_secret)
Fallback per-connector: fields["app_id"] + secret_token