import { DB } from '../../../generated/indexer' import { Channel } from '../../../generated/graphql-server/src/modules/channel/channel.model' import { Category } from '../../../generated/graphql-server/src/modules/category/category.model' import { KnownLicense } from '../../../generated/graphql-server/src/modules/known-license/known-license.model' import { UserDefinedLicense } from '../../../generated/graphql-server/src/modules/user-defined-license/user-defined-license.model' import { JoystreamMediaLocation } from '../../../generated/graphql-server/src/modules/joystream-media-location/joystream-media-location.model' import { HttpMediaLocation } from '../../../generated/graphql-server/src/modules/http-media-location/http-media-location.model' import { VideoMedia } from '../../../generated/graphql-server/src/modules/video-media/video-media.model' import { Video } from '../../../generated/graphql-server/src/modules/video/video.model' import { Block, Network } from '../../../generated/graphql-server/src/modules/block/block.model' import { Language } from '../../../generated/graphql-server/src/modules/language/language.model' import { VideoMediaEncoding } from '../../../generated/graphql-server/src/modules/video-media-encoding/video-media-encoding.model' import { ClassEntity } from '../../../generated/graphql-server/src/modules/class-entity/class-entity.model' import { License } from '../../../generated/graphql-server/src/modules/license/license.model' import { MediaLocation } from '../../../generated/graphql-server/src/modules/media-location/media-location.model' import { contentDirectoryClassNamesWithId } from '../content-dir-consts' import { ClassEntityMap, ICategory, IChannel, ICreateEntityOperation, IDBBlockId, IEntity, IHttpMediaLocation, IJoystreamMediaLocation, IKnownLicense, ILanguage, ILicense, IMediaLocation, IUserDefinedLicense, IVideo, IVideoMedia, IVideoMediaEncoding, } from '../../types' import { getOrCreate } from '../get-or-create' import BN from 'bn.js' async function createBlockOrGetFromDatabase(db: DB, blockNumber: number): Promise { let b = await db.get(Block, { where: { block: blockNumber } }) if (b === undefined) { // TODO: get timestamp from the event or extrinsic b = new Block({ block: blockNumber, network: Network.BABYLON, timestamp: new BN(Date.now()) }) await db.save(b) } return b } async function createChannel( { db, block, id }: IDBBlockId, classEntityMap: ClassEntityMap, p: IChannel, nextEntityIdBeforeTransaction: number ): Promise { const record = await db.get(Channel, { where: { id } }) if (record) return record const channel = new Channel() channel.version = block channel.id = id channel.title = p.title channel.description = p.description channel.isCurated = p.isCurated || false channel.isPublic = p.isPublic channel.coverPhotoUrl = p.coverPhotoURL channel.avatarPhotoUrl = p.avatarPhotoURL channel.happenedIn = await createBlockOrGetFromDatabase(db, block) const { language } = p if (language !== undefined) { channel.language = await getOrCreate.language( { db, block, id }, classEntityMap, language, nextEntityIdBeforeTransaction ) } await db.save(channel) return channel } async function createCategory({ db, block, id }: IDBBlockId, p: ICategory): Promise { const record = await db.get(Category, { where: { id } }) if (record) return record const category = new Category() category.id = id category.name = p.name category.description = p.description category.version = block category.happenedIn = await createBlockOrGetFromDatabase(db, block) await db.save(category) return category } async function createKnownLicense({ db, block, id }: IDBBlockId, p: IKnownLicense): Promise { const record = await db.get(KnownLicense, { where: { id } }) if (record) return record const knownLicence = new KnownLicense() knownLicence.id = id knownLicence.code = p.code knownLicence.name = p.name knownLicence.description = p.description knownLicence.url = p.url knownLicence.version = block knownLicence.happenedIn = await createBlockOrGetFromDatabase(db, block) await db.save(knownLicence) return knownLicence } async function createUserDefinedLicense( { db, block, id }: IDBBlockId, p: IUserDefinedLicense ): Promise { const record = await db.get(UserDefinedLicense, { where: { id } }) if (record) return record const userDefinedLicense = new UserDefinedLicense() userDefinedLicense.id = id userDefinedLicense.content = p.content userDefinedLicense.version = block userDefinedLicense.happenedIn = await createBlockOrGetFromDatabase(db, block) await db.save(userDefinedLicense) return userDefinedLicense } async function createJoystreamMediaLocation( { db, block, id }: IDBBlockId, p: IJoystreamMediaLocation ): Promise { const record = await db.get(JoystreamMediaLocation, { where: { id } }) if (record) return record const joyMediaLoc = new JoystreamMediaLocation() joyMediaLoc.id = id joyMediaLoc.dataObjectId = p.dataObjectId joyMediaLoc.version = block joyMediaLoc.happenedIn = await createBlockOrGetFromDatabase(db, block) await db.save(joyMediaLoc) return joyMediaLoc } async function createHttpMediaLocation( { db, block, id }: IDBBlockId, p: IHttpMediaLocation ): Promise { const record = await db.get(HttpMediaLocation, { where: { id } }) if (record) return record const httpMediaLoc = new HttpMediaLocation() httpMediaLoc.id = id httpMediaLoc.url = p.url httpMediaLoc.port = p.port httpMediaLoc.version = block httpMediaLoc.happenedIn = await createBlockOrGetFromDatabase(db, block) await db.save(httpMediaLoc) return httpMediaLoc } async function createVideoMedia( { db, block, id }: IDBBlockId, classEntityMap: ClassEntityMap, p: IVideoMedia, nextEntityIdBeforeTransaction: number ): Promise { const videoMedia = new VideoMedia() videoMedia.id = id videoMedia.pixelHeight = p.pixelHeight videoMedia.pixelWidth = p.pixelWidth videoMedia.size = p.size videoMedia.version = block const { encoding, location } = p if (encoding !== undefined) { videoMedia.encoding = await getOrCreate.videoMediaEncoding( { db, block, id }, classEntityMap, encoding, nextEntityIdBeforeTransaction ) } if (location !== undefined) { videoMedia.location = await getOrCreate.mediaLocation( { db, block, id }, classEntityMap, location, nextEntityIdBeforeTransaction ) } videoMedia.happenedIn = await createBlockOrGetFromDatabase(db, block) await db.save(videoMedia) return videoMedia } async function createVideo( { db, block, id }: IDBBlockId, classEntityMap: ClassEntityMap, p: IVideo, nextEntityIdBeforeTransaction: number ): Promise