Facebook page-token creative fetch flow

Click diagram nodes to open the exact source location in Zed.

flowchart TD
  subgraph Entrypoints["Entrypoints that can schedule creative fetch work"]
    UrlSync["URL: POST /:account_id/sync-assets/"]
    UrlResync["URL: POST /:account_id/re-sync-assets/"]
    UrlFailed["URL: POST /:account_id/sync-failed-assets/"]
    BeatAssets["Celery beat: account_creatives_daily_sync"]
    BeatFailed["Celery beat: failed_creatives_daily_sync"]
    PipelineRetry["sync_account_metrics_task retry path"]
    ExternalSync["external integration sync tasks"]
  end

  subgraph Scheduling["Scheduling layer"]
    SyncView["SyncAssetsView.post()"]
    ResyncView["ReSyncAssetsView.post()"]
    FailedView["SyncFailedAssetsView.post()"]
    SyncAssets["sync_assets()"]
    AccountDaily["account_creatives_daily_sync()"]
    GetNew["get_new_assets_task()"]
    ResyncExisting["re_sync_existing_assets()"]
    SyncFailed["sync_failed_assets()"]
    FailedDaily["failed_creatives_daily_sync()"]
    FetchTask["fetch_ad_creative_data_task()"]
  end

  subgraph Runtime["Runtime path inside fetch_ad_creative_data_task"]
    DataManager["PerformanceDataManager.get_ad_creative_data()"]
    FbCreative["get_ad_creatives_from_fb()"]
    FbClient["get_facebook_client() returns FacebookAdsApiWithLogging"]
    AdFetch["Ad(...).api_get() and get_insights()"]
    CreativeFetch["AdCreative(...).api_get()"]
    ImageFetch["AdAccount(...).get_ad_images()"]
    VideoFetch["AdVideo(video_id).api_get()"]
    PermissionCheck{"video fetch permission denied and actor_id present?"}
    PageToken["Page(actor_id).api_get(fields=['access_token'])"]
    ApiWrapper["FacebookAdsApiWithLogging.call()"]
    ErrorLog["line 351 logs Failed to execute facebook ad request, then raises PlatformUnknownError"]
    PageTokenCatch["page-token fallback catches it and logs warning"]
    PostFallback["fallback: build facebook.com post URL and try CDN extraction"]
  end

  UrlSync --> SyncView --> SyncAssets
  PipelineRetry --> SyncAssets
  BeatAssets --> AccountDaily --> GetNew
  ExternalSync --> GetNew
  SyncAssets --> GetNew
  UrlResync --> ResyncView --> ResyncExisting
  UrlFailed --> FailedView --> SyncFailed
  PipelineRetry --> SyncFailed
  BeatFailed --> FailedDaily

  GetNew --> FetchTask
  ResyncExisting --> FetchTask
  SyncFailed --> FetchTask
  FailedDaily --> FetchTask

  FetchTask --> DataManager --> FbCreative
  FbCreative --> FbClient
  FbCreative --> AdFetch --> CreativeFetch
  FbCreative --> ImageFetch
  CreativeFetch --> VideoFetch
  VideoFetch --> PermissionCheck
  PermissionCheck -- yes --> PageToken --> ApiWrapper --> ErrorLog --> PageTokenCatch --> PostFallback
  PermissionCheck -- no --> PostFallback

  classDef failure fill:#ffe5e5,stroke:#c33,stroke-width:2px,color:#111;
  classDef task fill:#e8f1ff,stroke:#3b73d9,stroke-width:1px,color:#111;
  classDef entry fill:#f4f4f4,stroke:#777,stroke-width:1px,color:#111;
  class PageToken,ApiWrapper,ErrorLog failure;
  class FetchTask,GetNew,SyncFailed,FailedDaily,ResyncExisting task;
  class UrlSync,UrlResync,UrlFailed,BeatAssets,BeatFailed,PipelineRetry,ExternalSync entry;

  click UrlSync "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/urls.py&line=29&column=1" "creative_module/urls.py:29"
  click UrlResync "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/urls.py&line=31&column=1" "creative_module/urls.py:31"
  click UrlFailed "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/urls.py&line=32&column=1" "creative_module/urls.py:32"
  click BeatAssets "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/crux_ferrous_insights_app/celery.py&line=188&column=1" "crux_ferrous_insights_app/celery.py:188"
  click BeatFailed "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/crux_ferrous_insights_app/celery.py&line=198&column=1" "crux_ferrous_insights_app/celery.py:198"
  click PipelineRetry "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_pipeline_module/tasks/pipeline.py&line=124&column=1" "data_pipeline_module/tasks/pipeline.py:124"
  click ExternalSync "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/external_integrations/tasks/periodic_sync.py&line=367&column=1" "external_integrations/tasks/periodic_sync.py:367"
  click SyncView "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/views.py&line=2765&column=1" "creative_module/views.py:2765"
  click ResyncView "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/views.py&line=3115&column=1" "creative_module/views.py:3115"
  click FailedView "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/views.py&line=3134&column=1" "creative_module/views.py:3134"
  click SyncAssets "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=1614&column=1" "creative_module/tasks/ad_creative_task.py:1614"
  click AccountDaily "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=2806&column=1" "creative_module/tasks/ad_creative_task.py:2806"
  click GetNew "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=1123&column=1" "creative_module/tasks/ad_creative_task.py:1123"
  click ResyncExisting "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=1573&column=1" "creative_module/tasks/ad_creative_task.py:1573"
  click SyncFailed "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=2368&column=1" "creative_module/tasks/ad_creative_task.py:2368"
  click FailedDaily "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=2922&column=1" "creative_module/tasks/ad_creative_task.py:2922"
  click FetchTask "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=143&column=1" "creative_module/tasks/ad_creative_task.py:143"
  click DataManager "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/platform_service.py&line=594&column=1" "data_module/services/platform_service.py:594"
  click FbCreative "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=667&column=1" "data_module/services/fb_services.py:667"
  click FbClient "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=400&column=1" "data_module/services/fb_services.py:400"
  click AdFetch "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=688&column=1" "data_module/services/fb_services.py:688"
  click CreativeFetch "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=698&column=1" "data_module/services/fb_services.py:698"
  click ImageFetch "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=883&column=1" "data_module/services/fb_services.py:883"
  click VideoFetch "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=910&column=1" "data_module/services/fb_services.py:910"
  click PageToken "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=919&column=1" "data_module/services/fb_services.py:919"
  click ApiWrapper "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=298&column=1" "data_module/services/fb_services.py:298"
  click ErrorLog "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=351&column=1" "data_module/services/fb_services.py:351"
  click PageTokenCatch "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=925&column=1" "data_module/services/fb_services.py:925"
  click PostFallback "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=930&column=1" "data_module/services/fb_services.py:930"