Browse Source

query node - channel and dataObject owner rework

ondratra 3 years ago
parent
commit
f8714592d2

+ 7 - 3
query-node/mappings/src/content/channel.ts

@@ -10,7 +10,8 @@ import { Content } from '../../../generated/types'
 import {
   readProtobuf,
   readProtobufWithAssets,
-  convertContentActorToOwner,
+  convertContentActorToChannelOwner,
+  convertContentActorToDataObjectOwner,
 } from './utils'
 
 import {
@@ -40,7 +41,7 @@ export async function content_ChannelCreated(db: DatabaseManager, event: Substra
       db,
       blockNumber: event.blockNumber,
       assets: channelCreationParameters.assets,
-      contentOwner: convertContentActorToOwner(contentActor, channelId.toNumber()),
+      contentOwner: convertContentActorToDataObjectOwner(contentActor, channelId.toNumber()),
     }
   )
 
@@ -62,6 +63,9 @@ export async function content_ChannelCreated(db: DatabaseManager, event: Substra
     createdAt: new Date(fixBlockTimestamp(event.blockTimestamp).toNumber()),
     updatedAt: new Date(fixBlockTimestamp(event.blockTimestamp).toNumber()),
 
+    // prepare channel owner (handles fields `ownerMember` and `ownerCuratorGroup`)
+    ...await convertContentActorToChannelOwner(db, contentActor),
+
     // integrate metadata
     ...protobufContent
   })
@@ -105,7 +109,7 @@ export async function content_ChannelUpdated(
         db,
         blockNumber: event.blockNumber,
         assets: channelUpdateParameters.assets.unwrapOr([]),
-        contentOwner: convertContentActorToOwner(contentActor, channelId.toNumber()),
+        contentOwner: convertContentActorToDataObjectOwner(contentActor, channelId.toNumber()),
       }
     )
 

+ 43 - 1
query-node/mappings/src/content/utils.ts

@@ -56,6 +56,8 @@ import {
   DataObject,
   LiaisonJudgement,
   AssetAvailability,
+
+  Membership,
 } from 'query-node'
 
 // Joystream types
@@ -248,7 +250,47 @@ export async function readProtobufWithAssets<T extends Channel | Video>(
   throw `Not implemented metadata type`
 }
 
-export function convertContentActorToOwner(contentActor: ContentActor, channelId: number): typeof DataObjectOwner {
+export async function convertContentActorToChannelOwner(db: DatabaseManager, contentActor: ContentActor): Promise<{
+  ownerMember?: Membership,
+  ownerCuratorGroup?: CuratorGroup,
+}> {
+  if (contentActor.isMember) {
+    const memberId = contentActor.asMember.toNumber()
+    const member = await db.get(Membership, { where: { id: memberId.toString() } as FindConditions<Membership> })
+
+    // ensure member exists
+    if (!member) {
+      return inconsistentState(`Actor is non-existing member`, memberId)
+    }
+
+    return {
+      ownerMember: member,
+      ownerCuratorGroup: undefined, // this will clear the field
+    }
+  }
+
+  if (contentActor.isCurator) {
+    const curatorGroupId = contentActor.asCurator[0].toNumber()
+    const curatorGroup = await db.get(CuratorGroup, { where: { id: curatorGroupId.toString() } as FindConditions<CuratorGroup> })
+
+    // ensure curator group exists
+    if (!curatorGroup) {
+      return inconsistentState('Actor is non-existing curator group', curatorGroupId)
+    }
+
+    return {
+      ownerMember: undefined, // this will clear the field
+      ownerCuratorGroup: curatorGroup,
+    }
+  }
+
+  // TODO: contentActor.isLead
+
+  logger.error('Not implemented ContentActor type', {contentActor: contentActor.toString()})
+  throw 'Not-implemented ContentActor type used'
+}
+
+export function convertContentActorToDataObjectOwner(contentActor: ContentActor, channelId: number): typeof DataObjectOwner {
   const owner = new DataObjectOwnerChannel()
   owner.channel = channelId
 

+ 3 - 3
query-node/mappings/src/content/video.ts

@@ -14,7 +14,7 @@ import {
 } from '../common'
 
 import {
-  convertContentActorToOwner,
+  convertContentActorToDataObjectOwner,
   readProtobuf,
   readProtobufWithAssets
 } from './utils'
@@ -170,7 +170,7 @@ export async function content_VideoCreated(
       db,
       blockNumber: event.blockNumber,
       assets: videoCreationParameters.assets,
-      contentOwner: convertContentActorToOwner(contentActor, channelId.toNumber()),
+      contentOwner: convertContentActorToDataObjectOwner(contentActor, channelId.toNumber()),
     }
   )
 
@@ -244,7 +244,7 @@ export async function content_VideoUpdated(
         db,
         blockNumber: event.blockNumber,
         assets: videoUpdateParameters.assets.unwrapOr([]),
-        contentOwner: convertContentActorToOwner(contentActor, (new BN(video.channel.id)).toNumber()),
+        contentOwner: convertContentActorToDataObjectOwner(contentActor, (new BN(video.channel.id)).toNumber()),
       }
     )