瀏覽代碼

Query node: Handle joystreamUtility.BudgetUpdatedEvent

Lezek123 3 年之前
父節點
當前提交
59887bf580

+ 5 - 0
query-node/manifest.yml

@@ -196,6 +196,8 @@ typegen:
     - content.NftSellOrderMade
     - content.NftBought
     - content.BuyNowCanceled
+    # Utility
+    - joystreamUtility.UpdatedWorkingGroupBudget
 
   calls:
     # Proposals discussion
@@ -931,6 +933,9 @@ mappings:
     # ExtrinsicSuccess is emitted at least once per block due to timestamp.set extrinsic
     - event: system.ExtrinsicSuccess
       handler: system_ExtrinsicSuccess
+    # Utility
+    - event: joystreamUtility.UpdatedWorkingGroupBudget
+      handler: joystreamUtility_UpdatedWorkingGroupBudget
   extrinsicHandlers:
     # infer defaults here
     #- extrinsic: Balances.Transfer

+ 15 - 3
query-node/mappings/src/common.ts

@@ -1,8 +1,8 @@
 import { DatabaseManager, SubstrateEvent, SubstrateExtrinsic, ExtrinsicArg } from '@joystream/hydra-common'
 import { Bytes } from '@polkadot/types'
 import { Codec } from '@polkadot/types/types'
-import { WorkingGroup, WorkerId, ThreadId } from '@joystream/types/augment/all'
-import { Worker, Event, Network } from 'query-node/dist/model'
+import { WorkingGroup as WGType, WorkerId, ThreadId } from '@joystream/types/augment/all'
+import { Worker, Event, Network, WorkingGroup as WGEntity } from 'query-node/dist/model'
 import { BaseModel } from '@joystream/warthog'
 import { metaToObject } from '@joystream/metadata-protobuf/utils'
 import { AnyMetadataClass, DecodedMetadataObject } from '@joystream/metadata-protobuf/types'
@@ -251,7 +251,7 @@ export type WorkingGroupModuleName =
   | 'operationsWorkingGroupBeta'
   | 'operationsWorkingGroupGamma'
 
-export function getWorkingGroupModuleName(group: WorkingGroup): WorkingGroupModuleName {
+export function getWorkingGroupModuleName(group: WGType): WorkingGroupModuleName {
   if (group.isContent) {
     return 'contentWorkingGroup'
   } else if (group.isMembership) {
@@ -275,6 +275,18 @@ export function getWorkingGroupModuleName(group: WorkingGroup): WorkingGroupModu
   unexpectedData('Unsupported working group encountered:', group.type)
 }
 
+export async function getWorkingGroupByName(
+  store: DatabaseManager,
+  name: WorkingGroupModuleName,
+  relations: string[] = []
+): Promise<WGEntity> {
+  const group = await store.get(WGEntity, { where: { name }, relations })
+  if (!group) {
+    throw new Error(`Working group ${name} not found!`)
+  }
+  return group
+}
+
 export async function getWorker(
   store: DatabaseManager,
   groupName: WorkingGroupModuleName,

+ 1 - 0
query-node/mappings/src/index.ts

@@ -17,3 +17,4 @@ export * from './forum'
 export * from './bootstrap'
 export * from './scheduler'
 export * from './system'
+export * from './joystreamUtility'

+ 19 - 0
query-node/mappings/src/joystreamUtility.ts

@@ -0,0 +1,19 @@
+import { EventContext, StoreContext } from '@joystream/hydra-common'
+import BN from 'bn.js'
+import { BudgetUpdatedEvent, WorkingGroup } from 'query-node/dist/model'
+import { JoystreamUtility } from '../generated/types'
+import { genericEventFields, getWorkingGroupByName, getWorkingGroupModuleName } from './common'
+
+export async function joystreamUtility_UpdatedWorkingGroupBudget({
+  store,
+  event,
+}: EventContext & StoreContext): Promise<void> {
+  const [workingGroup, amount, amountType] = new JoystreamUtility.UpdatedWorkingGroupBudgetEvent(event).params
+  const group = await getWorkingGroupByName(store, getWorkingGroupModuleName(workingGroup))
+  const budgetChangeAmount = new BN(amountType.isNegative ? `-${amount.toString()}` : amount.toString())
+  group.budget = group.budget.add(budgetChangeAmount)
+  await store.save<WorkingGroup>(group)
+
+  const budgetUpdatedEvent = new BudgetUpdatedEvent({ ...genericEventFields(event), group, budgetChangeAmount })
+  await store.save<BudgetUpdatedEvent>(budgetUpdatedEvent)
+}

+ 2 - 5
query-node/mappings/src/workingGroups.ts

@@ -24,6 +24,7 @@ import {
   WorkingGroupModuleName,
   toNumber,
   INT32MAX,
+  getWorkingGroupByName,
 } from './common'
 import BN from 'bn.js'
 import {
@@ -92,12 +93,8 @@ async function getWorkingGroup(
   relations: string[] = []
 ): Promise<WorkingGroup> {
   const [groupName] = event.name.split('.')
-  const group = await store.get(WorkingGroup, { where: { name: groupName }, relations })
-  if (!group) {
-    throw new Error(`Working group ${groupName} not found!`)
-  }
 
-  return group
+  return getWorkingGroupByName(store, groupName as WorkingGroupModuleName, relations)
 }
 
 async function getOpening(

+ 27 - 0
query-node/schemas/workingGroupsEvents.graphql

@@ -474,6 +474,33 @@ type BudgetSetEvent implements Event @entity {
   newBudget: BigInt!
 }
 
+type BudgetUpdatedEvent implements Event @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Related group"
+  group: WorkingGroup!
+
+  "Amount substracted from / added to the current budget"
+  budgetChangeAmount: BigInt!
+}
+
 type WorkerRewardAccountUpdatedEvent implements Event @entity {
   ### GENERIC DATA ###