Skip to content

Commit

Permalink
feat(cli): Take request headers, params, and body into account when s…
Browse files Browse the repository at this point in the history
…aving responses (#3098)

<!-- Describe the problem and your solution --> 
**Important: This should merge after an as-yet non-existent change in
integration-templates.**

When running the cli with --save-responses we currently only take the
method and url into account. This PR adds support for recording the
response with a request identity into a hash based file.

It currently does not support Stream based request bodies (`data`).

One major downside of this technique is that the hash based filenames
aren't the easiest to read. That said, the data in the files makes it
pretty straightforward to see what's going on.

<!-- Issue ticket number and link (if applicable) -->

See
https://linear.app/nango/issue/NAN-1902/fix-integration-unit-test-pagination

<!-- Testing instructions (skip if just adding/editing providers) -->

## How I tested it

- Make sure you're local dev env is set up so that CLI from your `nango`
repo works in `integration-templates`
- Make sure this code is all built
- Run a dry-run. You'll see new requests outputs appear with hash based
filenames.

## Format

Here's how the resulting cached requests look. They're definitely not
perfect yet, but give us enough to improve our tests.

Note: There are recordings of me staring at my camera trying to generate
enough recordings to get the Zoom API to paginate here. Great videos!

<details>
  <summary>Example cached file</summary>

```
{
  "requestIdentityHash": "1bef948570eee4ad73984e2cbb86077093cfc5b0",
  "requestIdentity": [
    [
      "headers",
      [
        [
          "Accept",
          "application/json, text/plain, */*"
        ],
        [
          "Base-Url-Override",
          ""
        ],
        [
          "Connection-Id",
          "03d80504-def8-45d1-b835-c9de8a467967"
        ],
        [
          "Content-Type",
          null
        ],
        [
          "Nango-Activity-Log-Id",
          ""
        ],
        [
          "Nango-Is-Dry-Run",
          "true"
        ],
        [
          "Nango-Is-Sync",
          "true"
        ],
        [
          "Provider-Config-Key",
          "zoom"
        ]
      ]
    ],
    [
      "method",
      "get"
    ],
    [
      "params",
      [
        [
          "from",
          "2024-11-03"
        ],
        [
          "to",
          "2024-12-03"
        ]
      ]
    ],
    [
      "url",
      "http://localhost:3003/proxy/users/me/recordings"
    ]
  ],
  "response": {
    "from": "2024-11-03",
    "to": "2024-12-03",
    "page_count": 1,
    "page_size": 30,
    "total_records": 30,
    "next_page_token": "",
    "meetings": [
      {
        "uuid": "2jQ60QnYThiV9cm+fdIbZQ==",
        "id": 82205654575,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:51:20Z",
        "timezone": "",
        "duration": 0,
        "total_size": 460381,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/cRp_uXaaR1nj7yaPydNH9iJ9T4B6l4WTXo2Kg32I_ufn2zvqHvgpsLg6QeVPnVHB.NW6Gm5PcK3eY6SJe",
        "recording_files": [
          {
            "id": "1ec4ad5a-fba9-4866-b71b-099b38a3e702",
            "meeting_id": "2jQ60QnYThiV9cm+fdIbZQ==",
            "recording_start": "2024-11-29T16:51:28Z",
            "recording_end": "2024-11-29T16:51:35Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 342924,
            "play_url": "https://us06web.zoom.us/rec/play/79KMn4cdm68Lkdgu8iMFmNMlm-EO46sJHYVc91qCUfZNswvIi88GZTKIMDF2KbiDWVljjuKcCeKbB-i4.2HnKYzKCeaVREbZv",
            "download_url": "https://us06web.zoom.us/rec/download/79KMn4cdm68Lkdgu8iMFmNMlm-EO46sJHYVc91qCUfZNswvIi88GZTKIMDF2KbiDWVljjuKcCeKbB-i4.2HnKYzKCeaVREbZv",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "3f9be9f0-577b-4ae7-a450-ac1a5eaa21f1",
            "meeting_id": "2jQ60QnYThiV9cm+fdIbZQ==",
            "recording_start": "2024-11-29T16:51:28Z",
            "recording_end": "2024-11-29T16:51:35Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 117364,
            "play_url": "https://us06web.zoom.us/rec/play/7L-kq79n5LAI-ppuTI0K-wVzuSfMi1qQXLNTUfvuBowUg_MBn4rVwQxLaFGouzhbrAcoQKbEsnia2msD.0_wLUNVYbP_pr_MU",
            "download_url": "https://us06web.zoom.us/rec/download/7L-kq79n5LAI-ppuTI0K-wVzuSfMi1qQXLNTUfvuBowUg_MBn4rVwQxLaFGouzhbrAcoQKbEsnia2msD.0_wLUNVYbP_pr_MU",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "2051feea-4e6e-4b8f-b679-9efded8a0af5",
            "meeting_id": "2jQ60QnYThiV9cm+fdIbZQ==",
            "recording_start": "2024-11-29T16:51:28Z",
            "recording_end": "2024-11-29T16:51:35Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/jht5wUiA4bW4gqWROnakF7ta4eZGC8Lcfi7w7m9hHDqSCCJoxFGN3u2sioDoO0-j3oIMHR8NmsY3NYxd.pUqno45G0r-IDHbR",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "2J1cRGLck-pC8ClqDUgrluOzDT5I7jaD"
      },
      {
        "uuid": "+gCB2Z5RS++JtabKun0eCg==",
        "id": 85309856990,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:51:01Z",
        "timezone": "",
        "duration": 0,
        "total_size": 410959,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/XZQFO4hc1EkEbkzCE9cuDg2p-1L5vVNHdaweoMdDFdcqShp8NIGH4pvzVZH15ar8.kNF75Zyu-CpOKQcf",
        "recording_files": [
          {
            "id": "3705b311-9a2e-4677-9f40-46eaaa36efe8",
            "meeting_id": "+gCB2Z5RS++JtabKun0eCg==",
            "recording_start": "2024-11-29T16:51:11Z",
            "recording_end": "2024-11-29T16:51:16Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 316423,
            "play_url": "https://us06web.zoom.us/rec/play/celRtje7sDJAo4LDHO92k7gN_kSz-XQJwEaYkoV0uz5poEIL--ns2FV23cD7iMq1yFN7eZsS6e7Plifz.XXHaJqcwZaL_CmWU",
            "download_url": "https://us06web.zoom.us/rec/download/celRtje7sDJAo4LDHO92k7gN_kSz-XQJwEaYkoV0uz5poEIL--ns2FV23cD7iMq1yFN7eZsS6e7Plifz.XXHaJqcwZaL_CmWU",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "c6a3d6ae-6add-4a0f-8646-df8df9dc0b2e",
            "meeting_id": "+gCB2Z5RS++JtabKun0eCg==",
            "recording_start": "2024-11-29T16:51:11Z",
            "recording_end": "2024-11-29T16:51:16Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 94443,
            "play_url": "https://us06web.zoom.us/rec/play/VzlQOiBu-GwFZgB7cGt9OILbgnhTY964K2_k2juIDsK8QzxTNF9jXdlhO2JwXfVwfHxWC4G8MsRKOKc4.ftUIWQgYk_Cg03ZS",
            "download_url": "https://us06web.zoom.us/rec/download/VzlQOiBu-GwFZgB7cGt9OILbgnhTY964K2_k2juIDsK8QzxTNF9jXdlhO2JwXfVwfHxWC4G8MsRKOKc4.ftUIWQgYk_Cg03ZS",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "06cd681a-c234-478f-b09d-d8c6227d1265",
            "meeting_id": "+gCB2Z5RS++JtabKun0eCg==",
            "recording_start": "2024-11-29T16:51:11Z",
            "recording_end": "2024-11-29T16:51:16Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/00a05V-EGegfENyCSjfQ742_t4qvrgjvLIkepSV-Cf7sFL6y-mPHfcJokz2qJS44etMnLJuoM9GlCvkJ.q4GwxkbemcZGrHky",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "5iaaMaXnPf_YqC8LGWDUDNie_AQLufvV"
      },
      {
        "uuid": "ahO36JdmRiqokbTNWaMmTQ==",
        "id": 81542095886,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:50:30Z",
        "timezone": "",
        "duration": 0,
        "total_size": 585308,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/_8veuq8RmWV4tY-64C9d-I9scwf03M8H-TJO8bW915-X-TIO_IxAmo9FSfm_c4FJ.SYN8ExmfUKcubz36",
        "recording_files": [
          {
            "id": "32fd9177-0f7a-4dd1-9694-2659cd9dd408",
            "meeting_id": "ahO36JdmRiqokbTNWaMmTQ==",
            "recording_start": "2024-11-29T16:50:37Z",
            "recording_end": "2024-11-29T16:50:46Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 433223,
            "play_url": "https://us06web.zoom.us/rec/play/BP-8B4IKPfwn1-Q9VHjNx65DnsEZM3vkIF1kiN0B14cZXW03Z7hhDAS5Ar9ZcfcNVnkFEf1rlX9eQe8.TF_MwUgt7DrDp9pE",
            "download_url": "https://us06web.zoom.us/rec/download/BP-8B4IKPfwn1-Q9VHjNx65DnsEZM3vkIF1kiN0B14cZXW03Z7hhDAS5Ar9ZcfcNVnkFEf1rlX9eQe8.TF_MwUgt7DrDp9pE",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "5e26a224-80aa-42c0-a530-94b67b49fd13",
            "meeting_id": "ahO36JdmRiqokbTNWaMmTQ==",
            "recording_start": "2024-11-29T16:50:37Z",
            "recording_end": "2024-11-29T16:50:46Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 151992,
            "play_url": "https://us06web.zoom.us/rec/play/o3uLrxH0Zi51J4F7Rfrq7qtzb5HFMW6Sx407p-jTA3D_Zq6XZ1TcUoVCq7F5jKChEZsaATCpscahzqQP.V02BexaS30T-KctW",
            "download_url": "https://us06web.zoom.us/rec/download/o3uLrxH0Zi51J4F7Rfrq7qtzb5HFMW6Sx407p-jTA3D_Zq6XZ1TcUoVCq7F5jKChEZsaATCpscahzqQP.V02BexaS30T-KctW",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "f27af72a-0e5b-441d-b18e-509be10751a0",
            "meeting_id": "ahO36JdmRiqokbTNWaMmTQ==",
            "recording_start": "2024-11-29T16:50:37Z",
            "recording_end": "2024-11-29T16:50:46Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/B3Dpj6EXhcL9eUV1RyhOrGXcBwnryvtBTgOizA3rF4pwAo4JXflUTo2DwJHl2RXErDgB4YOaJ-gNBWXF.A_dakxrUxmAc3k5q",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "cqRkoEgauIYFS-pbIrNcfjd_OsuAmHV9"
      },
      {
        "uuid": "J89yoQfNQ86sblmYz/CNKQ==",
        "id": 85708816321,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:49:50Z",
        "timezone": "",
        "duration": 0,
        "total_size": 1254519,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/CIBkQ6jFyhrMxn0QyAVYYVUSMuCft184-25KudQ-fjt0D1h6Q_h6Dp214wLfEGme.ViLAobm5MI9PWb8L",
        "recording_files": [
          {
            "id": "3e996c7b-aabc-4a69-a49c-d81d5e214f34",
            "meeting_id": "J89yoQfNQ86sblmYz/CNKQ==",
            "recording_start": "2024-11-29T16:50:07Z",
            "recording_end": "2024-11-29T16:50:25Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 298656,
            "play_url": "https://us06web.zoom.us/rec/play/TS-s4h5jL3umC26pAXpf6AjPmhoSwBBJL5SlfvQrxBBwMXETy7gU_VLgtkQ5-xlKxea3s8zgga5DJfI.LE5T9h2jJf4WPXy3",
            "download_url": "https://us06web.zoom.us/rec/download/TS-s4h5jL3umC26pAXpf6AjPmhoSwBBJL5SlfvQrxBBwMXETy7gU_VLgtkQ5-xlKxea3s8zgga5DJfI.LE5T9h2jJf4WPXy3",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "1bcbe947-f946-4155-b357-c6eac94cc845",
            "meeting_id": "J89yoQfNQ86sblmYz/CNKQ==",
            "recording_start": "2024-11-29T16:50:07Z",
            "recording_end": "2024-11-29T16:50:25Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/Tppc57yA1b2l6LaC5enF_uqW40x5dsthX3D_en_acdcRQGCUrrmQlaj-GO9lO73WfC-HbabvSbcoPhI5.I-AMWgQJI1cjOZw-",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "d310bb85-767b-441b-b936-8bcea06b8d82",
            "meeting_id": "J89yoQfNQ86sblmYz/CNKQ==",
            "recording_start": "2024-11-29T16:50:07Z",
            "recording_end": "2024-11-29T16:50:25Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 955770,
            "play_url": "https://us06web.zoom.us/rec/play/qkapELjO4Mv4ZwyldqOBGJlpIcBThOJSdAsnbjgN5OEejwKYe_mCHffr9QXs1o7PJdSs58FM_sO7tYQ4.BPd2iSJwh20Qjarh",
            "download_url": "https://us06web.zoom.us/rec/download/qkapELjO4Mv4ZwyldqOBGJlpIcBThOJSdAsnbjgN5OEejwKYe_mCHffr9QXs1o7PJdSs58FM_sO7tYQ4.BPd2iSJwh20Qjarh",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "Ir539UfpUNpH69IP7jvV3M2m9t32BVb-"
      },
      {
        "uuid": "ZzAhQs6ZQtWLj2hqg+MoNg==",
        "id": 82497224865,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:49:29Z",
        "timezone": "",
        "duration": 0,
        "total_size": 647314,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/96DiLtQuFA1A0s_CMo-3xnLF1xzNshJIiugMybGEjK-s_bpfB8zCainNFVkh2Soh.Q4ytjcQuS-APQ7bY",
        "recording_files": [
          {
            "id": "d0558bd7-65fa-4fc4-9c6f-09a44a8093b0",
            "meeting_id": "ZzAhQs6ZQtWLj2hqg+MoNg==",
            "recording_start": "2024-11-29T16:49:36Z",
            "recording_end": "2024-11-29T16:49:46Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 157591,
            "play_url": "https://us06web.zoom.us/rec/play/XZDhLp4X3knjsi-rFH_sYsctDy9ZsWfJ3pT4lj88uE9i-tmBCBaf8JMQ2Ae1EP4BxjcdB_cQaEZiwEjf.yn1YvPS8G5V66MyJ",
            "download_url": "https://us06web.zoom.us/rec/download/XZDhLp4X3knjsi-rFH_sYsctDy9ZsWfJ3pT4lj88uE9i-tmBCBaf8JMQ2Ae1EP4BxjcdB_cQaEZiwEjf.yn1YvPS8G5V66MyJ",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "855548d6-987c-4f27-9549-5df1c083606a",
            "meeting_id": "ZzAhQs6ZQtWLj2hqg+MoNg==",
            "recording_start": "2024-11-29T16:49:36Z",
            "recording_end": "2024-11-29T16:49:46Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/azrp9aD1KLyUP2OGsF7DwAKRJi-NPBFNqVmm3ZBlZcRLBlOHtea9Qfby_ZmB_Ny1IAMRGl38kjKgQsqX.hmQgJgFr3Vf-NXfK",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "f0646317-7547-4088-ab0e-1fd89c7d4387",
            "meeting_id": "ZzAhQs6ZQtWLj2hqg+MoNg==",
            "recording_start": "2024-11-29T16:49:36Z",
            "recording_end": "2024-11-29T16:49:46Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 489630,
            "play_url": "https://us06web.zoom.us/rec/play/5I5OqLkdYo3_A8CnY-4_vsOpy6-M_DzaNeIZlwCzYymacqQw8wdOh27CfRQnQWIEJ_-3yWlXukVg06J_.D404Dk6R3eeBMB1C",
            "download_url": "https://us06web.zoom.us/rec/download/5I5OqLkdYo3_A8CnY-4_vsOpy6-M_DzaNeIZlwCzYymacqQw8wdOh27CfRQnQWIEJ_-3yWlXukVg06J_.D404Dk6R3eeBMB1C",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "CfU1pyO3TAOGfHkRmUaaaS-aRKnTknPQ"
      },
      {
        "uuid": "JK25FQzSStiZZBhwtBg/Uw==",
        "id": 86981403959,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:49:14Z",
        "timezone": "",
        "duration": 0,
        "total_size": 377662,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/H3MFnks80-jpdPjplFPFUwrILWj7rYuoS8I6pUiwQic1fu3NOS4u96NlvssfnAcy.9nYjk1Cvnd57ifff",
        "recording_files": [
          {
            "id": "bd4d2dfe-151e-4b89-9e06-5316c4879f0f",
            "meeting_id": "JK25FQzSStiZZBhwtBg/Uw==",
            "recording_start": "2024-11-29T16:49:20Z",
            "recording_end": "2024-11-29T16:49:26Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 86808,
            "play_url": "https://us06web.zoom.us/rec/play/VfolFbOV-bcEWvnszhn_gaiAZkhQGuR672Hg2Vo71Qsod4yi5z30eDfClwQDpkazNaClsKLPaRayfNKH.e68-gdUT8hRLMrHd",
            "download_url": "https://us06web.zoom.us/rec/download/VfolFbOV-bcEWvnszhn_gaiAZkhQGuR672Hg2Vo71Qsod4yi5z30eDfClwQDpkazNaClsKLPaRayfNKH.e68-gdUT8hRLMrHd",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "7800c6c4-76ce-434c-b6bf-9e1e1295900f",
            "meeting_id": "JK25FQzSStiZZBhwtBg/Uw==",
            "recording_start": "2024-11-29T16:49:20Z",
            "recording_end": "2024-11-29T16:49:26Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/U7bU5Q1o2ZCBgnm6RV0VoMUlnsRcTon-1I17HReMC5OhUBrQRJHZnTaAFJE6O05fkGtnWEceodMmlhDW.pXQXkCfyIWnqRL3D",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "c871b6b0-b01b-408b-915a-b654e369a9e6",
            "meeting_id": "JK25FQzSStiZZBhwtBg/Uw==",
            "recording_start": "2024-11-29T16:49:20Z",
            "recording_end": "2024-11-29T16:49:26Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 290761,
            "play_url": "https://us06web.zoom.us/rec/play/8Rrp7WcwVArsAOn4Q4aoWtONFyUXOJ7XvraRBEwubsYO2Pkd5KfyQTSmNwPGrhST-LBUeHuJtjUxbB2H.g6jHJLzyZBveqAIl",
            "download_url": "https://us06web.zoom.us/rec/download/8Rrp7WcwVArsAOn4Q4aoWtONFyUXOJ7XvraRBEwubsYO2Pkd5KfyQTSmNwPGrhST-LBUeHuJtjUxbB2H.g6jHJLzyZBveqAIl",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "AS3DrnVt-AVUGxgZJsfoTzv0y1hhX1Zc"
      },
      {
        "uuid": "JLx3hkheQiiT2J+iBC+rNA==",
        "id": 85137315046,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:48:29Z",
        "timezone": "",
        "duration": 0,
        "total_size": 591759,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/hhFWPA1pzBCSi2EbKKYMyjp940cC5tAs4_G7X0QLeKppBvTu_mtGAgflwwo4VYHJ.h3EJdbeZ1Qv5Cceo",
        "recording_files": [
          {
            "id": "7cf89426-1818-4d12-86f0-794cf7538622",
            "meeting_id": "JLx3hkheQiiT2J+iBC+rNA==",
            "recording_start": "2024-11-29T16:48:36Z",
            "recording_end": "2024-11-29T16:48:45Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 439165,
            "play_url": "https://us06web.zoom.us/rec/play/WBwTaSYituFo7qhkrF7Ak344t-NeNrwgsshNBdEKdWavOa0en3f1Rzuf_QsfmFhntZCNNZaQpjQT3tyF.Ov17vbl-r1BPIMog",
            "download_url": "https://us06web.zoom.us/rec/download/WBwTaSYituFo7qhkrF7Ak344t-NeNrwgsshNBdEKdWavOa0en3f1Rzuf_QsfmFhntZCNNZaQpjQT3tyF.Ov17vbl-r1BPIMog",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "d0aa64e4-ed14-4937-98f5-09f569b79ba1",
            "meeting_id": "JLx3hkheQiiT2J+iBC+rNA==",
            "recording_start": "2024-11-29T16:48:36Z",
            "recording_end": "2024-11-29T16:48:45Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 152501,
            "play_url": "https://us06web.zoom.us/rec/play/QfwcgnF3P1_yCEGOYpyKaa_BuC7QQgNK83EhwZrrgOXcoMyGulq3fw3YKOVVEk-XqHW4UQ1yX2boo8kL.DSITfnoyGgwYUPBI",
            "download_url": "https://us06web.zoom.us/rec/download/QfwcgnF3P1_yCEGOYpyKaa_BuC7QQgNK83EhwZrrgOXcoMyGulq3fw3YKOVVEk-XqHW4UQ1yX2boo8kL.DSITfnoyGgwYUPBI",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "7cd744ce-5ada-4f50-ba93-2133dd96e7c9",
            "meeting_id": "JLx3hkheQiiT2J+iBC+rNA==",
            "recording_start": "2024-11-29T16:48:36Z",
            "recording_end": "2024-11-29T16:48:45Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/JhdLNHAfUHIR9XZA2yQt7Y6m9bYgL90pNGT5FeFCSULkX6L8mQGeblZnzLg_o4XH1MtKqdpbz6r8ANMb.tc1EpQvIFhyHbXlf",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "kqmfLBYqBj2VYTjN9Tybned2-UYZ300I"
      },
      {
        "uuid": "lgUiGwKoToapdVcSeGlZAw==",
        "id": 85306313388,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:48:10Z",
        "timezone": "",
        "duration": 0,
        "total_size": 438398,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/YftGIb3qps8ion3lWVcQw5gz5OC8EI0S7198kFzOox5tzBVCRav3tcrtToKdSl2p.ZqoXdguXxd3WHS4y",
        "recording_files": [
          {
            "id": "80ed647d-ceb8-4704-8b93-3f8a926c58fe",
            "meeting_id": "lgUiGwKoToapdVcSeGlZAw==",
            "recording_start": "2024-11-29T16:48:18Z",
            "recording_end": "2024-11-29T16:48:24Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 102595,
            "play_url": "https://us06web.zoom.us/rec/play/cS4pAlXIyHteY04vQDebdlDe0NVuk8PXzbGB3cAOiX3tJNqrJZ9PcoWsY3q2ZeJwHOdYn7aYVefAS5k.YWJ1sclTYbkyPG_1",
            "download_url": "https://us06web.zoom.us/rec/download/cS4pAlXIyHteY04vQDebdlDe0NVuk8PXzbGB3cAOiX3tJNqrJZ9PcoWsY3q2ZeJwHOdYn7aYVefAS5k.YWJ1sclTYbkyPG_1",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "876c8be7-56ea-4ffd-9897-cf817447f943",
            "meeting_id": "lgUiGwKoToapdVcSeGlZAw==",
            "recording_start": "2024-11-29T16:48:18Z",
            "recording_end": "2024-11-29T16:48:24Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/YjTuC9jQr2h6MVySUGU6yCy3lDUYO-1K34tKj2lltlKJ0Q3Dl9aG5N7ub4OT6ZMx0sslFMwCma_7eoDQ.5DctGHFy1ywETbOy",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "db9c91a9-9e87-46a9-a8a9-89425754848d",
            "meeting_id": "lgUiGwKoToapdVcSeGlZAw==",
            "recording_start": "2024-11-29T16:48:18Z",
            "recording_end": "2024-11-29T16:48:24Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 335710,
            "play_url": "https://us06web.zoom.us/rec/play/7s8NQcUW6ddTassP4dvfYwXyS8XxnLx9O5Mz0BIKBdMNDhz_WWwon5g33DUo-JWuCER74F0kHImovRof.xdMdNQ_WhFUO3r21",
            "download_url": "https://us06web.zoom.us/rec/download/7s8NQcUW6ddTassP4dvfYwXyS8XxnLx9O5Mz0BIKBdMNDhz_WWwon5g33DUo-JWuCER74F0kHImovRof.xdMdNQ_WhFUO3r21",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "Y7BWbHZ82w1zgOZiy684mV7vulAnhHVv"
      },
      {
        "uuid": "2+ZPvm41SG+UeF/ZVkBYMw==",
        "id": 89946391940,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:47:51Z",
        "timezone": "",
        "duration": 0,
        "total_size": 523619,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/OAtjSn2KLysv1lo7flv4PEXtmAL7yvRb4L125VCtVJjg9BJVuOUP3uwWUIxbWh4G.qaRfAxSXq08UjKla",
        "recording_files": [
          {
            "id": "02f8284d-0e38-4995-b107-59fab7ffe072",
            "meeting_id": "2+ZPvm41SG+UeF/ZVkBYMw==",
            "recording_start": "2024-11-29T16:47:58Z",
            "recording_end": "2024-11-29T16:48:06Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 132642,
            "play_url": "https://us06web.zoom.us/rec/play/no20bcPtU-XDggnX08o_9SAw81KzJER11ii5TXNYojCGg2eGDA8YwATFm0Csr_-hn2LXBenY4IKabb0i.FcTtjmn-iOdVOvZj",
            "download_url": "https://us06web.zoom.us/rec/download/no20bcPtU-XDggnX08o_9SAw81KzJER11ii5TXNYojCGg2eGDA8YwATFm0Csr_-hn2LXBenY4IKabb0i.FcTtjmn-iOdVOvZj",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "d74cc111-35dc-47b3-87c5-9698b91fe16a",
            "meeting_id": "2+ZPvm41SG+UeF/ZVkBYMw==",
            "recording_start": "2024-11-29T16:47:58Z",
            "recording_end": "2024-11-29T16:48:06Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/VYjHHJZYB_fD0y0EKPkwKkFNJJIRZ1Oaabzx6eLP-k0aTktKjE_Ha7JvwlXLpDl7q3PU8RyErqVd9UCp.HiBYxNy9yyZhgq6V",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "53c3036d-7d8a-4146-ac33-920af2271ced",
            "meeting_id": "2+ZPvm41SG+UeF/ZVkBYMw==",
            "recording_start": "2024-11-29T16:47:58Z",
            "recording_end": "2024-11-29T16:48:06Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 390884,
            "play_url": "https://us06web.zoom.us/rec/play/t5B42Kvv0quWftslwxDFoC29XiualSo3C-cPxrZDDjdiP2kfXFIesBBow_IMeU45LkUCs1qNgU2Lvx4._1ga-77r9rtjZNQD",
            "download_url": "https://us06web.zoom.us/rec/download/t5B42Kvv0quWftslwxDFoC29XiualSo3C-cPxrZDDjdiP2kfXFIesBBow_IMeU45LkUCs1qNgU2Lvx4._1ga-77r9rtjZNQD",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "L-JMx8Vza4LJlG6eRXlXK13UZ4p2F2KK"
      },
      {
        "uuid": "97N1w8HrRJKH+VYi20dDVw==",
        "id": 82875840650,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:47:31Z",
        "timezone": "",
        "duration": 0,
        "total_size": 571375,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/Q9dsx4RQ7YH1k4vw_sKAZ7HgIq8fgEkqGso48I7rDKtyFGHHwaoVP1NWVOgljfok.EE1YgJ3W8ELBQD2S",
        "recording_files": [
          {
            "id": "894874ac-a6bf-44fa-b162-7026cf727936",
            "meeting_id": "97N1w8HrRJKH+VYi20dDVw==",
            "recording_start": "2024-11-29T16:47:38Z",
            "recording_end": "2024-11-29T16:47:47Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 427442,
            "play_url": "https://us06web.zoom.us/rec/play/62A8L3z3Fk_gOJbfZqXV78GcH7MVyqr9-h8XVJ-Jkai7yu72bOCV7UGzD2aaMNoEBfyDAogvjoiVb8Dl.FbGpqYC91qXZBdeU",
            "download_url": "https://us06web.zoom.us/rec/download/62A8L3z3Fk_gOJbfZqXV78GcH7MVyqr9-h8XVJ-Jkai7yu72bOCV7UGzD2aaMNoEBfyDAogvjoiVb8Dl.FbGpqYC91qXZBdeU",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "fe87057b-da48-4a0b-b2ae-c0304bfa87b2",
            "meeting_id": "97N1w8HrRJKH+VYi20dDVw==",
            "recording_start": "2024-11-29T16:47:38Z",
            "recording_end": "2024-11-29T16:47:47Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 143840,
            "play_url": "https://us06web.zoom.us/rec/play/Lu94sF9aVDugykzBMNPTjJhG44HtgI3yhOHzgHZhEEPOYQ5xp0EQRMPp8FyTgbhjYLf_9iPtR42CHWl_.BGrq-qgiKZLDYJed",
            "download_url": "https://us06web.zoom.us/rec/download/Lu94sF9aVDugykzBMNPTjJhG44HtgI3yhOHzgHZhEEPOYQ5xp0EQRMPp8FyTgbhjYLf_9iPtR42CHWl_.BGrq-qgiKZLDYJed",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "e7a46f40-c3e3-4ee5-a747-9910285dd221",
            "meeting_id": "97N1w8HrRJKH+VYi20dDVw==",
            "recording_start": "2024-11-29T16:47:38Z",
            "recording_end": "2024-11-29T16:47:47Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/51lwflB99O8tEfdja1aPVnlzyvtlBW00KUffdzWb9-c4XxHRuLhoFYRLING-a0ibAzQptDYy8ecBTQ.9Aq062ceauIsaUl6",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "geCWB52CrVbVuriJIX6QhGmdVErvRX8g"
      },
      {
        "uuid": "/UE+cApLTmOc6HZxOLFclQ==",
        "id": 88516223979,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:47:08Z",
        "timezone": "",
        "duration": 0,
        "total_size": 646066,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/UWO9nvOaLaYzA9eziKDOid_QIukIH91SLLKPPbHqu6izGBpliS_bBZqgF38eZndc.M9kddWXVF4YWrqzH",
        "recording_files": [
          {
            "id": "4fe52355-c543-4328-a5fa-0690031d9be8",
            "meeting_id": "/UE+cApLTmOc6HZxOLFclQ==",
            "recording_start": "2024-11-29T16:47:16Z",
            "recording_end": "2024-11-29T16:47:27Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 168288,
            "play_url": "https://us06web.zoom.us/rec/play/Dd3DWG8dNqEnwy3b919OXNDq_HMxmPv4VzId9jn63-yeSUNcw5aS9stF8M2MGkSQkzfn7N30TWXh8rQR.ps5bHxwxh9nk-8v0",
            "download_url": "https://us06web.zoom.us/rec/download/Dd3DWG8dNqEnwy3b919OXNDq_HMxmPv4VzId9jn63-yeSUNcw5aS9stF8M2MGkSQkzfn7N30TWXh8rQR.ps5bHxwxh9nk-8v0",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "3a86dcac-1073-4221-b5fd-c1c203312c6c",
            "meeting_id": "/UE+cApLTmOc6HZxOLFclQ==",
            "recording_start": "2024-11-29T16:47:16Z",
            "recording_end": "2024-11-29T16:47:27Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/shl1WKpesMJhjp1FKc7E5epz_ruT7XEa6012oDZW00jXzUXWlDlaAOjrvMppz5ItuVXUw_LaqqtfOzSJ.eUYO5MDRw0GNl_yG",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "97d08778-655c-4642-8b95-f254b2775435",
            "meeting_id": "/UE+cApLTmOc6HZxOLFclQ==",
            "recording_start": "2024-11-29T16:47:16Z",
            "recording_end": "2024-11-29T16:47:27Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 477685,
            "play_url": "https://us06web.zoom.us/rec/play/Ga7_NXJxcc95LBMrUaILi16zkGV3eVM2-GyLuMg7dc9-jQK5SjB9_W3RpeIAEM3HbmGxuAfp-fR4ZL0.HxTUn-ku0SX3mQG-",
            "download_url": "https://us06web.zoom.us/rec/download/Ga7_NXJxcc95LBMrUaILi16zkGV3eVM2-GyLuMg7dc9-jQK5SjB9_W3RpeIAEM3HbmGxuAfp-fR4ZL0.HxTUn-ku0SX3mQG-",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "oSivjFCrckzPaQfjwDvhBcHs7_Yjvcvb"
      },
      {
        "uuid": "MOVxaICcQ8aEg1EXWXg0ng==",
        "id": 84833478512,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:46:49Z",
        "timezone": "",
        "duration": 0,
        "total_size": 504061,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/i0FbpHY7Otv3AQc7uh4M_DDSJpgTKk7B76b6UtobQTgXVGwhzYJEptynR2e5yf6Q.5fRL58Ko7NomKnnp",
        "recording_files": [
          {
            "id": "3d543eb8-e800-47e9-846b-cb97dfb2ed4e",
            "meeting_id": "MOVxaICcQ8aEg1EXWXg0ng==",
            "recording_start": "2024-11-29T16:46:56Z",
            "recording_end": "2024-11-29T16:47:03Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 381005,
            "play_url": "https://us06web.zoom.us/rec/play/tvvpDXrRqBKgo0dE2YbLSqIsU7EbIGn1RatHnmhWyFlr9uKCaH5sPbUWuauIm7P4UygFghgChQ1dYajB.uOSXP82cVfNPPz6a",
            "download_url": "https://us06web.zoom.us/rec/download/tvvpDXrRqBKgo0dE2YbLSqIsU7EbIGn1RatHnmhWyFlr9uKCaH5sPbUWuauIm7P4UygFghgChQ1dYajB.uOSXP82cVfNPPz6a",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "5e7d1e24-92a7-419d-9381-8eb682c689e3",
            "meeting_id": "MOVxaICcQ8aEg1EXWXg0ng==",
            "recording_start": "2024-11-29T16:46:56Z",
            "recording_end": "2024-11-29T16:47:03Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 122963,
            "play_url": "https://us06web.zoom.us/rec/play/q8QVqr94rKRj_P2KJamyOS6qOEpUSZhzlBJjhNl1GPGigLKMwh_b5IO3Y712-eMcMDoOmZLmdIZ1b8fj.oXijdA_ly8GiJUQA",
            "download_url": "https://us06web.zoom.us/rec/download/q8QVqr94rKRj_P2KJamyOS6qOEpUSZhzlBJjhNl1GPGigLKMwh_b5IO3Y712-eMcMDoOmZLmdIZ1b8fj.oXijdA_ly8GiJUQA",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "957e5ea4-5c5e-4aec-9221-d88f6db347ed",
            "meeting_id": "MOVxaICcQ8aEg1EXWXg0ng==",
            "recording_start": "2024-11-29T16:46:56Z",
            "recording_end": "2024-11-29T16:47:03Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/mRWVD8dTtWcQXVmxRrelICBq_knejaADY81ZdrEJBTpON4KXUa5BRE7EhVV1h7SAJMS3wt5Er0VylyWj.RHal-pR1YXOpTJ7t",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "R1XNLHljLnpI2vUarwWvfsKG3CmSsSMV"
      },
      {
        "uuid": "VsGkV7XUSqqeB5iNMnfoRw==",
        "id": 87855996521,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:46:31Z",
        "timezone": "",
        "duration": 0,
        "total_size": 424542,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/6_lVIUQUn7gYhJH3_zEDmuCUNHf19C4GrwCcxe6jb4Nc9ZIFcMuz3_pMXW4OK7N-.abv-7CEdSmkSWx1y",
        "recording_files": [
          {
            "id": "d3a2bb99-f7aa-4e59-b50c-fe26782836d1",
            "meeting_id": "VsGkV7XUSqqeB5iNMnfoRw==",
            "recording_start": "2024-11-29T16:46:39Z",
            "recording_end": "2024-11-29T16:46:45Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 321345,
            "play_url": "https://us06web.zoom.us/rec/play/E20al9NCPTD5K78AT76V5BbSAUiO5GrQerqG7Sc_2H8tc6K2ohZYOi2NvmLG6ObEdJbcUcB_bCGf_nQ.oGUt2uNyvES6bvsQ",
            "download_url": "https://us06web.zoom.us/rec/download/E20al9NCPTD5K78AT76V5BbSAUiO5GrQerqG7Sc_2H8tc6K2ohZYOi2NvmLG6ObEdJbcUcB_bCGf_nQ.oGUt2uNyvES6bvsQ",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "ea403200-7d83-478c-b685-8ab728b7e6e2",
            "meeting_id": "VsGkV7XUSqqeB5iNMnfoRw==",
            "recording_start": "2024-11-29T16:46:39Z",
            "recording_end": "2024-11-29T16:46:45Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 103104,
            "play_url": "https://us06web.zoom.us/rec/play/YV4Tc7XwFpkhCvTQczwLSG5C8u8N2sCNf5YSV4pPQQmM4ri5W6mnPsFSG6lbdNHqsr2ODnzoyFxoloyu.D5GHHJYsQYszI_Gh",
            "download_url": "https://us06web.zoom.us/rec/download/YV4Tc7XwFpkhCvTQczwLSG5C8u8N2sCNf5YSV4pPQQmM4ri5W6mnPsFSG6lbdNHqsr2ODnzoyFxoloyu.D5GHHJYsQYszI_Gh",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "5ac2ca33-f849-4c07-81b0-a0eb22590380",
            "meeting_id": "VsGkV7XUSqqeB5iNMnfoRw==",
            "recording_start": "2024-11-29T16:46:39Z",
            "recording_end": "2024-11-29T16:46:45Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/3pdr6EnZWLSc0ajS9KHhkQZDYL-WeM4Nv4ar23JxC8RDXQAUL3BNAvebvufyej0WkgNy8sTNOCo8vMV_.JgF-GwzaHXknkWsE",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "Mkb1OFHjrgz1K1Y4r5qddeEGjFPmutnq"
      },
      {
        "uuid": "hiEJCei2TTmP2Sr5g2zDWw==",
        "id": 84165580488,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:46:14Z",
        "timezone": "",
        "duration": 0,
        "total_size": 373085,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/MZxaN2K1bIcEfUAJdeApU7v_LHM9qC0wrJMBF3AaYQ4heBSBhbs_JSpSzFVTG03L.K7UUIsY0kZrLc379",
        "recording_files": [
          {
            "id": "88c18b65-0de5-4e6d-8536-9ae7e13bf56d",
            "meeting_id": "hiEJCei2TTmP2Sr5g2zDWw==",
            "recording_start": "2024-11-29T16:46:22Z",
            "recording_end": "2024-11-29T16:46:27Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 288220,
            "play_url": "https://us06web.zoom.us/rec/play/CShOpxvvgSQgdQFE54g_dgIlkJiyP5cQy74qSAfXJsWiGhsCM5_Cux1e0eWBDTaOWFtWd1W3rH-iGbnZ.h8WCdaE8jtbK8Dap",
            "download_url": "https://us06web.zoom.us/rec/download/CShOpxvvgSQgdQFE54g_dgIlkJiyP5cQy74qSAfXJsWiGhsCM5_Cux1e0eWBDTaOWFtWd1W3rH-iGbnZ.h8WCdaE8jtbK8Dap",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "8f087c1c-4f4b-4911-a611-904fede22282",
            "meeting_id": "hiEJCei2TTmP2Sr5g2zDWw==",
            "recording_start": "2024-11-29T16:46:22Z",
            "recording_end": "2024-11-29T16:46:27Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 84772,
            "play_url": "https://us06web.zoom.us/rec/play/jdzI_geE4V0I9gimbH4u9I5SbAmEVVoKY8ooOPofIW0nEsrYZqOMX5oVTA4L-bUXqqAV6WWORes9VbC-.EiOedlrnCe09Z0XO",
            "download_url": "https://us06web.zoom.us/rec/download/jdzI_geE4V0I9gimbH4u9I5SbAmEVVoKY8ooOPofIW0nEsrYZqOMX5oVTA4L-bUXqqAV6WWORes9VbC-.EiOedlrnCe09Z0XO",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "99d426a7-bed9-4fff-9837-81b9fc611cec",
            "meeting_id": "hiEJCei2TTmP2Sr5g2zDWw==",
            "recording_start": "2024-11-29T16:46:22Z",
            "recording_end": "2024-11-29T16:46:27Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/eJ_0xEzsR-ffZ-41FckiDrTe8RzP0aIBrlS3lZ_vRCWgiYi97iZUoNIvH225eZ_BbaR8T-veE_vB3lFH.AsF3V1Frm3FeMwzr",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "cXZgx_paRcNcGq0N730HFhsvsXL4NM_s"
      },
      {
        "uuid": "nDeZcwipROChYRvrREXKWg==",
        "id": 88135198633,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:43:04Z",
        "timezone": "",
        "duration": 0,
        "total_size": 316764,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/yQApf5sewldy_0LeMfqL124Z_Cov7NK_d7zAVqyQ5NiSDaXEjrryU9GLOdmBRXP4.K4NBJjlqXF2LnIiy",
        "recording_files": [
          {
            "id": "74ade212-8328-4cfd-a5b7-2d648e963c9f",
            "meeting_id": "nDeZcwipROChYRvrREXKWg==",
            "recording_start": "2024-11-29T16:43:10Z",
            "recording_end": "2024-11-29T16:43:15Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 243614,
            "play_url": "https://us06web.zoom.us/rec/play/xKlRDCkB4ea8_xUbSlhjC6jfXb5GsQKKKi8m32wYpVOJp5EgB9aAfseb6_q_VfWDz2o8e4EV1vp_iMXf.HEDUWv2Zai9nOBvx",
            "download_url": "https://us06web.zoom.us/rec/download/xKlRDCkB4ea8_xUbSlhjC6jfXb5GsQKKKi8m32wYpVOJp5EgB9aAfseb6_q_VfWDz2o8e4EV1vp_iMXf.HEDUWv2Zai9nOBvx",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "f20458b5-0143-4986-bd4d-61a9b6c651ed",
            "meeting_id": "nDeZcwipROChYRvrREXKWg==",
            "recording_start": "2024-11-29T16:43:10Z",
            "recording_end": "2024-11-29T16:43:15Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 73057,
            "play_url": "https://us06web.zoom.us/rec/play/iIWtfawo2_3NdT9PnmVKOll-GGMJ-glNC9TVI1ZNCR0vfRFq53xJnELkAk86GOrzcPC_CYUaK_KJ0j28.JbnF0oEoxAn8g5WY",
            "download_url": "https://us06web.zoom.us/rec/download/iIWtfawo2_3NdT9PnmVKOll-GGMJ-glNC9TVI1ZNCR0vfRFq53xJnELkAk86GOrzcPC_CYUaK_KJ0j28.JbnF0oEoxAn8g5WY",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "473b8fd3-04db-48f0-a220-ea654c337229",
            "meeting_id": "nDeZcwipROChYRvrREXKWg==",
            "recording_start": "2024-11-29T16:43:10Z",
            "recording_end": "2024-11-29T16:43:15Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/-XuLJ-TIFoOfwRxw1m96COJ8bdNOv2ECWqgm8ulsNOky3T7Awu8KLMhM8bW18MeATtnGAor7fo5lBLk.2F2qkIsElPI74wFW",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "ttWi5mkjKJ-Lh6-D0s2yFI6xP7-4AHkW"
      },
      {
        "uuid": "Yr7HSKHATT2R+cl4QIDglA==",
        "id": 84605017637,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:42:40Z",
        "timezone": "",
        "duration": 0,
        "total_size": 765790,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/CHJxMXgvXV322vwr2zHaAGVECV0dLe064EpbGMcMf_4KLR_w1foPpvM9M4xw4gWO.ZA1_pBoz1JxZxBw9",
        "recording_files": [
          {
            "id": "86763d9f-0bf1-4903-8a1b-9ece03802a71",
            "meeting_id": "Yr7HSKHATT2R+cl4QIDglA==",
            "recording_start": "2024-11-29T16:42:47Z",
            "recording_end": "2024-11-29T16:42:59Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 571442,
            "play_url": "https://us06web.zoom.us/rec/play/xiceCTkXqMZLXu969qL4lWhslSIONwPEazsAqRcIUHG6WLoS4l6omuvq6xkcs_NBEG6z4cE7IteN-uby.xbD3HPKkZ2WojTJm",
            "download_url": "https://us06web.zoom.us/rec/download/xiceCTkXqMZLXu969qL4lWhslSIONwPEazsAqRcIUHG6WLoS4l6omuvq6xkcs_NBEG6z4cE7IteN-uby.xbD3HPKkZ2WojTJm",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "be7604e8-77ed-479e-b0c0-62de2c027a15",
            "meeting_id": "Yr7HSKHATT2R+cl4QIDglA==",
            "recording_start": "2024-11-29T16:42:47Z",
            "recording_end": "2024-11-29T16:42:59Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 194255,
            "play_url": "https://us06web.zoom.us/rec/play/E3NMltjwQCijL08P3I9ooQGKHNVOPFdG7vF0zjeIsQwUbBU7ddRQfqKBCbn_isTAgDQIF-rkzashjVwe.vFKA27hnpSyPPlem",
            "download_url": "https://us06web.zoom.us/rec/download/E3NMltjwQCijL08P3I9ooQGKHNVOPFdG7vF0zjeIsQwUbBU7ddRQfqKBCbn_isTAgDQIF-rkzashjVwe.vFKA27hnpSyPPlem",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "39504552-02b7-4335-ac43-9ec4f22ed906",
            "meeting_id": "Yr7HSKHATT2R+cl4QIDglA==",
            "recording_start": "2024-11-29T16:42:47Z",
            "recording_end": "2024-11-29T16:42:59Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/ojERC-U_rLlaONbrOQAJfr7T44ZvXU3bxOCcv5aJAsBMW9ssOOgo33sHQwZBEZO3bACcMAvtcvnJjSSZ.ADhIZx1NquaCCgjj",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "1dEcwn1igJX1duAIq6UzYgz3KQwKLJuw"
      },
      {
        "uuid": "L6hG9AiCRNCXNDmmqwsi/g==",
        "id": 84529690740,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:42:22Z",
        "timezone": "",
        "duration": 0,
        "total_size": 528014,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/0VWGR2f4e9JqeqjJwiTCBd7E01XPUarBoyyjDHME9s0UBrO3DK4uIU-SU__6P83s.ni6k0SSTXya_xt1t",
        "recording_files": [
          {
            "id": "1ce2dd23-4172-4521-981e-2b1a5efd2301",
            "meeting_id": "L6hG9AiCRNCXNDmmqwsi/g==",
            "recording_start": "2024-11-29T16:42:28Z",
            "recording_end": "2024-11-29T16:42:36Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 123472,
            "play_url": "https://us06web.zoom.us/rec/play/kyCkzySNT6UKxbuSynfiXaRElPDUnbylUA6YGgZMCAFupOD7UEp3x06ZZyOQqLIHqlhiuw-OEb-1vQbp.5ZShJbIVOzQgAuVs",
            "download_url": "https://us06web.zoom.us/rec/download/kyCkzySNT6UKxbuSynfiXaRElPDUnbylUA6YGgZMCAFupOD7UEp3x06ZZyOQqLIHqlhiuw-OEb-1vQbp.5ZShJbIVOzQgAuVs",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "2f558bfd-d1e3-4d6e-abba-89feefdec788",
            "meeting_id": "L6hG9AiCRNCXNDmmqwsi/g==",
            "recording_start": "2024-11-29T16:42:28Z",
            "recording_end": "2024-11-29T16:42:36Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/vWuanR7WN1oz5rDA6gLD1O25NWlTkyOISjQrxaPkR5_GNA90a1X7s4yG9xMKe9CxW2k3RKQh1y3eUGDV.9KSi9UCzDiK5nCc8",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "df482cc5-7a3b-4168-9f7f-ee52ed5ef038",
            "meeting_id": "L6hG9AiCRNCXNDmmqwsi/g==",
            "recording_start": "2024-11-29T16:42:28Z",
            "recording_end": "2024-11-29T16:42:36Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 404449,
            "play_url": "https://us06web.zoom.us/rec/play/gV9zPusnsRoAQHVeoS8fBVh-v994eAY-Nr7k-PbrBav5c-8elAUepVtAhjJaM4wNKHyQfiG3BosSlX3M.VKnIUrvA7rIgOZ5W",
            "download_url": "https://us06web.zoom.us/rec/download/gV9zPusnsRoAQHVeoS8fBVh-v994eAY-Nr7k-PbrBav5c-8elAUepVtAhjJaM4wNKHyQfiG3BosSlX3M.VKnIUrvA7rIgOZ5W",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "vE7VJg0DX5xdGzYzMPfAzmkkq860QI7C"
      },
      {
        "uuid": "ykQZnMqeRqiF0xkLfDC6QA==",
        "id": 81181307276,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:41:59Z",
        "timezone": "",
        "duration": 0,
        "total_size": 650964,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/aX0JLOZ3fC_rajXIrkVIHxwNTvQb_5-3-YvCC1p_Y6xNWZZfhqYvhqTK7IcFyGuG.tAJzwvcxLAcs5rhb",
        "recording_files": [
          {
            "id": "887b563e-0079-423b-afb2-2d29464f2a24",
            "meeting_id": "ykQZnMqeRqiF0xkLfDC6QA==",
            "recording_start": "2024-11-29T16:42:07Z",
            "recording_end": "2024-11-29T16:42:18Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 164725,
            "play_url": "https://us06web.zoom.us/rec/play/t870eqdcOqiZCQrnaf1-B-83hJQoLiwd2VT6T_HvtrWIHtyXF7un1r268nT4f3HEcv3HG1i0T8LUt00.sgVoU2mgIDlqclCm",
            "download_url": "https://us06web.zoom.us/rec/download/t870eqdcOqiZCQrnaf1-B-83hJQoLiwd2VT6T_HvtrWIHtyXF7un1r268nT4f3HEcv3HG1i0T8LUt00.sgVoU2mgIDlqclCm",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "97b56432-ca05-4145-b5c7-1b19683a3db4",
            "meeting_id": "ykQZnMqeRqiF0xkLfDC6QA==",
            "recording_start": "2024-11-29T16:42:07Z",
            "recording_end": "2024-11-29T16:42:18Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/7X3uyJ5BtiIU0xBCXEC1PuBp6yGsWDBCp8JMENtDADuqFrnnPXyEOhd8hDbIqXXfAkawNAzcMunHX2YG.8dIO_yXnEAvQQd2X",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "ed382da7-305f-4ac8-8479-1c2dcf9ccc8b",
            "meeting_id": "ykQZnMqeRqiF0xkLfDC6QA==",
            "recording_start": "2024-11-29T16:42:07Z",
            "recording_end": "2024-11-29T16:42:18Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 486146,
            "play_url": "https://us06web.zoom.us/rec/play/dOO_SoHvJNXLeYHk8a_JY-gAUIsmbE9_Jxy1lXC7qP49b4V-VGI51dhBxYLwsFl6RjhmZErrEODjswEk.HmzMrIjloylP5RmM",
            "download_url": "https://us06web.zoom.us/rec/download/dOO_SoHvJNXLeYHk8a_JY-gAUIsmbE9_Jxy1lXC7qP49b4V-VGI51dhBxYLwsFl6RjhmZErrEODjswEk.HmzMrIjloylP5RmM",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "Hqg18pTJYAlbOub-os2rvftJDsUath-l"
      },
      {
        "uuid": "QKDKFMoNTpWQU0E+RkjHcw==",
        "id": 87827699025,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:41:37Z",
        "timezone": "",
        "duration": 0,
        "total_size": 631366,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/K8uhkAcvQbc6ColBtzMCL7hRowKKbYZykTMFzfTMzCquUHzJUk8gXpZR9tqJUpXi.ouPgQzU9x82_CTMX",
        "recording_files": [
          {
            "id": "efa48ceb-d3b8-4da2-b8cf-2cc90f4f5753",
            "meeting_id": "QKDKFMoNTpWQU0E+RkjHcw==",
            "recording_start": "2024-11-29T16:41:44Z",
            "recording_end": "2024-11-29T16:41:54Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 482335,
            "play_url": "https://us06web.zoom.us/rec/play/b63tDN5K6EssPGgXJDuBVpgihk8AQg3_IkXSzH5NXP989Ju8iMBtW75kggjMzlLTFkjz3v0Ayprs7vAK.S4q9sFEOpVUhcQCx",
            "download_url": "https://us06web.zoom.us/rec/download/b63tDN5K6EssPGgXJDuBVpgihk8AQg3_IkXSzH5NXP989Ju8iMBtW75kggjMzlLTFkjz3v0Ayprs7vAK.S4q9sFEOpVUhcQCx",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "f4bea321-f73a-44c9-a340-a0b672db4a92",
            "meeting_id": "QKDKFMoNTpWQU0E+RkjHcw==",
            "recording_start": "2024-11-29T16:41:44Z",
            "recording_end": "2024-11-29T16:41:54Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 148938,
            "play_url": "https://us06web.zoom.us/rec/play/Bdxu50bQ5ZgeyePZsL55S-YCSIExUWmwDjFqCFw3yHAj_F7SRWyBBIh6zj2alcG_A32XfImhVZo4tNuE.L0yNTr-9d0N3yTsv",
            "download_url": "https://us06web.zoom.us/rec/download/Bdxu50bQ5ZgeyePZsL55S-YCSIExUWmwDjFqCFw3yHAj_F7SRWyBBIh6zj2alcG_A32XfImhVZo4tNuE.L0yNTr-9d0N3yTsv",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "50131d21-3707-4909-9e54-2309684f650c",
            "meeting_id": "QKDKFMoNTpWQU0E+RkjHcw==",
            "recording_start": "2024-11-29T16:41:44Z",
            "recording_end": "2024-11-29T16:41:54Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/KaXHYJVJL5rX8Eh6rzkNn4-wAIm4IKcBGj5drsO8eBLgPUA20nYt4_WQciTO2xnUMLWa5DzQ3kPnfc1a.nnXzK5eCrlCnGXp2",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "xyJaQiQaoWOS7JgKJGggkWeQ5OYwM1-f"
      },
      {
        "uuid": "/z8UNSR8RaGPPDyT1wULKA==",
        "id": 87049998289,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:41:17Z",
        "timezone": "",
        "duration": 0,
        "total_size": 494798,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/H3FITfcmhX8m4qJ8lGRH0GE13aRwBVf3Amrrl_fEaeoj7Npt9mgznt244iKmZJqo.qnk26ZgoseGmnJUU",
        "recording_files": [
          {
            "id": "66f42a8b-f2e5-4dfc-9172-445fe56dfa12",
            "meeting_id": "/z8UNSR8RaGPPDyT1wULKA==",
            "recording_start": "2024-11-29T16:41:25Z",
            "recording_end": "2024-11-29T16:41:33Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 117364,
            "play_url": "https://us06web.zoom.us/rec/play/Gh6amMby35jYSCqPQ2zWTucsI6jB4yFo4tRyP12YtZ2lEKJdWGShMhsWyKwhlQ8nWOpdJFakOlCygiva.56dDO1o6hbPYOMcT",
            "download_url": "https://us06web.zoom.us/rec/download/Gh6amMby35jYSCqPQ2zWTucsI6jB4yFo4tRyP12YtZ2lEKJdWGShMhsWyKwhlQ8nWOpdJFakOlCygiva.56dDO1o6hbPYOMcT",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "1bad57dd-65c2-4488-bb38-b39893ad71b2",
            "meeting_id": "/z8UNSR8RaGPPDyT1wULKA==",
            "recording_start": "2024-11-29T16:41:25Z",
            "recording_end": "2024-11-29T16:41:33Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/kzSruF1iwpDHtQ4uH7IkODEwF9xnrIZVrK_uoKvAbyyfilvXlHnLCbQOitgCxFY0m2f8NEMrCcGsH59B.pTI_yag2tQXFNr_M",
            "status": "completed",
            "recording_type": "timeline"
          },
          {
            "id": "f01ce19c-5397-4c8d-90f8-1b4e493593ce",
            "meeting_id": "/z8UNSR8RaGPPDyT1wULKA==",
            "recording_start": "2024-11-29T16:41:25Z",
            "recording_end": "2024-11-29T16:41:33Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 377341,
            "play_url": "https://us06web.zoom.us/rec/play/4N56ynR5xkfdybGi3WZ4Pu1THPkE9RAsJ-JP4pFR2-UgMsisugFlfrvrsoMiUx9kZlxXGjAU3aZglnv9.7qeDktvnTGJgC1RH",
            "download_url": "https://us06web.zoom.us/rec/download/4N56ynR5xkfdybGi3WZ4Pu1THPkE9RAsJ-JP4pFR2-UgMsisugFlfrvrsoMiUx9kZlxXGjAU3aZglnv9.7qeDktvnTGJgC1RH",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          }
        ],
        "recording_play_passcode": "yIEfghMHyGdqA1m2HzjZ4b37LijgHp1I"
      },
      {
        "uuid": "eTpNrTpLQr2rQZCnLDRf7A==",
        "id": 88016730117,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:40:56Z",
        "timezone": "",
        "duration": 0,
        "total_size": 673519,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/8e1FmYNabJwH5w_vLIZ3wKP3nRgxYLdUhVAi2hDMGvPsejedXbbWdlDBbkmxRgJP.-pnXaj7fjX-8MF5T",
        "recording_files": [
          {
            "id": "a50274a5-dc73-4ffc-a65a-5c9b0a5b6b53",
            "meeting_id": "eTpNrTpLQr2rQZCnLDRf7A==",
            "recording_start": "2024-11-29T16:41:02Z",
            "recording_end": "2024-11-29T16:41:12Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 508192,
            "play_url": "https://us06web.zoom.us/rec/play/E6OwzWMW16MTL6SBEeveWgEZfG6h5RnJJB5vg5RLQUndShagUh9UTZBHmBlcc5qPQYoUnzXMk4ndGfSu.ibEbI56o5OgJUO5c",
            "download_url": "https://us06web.zoom.us/rec/download/E6OwzWMW16MTL6SBEeveWgEZfG6h5RnJJB5vg5RLQUndShagUh9UTZBHmBlcc5qPQYoUnzXMk4ndGfSu.ibEbI56o5OgJUO5c",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "e04219b0-6cfe-4ff6-84e8-ce31f23d708f",
            "meeting_id": "eTpNrTpLQr2rQZCnLDRf7A==",
            "recording_start": "2024-11-29T16:41:02Z",
            "recording_end": "2024-11-29T16:41:12Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 165234,
            "play_url": "https://us06web.zoom.us/rec/play/pOUnqihVsYBJ1xl3OsUVlPNu0fqtMMexIhnkiloOh6xqD5yq5-1i6rNojhzsYlGd0AFyd-ci_OcWe1Vk.rum6yq3KS5JXZ2iD",
            "download_url": "https://us06web.zoom.us/rec/download/pOUnqihVsYBJ1xl3OsUVlPNu0fqtMMexIhnkiloOh6xqD5yq5-1i6rNojhzsYlGd0AFyd-ci_OcWe1Vk.rum6yq3KS5JXZ2iD",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "7e9b4327-e485-4b0e-8c50-a47b87592849",
            "meeting_id": "eTpNrTpLQr2rQZCnLDRf7A==",
            "recording_start": "2024-11-29T16:41:02Z",
            "recording_end": "2024-11-29T16:41:12Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/YEbN_9I24hsy_FWHE8lxOntwLeZIedQPBzH_TlMdyo0LNgcIN71DI70fOT-4df31A4DgpBcFUiU9_pzP.MeCWXiSw5MxWimVj",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "OxC7UkCN1vuzOvYc4tDvKy75TuS8i6YN"
      },
      {
        "uuid": "Cn8sIsx/RY2REPUzQtJA7Q==",
        "id": 87632287680,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:40:38Z",
        "timezone": "",
        "duration": 0,
        "total_size": 468648,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/sup1bKPN2VM1x8sdCJQ6OnS-PxTTSmYxZsepdtt97z5FGQTiNHaMGGttU6vnAvub.GCiVlOraXxcIFGnM",
        "recording_files": [
          {
            "id": "51309365-b312-448d-ab7c-522f4ea54e2c",
            "meeting_id": "Cn8sIsx/RY2REPUzQtJA7Q==",
            "recording_start": "2024-11-29T16:40:44Z",
            "recording_end": "2024-11-29T16:40:51Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 357307,
            "play_url": "https://us06web.zoom.us/rec/play/36ElMYtPZOy_McbkR0gtVLrLgRWMaus503Xt4i7kw42suKNXFB85H3XoCpSoecxCXuMckyxiV6Ubd3F9.3-3iNXFkkkpLgMQJ",
            "download_url": "https://us06web.zoom.us/rec/download/36ElMYtPZOy_McbkR0gtVLrLgRWMaus503Xt4i7kw42suKNXFB85H3XoCpSoecxCXuMckyxiV6Ubd3F9.3-3iNXFkkkpLgMQJ",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "f5c436fe-c862-4dd1-a7e1-a86f4a43cf0f",
            "meeting_id": "Cn8sIsx/RY2REPUzQtJA7Q==",
            "recording_start": "2024-11-29T16:40:44Z",
            "recording_end": "2024-11-29T16:40:51Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 111248,
            "play_url": "https://us06web.zoom.us/rec/play/WyxnEi7WFi1so1VDQbJQx1WUN31a3LBvKpZ-wNuW4YEj1rtkjAbt22lY9AHzVEcikcWYLqhWGdeU7yKd.Ie7OmybOjDcAKtiv",
            "download_url": "https://us06web.zoom.us/rec/download/WyxnEi7WFi1so1VDQbJQx1WUN31a3LBvKpZ-wNuW4YEj1rtkjAbt22lY9AHzVEcikcWYLqhWGdeU7yKd.Ie7OmybOjDcAKtiv",
            "status": "completed",
            "recording_type": "audio_only"
          },
          {
            "id": "0f4f6198-b00c-4ad5-8906-3f159613c90b",
            "meeting_id": "Cn8sIsx/RY2REPUzQtJA7Q==",
            "recording_start": "2024-11-29T16:40:44Z",
            "recording_end": "2024-11-29T16:40:51Z",
            "file_type": "TIMELINE",
            "file_extension": "JSON",
            "file_size": 93,
            "download_url": "https://us06web.zoom.us/rec/download/G9RQRGN3kWfsjRaCG5A3wNrQ9VMhLEi_HiFSXiUJS262f0Um3CE-rDEDcdFw8m1lMwcsm-t5NP59kQsW.rjZOLsPt6jKyVXou",
            "status": "completed",
            "recording_type": "timeline"
          }
        ],
        "recording_play_passcode": "TgWuDdo8rEsEJd8I4PhJt2L-7FtmHBau"
      },
      {
        "uuid": "hShLYb1+TwaODkjJtGpF6w==",
        "id": 84908130120,
        "account_id": "uET0tmHjSNKK9pR945WnSg",
        "host_id": "MoRLcTuVS12AoJ72n6L11Q",
        "topic": "Bastien Beurier's Zoom Meeting",
        "type": 1,
        "start_time": "2024-11-29T16:40:19Z",
        "timezone": "",
        "duration": 0,
        "total_size": 556397,
        "recording_count": 3,
        "share_url": "https://us06web.zoom.us/rec/share/d0EzqrQqxYdhcgYWfZoHtCUQY2CbawbNN3JaV_UsD1Tj16bFkWlsW3pBbkHQ3Uya.nRrlbbyMzR9lv74R",
        "recording_files": [
          {
            "id": "4b667c7b-7669-430f-9955-9c4415d85e45",
            "meeting_id": "hShLYb1+TwaODkjJtGpF6w==",
            "recording_start": "2024-11-29T16:40:25Z",
            "recording_end": "2024-11-29T16:40:34Z",
            "file_type": "MP4",
            "file_extension": "MP4",
            "file_size": 419081,
            "play_url": "https://us06web.zoom.us/rec/play/7zD4xvZSFu7SiY0v94FHAI-yIhvYbZnJEjyncdOIBNDRn3PC9ZvWVpMdRbfHjZUgSkkiQ2aYuq3ivUjv.lJMFJ-zBNR3dBCBt",
            "download_url": "https://us06web.zoom.us/rec/download/7zD4xvZSFu7SiY0v94FHAI-yIhvYbZnJEjyncdOIBNDRn3PC9ZvWVpMdRbfHjZUgSkkiQ2aYuq3ivUjv.lJMFJ-zBNR3dBCBt",
            "status": "completed",
            "recording_type": "shared_screen_with_speaker_view"
          },
          {
            "id": "a9b74152-e801-4495-90eb-3ab28b74e0a3",
            "meeting_id": "hShLYb1+TwaODkjJtGpF6w==",
            "recording_start": "2024-11-29T16:40:25Z",
            "recording_end": "2024-11-29T16:40:34Z",
            "file_type": "M4A",
            "file_extension": "M4A",
            "file_size": 137223,
            "play_url": "https://us06web.zoom.us/rec/play/nha5NiNm3lT4AWAtOdMQywm1uLDqfEOcXLbE-pPVLnD1cecqb9_tdUjQE8FUToWPUDEkYE8iIH2CJMNk.Dh6FDItiTEJdSrRf",
            "download_url": "https://us06web.zoom.us/rec/download/nha5NiNm3lT4AWAtOdMQywm1uLDqfEOcXLbE-pPVLnD1cecqb9_tdUjQE8FUToWPUDEkYE8iIH2CJMNk.Dh6FDItiTEJdSrRf",
            "status": "completed",
            "recording_type": "audio_only"
          },
      …
  • Loading branch information
nalanj and bodinsamuel authored Dec 5, 2024
1 parent 9eeb271 commit f625c61
Showing 1 changed file with 123 additions and 36 deletions.
159 changes: 123 additions & 36 deletions packages/cli/lib/services/response-saver.service.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,62 @@
import fs from 'node:fs';
import path from 'node:path';
import type { AxiosResponse } from 'axios';
import crypto from 'node:crypto';
import type { AxiosRequestConfig, AxiosResponse } from 'axios';
import type { Connection } from '@nangohq/shared';
import type { Metadata } from '@nangohq/types';

const FILTER_HEADERS = [
'authorization',
'user-agent',
'nango-proxy-user-agent',
'accept-encoding',
'retries',
'host',
'connection-id',
'provider-config-key',
'nango-is-sync',
'nango-is-dry-run',
'nango-activity-log-id',
'content-type',
'accept',
'base-url-override'
];

interface ConfigIdentity {
method: string;
endpoint: string;
requestIdentityHash: string;
requestIdentity: RequestIdentity;
}

interface RequestIdentity {
method: string;
endpoint: string;
params: [string, unknown][];
headers: [string, unknown][];
data?: unknown;
}

interface CachedRequest {
requestIdentityHash: string;
requestIdentity: RequestIdentity;
response: unknown;
status: number;
headers: Record<string, string>;
}

export function ensureDirectoryExists(directoryName: string): void {
if (!fs.existsSync(directoryName)) {
fs.mkdirSync(directoryName, { recursive: true });
}
}

function saveResponse<T>({
directoryName,
data,
customFilePath,
concatenateIfExists
}: {
directoryName: string;
data: T | T[];
customFilePath: string;
concatenateIfExists: boolean;
}): void {
function saveResponse<T>({ directoryName, data, customFilePath }: { directoryName: string; data: T | T[]; customFilePath: string }): void {
ensureDirectoryExists(`${directoryName}/mocks`);

const filePath = path.join(directoryName, customFilePath);
ensureDirectoryExists(path.dirname(filePath));

if (fs.existsSync(filePath)) {
const existingData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
if (concatenateIfExists && Array.isArray(existingData) && Array.isArray(data)) {
data = data.concat(existingData);
}
}

fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
}

Expand All @@ -51,7 +75,6 @@ export function onAxiosRequestFulfilled({
return response;
}
const directoryName = `${process.env['NANGO_MOCKS_RESPONSE_DIRECTORY'] ?? ''}${providerConfigKey}`;
const method = response.config.method?.toLowerCase() || 'get';

if (response.request.path.includes(`/connection/${connectionId}?provider_config_key=${providerConfigKey}`)) {
const connection = response.data as Connection;
Expand All @@ -60,35 +83,99 @@ export function onAxiosRequestFulfilled({
saveResponse<Pick<Connection, 'metadata' | 'connection_config'>>({
directoryName,
data: { metadata: connection.metadata as Metadata, connection_config: connection.connection_config },
customFilePath: 'mocks/nango/getConnection.json',
concatenateIfExists: false
customFilePath: 'mocks/nango/getConnection.json'
});

saveResponse<Metadata>({
directoryName,
data: connection.metadata as Metadata,
customFilePath: 'mocks/nango/getMetadata.json',
concatenateIfExists: false
customFilePath: 'mocks/nango/getMetadata.json'
});

return response;
}

const [pathname, params] = response.request.path.split('?');
const strippedPath = pathname.replace('/', '');

let concatenateIfExists = false;

if (params && params.includes('page')) {
concatenateIfExists = true;
}
const requestIdentity = computeConfigIdentity(response.config);

saveResponse<AxiosResponse>({
saveResponse<CachedRequest>({
directoryName,
data: response.data,
customFilePath: `mocks/nango/${method}/${strippedPath}/${syncName}.json`,
concatenateIfExists
data: {
...requestIdentity,
response: response.data,
status: response.status,
headers: response.headers as Record<string, string>
},
customFilePath: `mocks/nango/${requestIdentity.method}/proxy/${requestIdentity.endpoint}/${syncName}/${requestIdentity.requestIdentityHash}.json`
});

return response;
}

function computeConfigIdentity(config: AxiosRequestConfig): ConfigIdentity {
const method = config.method?.toLowerCase() || 'get';
const params = sortEntries(Object.entries(config.params || {}));

const url = new URL(config.url!);
const endpoint = url.pathname.replace(/^\/proxy\//, '');

const dataIdentity = computeDataIdentity(config);

let headers: [string, string][] = [];
if (config.headers !== undefined) {
const filteredHeaders = Object.entries(config.headers).filter(([key]) => !FILTER_HEADERS.includes(key.toLowerCase()));
sortEntries(filteredHeaders);
headers = filteredHeaders;
}

// order is important to the request hash
const requestIdentity: RequestIdentity = {
method,
endpoint,
params,
headers,
data: dataIdentity
};
const requestIdentityHash = crypto.createHash('sha1').update(JSON.stringify(requestIdentity)).digest('hex');

return {
method,
endpoint,
requestIdentityHash,
requestIdentity
};
}

function sortEntries(entries: [string, unknown][]): [string, unknown][] {
return entries.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
}

function computeDataIdentity(config: AxiosRequestConfig): string | undefined {
const data = config.data;

if (!data) {
return undefined;
}

let dataString = '';
if (typeof data === 'string') {
dataString = data;
} else if (Buffer.isBuffer(data)) {
dataString = data.toString('base64');
} else {
try {
dataString = JSON.stringify(data);
} catch (e) {
if (e instanceof Error) {
throw new Error(`Unable to compute request identity: ${e.message}`);
} else {
throw new Error('Unable to compute request identity');
}
}
}

if (dataString.length > 1000) {
return 'sha1:' + crypto.createHash('sha1').update(dataString).digest('hex');
} else {
return dataString;
}
}

0 comments on commit f625c61

Please sign in to comment.