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 { KnownLicenseEntity } from '../../../generated/graphql-server/src/modules/known-license-entity/known-license-entity.model' import { UserDefinedLicenseEntity } from '../../../generated/graphql-server/src/modules/user-defined-license-entity/user-defined-license-entity.model' import { JoystreamMediaLocationEntity } from '../../../generated/graphql-server/src/modules/joystream-media-location-entity/joystream-media-location-entity.model' import { HttpMediaLocationEntity } from '../../../generated/graphql-server/src/modules/http-media-location-entity/http-media-location-entity.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 { LicenseEntity } from '../../../generated/graphql-server/src/modules/license-entity/license-entity.model' import { MediaLocationEntity } from '../../../generated/graphql-server/src/modules/media-location-entity/media-location-entity.model' import { FeaturedVideo } from '../../../generated/graphql-server/src/modules/featured-video/featured-video.model' import { contentDirectoryClassNamesWithId } from '../content-dir-consts' import { ClassEntityMap, ICategory, IChannel, ICreateEntityOperation, IDBBlockId, IEntity, IFeaturedVideo, IHttpMediaLocation, IJoystreamMediaLocation, IKnownLicense, ILanguage, ILicense, IMediaLocation, IUserDefinedLicense, IVideo, IVideoMedia, IVideoMediaEncoding, } from '../../types' import { getOrCreate } from '../get-or-create' import BN from 'bn.js' import { HttpMediaLocation, JoystreamMediaLocation, KnownLicense, UserDefinedLicense, } from '../../../generated/graphql-server/src/modules/variants/variants.model' 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.handle = p.handle channel.description = p.description channel.isCurated = !!p.isCurated channel.isPublic = p.isPublic channel.coverPhotoUrl = p.coverPhotoUrl channel.avatarPhotoUrl = p.avatarPhotoUrl channel.happenedIn = await createBlockOrGetFromDatabase(db, block) const { language } = p if (language) { 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(KnownLicenseEntity, { where: { id } }) if (record) return record const knownLicence = new KnownLicenseEntity() 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(UserDefinedLicenseEntity, { where: { id } }) if (record) return record const userDefinedLicense = new UserDefinedLicenseEntity() 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(JoystreamMediaLocationEntity, { where: { id } }) if (record) return record const joyMediaLoc = new JoystreamMediaLocationEntity() 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(HttpMediaLocationEntity, { where: { id } }) if (record) return record const httpMediaLoc = new HttpMediaLocationEntity() 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) { const m = await getOrCreate.mediaLocation( { db, block, id }, classEntityMap, location, nextEntityIdBeforeTransaction ) videoMedia.locationEntity = m const { httpMediaLocation, joystreamMediaLocation } = m if (httpMediaLocation) { const mediaLoc = new HttpMediaLocation() mediaLoc.port = httpMediaLocation.port mediaLoc.url = httpMediaLocation.url videoMedia.location = mediaLoc } if (joystreamMediaLocation) { const mediaLoc = new JoystreamMediaLocation() mediaLoc.dataObjectId = joystreamMediaLocation.dataObjectId videoMedia.location = mediaLoc } } 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