Browse Source

query-node: implement all membership mappings

metmirr 4 years ago
parent
commit
a59c9f8543
1 changed files with 70 additions and 12 deletions
  1. 70 12
      query-node/mappings/membership.ts

+ 70 - 12
query-node/mappings/membership.ts

@@ -1,21 +1,33 @@
 import BN from 'bn.js'
+import { Bytes } from '@polkadot/types'
+import { MemberId } from '@joystream/types/members'
 import { DatabaseManager, SubstrateEvent } from '@dzlzv/hydra-indexer-lib/lib'
 
 import { Members } from '../generated/types'
 import { EntryMethod, Membership } from '../generated/graphql-server/src/modules/membership/membership.model'
 import { Block, Network } from '../generated/graphql-server/src/modules/block/block.model'
 
+async function getMemberById(db: DatabaseManager, id: MemberId): Promise<Membership> {
+  const member = await db.get(Membership, { where: { id: id.toString() } })
+  if (!member) throw Error(`Member(${id}) not found`)
+  return member
+}
+
+function convertBytesToString(b: Bytes): string {
+  return Buffer.from(b.toU8a(true)).toString()
+}
+
 // eslint-disable-next-line @typescript-eslint/naming-convention
-export async function members_MemberRegistered(db: DatabaseManager, substrateEvent: SubstrateEvent): Promise<void> {
-  const eventData = new Members.MemberRegisteredEvent(substrateEvent).data
-  const callArgs = new Members.BuyMembershipCall(substrateEvent).args
+export async function members_MemberRegistered(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
+  const { accountId, memberId } = new Members.MemberRegisteredEvent(event_).data
+  const { avatarUri, about, handle } = new Members.BuyMembershipCall(event_).args
 
-  let block = await db.get(Block, { where: { block: eventData.ctx.blockNumber } })
+  let block = await db.get(Block, { where: { block: event_.blockNumber } })
 
   if (!block) {
     block = new Block({
       network: Network.BABYLON,
-      block: substrateEvent.blockNumber,
+      block: event_.blockNumber,
       // TODO: upgrade indexer-lib which support block timestamp: substrateEvent.timestamp
       timestamp: new BN(Date.now()),
     })
@@ -23,17 +35,63 @@ export async function members_MemberRegistered(db: DatabaseManager, substrateEve
   }
 
   const member = new Membership({
-    id: eventData.memberId.toString(),
-    rootAccount: eventData.accountId.toString(),
-    controllerAccount: eventData.accountId.toString(),
-    handle: callArgs.handle.value.toString(),
-    about: callArgs.about.value.toString(),
-    avatarUri: callArgs.avatarUri.toString(),
+    id: memberId.toString(),
+    rootAccount: accountId.toString(),
+    controllerAccount: accountId.toString(),
+    handle: convertBytesToString(handle.unwrap()),
+    about: convertBytesToString(about.unwrap()),
+    avatarUri: convertBytesToString(avatarUri.unwrap()),
     registeredAtBlock: block,
     // TODO: upgrade indexer-lib which support block timestamp: substrateEvent.timestamp
     registeredAtTime: new Date(),
-    // entry: callArgs.paidTermsId,
+    entry: EntryMethod.PAID, // TODO?: callArgs.paidTermsId
+    suspended: false,
   })
 
   await db.save<Membership>(member)
 }
+
+// eslint-disable-next-line @typescript-eslint/naming-convention
+export async function members_MemberUpdatedAboutText(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
+  const { text, memberId } = new Members.ChangeMemberAboutTextCall(event_).args
+
+  const member = await getMemberById(db, memberId)
+  member.about = convertBytesToString(text)
+  await db.save<Membership>(member)
+}
+
+// eslint-disable-next-line @typescript-eslint/naming-convention
+export async function members_MemberUpdatedAvatar(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
+  const { uri, memberId } = new Members.ChangeMemberAvatarCall(event_).args
+
+  const member = await getMemberById(db, memberId)
+  member.avatarUri = convertBytesToString(uri)
+  await db.save<Membership>(member)
+}
+
+// eslint-disable-next-line @typescript-eslint/naming-convention
+export async function members_MemberUpdatedHandle(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
+  const { handle, memberId } = new Members.ChangeMemberHandleCall(event_).args
+
+  const member = await getMemberById(db, memberId)
+  member.handle = convertBytesToString(handle)
+  await db.save<Membership>(member)
+}
+
+// eslint-disable-next-line @typescript-eslint/naming-convention
+export async function members_MemberSetRootAccount(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
+  const { newRootAccount, memberId } = new Members.SetRootAccountCall(event_).args
+
+  const member = await getMemberById(db, memberId)
+  member.rootAccount = newRootAccount.toString()
+  await db.save<Membership>(member)
+}
+
+// eslint-disable-next-line @typescript-eslint/naming-convention
+export async function members_MemberSetControllerAccount(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
+  const { newControllerAccount, memberId } = new Members.SetControllerAccountCall(event_).args
+
+  const member = await getMemberById(db, memberId)
+  member.controllerAccount = newControllerAccount.toString()
+  await db.save<Membership>(member)
+}