Browse Source

query node - storage mappings

ondratra 4 năm trước cách đây
mục cha
commit
cad2c4ae29

+ 46 - 0
query-node/mappings/common.ts

@@ -4,8 +4,27 @@ import { DatabaseManager } from '@dzlzv/hydra-db-utils'
 import { Block } from 'query-node/dist/src/modules/block/block.model'
 import { Network } from 'query-node/src/modules/enums/enums'
 
+// Asset
+import {
+  Asset,
+  AssetUploadStatus,
+  AssetStorage,
+  AssetOwnerMember,
+} from 'query-node/dist/src/modules/variants/variants.model'
+import {
+  AssetDataObject,
+  LiaisonJudgement,
+} from 'query-node/dist/src/modules/asset-data-object/asset-data-object.model'
+import {
+  ContentParameters
+} from '@joystream/types/augment'
+
 const currentNetwork = Network.BABYLON
 
+export function inconsistentState(): void {
+  throw 'Inconsistent state' // TODO: create a proper way of handling inconsistent state
+}
+
 // prepare block record
 export async function prepareBlock(db: DatabaseManager, event: SubstrateEvent): Promise<Block> {
   let block = await db.get(Block, { where: { block: event.blockNumber } })
@@ -20,3 +39,30 @@ export async function prepareBlock(db: DatabaseManager, event: SubstrateEvent):
     network: currentNetwork,
   })
 }
+
+export async function prepareAssetDataObject(contentParameters: ContentParameters, block: Block): Promise<AssetStorage> {
+  const assetOwner = new AssetOwnerMember() // TODO: proper owner
+  assetOwner.memberId = 0
+
+  const assetDataObject = new AssetDataObject({
+    owner: assetOwner,
+    addedAt: block,
+    typeId: contentParameters.type_id.toNumber(),
+    size: contentParameters.size,
+    liaisonId: 0, // TODO: proper id
+    liaisonJudgement: LiaisonJudgement.PENDING, // TODO: proper judgement
+    ipfsContentId: contentParameters.ipfs_content_id.toHex(),
+    joystreamContentId: contentParameters.content_id.toHex(),
+  })
+  // TODO: handle `AssetNeverProvided` and `AssetDeleted` states
+  const uploadingStatus = new AssetUploadStatus()
+  /* TODO: set the values (`dataObject` and `oldDataObject` absent in AssetUploadStatus)
+  uploadingStatus.dataObject = new AssetDataObject
+  uploadingStatus.oldDataObject: undefined // TODO: handle oldDataObject
+  */
+
+  const assetStorage = new AssetStorage()
+  assetStorage.uploadStatus = uploadingStatus
+
+  return assetStorage
+}

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

@@ -1,2 +1,3 @@
 export * from './mappingsContent'
 export * from './membership'
+export * from './storage'

+ 15 - 30
query-node/mappings/mappingsContent.ts

@@ -44,7 +44,11 @@ import {
 } from 'query-node'
 */
 
-import { prepareBlock } from './common'
+import {
+  inconsistentState,
+  prepareBlock,
+  prepareAssetDataObject,
+} from './common'
 
 // primary entities
 import { Block } from 'query-node/dist/src/modules/block/block.model'
@@ -73,11 +77,15 @@ import {
   LiaisonJudgement
 } from 'query-node/dist/src/modules/asset-data-object/asset-data-object.model'
 
+
+// TODO: decide which of the following imports is valid
+import {
+  ContentParameters
+} from '@joystream/types/augment'
 import {
   contentDirectory,
+  storage,
 } from '@joystream/types'
-
-
 type RawAsset = ReturnType<typeof contentDirectory.NewAsset.create>
 type RawAssetTypes = typeof contentDirectory.NewAsset.typeDefinitions
 
@@ -179,6 +187,7 @@ async function readProtobuf(
   throw `Not implemented type: ${type}`
 }
 
+
 async function convertAsset(rawAsset: RawAsset, db: DatabaseManager, event: SubstrateEvent): Promise<typeof Asset> {
   if (rawAsset.type == 'Urls') {
     const assetUrl = new AssetUrl()
@@ -190,30 +199,10 @@ async function convertAsset(rawAsset: RawAsset, db: DatabaseManager, event: Subs
   // rawAsset == 'Upload'
 
   //const contentParameters: typeof contentDirectory.ContentParameters = rawAsset.asStorage()
-  const contentParameters = rawAsset.asType('Upload')
+  const contentParameters: ContentParameters = rawAsset.asType('Upload')
 
-  const assetOwner = new AssetOwnerMember() // TODO: proper owner
-  assetOwner.memberId = 0
-
-  const assetDataObject = new AssetDataObject({
-    owner: assetOwner,
-    addedAt: await prepareBlock(db, event),
-    typeId: contentParameters.type_id.toNumber(),
-    size: 0, // TODO: retrieve proper file size
-    liaisonId: 0, // TODO: proper id
-    liaisonJudgement: LiaisonJudgement.PENDING, // TODO: proper judgement
-    ipfsContentId: contentParameters.ipfs_content_id.toHex(),
-    joystreamContentId: contentParameters.content_id.toHex(),
-  })
-  // TODO: handle `AssetNeverProvided` and `AssetDeleted` states
-  const uploadingStatus = new AssetUploadStatus()
-  /* TODO: set the values (`dataObject` and `oldDataObject` absent in AssetUploadStatus)
-  uploadingStatus.dataObject = new AssetDataObject
-  uploadingStatus.oldDataObject: undefined // TODO: handle oldDataObject
-  */
-
-  const assetStorage = new AssetStorage()
-  assetStorage.uploadStatus = uploadingStatus
+  const block = await prepareBlock(db, event)
+  const assetStorage = await prepareAssetDataObject(contentParameters, block)
 
   return assetStorage
 }
@@ -287,10 +276,6 @@ async function prepareVideoCategory(categoryId: number, db: DatabaseManager): Pr
   return category
 }
 
-function inconsistentState(): void {
-  throw 'Inconsistent state' // TODO: create a proper way of handling inconsistent state
-}
-
 /////////////////// Channel ////////////////////////////////////////////////////
 
 // eslint-disable-next-line @typescript-eslint/naming-convention

+ 2 - 2
query-node/mappings/package.json

@@ -10,8 +10,8 @@
     "clean": "rm -rf lib"
   },
   "dependencies": {
-    "@dzlzv/hydra-common": "2.0.1-beta.0",
-    "@dzlzv/hydra-db-utils": "2.0.1-beta.0",
+    "@dzlzv/hydra-common": "2.0.1-beta.9",
+    "@dzlzv/hydra-db-utils": "2.0.1-beta.9",
     "@joystream/content-metadata-protobuf": "^1.0.0",
     "@joystream/types": "^0.16.0",
     "query-node": "^0.0.0",

+ 85 - 0
query-node/mappings/storage.ts

@@ -0,0 +1,85 @@
+import { SubstrateEvent } from '@dzlzv/hydra-common'
+import { DatabaseManager } from '@dzlzv/hydra-db-utils'
+
+import {
+  inconsistentState,
+  prepareAssetDataObject,
+  prepareBlock,
+} from './common'
+
+import {
+  ContentId,
+  ContentParameters,
+} from '@joystream/types/augment'
+import {
+  AssetStorage,
+} from 'query-node/dist/src/modules/variants/variants.model'
+import { LiaisonJudgement } from 'query-node/dist/src/modules/enums/enums'
+
+import { AssetDataObject } from 'query-node/dist/src/modules/asset-data-object/asset-data-object.model'
+
+export async function ContentAdded(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
+  /* event arguments
+  Vec<ContentParameters>,
+  StorageObjectOwner
+  */
+
+  // TODO: resolve handling of Vec<ContentParameters> - currently only the first item is handled
+  const contentParameters: ContentParameters = (event.params[0].value as any)[0] // TODO: get rid of `any` typecast
+
+  const block = await prepareBlock(db, event)
+  const assetStorage = await prepareAssetDataObject(contentParameters, block)
+
+  await db.save<AssetStorage>(assetStorage)
+}
+
+export async function ContentRemoved(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
+  /* event arguments
+  Vec<ContentId>,
+  StorageObjectOwner,
+  */
+
+  const contentIds: ContentId[] = (event.params[0].value as any)[0] // TODO: get rid of `any` typecast
+
+  const assetDataObjects = await db.getMany(AssetDataObject, { where: { joystreamContentId: contentIds }})
+
+  for (let item of assetDataObjects) {
+      await db.remove<AssetDataObject>(item)
+  }
+}
+
+export async function ContentAccepted(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
+  /* event arguments
+  ContentId,
+  StorageProviderId,
+  */
+
+  const joystreamContentId: ContentParameters = (event.params[0].value as any) // TODO: get rid of `any` typecast
+  const assetDataObject = await db.get(AssetDataObject, { where: { joystreamContentId }})
+
+  if (!assetDataObject) {
+    return inconsistentState()
+  }
+
+  assetDataObject.liaisonJudgement = LiaisonJudgement.ACCEPTED
+
+  await db.save<AssetDataObject>(assetDataObject)
+}
+
+export async function ContentRejected(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
+    /* event arguments
+  ContentId,
+  StorageProviderId,
+  */
+
+  const joystreamContentId: ContentParameters = (event.params[0].value as any) // TODO: get rid of `any` typecast
+  const assetDataObject = await db.get(AssetDataObject, { where: { joystreamContentId }})
+
+  if (!assetDataObject) {
+    return inconsistentState()
+  }
+
+  assetDataObject.liaisonJudgement = LiaisonJudgement.REJECTED
+
+  await db.save<AssetDataObject>(assetDataObject)
+}

+ 4 - 5
query-node/package.json

@@ -37,13 +37,12 @@
     "tslib": "^2.0.0",
     "@types/bn.js": "^4.11.6",
     "bn.js": "^5.1.2",
-    "@dzlzv/hydra-cli": "2.0.0-beta",
-    "@dzlzv/hydra-processor": "0.1.1"
+    "@dzlzv/hydra-cli": "2.0.1-beta.9",
+    "@dzlzv/hydra-processor": "2.0.1-beta.9"
   },
   "devDependencies": {
-    "@dzlzv/hydra-cli": "2.0.1-beta.3",
-    "@dzlzv/hydra-processor": "2.0.1-beta.3",
-    "@dzlzv/hydra-typegen": "2.0.1-beta.3"
+    "@dzlzv/hydra-typegen": "2.0.1-beta.9"
+    , "@polkadot/x-ws": "6.0.5"
   },
   "volta": {
 		"extends": "../package.json"