QueryNodeApi.ts 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. import { ApolloClient, DocumentNode, NormalizedCacheObject } from '@apollo/client/core'
  2. import { MemberId, PostId, ThreadId } from '@joystream/types/common'
  3. import { extendDebug, Debugger } from './Debugger'
  4. import { ApplicationId, OpeningId, WorkerId } from '@joystream/types/working-group'
  5. import { EventDetails, WorkingGroupModuleName } from './types'
  6. import {
  7. ElectedCouncilFieldsFragment,
  8. GetCurrentCouncilMembers,
  9. GetCurrentCouncilMembersQuery,
  10. GetCurrentCouncilMembersQueryVariables,
  11. CandidateFieldsFragment,
  12. GetReferendumIntermediateWinners,
  13. GetReferendumIntermediateWinnersQuery,
  14. GetReferendumIntermediateWinnersQueryVariables,
  15. GetMemberByIdQuery,
  16. GetMemberByIdQueryVariables,
  17. GetMemberById,
  18. GetMemberProfileUpdatedEventsByMemberIdQuery,
  19. GetMemberProfileUpdatedEventsByMemberIdQueryVariables,
  20. GetMemberProfileUpdatedEventsByMemberId,
  21. GetMemberAccountsUpdatedEventsByMemberIdQuery,
  22. GetMemberAccountsUpdatedEventsByMemberIdQueryVariables,
  23. GetMemberAccountsUpdatedEventsByMemberId,
  24. GetInvitesTransferredEventsBySourceMemberIdQuery,
  25. GetInvitesTransferredEventsBySourceMemberIdQueryVariables,
  26. GetInvitesTransferredEventsBySourceMemberId,
  27. GetStakingAccountRemovedEventsByMemberIdQuery,
  28. GetStakingAccountRemovedEventsByMemberIdQueryVariables,
  29. GetStakingAccountRemovedEventsByMemberId,
  30. GetMembershipSystemSnapshotAtQuery,
  31. GetMembershipSystemSnapshotAtQueryVariables,
  32. GetMembershipSystemSnapshotAt,
  33. GetMembershipSystemSnapshotBeforeQuery,
  34. GetMembershipSystemSnapshotBeforeQueryVariables,
  35. GetMembershipSystemSnapshotBefore,
  36. GetReferralCutUpdatedEventsByEventIdQuery,
  37. GetReferralCutUpdatedEventsByEventIdQueryVariables,
  38. GetReferralCutUpdatedEventsByEventId,
  39. GetMembershipPriceUpdatedEventsByEventIdQuery,
  40. GetMembershipPriceUpdatedEventsByEventIdQueryVariables,
  41. GetMembershipPriceUpdatedEventsByEventId,
  42. GetInitialInvitationBalanceUpdatedEventsByEventIdQuery,
  43. GetInitialInvitationBalanceUpdatedEventsByEventIdQueryVariables,
  44. GetInitialInvitationBalanceUpdatedEventsByEventId,
  45. GetInitialInvitationCountUpdatedEventsByEventIdQuery,
  46. GetInitialInvitationCountUpdatedEventsByEventIdQueryVariables,
  47. GetInitialInvitationCountUpdatedEventsByEventId,
  48. GetOpeningByIdQuery,
  49. GetOpeningByIdQueryVariables,
  50. GetOpeningById,
  51. GetApplicationByIdQuery,
  52. GetApplicationByIdQueryVariables,
  53. GetApplicationById,
  54. GetAppliedOnOpeningEventsByEventIdsQuery,
  55. GetAppliedOnOpeningEventsByEventIdsQueryVariables,
  56. GetAppliedOnOpeningEventsByEventIds,
  57. GetOpeningAddedEventsByEventIdsQuery,
  58. GetOpeningAddedEventsByEventIdsQueryVariables,
  59. GetOpeningAddedEventsByEventIds,
  60. GetOpeningFilledEventsByEventIdsQuery,
  61. GetOpeningFilledEventsByEventIdsQueryVariables,
  62. GetOpeningFilledEventsByEventIds,
  63. GetApplicationWithdrawnEventsByEventIdsQuery,
  64. GetApplicationWithdrawnEventsByEventIdsQueryVariables,
  65. GetApplicationWithdrawnEventsByEventIds,
  66. GetOpeningCancelledEventsByEventIdsQuery,
  67. GetOpeningCancelledEventsByEventIdsQueryVariables,
  68. GetOpeningCancelledEventsByEventIds,
  69. GetStatusTextChangedEventsByEventIdsQuery,
  70. GetStatusTextChangedEventsByEventIdsQueryVariables,
  71. GetStatusTextChangedEventsByEventIds,
  72. GetUpcomingOpeningsByCreatedInEventIdsQuery,
  73. GetUpcomingOpeningsByCreatedInEventIdsQueryVariables,
  74. GetUpcomingOpeningsByCreatedInEventIds,
  75. GetWorkingGroupByNameQuery,
  76. GetWorkingGroupByNameQueryVariables,
  77. GetWorkingGroupByName,
  78. GetWorkingGroupMetadataSnapshotsByTimeAsc,
  79. GetWorkingGroupMetadataSnapshotsByTimeAscQuery,
  80. GetWorkingGroupMetadataSnapshotsByTimeAscQueryVariables,
  81. MembershipFieldsFragment,
  82. MembershipBoughtEventFieldsFragment,
  83. MemberProfileUpdatedEventFieldsFragment,
  84. MemberAccountsUpdatedEventFieldsFragment,
  85. MemberInvitedEventFieldsFragment,
  86. InvitesTransferredEventFieldsFragment,
  87. StakingAccountAddedEventFieldsFragment,
  88. StakingAccountConfirmedEventFieldsFragment,
  89. StakingAccountRemovedEventFieldsFragment,
  90. MembershipSystemSnapshotFieldsFragment,
  91. ReferralCutUpdatedEventFieldsFragment,
  92. MembershipPriceUpdatedEventFieldsFragment,
  93. InitialInvitationBalanceUpdatedEventFieldsFragment,
  94. InitialInvitationCountUpdatedEventFieldsFragment,
  95. OpeningFieldsFragment,
  96. ApplicationFieldsFragment,
  97. AppliedOnOpeningEventFieldsFragment,
  98. OpeningAddedEventFieldsFragment,
  99. OpeningFilledEventFieldsFragment,
  100. ApplicationWithdrawnEventFieldsFragment,
  101. OpeningCanceledEventFieldsFragment,
  102. StatusTextChangedEventFieldsFragment,
  103. UpcomingOpeningFieldsFragment,
  104. WorkingGroupFieldsFragment,
  105. WorkingGroupMetadataFieldsFragment,
  106. GetUpcomingOpeningByIdQuery,
  107. GetUpcomingOpeningByIdQueryVariables,
  108. GetUpcomingOpeningById,
  109. GetOpeningsByIdsQuery,
  110. GetOpeningsByIdsQueryVariables,
  111. GetOpeningsByIds,
  112. GetApplicationsByIdsQuery,
  113. GetApplicationsByIdsQueryVariables,
  114. GetApplicationsByIds,
  115. GetWorkerRoleAccountUpdatedEventsByEventIdsQuery,
  116. GetWorkerRoleAccountUpdatedEventsByEventIdsQueryVariables,
  117. WorkerRoleAccountUpdatedEventFieldsFragment,
  118. GetWorkerRoleAccountUpdatedEventsByEventIds,
  119. GetWorkerRewardAccountUpdatedEventsByEventIdsQuery,
  120. GetWorkerRewardAccountUpdatedEventsByEventIdsQueryVariables,
  121. WorkerRewardAccountUpdatedEventFieldsFragment,
  122. GetWorkerRewardAccountUpdatedEventsByEventIds,
  123. StakeIncreasedEventFieldsFragment,
  124. GetStakeIncreasedEventsByEventIdsQuery,
  125. GetStakeIncreasedEventsByEventIdsQueryVariables,
  126. GetStakeIncreasedEventsByEventIds,
  127. WorkerFieldsFragment,
  128. GetWorkersByRuntimeIdsQuery,
  129. GetWorkersByRuntimeIdsQueryVariables,
  130. GetWorkersByRuntimeIds,
  131. GetWorkerStartedLeavingEventsByEventIdsQuery,
  132. GetWorkerStartedLeavingEventsByEventIdsQueryVariables,
  133. GetWorkerStartedLeavingEventsByEventIds,
  134. WorkerStartedLeavingEventFieldsFragment,
  135. TerminatedWorkerEventFieldsFragment,
  136. GetTerminatedWorkerEventsByEventIdsQuery,
  137. GetTerminatedWorkerEventsByEventIdsQueryVariables,
  138. GetTerminatedWorkerEventsByEventIds,
  139. TerminatedLeaderEventFieldsFragment,
  140. GetTerminatedLeaderEventsByEventIdsQuery,
  141. GetTerminatedLeaderEventsByEventIdsQueryVariables,
  142. GetTerminatedLeaderEventsByEventIds,
  143. WorkerRewardAmountUpdatedEventFieldsFragment,
  144. GetWorkerRewardAmountUpdatedEventsByEventIdsQuery,
  145. GetWorkerRewardAmountUpdatedEventsByEventIdsQueryVariables,
  146. GetWorkerRewardAmountUpdatedEventsByEventIds,
  147. StakeSlashedEventFieldsFragment,
  148. GetStakeSlashedEventsByEventIdsQuery,
  149. GetStakeSlashedEventsByEventIdsQueryVariables,
  150. GetStakeSlashedEventsByEventIds,
  151. StakeDecreasedEventFieldsFragment,
  152. GetStakeDecreasedEventsByEventIdsQuery,
  153. GetStakeDecreasedEventsByEventIdsQueryVariables,
  154. GetStakeDecreasedEventsByEventIds,
  155. BudgetSetEventFieldsFragment,
  156. GetBudgetSetEventsByEventIdsQuery,
  157. GetBudgetSetEventsByEventIdsQueryVariables,
  158. GetBudgetSetEventsByEventIds,
  159. BudgetSpendingEventFieldsFragment,
  160. GetBudgetSpendingEventsByEventIdsQuery,
  161. GetBudgetSpendingEventsByEventIdsQueryVariables,
  162. GetBudgetSpendingEventsByEventIds,
  163. LeaderUnsetEventFieldsFragment,
  164. GetLeaderUnsetEventsByEventIdsQuery,
  165. GetLeaderUnsetEventsByEventIdsQueryVariables,
  166. GetLeaderUnsetEventsByEventIds,
  167. LeaderSetEventFieldsFragment,
  168. GetLeaderSetEventsByEventIdsQuery,
  169. GetLeaderSetEventsByEventIdsQueryVariables,
  170. GetLeaderSetEventsByEventIds,
  171. ForumCategoryFieldsFragment,
  172. GetCategoriesByIdsQuery,
  173. GetCategoriesByIdsQueryVariables,
  174. GetCategoriesByIds,
  175. CategoryCreatedEventFieldsFragment,
  176. GetCategoryCreatedEventsByEventIdsQuery,
  177. GetCategoryCreatedEventsByEventIdsQueryVariables,
  178. GetCategoryCreatedEventsByEventIds,
  179. GetCategoryArchivalStatusUpdatedEventsByEventIds,
  180. GetCategoryArchivalStatusUpdatedEventsByEventIdsQuery,
  181. GetCategoryArchivalStatusUpdatedEventsByEventIdsQueryVariables,
  182. CategoryDeletedEventFieldsFragment,
  183. GetCategoryDeletedEventsByEventIdsQuery,
  184. GetCategoryDeletedEventsByEventIdsQueryVariables,
  185. GetCategoryDeletedEventsByEventIds,
  186. ThreadCreatedEventFieldsFragment,
  187. GetThreadCreatedEventsByEventIdsQuery,
  188. GetThreadCreatedEventsByEventIds,
  189. GetThreadCreatedEventsByEventIdsQueryVariables,
  190. VoteOnPollEventFieldsFragment,
  191. GetVoteOnPollEventsByEventIdsQuery,
  192. GetVoteOnPollEventsByEventIdsQueryVariables,
  193. GetVoteOnPollEventsByEventIds,
  194. ThreadDeletedEventFieldsFragment,
  195. GetThreadDeletedEventsByEventIdsQuery,
  196. GetThreadDeletedEventsByEventIdsQueryVariables,
  197. GetThreadDeletedEventsByEventIds,
  198. ForumThreadWithInitialPostFragment,
  199. GetThreadsWithInitialPostsByIds,
  200. GetThreadsWithInitialPostsByIdsQuery,
  201. GetThreadsWithInitialPostsByIdsQueryVariables,
  202. GetMembershipBoughtEventsByEventIdsQuery,
  203. GetMembershipBoughtEventsByEventIdsQueryVariables,
  204. GetMembershipBoughtEventsByEventIds,
  205. GetMembersByIdsQuery,
  206. GetMembersByIdsQueryVariables,
  207. GetMembersByIds,
  208. GetMemberInvitedEventsByEventIdsQuery,
  209. GetMemberInvitedEventsByEventIdsQueryVariables,
  210. GetMemberInvitedEventsByEventIds,
  211. ProposalFieldsFragment,
  212. GetProposalsByIdsQuery,
  213. GetProposalsByIdsQueryVariables,
  214. GetProposalsByIds,
  215. GetStakingAccountConfirmedEventsByEventIdsQuery,
  216. GetStakingAccountConfirmedEventsByEventIdsQueryVariables,
  217. GetStakingAccountConfirmedEventsByEventIds,
  218. GetStakingAccountAddedEventsByEventIdsQuery,
  219. GetStakingAccountAddedEventsByEventIdsQueryVariables,
  220. GetStakingAccountAddedEventsByEventIds,
  221. ProposalVotedEventFieldsFragment,
  222. GetProposalVotedEventsByEventIdsQuery,
  223. GetProposalVotedEventsByEventIdsQueryVariables,
  224. GetProposalVotedEventsByEventIds,
  225. ProposalCancelledEventFieldsFragment,
  226. GetProposalCancelledEventsByEventIdsQuery,
  227. GetProposalCancelledEventsByEventIdsQueryVariables,
  228. GetProposalCancelledEventsByEventIds,
  229. ForumPostFieldsFragment,
  230. GetPostsByIdsQuery,
  231. GetPostsByIdsQueryVariables,
  232. GetPostsByIds,
  233. PostAddedEventFieldsFragment,
  234. GetPostAddedEventsByEventIdsQuery,
  235. GetPostAddedEventsByEventIdsQueryVariables,
  236. GetPostAddedEventsByEventIds,
  237. ThreadMetadataUpdatedEventFieldsFragment,
  238. GetThreadMetadataUpdatedEventsByEventIds,
  239. GetThreadMetadataUpdatedEventsByEventIdsQuery,
  240. GetThreadMetadataUpdatedEventsByEventIdsQueryVariables,
  241. ThreadMovedEventFieldsFragment,
  242. GetThreadMovedEventsByEventIdsQuery,
  243. GetThreadMovedEventsByEventIdsQueryVariables,
  244. GetThreadMovedEventsByEventIds,
  245. CategoryStickyThreadUpdateEventFieldsFragment,
  246. GetCategoryStickyThreadUpdateEventsByEventIdsQuery,
  247. GetCategoryStickyThreadUpdateEventsByEventIdsQueryVariables,
  248. GetCategoryStickyThreadUpdateEventsByEventIds,
  249. CategoryMembershipOfModeratorUpdatedEventFieldsFragment,
  250. GetCategoryMembershipOfModeratorUpdatedEventsByEventIdsQuery,
  251. GetCategoryMembershipOfModeratorUpdatedEventsByEventIdsQueryVariables,
  252. GetCategoryMembershipOfModeratorUpdatedEventsByEventIds,
  253. ThreadModeratedEventFieldsFragment,
  254. GetThreadModeratedEventsByEventIdsQuery,
  255. GetThreadModeratedEventsByEventIdsQueryVariables,
  256. GetThreadModeratedEventsByEventIds,
  257. PostModeratedEventFieldsFragment,
  258. GetPostModeratedEventsByEventIdsQuery,
  259. GetPostModeratedEventsByEventIdsQueryVariables,
  260. GetPostModeratedEventsByEventIds,
  261. PostReactedEventFieldsFragment,
  262. GetPostReactedEventsByEventIdsQuery,
  263. GetPostReactedEventsByEventIdsQueryVariables,
  264. GetPostReactedEventsByEventIds,
  265. PostTextUpdatedEventFieldsFragment,
  266. GetPostTextUpdatedEventsByEventIdsQuery,
  267. GetPostTextUpdatedEventsByEventIdsQueryVariables,
  268. GetPostTextUpdatedEventsByEventIds,
  269. PostDeletedEventFieldsFragment,
  270. GetPostDeletedEventsByEventIdsQuery,
  271. GetPostDeletedEventsByEventIdsQueryVariables,
  272. GetPostDeletedEventsByEventIds,
  273. CategoryArchivalStatusUpdatedEventFieldsFragment,
  274. ProposalDiscussionPostCreatedEventFieldsFragment,
  275. GetProposalDiscussionPostCreatedEventsQuery,
  276. GetProposalDiscussionPostCreatedEventsQueryVariables,
  277. GetProposalDiscussionPostCreatedEvents,
  278. ProposalDiscussionPostUpdatedEventFieldsFragment,
  279. GetProposalDiscussionPostUpdatedEventsQuery,
  280. GetProposalDiscussionPostUpdatedEventsQueryVariables,
  281. GetProposalDiscussionPostUpdatedEvents,
  282. ProposalDiscussionThreadModeChangedEventFieldsFragment,
  283. GetProposalDiscussionThreadModeChangedEventsQuery,
  284. GetProposalDiscussionThreadModeChangedEventsQueryVariables,
  285. GetProposalDiscussionThreadModeChangedEvents,
  286. ProposalDiscussionPostDeletedEventFieldsFragment,
  287. GetProposalDiscussionPostDeletedEventsQuery,
  288. GetProposalDiscussionPostDeletedEventsQueryVariables,
  289. GetProposalDiscussionPostDeletedEvents,
  290. ProposalDiscussionPostFieldsFragment,
  291. GetProposalDiscussionPostsByIdsQuery,
  292. GetProposalDiscussionPostsByIdsQueryVariables,
  293. GetProposalDiscussionPostsByIds,
  294. ProposalDiscussionThreadFieldsFragment,
  295. GetProposalDiscussionThreadsByIdsQuery,
  296. GetProposalDiscussionThreadsByIdsQueryVariables,
  297. GetProposalDiscussionThreadsByIds,
  298. GetChannelById,
  299. GetChannelByIdQuery,
  300. GetChannelByIdQueryVariables,
  301. ChannelFieldsFragment,
  302. OwnedNftFieldsFragment,
  303. GetOwnedNftByVideoId,
  304. GetOwnedNftByVideoIdQuery,
  305. GetOwnedNftByVideoIdQueryVariables,
  306. GetChannelsVideoCountersQuery,
  307. ChannelVideoCounterFragment,
  308. GetChannelsVideoCountersQueryVariables,
  309. GetChannelsVideoCounters,
  310. ChannelCategoryVideoCounterFragment,
  311. GetChannelCategoriesVideoCounterQuery,
  312. GetChannelCategoriesVideoCounterQueryVariables,
  313. GetChannelCategoriesVideoCounter,
  314. VideoCategoryVideoCounterFragment,
  315. GetVideoCategoriesVideoCounterQuery,
  316. GetVideoCategoriesVideoCounterQueryVariables,
  317. GetVideoCategoriesVideoCounter,
  318. } from './graphql/generated/queries'
  319. import { Maybe } from './graphql/generated/schema'
  320. import { OperationDefinitionNode } from 'graphql'
  321. import { ProposalId } from '@joystream/types/proposals'
  322. import { BLOCKTIME } from './consts'
  323. import { CategoryId } from '@joystream/types/forum'
  324. import { Utils } from './utils'
  325. export class QueryNodeApi {
  326. private readonly queryNodeProvider: ApolloClient<NormalizedCacheObject>
  327. private readonly debug: Debugger.Debugger
  328. private readonly queryDebug: Debugger.Debugger
  329. private readonly tryDebug: Debugger.Debugger
  330. constructor(queryNodeProvider: ApolloClient<NormalizedCacheObject>) {
  331. this.queryNodeProvider = queryNodeProvider
  332. this.debug = extendDebug('query-node-api')
  333. this.queryDebug = this.debug.extend('query')
  334. this.tryDebug = this.debug.extend('try')
  335. }
  336. public async tryQueryWithTimeout<QueryResultT>(
  337. query: () => Promise<QueryResultT>,
  338. assertResultIsValid: (res: QueryResultT) => void,
  339. retryTimeMs = BLOCKTIME * 3,
  340. retries = 6
  341. ): Promise<QueryResultT> {
  342. const label = query.toString().replace(/^.*\.([A-za-z0-9]+\(.*\))$/g, '$1')
  343. const debug = this.tryDebug.extend(label)
  344. let retryCounter = 0
  345. const retry = async (error: any) => {
  346. if (retryCounter === retries) {
  347. debug(`Max number of query retries (${retries}) reached!`)
  348. throw error
  349. }
  350. debug(`Retrying query in ${retryTimeMs}ms...`)
  351. ++retryCounter
  352. await Utils.wait(retryTimeMs)
  353. }
  354. while (true) {
  355. let result: QueryResultT
  356. try {
  357. result = await query()
  358. } catch (e) {
  359. debug(`Query node unreachable`)
  360. await retry(e)
  361. continue
  362. }
  363. try {
  364. assertResultIsValid(result)
  365. } catch (e) {
  366. debug(`Unexpected query result${e && (e as Error).message ? ` (${(e as Error).message})` : ''}`)
  367. await retry(e)
  368. continue
  369. }
  370. return result
  371. }
  372. }
  373. private debugQuery(query: DocumentNode, args: Record<string, unknown>): void {
  374. const queryDef = query.definitions.find((d) => d.kind === 'OperationDefinition') as OperationDefinitionNode
  375. this.queryDebug(`${queryDef.name!.value}(${JSON.stringify(args)})`)
  376. }
  377. // Query entity by unique input
  378. private async uniqueEntityQuery<
  379. QueryT extends { [k: string]: Maybe<Record<string, unknown>> | undefined },
  380. VariablesT extends Record<string, unknown>
  381. >(
  382. query: DocumentNode,
  383. variables: VariablesT,
  384. resultKey: keyof QueryT
  385. ): Promise<Required<QueryT>[keyof QueryT] | null> {
  386. this.debugQuery(query, variables)
  387. return (await this.queryNodeProvider.query<QueryT, VariablesT>({ query, variables })).data[resultKey] || null
  388. }
  389. // Query entities by "non-unique" input and return first result
  390. private async firstEntityQuery<QueryT extends { [k: string]: unknown[] }, VariablesT extends Record<string, unknown>>(
  391. query: DocumentNode,
  392. variables: VariablesT,
  393. resultKey: keyof QueryT
  394. ): Promise<QueryT[keyof QueryT][number] | null> {
  395. this.debugQuery(query, variables)
  396. return (await this.queryNodeProvider.query<QueryT, VariablesT>({ query, variables })).data[resultKey][0] || null
  397. }
  398. // Query multiple entities
  399. private async multipleEntitiesQuery<
  400. QueryT extends { [k: string]: unknown[] },
  401. VariablesT extends Record<string, unknown>
  402. >(query: DocumentNode, variables: VariablesT, resultKey: keyof QueryT): Promise<QueryT[keyof QueryT]> {
  403. this.debugQuery(query, variables)
  404. return (await this.queryNodeProvider.query<QueryT, VariablesT>({ query, variables })).data[resultKey]
  405. }
  406. public getQueryNodeEventId(blockNumber: number, indexInBlock: number): string {
  407. return `OLYMPIA-${blockNumber}-${indexInBlock}`
  408. }
  409. public async getMemberById(id: MemberId): Promise<MembershipFieldsFragment | null> {
  410. return this.uniqueEntityQuery<GetMemberByIdQuery, GetMemberByIdQueryVariables>(
  411. GetMemberById,
  412. { id: id.toString() },
  413. 'membershipByUniqueInput'
  414. )
  415. }
  416. public async getMembersByIds(ids: MemberId[]): Promise<MembershipFieldsFragment[]> {
  417. return this.multipleEntitiesQuery<GetMembersByIdsQuery, GetMembersByIdsQueryVariables>(
  418. GetMembersByIds,
  419. { ids: ids.map((id) => id.toString()) },
  420. 'memberships'
  421. )
  422. }
  423. public async getMembershipBoughtEvents(events: EventDetails[]): Promise<MembershipBoughtEventFieldsFragment[]> {
  424. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  425. return this.multipleEntitiesQuery<
  426. GetMembershipBoughtEventsByEventIdsQuery,
  427. GetMembershipBoughtEventsByEventIdsQueryVariables
  428. >(GetMembershipBoughtEventsByEventIds, { eventIds }, 'membershipBoughtEvents')
  429. }
  430. public async getMemberProfileUpdatedEvents(memberId: MemberId): Promise<MemberProfileUpdatedEventFieldsFragment[]> {
  431. return this.multipleEntitiesQuery<
  432. GetMemberProfileUpdatedEventsByMemberIdQuery,
  433. GetMemberProfileUpdatedEventsByMemberIdQueryVariables
  434. >(GetMemberProfileUpdatedEventsByMemberId, { memberId: memberId.toString() }, 'memberProfileUpdatedEvents')
  435. }
  436. public async getMemberAccountsUpdatedEvents(memberId: MemberId): Promise<MemberAccountsUpdatedEventFieldsFragment[]> {
  437. return this.multipleEntitiesQuery<
  438. GetMemberAccountsUpdatedEventsByMemberIdQuery,
  439. GetMemberAccountsUpdatedEventsByMemberIdQueryVariables
  440. >(GetMemberAccountsUpdatedEventsByMemberId, { memberId: memberId.toString() }, 'memberAccountsUpdatedEvents')
  441. }
  442. public async getMemberInvitedEvents(events: EventDetails[]): Promise<MemberInvitedEventFieldsFragment[]> {
  443. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  444. return this.multipleEntitiesQuery<
  445. GetMemberInvitedEventsByEventIdsQuery,
  446. GetMemberInvitedEventsByEventIdsQueryVariables
  447. >(GetMemberInvitedEventsByEventIds, { eventIds }, 'memberInvitedEvents')
  448. }
  449. public async getCurrentCouncilMembers(): Promise<ElectedCouncilFieldsFragment | null> {
  450. return this.firstEntityQuery<GetCurrentCouncilMembersQuery, GetCurrentCouncilMembersQueryVariables>(
  451. GetCurrentCouncilMembers,
  452. {},
  453. 'electedCouncils'
  454. )
  455. }
  456. public async getReferendumIntermediateWinners(
  457. electionRoundCycleId: number,
  458. councilSize: number
  459. ): Promise<CandidateFieldsFragment[]> {
  460. return this.multipleEntitiesQuery<
  461. GetReferendumIntermediateWinnersQuery,
  462. GetReferendumIntermediateWinnersQueryVariables
  463. >(
  464. GetReferendumIntermediateWinners,
  465. {
  466. electionRoundCycleId,
  467. councilSize,
  468. },
  469. 'candidates'
  470. )
  471. }
  472. // TODO: Use event id
  473. public async getInvitesTransferredEvent(
  474. sourceMemberId: MemberId
  475. ): Promise<InvitesTransferredEventFieldsFragment | null> {
  476. return this.firstEntityQuery<
  477. GetInvitesTransferredEventsBySourceMemberIdQuery,
  478. GetInvitesTransferredEventsBySourceMemberIdQueryVariables
  479. >(
  480. GetInvitesTransferredEventsBySourceMemberId,
  481. { sourceMemberId: sourceMemberId.toString() },
  482. 'invitesTransferredEvents'
  483. )
  484. }
  485. public async getStakingAccountAddedEvents(events: EventDetails[]): Promise<StakingAccountAddedEventFieldsFragment[]> {
  486. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  487. return this.multipleEntitiesQuery<
  488. GetStakingAccountAddedEventsByEventIdsQuery,
  489. GetStakingAccountAddedEventsByEventIdsQueryVariables
  490. >(GetStakingAccountAddedEventsByEventIds, { ids: eventIds }, 'stakingAccountAddedEvents')
  491. }
  492. public async getStakingAccountConfirmedEvents(
  493. events: EventDetails[]
  494. ): Promise<StakingAccountConfirmedEventFieldsFragment[]> {
  495. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  496. return this.multipleEntitiesQuery<
  497. GetStakingAccountConfirmedEventsByEventIdsQuery,
  498. GetStakingAccountConfirmedEventsByEventIdsQueryVariables
  499. >(GetStakingAccountConfirmedEventsByEventIds, { ids: eventIds }, 'stakingAccountConfirmedEvents')
  500. }
  501. public async getStakingAccountRemovedEvents(memberId: MemberId): Promise<StakingAccountRemovedEventFieldsFragment[]> {
  502. return this.multipleEntitiesQuery<
  503. GetStakingAccountRemovedEventsByMemberIdQuery,
  504. GetStakingAccountRemovedEventsByMemberIdQueryVariables
  505. >(GetStakingAccountRemovedEventsByMemberId, { memberId: memberId.toString() }, 'stakingAccountRemovedEvents')
  506. }
  507. // FIXME: Cross-filtering is not enabled yet, so we have to use timestamp workaround
  508. public async getMembershipSystemSnapshotAt(
  509. timestamp: number
  510. ): Promise<MembershipSystemSnapshotFieldsFragment | null> {
  511. return this.firstEntityQuery<GetMembershipSystemSnapshotAtQuery, GetMembershipSystemSnapshotAtQueryVariables>(
  512. GetMembershipSystemSnapshotAt,
  513. { time: new Date(timestamp) },
  514. 'membershipSystemSnapshots'
  515. )
  516. }
  517. public async getMembershipSystemSnapshotBefore(
  518. timestamp: number
  519. ): Promise<MembershipSystemSnapshotFieldsFragment | null> {
  520. return this.firstEntityQuery<
  521. GetMembershipSystemSnapshotBeforeQuery,
  522. GetMembershipSystemSnapshotBeforeQueryVariables
  523. >(GetMembershipSystemSnapshotBefore, { time: new Date(timestamp) }, 'membershipSystemSnapshots')
  524. }
  525. public async getReferralCutUpdatedEvent(
  526. blockNumber: number,
  527. indexInBlock: number
  528. ): Promise<ReferralCutUpdatedEventFieldsFragment | null> {
  529. return this.firstEntityQuery<
  530. GetReferralCutUpdatedEventsByEventIdQuery,
  531. GetReferralCutUpdatedEventsByEventIdQueryVariables
  532. >(
  533. GetReferralCutUpdatedEventsByEventId,
  534. { eventId: this.getQueryNodeEventId(blockNumber, indexInBlock) },
  535. 'referralCutUpdatedEvents'
  536. )
  537. }
  538. public async getMembershipPriceUpdatedEvent(
  539. blockNumber: number,
  540. indexInBlock: number
  541. ): Promise<MembershipPriceUpdatedEventFieldsFragment | null> {
  542. return this.firstEntityQuery<
  543. GetMembershipPriceUpdatedEventsByEventIdQuery,
  544. GetMembershipPriceUpdatedEventsByEventIdQueryVariables
  545. >(
  546. GetMembershipPriceUpdatedEventsByEventId,
  547. { eventId: this.getQueryNodeEventId(blockNumber, indexInBlock) },
  548. 'membershipPriceUpdatedEvents'
  549. )
  550. }
  551. public async getInitialInvitationBalanceUpdatedEvent(
  552. blockNumber: number,
  553. indexInBlock: number
  554. ): Promise<InitialInvitationBalanceUpdatedEventFieldsFragment | null> {
  555. return this.firstEntityQuery<
  556. GetInitialInvitationBalanceUpdatedEventsByEventIdQuery,
  557. GetInitialInvitationBalanceUpdatedEventsByEventIdQueryVariables
  558. >(
  559. GetInitialInvitationBalanceUpdatedEventsByEventId,
  560. { eventId: this.getQueryNodeEventId(blockNumber, indexInBlock) },
  561. 'initialInvitationBalanceUpdatedEvents'
  562. )
  563. }
  564. public async getInitialInvitationCountUpdatedEvent(
  565. blockNumber: number,
  566. indexInBlock: number
  567. ): Promise<InitialInvitationCountUpdatedEventFieldsFragment | null> {
  568. return this.firstEntityQuery<
  569. GetInitialInvitationCountUpdatedEventsByEventIdQuery,
  570. GetInitialInvitationCountUpdatedEventsByEventIdQueryVariables
  571. >(
  572. GetInitialInvitationCountUpdatedEventsByEventId,
  573. { eventId: this.getQueryNodeEventId(blockNumber, indexInBlock) },
  574. 'initialInvitationCountUpdatedEvents'
  575. )
  576. }
  577. public async getOpeningById(id: OpeningId, group: WorkingGroupModuleName): Promise<OpeningFieldsFragment | null> {
  578. return this.uniqueEntityQuery<GetOpeningByIdQuery, GetOpeningByIdQueryVariables>(
  579. GetOpeningById,
  580. { openingId: `${group}-${id.toString()}` },
  581. 'workingGroupOpeningByUniqueInput'
  582. )
  583. }
  584. public async getOpeningsByIds(ids: OpeningId[], group: WorkingGroupModuleName): Promise<OpeningFieldsFragment[]> {
  585. const openingIds = ids.map((id) => `${group}-${id.toString()}`)
  586. return this.multipleEntitiesQuery<GetOpeningsByIdsQuery, GetOpeningsByIdsQueryVariables>(
  587. GetOpeningsByIds,
  588. { openingIds },
  589. 'workingGroupOpenings'
  590. )
  591. }
  592. public async getApplicationById(
  593. id: ApplicationId,
  594. group: WorkingGroupModuleName
  595. ): Promise<ApplicationFieldsFragment | null> {
  596. return this.uniqueEntityQuery<GetApplicationByIdQuery, GetApplicationByIdQueryVariables>(
  597. GetApplicationById,
  598. { applicationId: `${group}-${id.toString()}` },
  599. 'workingGroupApplicationByUniqueInput'
  600. )
  601. }
  602. public async getApplicationsByIds(
  603. ids: ApplicationId[],
  604. group: WorkingGroupModuleName
  605. ): Promise<ApplicationFieldsFragment[]> {
  606. const applicationIds = ids.map((id) => `${group}-${id.toString()}`)
  607. return this.multipleEntitiesQuery<GetApplicationsByIdsQuery, GetApplicationsByIdsQueryVariables>(
  608. GetApplicationsByIds,
  609. { applicationIds },
  610. 'workingGroupApplications'
  611. )
  612. }
  613. public async getAppliedOnOpeningEvents(events: EventDetails[]): Promise<AppliedOnOpeningEventFieldsFragment[]> {
  614. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  615. return this.multipleEntitiesQuery<
  616. GetAppliedOnOpeningEventsByEventIdsQuery,
  617. GetAppliedOnOpeningEventsByEventIdsQueryVariables
  618. >(GetAppliedOnOpeningEventsByEventIds, { eventIds }, 'appliedOnOpeningEvents')
  619. }
  620. public async getOpeningAddedEvents(events: EventDetails[]): Promise<OpeningAddedEventFieldsFragment[]> {
  621. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  622. return this.multipleEntitiesQuery<
  623. GetOpeningAddedEventsByEventIdsQuery,
  624. GetOpeningAddedEventsByEventIdsQueryVariables
  625. >(GetOpeningAddedEventsByEventIds, { eventIds }, 'openingAddedEvents')
  626. }
  627. public async getOpeningFilledEvents(events: EventDetails[]): Promise<OpeningFilledEventFieldsFragment[]> {
  628. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  629. return this.multipleEntitiesQuery<
  630. GetOpeningFilledEventsByEventIdsQuery,
  631. GetOpeningFilledEventsByEventIdsQueryVariables
  632. >(GetOpeningFilledEventsByEventIds, { eventIds }, 'openingFilledEvents')
  633. }
  634. public async getApplicationWithdrawnEvents(
  635. events: EventDetails[]
  636. ): Promise<ApplicationWithdrawnEventFieldsFragment[]> {
  637. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  638. return this.multipleEntitiesQuery<
  639. GetApplicationWithdrawnEventsByEventIdsQuery,
  640. GetApplicationWithdrawnEventsByEventIdsQueryVariables
  641. >(GetApplicationWithdrawnEventsByEventIds, { eventIds }, 'applicationWithdrawnEvents')
  642. }
  643. public async getOpeningCancelledEvents(events: EventDetails[]): Promise<OpeningCanceledEventFieldsFragment[]> {
  644. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  645. return this.multipleEntitiesQuery<
  646. GetOpeningCancelledEventsByEventIdsQuery,
  647. GetOpeningCancelledEventsByEventIdsQueryVariables
  648. >(GetOpeningCancelledEventsByEventIds, { eventIds }, 'openingCanceledEvents')
  649. }
  650. public async getStatusTextChangedEvents(events: EventDetails[]): Promise<StatusTextChangedEventFieldsFragment[]> {
  651. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  652. return this.multipleEntitiesQuery<
  653. GetStatusTextChangedEventsByEventIdsQuery,
  654. GetStatusTextChangedEventsByEventIdsQueryVariables
  655. >(GetStatusTextChangedEventsByEventIds, { eventIds }, 'statusTextChangedEvents')
  656. }
  657. public async getUpcomingOpeningById(id: string): Promise<UpcomingOpeningFieldsFragment | null> {
  658. return this.uniqueEntityQuery<GetUpcomingOpeningByIdQuery, GetUpcomingOpeningByIdQueryVariables>(
  659. GetUpcomingOpeningById,
  660. { id },
  661. 'upcomingWorkingGroupOpeningByUniqueInput'
  662. )
  663. }
  664. public async getUpcomingOpeningsByCreatedInEventIds(eventIds: string[]): Promise<UpcomingOpeningFieldsFragment[]> {
  665. return this.multipleEntitiesQuery<
  666. GetUpcomingOpeningsByCreatedInEventIdsQuery,
  667. GetUpcomingOpeningsByCreatedInEventIdsQueryVariables
  668. >(GetUpcomingOpeningsByCreatedInEventIds, { createdInEventIds: eventIds }, 'upcomingWorkingGroupOpenings')
  669. }
  670. public async getWorkingGroup(name: WorkingGroupModuleName): Promise<WorkingGroupFieldsFragment | null> {
  671. return this.uniqueEntityQuery<GetWorkingGroupByNameQuery, GetWorkingGroupByNameQueryVariables>(
  672. GetWorkingGroupByName,
  673. { name },
  674. 'workingGroupByUniqueInput'
  675. )
  676. }
  677. public async getGroupMetaSnapshotsByTimeAsc(groupId: string): Promise<WorkingGroupMetadataFieldsFragment[]> {
  678. return this.multipleEntitiesQuery<
  679. GetWorkingGroupMetadataSnapshotsByTimeAscQuery,
  680. GetWorkingGroupMetadataSnapshotsByTimeAscQueryVariables
  681. >(GetWorkingGroupMetadataSnapshotsByTimeAsc, { groupId }, 'workingGroupMetadata')
  682. }
  683. public async getWorkerRoleAccountUpdatedEvents(
  684. events: EventDetails[]
  685. ): Promise<WorkerRoleAccountUpdatedEventFieldsFragment[]> {
  686. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  687. return this.multipleEntitiesQuery<
  688. GetWorkerRoleAccountUpdatedEventsByEventIdsQuery,
  689. GetWorkerRoleAccountUpdatedEventsByEventIdsQueryVariables
  690. >(GetWorkerRoleAccountUpdatedEventsByEventIds, { eventIds }, 'workerRoleAccountUpdatedEvents')
  691. }
  692. public async getWorkerRewardAccountUpdatedEvents(
  693. events: EventDetails[]
  694. ): Promise<WorkerRewardAccountUpdatedEventFieldsFragment[]> {
  695. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  696. return this.multipleEntitiesQuery<
  697. GetWorkerRewardAccountUpdatedEventsByEventIdsQuery,
  698. GetWorkerRewardAccountUpdatedEventsByEventIdsQueryVariables
  699. >(GetWorkerRewardAccountUpdatedEventsByEventIds, { eventIds }, 'workerRewardAccountUpdatedEvents')
  700. }
  701. public async getStakeIncreasedEvents(events: EventDetails[]): Promise<StakeIncreasedEventFieldsFragment[]> {
  702. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  703. return this.multipleEntitiesQuery<
  704. GetStakeIncreasedEventsByEventIdsQuery,
  705. GetStakeIncreasedEventsByEventIdsQueryVariables
  706. >(GetStakeIncreasedEventsByEventIds, { eventIds }, 'stakeIncreasedEvents')
  707. }
  708. public async getWorkersByIds(ids: WorkerId[], group: WorkingGroupModuleName): Promise<WorkerFieldsFragment[]> {
  709. return this.multipleEntitiesQuery<GetWorkersByRuntimeIdsQuery, GetWorkersByRuntimeIdsQueryVariables>(
  710. GetWorkersByRuntimeIds,
  711. { workerIds: ids.map((id) => id.toNumber()), groupId: group },
  712. 'workers'
  713. )
  714. }
  715. public async getWorkerStartedLeavingEvents(
  716. events: EventDetails[]
  717. ): Promise<WorkerStartedLeavingEventFieldsFragment[]> {
  718. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  719. return this.multipleEntitiesQuery<
  720. GetWorkerStartedLeavingEventsByEventIdsQuery,
  721. GetWorkerStartedLeavingEventsByEventIdsQueryVariables
  722. >(GetWorkerStartedLeavingEventsByEventIds, { eventIds }, 'workerStartedLeavingEvents')
  723. }
  724. public async getTerminatedWorkerEvents(events: EventDetails[]): Promise<TerminatedWorkerEventFieldsFragment[]> {
  725. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  726. return this.multipleEntitiesQuery<
  727. GetTerminatedWorkerEventsByEventIdsQuery,
  728. GetTerminatedWorkerEventsByEventIdsQueryVariables
  729. >(GetTerminatedWorkerEventsByEventIds, { eventIds }, 'terminatedWorkerEvents')
  730. }
  731. public async getTerminatedLeaderEvents(events: EventDetails[]): Promise<TerminatedLeaderEventFieldsFragment[]> {
  732. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  733. return this.multipleEntitiesQuery<
  734. GetTerminatedLeaderEventsByEventIdsQuery,
  735. GetTerminatedLeaderEventsByEventIdsQueryVariables
  736. >(GetTerminatedLeaderEventsByEventIds, { eventIds }, 'terminatedLeaderEvents')
  737. }
  738. public async getWorkerRewardAmountUpdatedEvents(
  739. events: EventDetails[]
  740. ): Promise<WorkerRewardAmountUpdatedEventFieldsFragment[]> {
  741. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  742. return this.multipleEntitiesQuery<
  743. GetWorkerRewardAmountUpdatedEventsByEventIdsQuery,
  744. GetWorkerRewardAmountUpdatedEventsByEventIdsQueryVariables
  745. >(GetWorkerRewardAmountUpdatedEventsByEventIds, { eventIds }, 'workerRewardAmountUpdatedEvents')
  746. }
  747. public async getStakeSlashedEvents(events: EventDetails[]): Promise<StakeSlashedEventFieldsFragment[]> {
  748. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  749. return this.multipleEntitiesQuery<
  750. GetStakeSlashedEventsByEventIdsQuery,
  751. GetStakeSlashedEventsByEventIdsQueryVariables
  752. >(GetStakeSlashedEventsByEventIds, { eventIds }, 'stakeSlashedEvents')
  753. }
  754. public async getStakeDecreasedEvents(events: EventDetails[]): Promise<StakeDecreasedEventFieldsFragment[]> {
  755. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  756. return this.multipleEntitiesQuery<
  757. GetStakeDecreasedEventsByEventIdsQuery,
  758. GetStakeDecreasedEventsByEventIdsQueryVariables
  759. >(GetStakeDecreasedEventsByEventIds, { eventIds }, 'stakeDecreasedEvents')
  760. }
  761. public async getBudgetSetEvents(events: EventDetails[]): Promise<BudgetSetEventFieldsFragment[]> {
  762. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  763. return this.multipleEntitiesQuery<GetBudgetSetEventsByEventIdsQuery, GetBudgetSetEventsByEventIdsQueryVariables>(
  764. GetBudgetSetEventsByEventIds,
  765. { eventIds },
  766. 'budgetSetEvents'
  767. )
  768. }
  769. public async getBudgetSpendingEvents(events: EventDetails[]): Promise<BudgetSpendingEventFieldsFragment[]> {
  770. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  771. return this.multipleEntitiesQuery<
  772. GetBudgetSpendingEventsByEventIdsQuery,
  773. GetBudgetSpendingEventsByEventIdsQueryVariables
  774. >(GetBudgetSpendingEventsByEventIds, { eventIds }, 'budgetSpendingEvents')
  775. }
  776. public async getLeaderSetEvent(event: EventDetails): Promise<LeaderSetEventFieldsFragment | null> {
  777. const eventId = this.getQueryNodeEventId(event.blockNumber, event.indexInBlock)
  778. return this.firstEntityQuery<GetLeaderSetEventsByEventIdsQuery, GetLeaderSetEventsByEventIdsQueryVariables>(
  779. GetLeaderSetEventsByEventIds,
  780. { eventIds: [eventId] },
  781. 'leaderSetEvents'
  782. )
  783. }
  784. public async getLeaderUnsetEvent(event: EventDetails): Promise<LeaderUnsetEventFieldsFragment | null> {
  785. const eventId = this.getQueryNodeEventId(event.blockNumber, event.indexInBlock)
  786. return this.firstEntityQuery<GetLeaderUnsetEventsByEventIdsQuery, GetLeaderUnsetEventsByEventIdsQueryVariables>(
  787. GetLeaderUnsetEventsByEventIds,
  788. { eventIds: [eventId] },
  789. 'leaderUnsetEvents'
  790. )
  791. }
  792. public async getProposalsByIds(ids: (ProposalId | string)[]): Promise<ProposalFieldsFragment[]> {
  793. return this.multipleEntitiesQuery<GetProposalsByIdsQuery, GetProposalsByIdsQueryVariables>(
  794. GetProposalsByIds,
  795. { ids: ids.map((id) => id.toString()) },
  796. 'proposals'
  797. )
  798. }
  799. public async getProposalVotedEvents(events: EventDetails[]): Promise<ProposalVotedEventFieldsFragment[]> {
  800. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  801. return this.multipleEntitiesQuery<
  802. GetProposalVotedEventsByEventIdsQuery,
  803. GetProposalVotedEventsByEventIdsQueryVariables
  804. >(GetProposalVotedEventsByEventIds, { eventIds }, 'proposalVotedEvents')
  805. }
  806. public async getProposalCancelledEvents(events: EventDetails[]): Promise<ProposalCancelledEventFieldsFragment[]> {
  807. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  808. return this.multipleEntitiesQuery<
  809. GetProposalCancelledEventsByEventIdsQuery,
  810. GetProposalCancelledEventsByEventIdsQueryVariables
  811. >(GetProposalCancelledEventsByEventIds, { eventIds }, 'proposalCancelledEvents')
  812. }
  813. public async getCategoriesByIds(ids: CategoryId[]): Promise<ForumCategoryFieldsFragment[]> {
  814. return this.multipleEntitiesQuery<GetCategoriesByIdsQuery, GetCategoriesByIdsQueryVariables>(
  815. GetCategoriesByIds,
  816. { ids: ids.map((id) => id.toString()) },
  817. 'forumCategories'
  818. )
  819. }
  820. public async getCategoryCreatedEvents(events: EventDetails[]): Promise<CategoryCreatedEventFieldsFragment[]> {
  821. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  822. return this.multipleEntitiesQuery<
  823. GetCategoryCreatedEventsByEventIdsQuery,
  824. GetCategoryCreatedEventsByEventIdsQueryVariables
  825. >(GetCategoryCreatedEventsByEventIds, { eventIds }, 'categoryCreatedEvents')
  826. }
  827. public async getCategoryArchivalStatusUpdatedEvents(
  828. events: EventDetails[]
  829. ): Promise<CategoryArchivalStatusUpdatedEventFieldsFragment[]> {
  830. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  831. return this.multipleEntitiesQuery<
  832. GetCategoryArchivalStatusUpdatedEventsByEventIdsQuery,
  833. GetCategoryArchivalStatusUpdatedEventsByEventIdsQueryVariables
  834. >(GetCategoryArchivalStatusUpdatedEventsByEventIds, { eventIds }, 'categoryArchivalStatusUpdatedEvents')
  835. }
  836. public async getCategoryDeletedEvents(events: EventDetails[]): Promise<CategoryDeletedEventFieldsFragment[]> {
  837. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  838. return this.multipleEntitiesQuery<
  839. GetCategoryDeletedEventsByEventIdsQuery,
  840. GetCategoryDeletedEventsByEventIdsQueryVariables
  841. >(GetCategoryDeletedEventsByEventIds, { eventIds }, 'categoryDeletedEvents')
  842. }
  843. public async getThreadCreatedEvents(events: EventDetails[]): Promise<ThreadCreatedEventFieldsFragment[]> {
  844. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  845. return this.multipleEntitiesQuery<
  846. GetThreadCreatedEventsByEventIdsQuery,
  847. GetThreadCreatedEventsByEventIdsQueryVariables
  848. >(GetThreadCreatedEventsByEventIds, { eventIds }, 'threadCreatedEvents')
  849. }
  850. public async getThreadMetadataUpdatedEvents(
  851. events: EventDetails[]
  852. ): Promise<ThreadMetadataUpdatedEventFieldsFragment[]> {
  853. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  854. return this.multipleEntitiesQuery<
  855. GetThreadMetadataUpdatedEventsByEventIdsQuery,
  856. GetThreadMetadataUpdatedEventsByEventIdsQueryVariables
  857. >(GetThreadMetadataUpdatedEventsByEventIds, { eventIds }, 'threadMetadataUpdatedEvents')
  858. }
  859. public async getThreadsWithInitialPostsByIds(ids: ThreadId[]): Promise<ForumThreadWithInitialPostFragment[]> {
  860. return this.multipleEntitiesQuery<
  861. GetThreadsWithInitialPostsByIdsQuery,
  862. GetThreadsWithInitialPostsByIdsQueryVariables
  863. >(GetThreadsWithInitialPostsByIds, { ids: ids.map((id) => id.toString()) }, 'forumThreads')
  864. }
  865. public async getVoteOnPollEvents(events: EventDetails[]): Promise<VoteOnPollEventFieldsFragment[]> {
  866. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  867. return this.multipleEntitiesQuery<GetVoteOnPollEventsByEventIdsQuery, GetVoteOnPollEventsByEventIdsQueryVariables>(
  868. GetVoteOnPollEventsByEventIds,
  869. { eventIds },
  870. 'voteOnPollEvents'
  871. )
  872. }
  873. public async getThreadDeletedEvents(events: EventDetails[]): Promise<ThreadDeletedEventFieldsFragment[]> {
  874. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  875. return this.multipleEntitiesQuery<
  876. GetThreadDeletedEventsByEventIdsQuery,
  877. GetThreadDeletedEventsByEventIdsQueryVariables
  878. >(GetThreadDeletedEventsByEventIds, { eventIds }, 'threadDeletedEvents')
  879. }
  880. public async getPostsByIds(ids: PostId[]): Promise<ForumPostFieldsFragment[]> {
  881. return this.multipleEntitiesQuery<GetPostsByIdsQuery, GetPostsByIdsQueryVariables>(
  882. GetPostsByIds,
  883. { ids: ids.map((id) => id.toString()) },
  884. 'forumPosts'
  885. )
  886. }
  887. public async getPostAddedEvents(events: EventDetails[]): Promise<PostAddedEventFieldsFragment[]> {
  888. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  889. return this.multipleEntitiesQuery<GetPostAddedEventsByEventIdsQuery, GetPostAddedEventsByEventIdsQueryVariables>(
  890. GetPostAddedEventsByEventIds,
  891. { eventIds },
  892. 'postAddedEvents'
  893. )
  894. }
  895. public async getThreadMovedEvents(events: EventDetails[]): Promise<ThreadMovedEventFieldsFragment[]> {
  896. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  897. return this.multipleEntitiesQuery<
  898. GetThreadMovedEventsByEventIdsQuery,
  899. GetThreadMovedEventsByEventIdsQueryVariables
  900. >(GetThreadMovedEventsByEventIds, { eventIds }, 'threadMovedEvents')
  901. }
  902. public async getCategoryStickyThreadUpdateEvents(
  903. events: EventDetails[]
  904. ): Promise<CategoryStickyThreadUpdateEventFieldsFragment[]> {
  905. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  906. return this.multipleEntitiesQuery<
  907. GetCategoryStickyThreadUpdateEventsByEventIdsQuery,
  908. GetCategoryStickyThreadUpdateEventsByEventIdsQueryVariables
  909. >(GetCategoryStickyThreadUpdateEventsByEventIds, { eventIds }, 'categoryStickyThreadUpdateEvents')
  910. }
  911. public async getCategoryMembershipOfModeratorUpdatedEvents(
  912. events: EventDetails[]
  913. ): Promise<CategoryMembershipOfModeratorUpdatedEventFieldsFragment[]> {
  914. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  915. return this.multipleEntitiesQuery<
  916. GetCategoryMembershipOfModeratorUpdatedEventsByEventIdsQuery,
  917. GetCategoryMembershipOfModeratorUpdatedEventsByEventIdsQueryVariables
  918. >(
  919. GetCategoryMembershipOfModeratorUpdatedEventsByEventIds,
  920. { eventIds },
  921. 'categoryMembershipOfModeratorUpdatedEvents'
  922. )
  923. }
  924. public async getThreadModeratedEvents(events: EventDetails[]): Promise<ThreadModeratedEventFieldsFragment[]> {
  925. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  926. return this.multipleEntitiesQuery<
  927. GetThreadModeratedEventsByEventIdsQuery,
  928. GetThreadModeratedEventsByEventIdsQueryVariables
  929. >(GetThreadModeratedEventsByEventIds, { eventIds }, 'threadModeratedEvents')
  930. }
  931. public async getPostModeratedEvents(events: EventDetails[]): Promise<PostModeratedEventFieldsFragment[]> {
  932. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  933. return this.multipleEntitiesQuery<
  934. GetPostModeratedEventsByEventIdsQuery,
  935. GetPostModeratedEventsByEventIdsQueryVariables
  936. >(GetPostModeratedEventsByEventIds, { eventIds }, 'postModeratedEvents')
  937. }
  938. public async getPostReactedEvents(events: EventDetails[]): Promise<PostReactedEventFieldsFragment[]> {
  939. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  940. return this.multipleEntitiesQuery<
  941. GetPostReactedEventsByEventIdsQuery,
  942. GetPostReactedEventsByEventIdsQueryVariables
  943. >(GetPostReactedEventsByEventIds, { eventIds }, 'postReactedEvents')
  944. }
  945. public async getPostTextUpdatedEvents(events: EventDetails[]): Promise<PostTextUpdatedEventFieldsFragment[]> {
  946. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  947. return this.multipleEntitiesQuery<
  948. GetPostTextUpdatedEventsByEventIdsQuery,
  949. GetPostTextUpdatedEventsByEventIdsQueryVariables
  950. >(GetPostTextUpdatedEventsByEventIds, { eventIds }, 'postTextUpdatedEvents')
  951. }
  952. public async getPostDeletedEvents(events: EventDetails[]): Promise<PostDeletedEventFieldsFragment[]> {
  953. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  954. return this.multipleEntitiesQuery<
  955. GetPostDeletedEventsByEventIdsQuery,
  956. GetPostDeletedEventsByEventIdsQueryVariables
  957. >(GetPostDeletedEventsByEventIds, { eventIds }, 'postDeletedEvents')
  958. }
  959. public async getProposalDiscussionPostCreatedEvents(
  960. events: EventDetails[]
  961. ): Promise<ProposalDiscussionPostCreatedEventFieldsFragment[]> {
  962. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  963. return this.multipleEntitiesQuery<
  964. GetProposalDiscussionPostCreatedEventsQuery,
  965. GetProposalDiscussionPostCreatedEventsQueryVariables
  966. >(GetProposalDiscussionPostCreatedEvents, { eventIds }, 'proposalDiscussionPostCreatedEvents')
  967. }
  968. public async getProposalDiscussionPostUpdatedEvents(
  969. events: EventDetails[]
  970. ): Promise<ProposalDiscussionPostUpdatedEventFieldsFragment[]> {
  971. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  972. return this.multipleEntitiesQuery<
  973. GetProposalDiscussionPostUpdatedEventsQuery,
  974. GetProposalDiscussionPostUpdatedEventsQueryVariables
  975. >(GetProposalDiscussionPostUpdatedEvents, { eventIds }, 'proposalDiscussionPostUpdatedEvents')
  976. }
  977. public async getProposalDiscussionThreadModeChangedEvents(
  978. events: EventDetails[]
  979. ): Promise<ProposalDiscussionThreadModeChangedEventFieldsFragment[]> {
  980. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  981. return this.multipleEntitiesQuery<
  982. GetProposalDiscussionThreadModeChangedEventsQuery,
  983. GetProposalDiscussionThreadModeChangedEventsQueryVariables
  984. >(GetProposalDiscussionThreadModeChangedEvents, { eventIds }, 'proposalDiscussionThreadModeChangedEvents')
  985. }
  986. public async getProposalDiscussionPostDeletedEvents(
  987. events: EventDetails[]
  988. ): Promise<ProposalDiscussionPostDeletedEventFieldsFragment[]> {
  989. const eventIds = events.map((e) => this.getQueryNodeEventId(e.blockNumber, e.indexInBlock))
  990. return this.multipleEntitiesQuery<
  991. GetProposalDiscussionPostDeletedEventsQuery,
  992. GetProposalDiscussionPostDeletedEventsQueryVariables
  993. >(GetProposalDiscussionPostDeletedEvents, { eventIds }, 'proposalDiscussionPostDeletedEvents')
  994. }
  995. public async getProposalDiscussionPostsByIds(
  996. ids: (PostId | number)[]
  997. ): Promise<ProposalDiscussionPostFieldsFragment[]> {
  998. return this.multipleEntitiesQuery<
  999. GetProposalDiscussionPostsByIdsQuery,
  1000. GetProposalDiscussionPostsByIdsQueryVariables
  1001. >(GetProposalDiscussionPostsByIds, { ids: ids.map((id) => id.toString()) }, 'proposalDiscussionPosts')
  1002. }
  1003. public async getProposalDiscussionThreadsByIds(
  1004. ids: (PostId | number)[]
  1005. ): Promise<ProposalDiscussionThreadFieldsFragment[]> {
  1006. return this.multipleEntitiesQuery<
  1007. GetProposalDiscussionThreadsByIdsQuery,
  1008. GetProposalDiscussionThreadsByIdsQueryVariables
  1009. >(GetProposalDiscussionThreadsByIds, { ids: ids.map((id) => id.toString()) }, 'proposalDiscussionThreads')
  1010. }
  1011. public async channelById(id: string): Promise<Maybe<ChannelFieldsFragment>> {
  1012. return this.uniqueEntityQuery<GetChannelByIdQuery, GetChannelByIdQueryVariables>(
  1013. GetChannelById,
  1014. { id },
  1015. 'channelByUniqueInput'
  1016. )
  1017. }
  1018. public async getChannelsVideoCounters(): Promise<ChannelVideoCounterFragment[]> {
  1019. return this.multipleEntitiesQuery<GetChannelsVideoCountersQuery, GetChannelsVideoCountersQueryVariables>(
  1020. GetChannelsVideoCounters,
  1021. {},
  1022. 'channels'
  1023. )
  1024. }
  1025. public async getChannelCategoriesVideoCounters(): Promise<ChannelCategoryVideoCounterFragment[]> {
  1026. return this.multipleEntitiesQuery<
  1027. GetChannelCategoriesVideoCounterQuery,
  1028. GetChannelCategoriesVideoCounterQueryVariables
  1029. >(GetChannelCategoriesVideoCounter, {}, 'channelCategories')
  1030. }
  1031. public async getVideoCategoriesVideoCounters(): Promise<VideoCategoryVideoCounterFragment[]> {
  1032. return this.multipleEntitiesQuery<
  1033. GetVideoCategoriesVideoCounterQuery,
  1034. GetVideoCategoriesVideoCounterQueryVariables
  1035. >(GetVideoCategoriesVideoCounter, {}, 'videoCategories')
  1036. }
  1037. public async ownedNftByVideoId(videoId: string): Promise<Maybe<OwnedNftFieldsFragment>> {
  1038. return this.firstEntityQuery<GetOwnedNftByVideoIdQuery, GetOwnedNftByVideoIdQueryVariables>(
  1039. GetOwnedNftByVideoId,
  1040. { videoId },
  1041. 'ownedNfts'
  1042. )
  1043. }
  1044. }