const { DataTypes, Model } = require('sequelize') module.exports = (sequelize) => { class PodcastEpisode extends Model { getOldPodcastEpisode(libraryItemId = null) { let enclosure = null if (this.enclosureURL) { enclosure = { url: this.enclosureURL, type: this.enclosureType, length: this.enclosureSize !== null ? String(this.enclosureSize) : null } } return { libraryItemId: libraryItemId || null, podcastId: this.podcastId, id: this.id, oldEpisodeId: this.extraData?.oldEpisodeId || null, index: this.index, season: this.season, episode: this.episode, episodeType: this.episodeType, title: this.title, subtitle: this.subtitle, description: this.description, enclosure, pubDate: this.pubDate, chapters: this.chapters, audioFile: this.audioFile, publishedAt: this.publishedAt?.valueOf() || null, addedAt: this.createdAt.valueOf(), updatedAt: this.updatedAt.valueOf() } } static createFromOld(oldEpisode) { const podcastEpisode = this.getFromOld(oldEpisode) return this.create(podcastEpisode) } static getFromOld(oldEpisode) { const extraData = {} if (oldEpisode.oldEpisodeId) { extraData.oldEpisodeId = oldEpisode.oldEpisodeId } return { id: oldEpisode.id, index: oldEpisode.index, season: oldEpisode.season, episode: oldEpisode.episode, episodeType: oldEpisode.episodeType, title: oldEpisode.title, subtitle: oldEpisode.subtitle, description: oldEpisode.description, pubDate: oldEpisode.pubDate, enclosureURL: oldEpisode.enclosure?.url || null, enclosureSize: oldEpisode.enclosure?.length || null, enclosureType: oldEpisode.enclosure?.type || null, publishedAt: oldEpisode.publishedAt, podcastId: oldEpisode.podcastId, audioFile: oldEpisode.audioFile?.toJSON() || null, chapters: oldEpisode.chapters, extraData } } } PodcastEpisode.init({ id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true }, index: DataTypes.INTEGER, season: DataTypes.STRING, episode: DataTypes.STRING, episodeType: DataTypes.STRING, title: DataTypes.STRING, subtitle: DataTypes.STRING(1000), description: DataTypes.TEXT, pubDate: DataTypes.STRING, enclosureURL: DataTypes.STRING, enclosureSize: DataTypes.BIGINT, enclosureType: DataTypes.STRING, publishedAt: DataTypes.DATE, audioFile: DataTypes.JSON, chapters: DataTypes.JSON, extraData: DataTypes.JSON }, { sequelize, modelName: 'podcastEpisode' }) const { podcast } = sequelize.models podcast.hasMany(PodcastEpisode, { onDelete: 'CASCADE' }) PodcastEpisode.belongsTo(podcast) return PodcastEpisode }