如何使用 Shyft GraphQL API 查询 Raffle 项目账户

  • Shyft_to
  • 发布于 2023-11-25 15:41
  • 阅读 5

本文介绍了如何使用 SHYFT 的 GraphQL API 查询 FamousFox Raffle program 的数据。

如何使用 Shyft GraphQL API 查询 Raffle 程序账户

在本文中,我们将了解如何使用 SHYFT 的 GraphQL API 查询 FamousFox Raffle 程序的数据。

在之前的文章中,我们向你介绍了 Shyft 的 GraphQL API,它们正在彻底改变你与 Solana 程序账户数据交互的方式。这些 API 提供了一种无缝的方法来查询任何程序的账户数据,为传统的 getProgramAccounts() 方法提供了一个 强大的替代方案。如果你错过了那篇文章,可以通过点击这个链接重新阅读。

在今天的文章中,我们将指导你使用 Shyft 的 GraphQL API 来查询来自 FFF Raffles 的数据,演示各种功能的实现:

  1. 查询所有带有分页支持的 raffle。
  2. 按最近添加、价格(从高到低)和价格(从低到高)对 raffle 进行排序。
  3. 按创建者地址或 mint token 过滤 raffle。

听起来是不是很有趣?让我们深入了解如何充分利用这些功能。

首先,我们需要准备一些东西。

注册你的 Shyft 账户并获取你自己的 Shyft API 密钥。

x-api-key 是一个身份验证参数,它使你可以访问 Shyft API你可以从 Shyft 网站获取 你自己的 API 密钥。只需在此处使用你的电子邮件 ID 注册,即可免费获得。如果你已经拥有 Shyft API 密钥,请跳过此步骤。

支持 API 调用的 NextJs 或任何开发环境/堆栈

我们在这个项目中使用的是 Next JS,但这可以在任何应用程序开发环境中完成。有关 如何使用 Next.js 1 设置 GraphQL 的更多信息,请参考此链接 3。

你可以从此 repo 克隆本文的完整源代码。

查询所有带有分页支持的 raffle。

使用 Shyft GraphQL API,查询所有带有分页支持的 raffle 易如反掌。 查询结构非常简单:

query FFF_Raffle_Raffle($limit: Int, $offset: Int) {
  FFF_Raffle_Raffle(limit: $limit, offset: $offset) {
    claimedPrizes
    cm
    creator
    endTimestamp
    entrants
    fox
    holderOnly
    lamports
    limit
    mint
    numberSold
    prize
    pubkey
    randomness
    startTimestamp
    ticketPrice
    totalPrizes
    totalTickets
    winner
    winnerCount
  }
}

为了实现分页,我们可以通过指定 limitoffset 字段来自定义查询。limit 参数确定返回的行数(默认为 1000),而 offset 参数设置结果集的起始点。你的代码片段可能如下所示:

const ITEM_PER_PAGE = 50;

const query = gql`
  query FFF_Raffle_Raffle($limit: Int, $offset: Int) {
    FFF_Raffle_Raffle(limit: $limit, offset: $offset) {
      claimedPrizes
      cm
      creator
      ...
    }
  }
`;

const variables = {
  limit: ITEM_PER_PAGE,
  offset: 0,
}

const { loading, data, fetchMore } = useQuery(query, {
    variables,
});

const raffles = (data?.FFF_Raffle_Raffle ?? []) as RafffleItemType[];

通过结合 limitoffset 参数,你可以轻松地合并分页 - 这是传统 getProgramAccounts() 方法不支持的功能。

排序 raffle

Shyft GraphQL API 使我们能够根据任何期望的字段无缝地对返回的结果进行排序。 排序过程通过指定我们要排序的字段以及我们希望排序的方向(ascdesc)来执行。 让我们相应地增强查询:

query FFF_Raffle_Raffle(
  $limit: Int
  $offset: Int
  $orderBy: [FFF_Raffle_Raffle_order_by!]
) {
  FFF_Raffle_Raffle(limit: $limit, offset: $offset, order_by: $orderBy) {
    claimedPrizes
    cm
    creator
    ...
  }
}

现在,让我们将其转化为代码:

const ITEM_PER_PAGE = 50;

const query = gql`
  query FFF_Raffle_Raffle(
    $limit: Int
    $offset: Int
    $orderBy: [FFF_Raffle_Raffle_order_by!]
  ) {
    FFF_Raffle_Raffle(limit: $limit, offset: $offset, order_by: $orderBy) {
      claimedPrizes
      cm
      creator
      ...
    }
  }
`;

const sortByField = "startTimestamp";
const sortByDirection = "desc";

const variables = {
  orderBy: [\
    {\
      [sortByField]: sortByDirection,\
    },\
  ],
  limit: ITEM_PER_PAGE,
  offset: 0,
}

const { loading, data, fetchMore } = useQuery(query, {
    variables,
});

const raffles = (data?.FFF_Raffle_Raffle ?? []) as RafffleItemType[];

在上面的例子中,我们根据 startTimestamp 字段按降序(最新到最旧)对结果进行排序。 通过更新 sortByFieldsortByDirection 的值,你可以轻松自定义 raffle 列表的排序 - 无论是按价格(从高到低)、价格(从低到高)还是你喜欢的任何顺序。

过滤 raffle

如果你想要查询由特定创建者创建的所有 raffle,Shyft GraphQL API 不仅使之成为可能,而且还很简单。 这些 API 提供了基于任何期望字段过滤结果的功能。 此外,你可以灵活地从各种比较表达式中进行选择,例如 _eq(等于)和 _like(类似于 SQL 的 LIKE 运算符)。

现在,让我们增强查询:

query FFF_Raffle_Raffle(
  $limit: Int
  $offset: Int
  $orderBy: [FFF_Raffle_Raffle_order_by!]
  $where: FFF_Raffle_Raffle_bool_exp
) {
  FFF_Raffle_Raffle(
    limit: $limit
    offset: $offset
    order_by: $orderBy
    where: $where
  ) {
    claimedPrizes
    cm
    creator
    ...
  }
}

将其转化为代码:

const ITEM_PER_PAGE = 50;

const query = gql`
  query FFF_Raffle_Raffle(
    $limit: Int
    $offset: Int
    $orderBy: [FFF_Raffle_Raffle_order_by!]
    $where: FFF_Raffle_Raffle_bool_exp
  ) {
    FFF_Raffle_Raffle(
      limit: $limit
      offset: $offset
      order_by: $orderBy
      where: $where
    ) {
      claimedPrizes
      cm
      creator
      ...
    }
  }
`;

const creator = "desc";
const sortByField = "startTimestamp";
const sortByDirection = "2NN5VR5UVtRY7mAM18cnxcJ8qXwqWFxLrF2J5bJXBJoz";

const variables = {
  where: {
    creator: {
      _eq: creator
    }
  }
  orderBy: [\
    {\
      [sortByField]: sortByDirection,\
    },\
  ],
  limit: ITEM_PER_PAGE,
  offset: 0,
}

const { loading, data, fetchMore } = useQuery(query, {
    variables,
});

const raffles = (data?.FFF_Raffle_Raffle ?? []) as RafffleItemType[];

在这个例子中,我们查询由特定创建者创建的所有 raffle。 filter 参数与 _eq 表达式结合使用,使我们能够精确地缩小结果范围。 这种程度的特异性确保你检索到正在寻找的精确数据。

设置好一切并运行应用程序后,我们会收到如下面视频所示的结果。

结论

因此,我们刚刚向你介绍了使用 Shyft GraphQL API 与 FFF Raffles 交互的来龙去脉。 借助 Shyft GraphQL API,查询所有带有分页支持的 raffle、按任何字段对 raffle 进行排序以及按创建者和 mint token 过滤 raffle 变得轻松实现。 我们希望通过本文,你能够获得将 Shyft GraphQL API 无缝集成到你的 Dapp 应用程序中的知识和信心,使你能够制作真正引人入胜和创新的产品。

我们真诚地希望你喜欢阅读这篇博文! 如果你有任何疑问或想法,请随时访问我们的 Discord 社区。

非常感谢你抽出时间阅读!

资源

  • 原文链接: blogs.shyft.to/how-to-qu...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Shyft_to
Shyft_to
在 Solana上更快更智能地构建,使用Shyft的SuperIndexer、gRPC、RPC、API和SDK