Browse Source

query node - channel creation fixes

ondratra 3 years ago
parent
commit
8e959e01f5

+ 4 - 0
query-node/mappings/src/common.ts

@@ -46,6 +46,10 @@ export async function prepareDataObject(
     liaisonJudgement: LiaisonJudgement.PENDING, // judgement is pending at start; liaison id is set when content is accepted/rejected
     liaisonJudgement: LiaisonJudgement.PENDING, // judgement is pending at start; liaison id is set when content is accepted/rejected
     ipfsContentId: contentParameters.ipfs_content_id.toHex(),
     ipfsContentId: contentParameters.ipfs_content_id.toHex(),
     joystreamContentId: contentParameters.content_id.toHex(),
     joystreamContentId: contentParameters.content_id.toHex(),
+
+
+    createdById: '1',
+    updatedById: '1',
   })
   })
 
 
   return dataObject
   return dataObject

+ 4 - 0
query-node/mappings/src/content/channel.ts

@@ -23,6 +23,10 @@ import {
   logger,
   logger,
 } from '../common'
 } from '../common'
 
 
+import {
+  AssetAvailability,
+} from 'query-node'
+import BN from 'bn.js'
 // eslint-disable-next-line @typescript-eslint/naming-convention
 // eslint-disable-next-line @typescript-eslint/naming-convention
 export async function content_ChannelCreated(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
 export async function content_ChannelCreated(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
   // read event data
   // read event data

+ 35 - 13
query-node/mappings/src/content/utils.ts

@@ -8,6 +8,7 @@
 
 
 import { SubstrateEvent } from '@dzlzv/hydra-common'
 import { SubstrateEvent } from '@dzlzv/hydra-common'
 import { DatabaseManager } from '@dzlzv/hydra-db-utils'
 import { DatabaseManager } from '@dzlzv/hydra-db-utils'
+import { Bytes } from '@polkadot/types'
 import ISO6391 from 'iso-639-1';
 import ISO6391 from 'iso-639-1';
 import BN from 'bn.js'
 import BN from 'bn.js'
 import { u64 } from '@polkadot/types/primitive';
 import { u64 } from '@polkadot/types/primitive';
@@ -82,8 +83,8 @@ function isAssetInStorage(dataObject: AssetStorageOrUrls): dataObject is DataObj
   return true
   return true
 }
 }
 
 
-export interface IReadProtobufArguments{
-  metadata: Uint8Array
+export interface IReadProtobufArguments {
+  metadata: Bytes
   db: DatabaseManager
   db: DatabaseManager
   blockNumber: number
   blockNumber: number
 }
 }
@@ -100,14 +101,17 @@ export async function readProtobuf<T extends ChannelCategory | VideoCategory>(
   type: T,
   type: T,
   parameters: IReadProtobufArguments,
   parameters: IReadProtobufArguments,
 ): Promise<Partial<T>> {
 ): Promise<Partial<T>> {
+  // true option here is crucial, it indicates that we want just the underlying bytes (by default it will also include bytes encoding the length)
+  const metaU8a = parameters.metadata.toU8a(true);
+
   // process channel category
   // process channel category
   if (type instanceof ChannelCategory) {
   if (type instanceof ChannelCategory) {
-    return ChannelCategoryMetadata.deserializeBinary(parameters.metadata).toObject() as Partial<T>
+    return ChannelCategoryMetadata.deserializeBinary(metaU8a).toObject() as Partial<T>
   }
   }
 
 
   // process video category
   // process video category
   if (type instanceof VideoCategory) {
   if (type instanceof VideoCategory) {
-    return VideoCategoryMetadata.deserializeBinary(parameters.metadata).toObject() as Partial<T>
+    return VideoCategoryMetadata.deserializeBinary(metaU8a).toObject() as Partial<T>
   }
   }
 
 
   // this should never happen
   // this should never happen
@@ -130,10 +134,12 @@ export async function readProtobufWithAssets<T extends Channel | Video>(
   type: T,
   type: T,
   parameters: IReadProtobufArgumentsWithAssets,
   parameters: IReadProtobufArgumentsWithAssets,
 ): Promise<Partial<T>> {
 ): Promise<Partial<T>> {
+  // true option here is crucial, it indicates that we want just the underlying bytes (by default it will also include bytes encoding the length)
+  const metaU8a = parameters.metadata.toU8a(true);
 
 
   // process channel
   // process channel
   if (type instanceof Channel) {
   if (type instanceof Channel) {
-    const meta = ChannelMetadata.deserializeBinary(parameters.metadata)
+    const meta = ChannelMetadata.deserializeBinary(metaU8a)
     const metaAsObject = meta.toObject()
     const metaAsObject = meta.toObject()
     const result = metaAsObject as any as Partial<Channel>
     const result = metaAsObject as any as Partial<Channel>
 
 
@@ -165,7 +171,7 @@ export async function readProtobufWithAssets<T extends Channel | Video>(
 
 
     // prepare language if needed
     // prepare language if needed
     if (metaAsObject.language) {
     if (metaAsObject.language) {
-      result.language = await prepareLanguage(metaAsObject.language, parameters.db)
+      result.language = await prepareLanguage(metaAsObject.language, parameters.db, parameters.blockNumber)
     }
     }
 
 
     return result as Partial<T>
     return result as Partial<T>
@@ -173,7 +179,7 @@ export async function readProtobufWithAssets<T extends Channel | Video>(
 
 
   // process video
   // process video
   if (type instanceof Video) {
   if (type instanceof Video) {
-    const meta = VideoMetadata.deserializeBinary(parameters.metadata)
+    const meta = VideoMetadata.deserializeBinary(metaU8a)
     const metaAsObject = meta.toObject()
     const metaAsObject = meta.toObject()
     const result = metaAsObject as any as Partial<Video>
     const result = metaAsObject as any as Partial<Video>
 
 
@@ -224,7 +230,7 @@ export async function readProtobufWithAssets<T extends Channel | Video>(
 
 
     // prepare language if needed
     // prepare language if needed
     if (metaAsObject.language) {
     if (metaAsObject.language) {
-      result.language = await prepareLanguage(metaAsObject.language, parameters.db)
+      result.language = await prepareLanguage(metaAsObject.language, parameters.db, parameters.blockNumber)
     }
     }
 
 
     // prepare information about media published somewhere else before Joystream if needed.
     // prepare information about media published somewhere else before Joystream if needed.
@@ -243,7 +249,7 @@ export async function readProtobufWithAssets<T extends Channel | Video>(
 
 
 export function convertContentActorToOwner(contentActor: ContentActor, channelId: BN): typeof DataObjectOwner {
 export function convertContentActorToOwner(contentActor: ContentActor, channelId: BN): typeof DataObjectOwner {
   const owner = new DataObjectOwnerChannel()
   const owner = new DataObjectOwnerChannel()
-  owner.channel = channelId
+  //owner.channel = channelId // TODO: make this work; it causes error `TypeError, message: attempted to use private field on non-instance`
 
 
   return owner
   return owner
 
 
@@ -362,7 +368,7 @@ function integrateAsset<T>(propertyName: string, result: Object, asset: AssetSto
   }
   }
 
 
   // (un)set asset's properties
   // (un)set asset's properties
-  result[nameUrl] = undefined // plan deletion (will have effect when saved to db)
+  result[nameUrl] = [] // plan deletion (will have effect when saved to db)
   result[nameAvailability] = conversionTable[asset.liaisonJudgement]
   result[nameAvailability] = conversionTable[asset.liaisonJudgement]
   result[nameDataObject] = asset
   result[nameDataObject] = asset
 }
 }
@@ -395,7 +401,7 @@ async function extractVideoSize(assets: NewAsset[], assetIndex: number | undefin
   return videoSize
   return videoSize
 }
 }
 
 
-async function prepareLanguage(languageIso: string, db: DatabaseManager): Promise<Language> {
+async function prepareLanguage(languageIso: string, db: DatabaseManager, blockNumber: number): Promise<Language> {
   // validate language string
   // validate language string
   const isValidIso = ISO6391.validate(languageIso);
   const isValidIso = ISO6391.validate(languageIso);
 
 
@@ -412,11 +418,19 @@ async function prepareLanguage(languageIso: string, db: DatabaseManager): Promis
     return language;
     return language;
   }
   }
 
 
+
   // create new language
   // create new language
   const newLanguage = new Language({
   const newLanguage = new Language({
-    iso: languageIso
+    iso: languageIso,
+    createdInBlock: blockNumber,
+
+    // TODO: remove these lines after Hydra auto-fills the values when cascading save (remove them on all places)
+    createdById: '1',
+    updatedById: '1',
   })
   })
 
 
+  await db.save<Language>(newLanguage)
+
   return newLanguage
   return newLanguage
 }
 }
 
 
@@ -425,7 +439,12 @@ async function prepareLicense(licenseProtobuf: LicenseMetadata.AsObject): Promis
   //       and not here even it might appear so.
   //       and not here even it might appear so.
 
 
   // crete new license
   // crete new license
-  const license = new License(licenseProtobuf)
+  const license = new License({
+    ...licenseProtobuf,
+
+    createdById: '1',
+    updatedById: '1',
+  })
 
 
   return license
   return license
 }
 }
@@ -439,6 +458,9 @@ async function prepareVideoMetadata(videoProtobuf: VideoMetadata.AsObject, video
     encoding,
     encoding,
     pixelWidth: videoProtobuf.mediaPixelWidth,
     pixelWidth: videoProtobuf.mediaPixelWidth,
     pixelHeight: videoProtobuf.mediaPixelHeight,
     pixelHeight: videoProtobuf.mediaPixelHeight,
+
+    createdById: '1',
+    updatedById: '1',
   })
   })
 
 
   // fill in video size if provided
   // fill in video size if provided

+ 1 - 1
query-node/schema.graphql

@@ -116,7 +116,7 @@ type DataObjectOwnerMember @variant {
   #"Member identifier"
   #"Member identifier"
   #memberId: Membership!
   #memberId: Membership!
   "Member identifier"
   "Member identifier"
-  member: BigInt!
+  member: BigInt # TODO: make this mandatory again (see DataObject mapping for more info)
 
 
   "Variant needs to have at least one property. This value is not used."
   "Variant needs to have at least one property. This value is not used."
   dummy: Int
   dummy: Int