ar-io / arns-service

Koa microservice that leverages Warp to support the ArNS Portal and ar.io observers.
https://api.arns.app
GNU Affero General Public License v3.0
19 stars 4 forks source link

feat(pagination): add pagination to `/interactions` endpoints #80

Closed dtfiedler closed 7 months ago

dtfiedler commented 7 months ago

Adds support for pagination on the /interactions endpoints (wallets and contracts). There is another opportunity to use a read-through promise cache as noted in 2adbb89.

Example requests (contracts): First page:

❯ curl localhost -s http://localhost:3000/v1/contract/bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U/interactions\?page\=1\&pageSize\=1 | jq '.'
{
  "contractTxId": "bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U",
  "sortKey": "000001321463,0000000000000,1f18c85c9f62f291296710858878d39802abe09dd55771f804858ec359f972f5",
  "interactions": [
    {
      "height": 1321463,
      "timestamp": 1702454667,
      "input": {
        "function": "tick"
      },
      "owner": "JNC6vBhjHY1EPwV3pEeNmrsgFMxH5d38_LHsZ7jful8",
      "sortKey": "000001321463,0000000000000,1f18c85c9f62f291296710858878d39802abe09dd55771f804858ec359f972f5",
      "valid": true,
      "id": "EI5YhgfshC3TIBbuT2vKjdGa9KUh76NUmpDfR6tghcs"
    }
  ],
  "pages": {
    "page": 1,
    "pageSize": 1,
    "totalPages": 6972,
    "totalItems": 6972,
    "hasNextPage": true
  },
  "evaluationOptions": {
    "maxInteractionEvaluationTimeSeconds": 3600
  }
}

Last page (at the time):

❯ curl localhost -s http://localhost:3000/v1/contract/bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U/interactions\?page\=6972\&pageSize\=1 | jq '.'
{
  "contractTxId": "bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U",
  "sortKey": "000001321463,0000000000000,1f18c85c9f62f291296710858878d39802abe09dd55771f804858ec359f972f5",
  "interactions": [
    {
      "height": 960086,
      "timestamp": 1655960383,
      "input": {
        "function": "addANTSourceCodeTx",
        "contractTransactionId": "JIIB01pRbNK2-UyNxwQK-6eknrjENMTpTvQmB8ZDzQg"
      },
      "owner": "QGWqtJdLLgm2ehFWiiPzMaoFLD50CnGuzZIPEdoDRGQ",
      "sortKey": "000000960086,0000000000000,c92db52f533b5cdb77069018ddcde359f259fd46e037fe32d6f2f71e416e7b47",
      "valid": true,
      "id": "TCVdA6ArIpN1bZLkLx080apBmf0DKfNWL12-NKLuEyg"
    }
  ],
  "pages": {
    "page": 6972,
    "pageSize": 1,
    "totalPages": 6972,
    "totalItems": 6972,
    "hasNextPage": false
  },
  "evaluationOptions": {
    "maxInteractionEvaluationTimeSeconds": 3600
  }
}

Example request (wallets):

❯ curl -s http://localhost:3000/v1/wallet/7waR8v4STuwPnTck1zFVkQqJh5K9q9Zik4Y5-5dV7nk/contract/bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U\?page\=1\&pageSize\=1 | jq '.'
{
  "contractTxId": "bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U",
  "address": "7waR8v4STuwPnTck1zFVkQqJh5K9q9Zik4Y5-5dV7nk",
  "sortKey": "000001321447,0000000000000,bb55f93485dd313bf468efd8650eae13cef601ec7efa034f61be6b9420b2d085",
  "interactions": [
    {
      "height": 1313735,
      "timestamp": 1701459390,
      "input": {
        "function": "buyRecord",
        "name": "lmfao",
        "contractTxId": "atomic",
        "type": "permabuy",
        "auction": true
      },
      "owner": "7waR8v4STuwPnTck1zFVkQqJh5K9q9Zik4Y5-5dV7nk",
      "sortKey": "000001313735,0000000000000,8113762a7f66e07213d2aee7692e5d8fe7a4d6753222c4e8d9c30e172b91aa91",
      "valid": true,
      "id": "wgiMij9Ba69ws8lpNoN-UxbWeX8jzmWkytB1VVQNZUU"
    }
  ],
  "pages": {
    "page": 1,
    "pageSize": 1,
    "totalPages": 121,
    "totalItems": 121,
    "hasNextPage": true
  },
  "evaluationOptions": {
    "maxInteractionEvaluationTimeSeconds": 3600
  }
}

This updated endpoint can/should be used by the arns-portal where appropriate - cc @atticusofsparta / @kunstmusik