membership.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import BN from 'bn.js'
  2. import { Bytes } from '@polkadot/types'
  3. import { MemberId } from '@joystream/types/members'
  4. import { SubstrateEvent } from '@dzlzv/hydra-common'
  5. import { DatabaseManager } from '@dzlzv/hydra-db-utils'
  6. import {
  7. inconsistentState,
  8. prepareBlock,
  9. } from './common'
  10. import { Members } from '../generated/types'
  11. import { MembershipEntryMethod, Membership } from 'query-node/src/modules/membership/membership.model'
  12. import { Block } from 'query-node/src/modules/block/block.model'
  13. /*
  14. Retrive membership from the database
  15. */
  16. async function getMemberById(db: DatabaseManager, id: MemberId): Promise<Membership> {
  17. // load member
  18. const member = await db.get(Membership, { where: { id: id.toString() } })
  19. // ensure member exists
  20. if (!member) {
  21. return inconsistentState(`Member(${id}) not found`)
  22. }
  23. return member
  24. }
  25. /*
  26. Helper for converting Bytes type to string
  27. */
  28. function convertBytesToString(b: Bytes): string {
  29. return Buffer.from(b.toU8a(true)).toString()
  30. }
  31. // eslint-disable-next-line @typescript-eslint/naming-convention
  32. export async function members_MemberRegistered(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
  33. // read event data
  34. const { accountId, memberId } = new Members.MemberRegisteredEvent(event_).data
  35. const { avatarUri, about, handle } = new Members.BuyMembershipCall(event_).args
  36. // create new membership
  37. const member = new Membership({
  38. id: memberId.toString(),
  39. rootAccount: accountId.toString(),
  40. controllerAccount: accountId.toString(),
  41. handle: convertBytesToString(handle.unwrap()),
  42. about: convertBytesToString(about.unwrap()),
  43. avatarUri: convertBytesToString(avatarUri.unwrap()),
  44. registeredAtBlock: await prepareBlock(db, event_),
  45. registeredAtTime: new Date(event_.blockTimestamp.toNumber()),
  46. // TODO: in the runtime there is currently no way to distinguish distinguish `buy_membership`(method `Paid`) and `add_screened_member`(`Screening`)
  47. entry: MembershipEntryMethod.PAID,
  48. })
  49. // save membership
  50. await db.save<Membership>(member)
  51. }
  52. // eslint-disable-next-line @typescript-eslint/naming-convention
  53. export async function members_MemberUpdatedAboutText(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
  54. // read event data
  55. const { text, memberId } = new Members.ChangeMemberAboutTextCall(event_).args
  56. // load member
  57. const member = await getMemberById(db, memberId)
  58. // update member
  59. member.about = convertBytesToString(text)
  60. // save member
  61. await db.save<Membership>(member)
  62. }
  63. // eslint-disable-next-line @typescript-eslint/naming-convention
  64. export async function members_MemberUpdatedAvatar(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
  65. // read event data
  66. const { uri, memberId } = new Members.ChangeMemberAvatarCall(event_).args
  67. // load member
  68. const member = await getMemberById(db, memberId)
  69. // update member
  70. member.avatarUri = convertBytesToString(uri)
  71. // save member
  72. await db.save<Membership>(member)
  73. }
  74. // eslint-disable-next-line @typescript-eslint/naming-convention
  75. export async function members_MemberUpdatedHandle(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
  76. // read event data
  77. const { handle, memberId } = new Members.ChangeMemberHandleCall(event_).args
  78. // load member
  79. const member = await getMemberById(db, memberId)
  80. // update member
  81. member.handle = convertBytesToString(handle)
  82. // save member
  83. await db.save<Membership>(member)
  84. }
  85. // eslint-disable-next-line @typescript-eslint/naming-convention
  86. export async function members_MemberSetRootAccount(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
  87. // read event data
  88. const { newRootAccount, memberId } = new Members.SetRootAccountCall(event_).args
  89. const member = await getMemberById(db, memberId)
  90. // update member
  91. member.rootAccount = newRootAccount.toString()
  92. // save member
  93. await db.save<Membership>(member)
  94. }
  95. // eslint-disable-next-line @typescript-eslint/naming-convention
  96. export async function members_MemberSetControllerAccount(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
  97. // read event data
  98. const { newControllerAccount, memberId } = new Members.SetControllerAccountCall(event_).args
  99. // load member
  100. const member = await getMemberById(db, memberId)
  101. // update member
  102. member.controllerAccount = newControllerAccount.toString()
  103. // save member
  104. await db.save<Membership>(member)
  105. }