123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- import { fixBlockTimestamp } from './eventFix'
- import { SubstrateEvent } from '@dzlzv/hydra-common'
- import { DatabaseManager } from '@dzlzv/hydra-db-utils'
- import { FindConditions, In } from 'typeorm'
- import { inconsistentState, logger, prepareDataObject } from './common'
- import { DataDirectory } from '../../generated/types'
- import { ContentId, ContentParameters, StorageObjectOwner } from '@joystream/types/augment'
- import { ContentId as Custom_ContentId, ContentParameters as Custom_ContentParameters } from '@joystream/types/storage'
- import { registry } from '@joystream/types'
- import {
- Channel,
- Video,
- AssetAvailability,
- DataObject,
- DataObjectOwner,
- DataObjectOwnerMember,
- DataObjectOwnerChannel,
- DataObjectOwnerDao,
- DataObjectOwnerCouncil,
- DataObjectOwnerWorkingGroup,
- LiaisonJudgement,
- Worker,
- WorkerType,
- } from 'query-node'
- export async function dataDirectory_ContentAdded(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
-
- const { contentParameters, storageObjectOwner } = new DataDirectory.ContentAddedEvent(event).data
-
- for (const parameters of contentParameters) {
- const owner = convertStorageObjectOwner(storageObjectOwner)
- const dataObject = await prepareDataObject(db, parameters, event, owner)
-
- dataObject.createdAt = new Date(fixBlockTimestamp(event.blockTimestamp).toNumber())
- dataObject.updatedAt = new Date(fixBlockTimestamp(event.blockTimestamp).toNumber())
- await db.save<DataObject>(dataObject)
- }
-
- logger.info('Storage content has beed added', {
- ids: contentParameters.map((item) => encodeContentId(item.content_id)),
- })
- }
- export async function dataDirectory_ContentRemoved(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
-
- const { contentId: contentIds } = new DataDirectory.ContentRemovedEvent(event).data
-
- const dataObjects = await db.getMany(DataObject, {
- where: {
- joystreamContentId: In(contentIds.map((item) => encodeContentId(item))),
- } as FindConditions<DataObject>,
- })
-
- const dataObjectIds = dataObjects.map((item) => item.id)
-
- for (const item of dataObjects) {
-
- await disconnectDataObjectRelations(db, item)
-
- await db.remove<DataObject>(item)
- }
-
- logger.info('Storage content have been removed', { id: contentIds, dataObjectIds })
- }
- export async function dataDirectory_ContentAccepted(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
-
- const { contentId, storageProviderId } = new DataDirectory.ContentAcceptedEvent(event).data
- const encodedContentId = encodeContentId(contentId)
-
- const dataObject = await db.get(DataObject, {
- where: { joystreamContentId: encodedContentId } as FindConditions<DataObject>,
- })
-
- if (!dataObject) {
- return inconsistentState('Non-existing content acceptation requested', encodedContentId)
- }
-
- const worker = await db.get(Worker, {
- where: {
- workerId: storageProviderId.toString(),
- type: WorkerType.STORAGE,
- } as FindConditions<Worker>,
- })
-
- if (!worker) {
- return inconsistentState('Missing Storage Provider Id', storageProviderId)
- }
-
- dataObject.liaison = worker
- dataObject.liaisonJudgement = LiaisonJudgement.ACCEPTED
-
- dataObject.updatedAt = new Date(fixBlockTimestamp(event.blockTimestamp).toNumber())
-
- await db.save<DataObject>(dataObject)
-
- logger.info('Storage content has been accepted', { id: encodedContentId })
-
-
- await updateConnectedAssets(db, dataObject)
- }
- async function updateConnectedAssets(db: DatabaseManager, dataObject: DataObject) {
- await updateSingleConnectedAsset(db, new Channel(), 'avatarPhoto', dataObject)
- await updateSingleConnectedAsset(db, new Channel(), 'coverPhoto', dataObject)
- await updateSingleConnectedAsset(db, new Video(), 'thumbnailPhoto', dataObject)
- await updateSingleConnectedAsset(db, new Video(), 'media', dataObject)
- }
- async function updateSingleConnectedAsset<T extends Channel | Video>(
- db: DatabaseManager,
- type: T,
- propertyName: string,
- dataObject: DataObject
- ) {
-
- const condition = {
- where: {
- [propertyName + 'DataObject']: dataObject,
- },
- }
-
-
-
- const item = type instanceof Channel ? await db.get(Channel, condition) : await db.get(Video, condition)
-
- if (!item) {
- return
- }
- item[propertyName + 'Availability'] = AssetAvailability.ACCEPTED
- if (type instanceof Channel) {
- await db.save<Channel>(item)
-
- logger.info('Channel using Content has been accepted', {
- channelId: item.id.toString(),
- joystreamContentId: dataObject.joystreamContentId,
- })
- } else {
- await db.save<Video>(item)
-
- logger.info('Video using Content has been accepted', {
- videoId: item.id.toString(),
- joystreamContentId: dataObject.joystreamContentId,
- })
- }
- }
- async function disconnectDataObjectRelations(db: DatabaseManager, dataObject: DataObject) {
- await disconnectSingleDataObjectRelation(db, new Channel(), 'avatarPhoto', dataObject)
- await disconnectSingleDataObjectRelation(db, new Channel(), 'coverPhoto', dataObject)
- await disconnectSingleDataObjectRelation(db, new Video(), 'thumbnailPhoto', dataObject)
- await disconnectSingleDataObjectRelation(db, new Video(), 'media', dataObject)
- }
- async function disconnectSingleDataObjectRelation<T extends Channel | Video>(
- db: DatabaseManager,
- type: T,
- propertyName: string,
- dataObject: DataObject
- ) {
-
- const condition = {
- where: {
- [propertyName + 'DataObject']: dataObject,
- },
- }
-
-
-
- const item = type instanceof Channel ? await db.get(Channel, condition) : await db.get(Video, condition)
-
- if (!item) {
- return
- }
- item[propertyName + 'Availability'] = AssetAvailability.INVALID
- item[propertyName + 'DataObject'] = null
- if (type instanceof Channel) {
- await db.save<Channel>(item)
-
- logger.info('Content has been disconnected from Channel', {
- channelId: item.id.toString(),
- joystreamContentId: dataObject.joystreamContentId,
- })
- } else {
-
- await db.save<Video>(item)
-
- logger.info('Content has been disconnected from Video', {
- videoId: item.id.toString(),
- joystreamContentId: dataObject.joystreamContentId,
- })
- }
- }
- function convertStorageObjectOwner(objectOwner: StorageObjectOwner): typeof DataObjectOwner {
- if (objectOwner.isMember) {
- const owner = new DataObjectOwnerMember()
- owner.member = objectOwner.asMember.toNumber()
- return owner
- }
- if (objectOwner.isChannel) {
- const owner = new DataObjectOwnerChannel()
- owner.channel = objectOwner.asChannel.toNumber()
- return owner
- }
- if (objectOwner.isDao) {
- const owner = new DataObjectOwnerDao()
- owner.dao = objectOwner.asDao.toNumber()
- return owner
- }
- if (objectOwner.isCouncil) {
- return new DataObjectOwnerCouncil()
- }
- if (objectOwner.isWorkingGroup) {
- const owner = new DataObjectOwnerWorkingGroup()
- owner.workingGroup = objectOwner.asWorkingGroup.toNumber()
- return owner
- }
- logger.error('Not implemented StorageObjectOwner type', { objectOwner: objectOwner.toString() })
- throw new Error('Not implemented StorageObjectOwner type')
- }
- function encodeContentId(contentId: ContentId) {
- const customContentId = new Custom_ContentId(registry, contentId)
- return customContentId.encode()
- }
|