mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-03-01 05:29:41 +00:00
Update model casing & associations
This commit is contained in:
parent
2131a65299
commit
54ca58e610
45 changed files with 830 additions and 561 deletions
|
|
@ -8,7 +8,7 @@ module.exports = (sequelize) => {
|
|||
class AudioBookmark extends Model {
|
||||
getMediaItem(options) {
|
||||
if (!this.mediaItemType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${this.mediaItemType}`
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.mediaItemType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
|
@ -19,52 +19,57 @@ module.exports = (sequelize) => {
|
|||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
},
|
||||
MediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemType: DataTypes.STRING,
|
||||
title: DataTypes.STRING,
|
||||
time: DataTypes.INTEGER
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'AudioBookmark'
|
||||
modelName: 'audioBookmark'
|
||||
})
|
||||
|
||||
const { User, Book, PodcastEpisode } = sequelize.models
|
||||
Book.hasMany(AudioBookmark, {
|
||||
foreignKey: 'MediaItemId',
|
||||
const { user, book, podcastEpisode } = sequelize.models
|
||||
book.hasMany(AudioBookmark, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'Book'
|
||||
mediaItemType: 'book'
|
||||
}
|
||||
})
|
||||
AudioBookmark.belongsTo(Book, { foreignKey: 'MediaItemId', constraints: false })
|
||||
AudioBookmark.belongsTo(book, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
PodcastEpisode.hasMany(AudioBookmark, {
|
||||
foreignKey: 'MediaItemId',
|
||||
podcastEpisode.hasMany(AudioBookmark, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'PodcastEpisode'
|
||||
mediaItemType: 'podcastEpisode'
|
||||
}
|
||||
})
|
||||
AudioBookmark.belongsTo(PodcastEpisode, { foreignKey: 'MediaItemId', constraints: false })
|
||||
AudioBookmark.belongsTo(podcastEpisode, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
AudioBookmark.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
|
||||
for (const instance of findResult) {
|
||||
if (instance.mediaItemType === 'Book' && instance.Book !== undefined) {
|
||||
instance.MediaItem = instance.Book
|
||||
} else if (instance.mediaItemType === 'PodcastEpisode' && instance.PodcastEpisode !== undefined) {
|
||||
instance.MediaItem = instance.PodcastEpisode
|
||||
if (instance.mediaItemType === 'book' && instance.book !== undefined) {
|
||||
instance.mediaItem = instance.book
|
||||
instance.dataValues.mediaItem = instance.dataValues.book
|
||||
} else if (instance.mediaItemType === 'podcastEpisode' && instance.podcastEpisode !== undefined) {
|
||||
instance.mediaItem = instance.podcastEpisode
|
||||
instance.dataValues.mediaItem = instance.dataValues.podcastEpisode
|
||||
}
|
||||
// To prevent mistakes:
|
||||
delete instance.Book
|
||||
delete instance.dataValues.Book
|
||||
delete instance.PodcastEpisode
|
||||
delete instance.dataValues.PodcastEpisode
|
||||
delete instance.book
|
||||
delete instance.dataValues.book
|
||||
delete instance.podcastEpisode
|
||||
delete instance.dataValues.podcastEpisode
|
||||
}
|
||||
})
|
||||
|
||||
User.hasMany(AudioBookmark)
|
||||
AudioBookmark.belongsTo(User)
|
||||
user.hasMany(AudioBookmark)
|
||||
AudioBookmark.belongsTo(user)
|
||||
|
||||
return AudioBookmark
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ module.exports = (sequelize) => {
|
|||
class AudioTrack extends Model {
|
||||
getMediaItem(options) {
|
||||
if (!this.mediaItemType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${this.mediaItemType}`
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.mediaItemType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ module.exports = (sequelize) => {
|
|||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
},
|
||||
MediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemType: DataTypes.STRING,
|
||||
index: DataTypes.INTEGER,
|
||||
startOffset: DataTypes.FLOAT,
|
||||
|
|
@ -31,45 +31,50 @@ module.exports = (sequelize) => {
|
|||
discNumber: DataTypes.INTEGER
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'AudioTrack'
|
||||
modelName: 'audioTrack'
|
||||
})
|
||||
|
||||
const { Book, PodcastEpisode, MediaFile } = sequelize.models
|
||||
const { book, podcastEpisode, mediaFile } = sequelize.models
|
||||
|
||||
MediaFile.hasOne(AudioTrack)
|
||||
AudioTrack.belongsTo(MediaFile)
|
||||
mediaFile.hasOne(AudioTrack)
|
||||
AudioTrack.belongsTo(mediaFile)
|
||||
|
||||
Book.hasMany(AudioTrack, {
|
||||
foreignKey: 'MediaItemId',
|
||||
book.hasMany(AudioTrack, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'Book'
|
||||
mediaItemType: 'book'
|
||||
}
|
||||
})
|
||||
AudioTrack.belongsTo(Book, { foreignKey: 'MediaItemId', constraints: false })
|
||||
AudioTrack.belongsTo(book, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
PodcastEpisode.hasOne(AudioTrack, {
|
||||
foreignKey: 'MediaItemId',
|
||||
podcastEpisode.hasOne(AudioTrack, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'PodcastEpisode'
|
||||
mediaItemType: 'podcastEpisode'
|
||||
}
|
||||
})
|
||||
AudioTrack.belongsTo(PodcastEpisode, { foreignKey: 'MediaItemId', constraints: false })
|
||||
AudioTrack.belongsTo(podcastEpisode, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
AudioTrack.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
|
||||
for (const instance of findResult) {
|
||||
if (instance.mediaItemType === 'Book' && instance.Book !== undefined) {
|
||||
instance.MediaItem = instance.Book
|
||||
} else if (instance.mediaItemType === 'PodcastEpisode' && instance.PodcastEpisode !== undefined) {
|
||||
instance.MediaItem = instance.PodcastEpisode
|
||||
if (instance.mediaItemType === 'book' && instance.book !== undefined) {
|
||||
instance.mediaItem = instance.book
|
||||
instance.dataValues.mediaItem = instance.dataValues.book
|
||||
} else if (instance.mediaItemType === 'podcastEpisode' && instance.podcastEpisode !== undefined) {
|
||||
instance.mediaItem = instance.podcastEpisode
|
||||
instance.dataValues.mediaItem = instance.dataValues.podcastEpisode
|
||||
}
|
||||
// To prevent mistakes:
|
||||
delete instance.Book
|
||||
delete instance.dataValues.Book
|
||||
delete instance.PodcastEpisode
|
||||
delete instance.dataValues.PodcastEpisode
|
||||
delete instance.book
|
||||
delete instance.dataValues.book
|
||||
delete instance.podcastEpisode
|
||||
delete instance.dataValues.podcastEpisode
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -23,18 +23,16 @@ module.exports = (sequelize) => {
|
|||
lastCoverSearch: DataTypes.DATE
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Book'
|
||||
modelName: 'book'
|
||||
})
|
||||
|
||||
const { LibraryItem, FileMetadata, EBookFile } = sequelize.models
|
||||
LibraryItem.hasOne(Book)
|
||||
Book.belongsTo(LibraryItem)
|
||||
const { fileMetadata, eBookFile } = sequelize.models
|
||||
|
||||
FileMetadata.hasOne(Book, { foreignKey: 'ImageFileId ' })
|
||||
Book.belongsTo(FileMetadata, { as: 'ImageFile', foreignKey: 'ImageFileId' }) // Ref: https://sequelize.org/docs/v6/core-concepts/assocs/#defining-an-alias
|
||||
fileMetadata.hasOne(Book, { foreignKey: 'imageFileId' })
|
||||
Book.belongsTo(fileMetadata, { as: 'imageFile', foreignKey: 'imageFileId' }) // Ref: https://sequelize.org/docs/v6/core-concepts/assocs/#defining-an-alias
|
||||
|
||||
EBookFile.hasOne(Book)
|
||||
Book.belongsTo(EBookFile)
|
||||
eBookFile.hasOne(Book)
|
||||
Book.belongsTo(eBookFile)
|
||||
|
||||
return Book
|
||||
}
|
||||
|
|
@ -11,21 +11,21 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'BookAuthor',
|
||||
modelName: 'bookAuthor',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Book, Person } = sequelize.models
|
||||
Book.belongsToMany(Person, { through: BookAuthor })
|
||||
Person.belongsToMany(Book, { through: BookAuthor })
|
||||
const { book, person } = sequelize.models
|
||||
book.belongsToMany(person, { through: BookAuthor, as: 'authors', otherKey: 'authorId' })
|
||||
person.belongsToMany(book, { through: BookAuthor, foreignKey: 'authorId' })
|
||||
|
||||
Book.hasMany(BookAuthor)
|
||||
BookAuthor.belongsTo(Book)
|
||||
book.hasMany(BookAuthor)
|
||||
BookAuthor.belongsTo(book)
|
||||
|
||||
Person.hasMany(BookAuthor)
|
||||
BookAuthor.belongsTo(Person)
|
||||
person.hasMany(BookAuthor, { foreignKey: 'authorId' })
|
||||
BookAuthor.belongsTo(person, { as: 'author', foreignKey: 'authorId' })
|
||||
|
||||
return BookAuthor
|
||||
}
|
||||
|
|
@ -15,13 +15,13 @@ module.exports = (sequelize) => {
|
|||
end: DataTypes.FLOAT
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'BookChapter'
|
||||
modelName: 'bookChapter'
|
||||
})
|
||||
|
||||
const { Book } = sequelize.models
|
||||
const { book } = sequelize.models
|
||||
|
||||
Book.hasMany(BookChapter)
|
||||
BookChapter.belongsTo(Book)
|
||||
book.hasMany(BookChapter)
|
||||
BookChapter.belongsTo(book)
|
||||
|
||||
return BookChapter
|
||||
}
|
||||
|
|
@ -11,21 +11,21 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'BookGenre',
|
||||
modelName: 'bookGenre',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Book, Genre } = sequelize.models
|
||||
Book.belongsToMany(Genre, { through: BookGenre })
|
||||
Genre.belongsToMany(Book, { through: BookGenre })
|
||||
const { book, genre } = sequelize.models
|
||||
book.belongsToMany(genre, { through: BookGenre })
|
||||
genre.belongsToMany(book, { through: BookGenre })
|
||||
|
||||
Book.hasMany(BookGenre)
|
||||
BookGenre.belongsTo(Book)
|
||||
book.hasMany(BookGenre)
|
||||
BookGenre.belongsTo(book)
|
||||
|
||||
Genre.hasMany(BookGenre)
|
||||
BookGenre.belongsTo(Genre)
|
||||
genre.hasMany(BookGenre)
|
||||
BookGenre.belongsTo(genre)
|
||||
|
||||
return BookGenre
|
||||
}
|
||||
|
|
@ -11,21 +11,21 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'BookNarrator',
|
||||
modelName: 'bookNarrator',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Book, Person } = sequelize.models
|
||||
Book.belongsToMany(Person, { through: BookNarrator })
|
||||
Person.belongsToMany(Book, { through: BookNarrator })
|
||||
const { book, person } = sequelize.models
|
||||
book.belongsToMany(person, { through: BookNarrator, as: 'narrators', otherKey: 'narratorId' })
|
||||
person.belongsToMany(book, { through: BookNarrator, foreignKey: 'narratorId' })
|
||||
|
||||
Book.hasMany(BookNarrator)
|
||||
BookNarrator.belongsTo(Book)
|
||||
book.hasMany(BookNarrator)
|
||||
BookNarrator.belongsTo(book)
|
||||
|
||||
Person.hasMany(BookNarrator)
|
||||
BookNarrator.belongsTo(Person)
|
||||
person.hasMany(BookNarrator, { foreignKey: 'narratorId' })
|
||||
BookNarrator.belongsTo(person, { as: 'narrator', foreignKey: 'narratorId' })
|
||||
|
||||
return BookNarrator
|
||||
}
|
||||
|
|
@ -12,21 +12,21 @@ module.exports = (sequelize) => {
|
|||
sequence: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'BookSeries',
|
||||
modelName: 'bookSeries',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Book, Series } = sequelize.models
|
||||
Book.belongsToMany(Series, { through: BookSeries })
|
||||
Series.belongsToMany(Book, { through: BookSeries })
|
||||
const { book, series } = sequelize.models
|
||||
book.belongsToMany(series, { through: BookSeries })
|
||||
series.belongsToMany(book, { through: BookSeries })
|
||||
|
||||
Book.hasMany(BookSeries)
|
||||
BookSeries.belongsTo(Book)
|
||||
book.hasMany(BookSeries)
|
||||
BookSeries.belongsTo(book)
|
||||
|
||||
Series.hasMany(BookSeries)
|
||||
BookSeries.belongsTo(Series)
|
||||
series.hasMany(BookSeries)
|
||||
BookSeries.belongsTo(series)
|
||||
|
||||
return BookSeries
|
||||
}
|
||||
|
|
@ -11,21 +11,21 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'BookTag',
|
||||
modelName: 'bookTag',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Book, Tag } = sequelize.models
|
||||
Book.belongsToMany(Tag, { through: BookTag })
|
||||
Tag.belongsToMany(Book, { through: BookTag })
|
||||
const { book, tag } = sequelize.models
|
||||
book.belongsToMany(tag, { through: BookTag })
|
||||
tag.belongsToMany(book, { through: BookTag })
|
||||
|
||||
Book.hasMany(BookTag)
|
||||
BookTag.belongsTo(Book)
|
||||
book.hasMany(BookTag)
|
||||
BookTag.belongsTo(book)
|
||||
|
||||
Tag.hasMany(BookTag)
|
||||
BookTag.belongsTo(Tag)
|
||||
tag.hasMany(BookTag)
|
||||
BookTag.belongsTo(tag)
|
||||
|
||||
return BookTag
|
||||
}
|
||||
|
|
@ -13,13 +13,13 @@ module.exports = (sequelize) => {
|
|||
description: DataTypes.TEXT
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Collection'
|
||||
modelName: 'collection'
|
||||
})
|
||||
|
||||
const { Library } = sequelize.models
|
||||
const { library } = sequelize.models
|
||||
|
||||
Library.hasMany(Collection)
|
||||
Collection.belongsTo(Library)
|
||||
library.hasMany(Collection)
|
||||
Collection.belongsTo(library)
|
||||
|
||||
return Collection
|
||||
}
|
||||
|
|
@ -13,20 +13,20 @@ module.exports = (sequelize) => {
|
|||
sequelize,
|
||||
timestamps: true,
|
||||
updatedAt: false,
|
||||
modelName: 'CollectionBook'
|
||||
modelName: 'collectionBook'
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Book, Collection } = sequelize.models
|
||||
Book.belongsToMany(Collection, { through: CollectionBook })
|
||||
Collection.belongsToMany(Book, { through: CollectionBook })
|
||||
const { book, collection } = sequelize.models
|
||||
book.belongsToMany(collection, { through: CollectionBook })
|
||||
collection.belongsToMany(book, { through: CollectionBook })
|
||||
|
||||
Book.hasMany(CollectionBook)
|
||||
CollectionBook.belongsTo(Book)
|
||||
book.hasMany(CollectionBook)
|
||||
CollectionBook.belongsTo(book)
|
||||
|
||||
Collection.hasMany(CollectionBook)
|
||||
CollectionBook.belongsTo(Collection)
|
||||
collection.hasMany(CollectionBook)
|
||||
CollectionBook.belongsTo(collection)
|
||||
|
||||
return CollectionBook
|
||||
}
|
||||
|
|
@ -17,13 +17,13 @@ module.exports = (sequelize) => {
|
|||
deviceVersion: DataTypes.STRING // e.g. Browser version or Android SDK
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Device'
|
||||
modelName: 'device'
|
||||
})
|
||||
|
||||
const { User } = sequelize.models
|
||||
const { user } = sequelize.models
|
||||
|
||||
User.hasMany(Device)
|
||||
Device.belongsTo(User)
|
||||
user.hasMany(Device)
|
||||
Device.belongsTo(user)
|
||||
|
||||
return Device
|
||||
}
|
||||
|
|
@ -8,16 +8,17 @@ module.exports = (sequelize) => {
|
|||
type: DataTypes.UUID,
|
||||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
}
|
||||
},
|
||||
format: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'EBookFile'
|
||||
modelName: 'eBookFile'
|
||||
})
|
||||
|
||||
const { FileMetadata } = sequelize.models
|
||||
const { fileMetadata } = sequelize.models
|
||||
|
||||
FileMetadata.hasOne(EBookFile, { foreignKey: 'FileMetadataId' })
|
||||
EBookFile.belongsTo(FileMetadata, { as: 'FileMetadata', foreignKey: 'FileMetadataId' })
|
||||
fileMetadata.hasOne(EBookFile, { foreignKey: 'fileMetadataId' })
|
||||
EBookFile.belongsTo(fileMetadata, { as: 'fileMetadata', foreignKey: 'fileMetadataId' })
|
||||
|
||||
return EBookFile
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ module.exports = (sequelize) => {
|
|||
class Feed extends Model {
|
||||
getEntity(options) {
|
||||
if (!this.entityType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${this.entityType}`
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.entityType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ module.exports = (sequelize) => {
|
|||
},
|
||||
slug: DataTypes.STRING,
|
||||
entityType: DataTypes.STRING,
|
||||
EntityId: DataTypes.UUIDV4,
|
||||
entityId: DataTypes.UUIDV4,
|
||||
entityUpdatedAt: DataTypes.DATE,
|
||||
serverAddress: DataTypes.STRING,
|
||||
feedURL: DataTypes.STRING,
|
||||
|
|
@ -38,72 +38,78 @@ module.exports = (sequelize) => {
|
|||
preventIndexing: DataTypes.BOOLEAN
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Feed'
|
||||
modelName: 'feed'
|
||||
})
|
||||
|
||||
const { User, LibraryItem, Collection, Series, Playlist } = sequelize.models
|
||||
const { user, libraryItem, collection, series, playlist } = sequelize.models
|
||||
|
||||
User.hasMany(Feed)
|
||||
Feed.belongsTo(User)
|
||||
user.hasMany(Feed)
|
||||
Feed.belongsTo(user)
|
||||
|
||||
LibraryItem.hasMany(Feed, {
|
||||
foreignKey: 'EntityId',
|
||||
libraryItem.hasMany(Feed, {
|
||||
foreignKey: 'entityId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
entityType: 'LibraryItem'
|
||||
entityType: 'libraryItem'
|
||||
}
|
||||
})
|
||||
Feed.belongsTo(LibraryItem, { foreignKey: 'EntityId', constraints: false })
|
||||
Feed.belongsTo(libraryItem, { foreignKey: 'entityId', constraints: false })
|
||||
|
||||
Collection.hasMany(Feed, {
|
||||
foreignKey: 'EntityId',
|
||||
collection.hasMany(Feed, {
|
||||
foreignKey: 'entityId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
entityType: 'Collection'
|
||||
entityType: 'collection'
|
||||
}
|
||||
})
|
||||
Feed.belongsTo(Collection, { foreignKey: 'EntityId', constraints: false })
|
||||
Feed.belongsTo(collection, { foreignKey: 'entityId', constraints: false })
|
||||
|
||||
Series.hasMany(Feed, {
|
||||
foreignKey: 'EntityId',
|
||||
series.hasMany(Feed, {
|
||||
foreignKey: 'entityId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
entityType: 'Series'
|
||||
entityType: 'series'
|
||||
}
|
||||
})
|
||||
Feed.belongsTo(Series, { foreignKey: 'EntityId', constraints: false })
|
||||
Feed.belongsTo(series, { foreignKey: 'entityId', constraints: false })
|
||||
|
||||
Playlist.hasMany(Feed, {
|
||||
foreignKey: 'EntityId',
|
||||
playlist.hasMany(Feed, {
|
||||
foreignKey: 'entityId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
entityType: 'Playlist'
|
||||
entityType: 'playlist'
|
||||
}
|
||||
})
|
||||
Feed.belongsTo(Playlist, { foreignKey: 'EntityId', constraints: false })
|
||||
Feed.belongsTo(playlist, { foreignKey: 'entityId', constraints: false })
|
||||
|
||||
Feed.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
for (const instance of findResult) {
|
||||
if (instance.entityType === 'LibraryItem' && instance.LibraryItem !== undefined) {
|
||||
instance.Entity = instance.LibraryItem
|
||||
} else if (instance.mediaItemType === 'Collection' && instance.Collection !== undefined) {
|
||||
instance.Entity = instance.Collection
|
||||
} else if (instance.mediaItemType === 'Series' && instance.Series !== undefined) {
|
||||
instance.Entity = instance.Series
|
||||
} else if (instance.mediaItemType === 'Playlist' && instance.Playlist !== undefined) {
|
||||
instance.Entity = instance.Playlist
|
||||
if (instance.entityType === 'libraryItem' && instance.libraryItem !== undefined) {
|
||||
instance.entity = instance.libraryItem
|
||||
instance.dataValues.entity = instance.dataValues.libraryItem
|
||||
} else if (instance.entityType === 'collection' && instance.collection !== undefined) {
|
||||
instance.entity = instance.collection
|
||||
instance.dataValues.entity = instance.dataValues.collection
|
||||
} else if (instance.entityType === 'series' && instance.series !== undefined) {
|
||||
instance.entity = instance.series
|
||||
instance.dataValues.entity = instance.dataValues.series
|
||||
} else if (instance.entityType === 'playlist' && instance.playlist !== undefined) {
|
||||
instance.entity = instance.playlist
|
||||
instance.dataValues.entity = instance.dataValues.playlist
|
||||
}
|
||||
|
||||
// To prevent mistakes:
|
||||
delete instance.LibraryItem
|
||||
delete instance.dataValues.LibraryItem
|
||||
delete instance.Collection
|
||||
delete instance.dataValues.Collection
|
||||
delete instance.Series
|
||||
delete instance.dataValues.Series
|
||||
delete instance.Playlist
|
||||
delete instance.dataValues.Playlist
|
||||
delete instance.libraryItem
|
||||
delete instance.dataValues.libraryItem
|
||||
delete instance.collection
|
||||
delete instance.dataValues.collection
|
||||
delete instance.series
|
||||
delete instance.dataValues.series
|
||||
delete instance.playlist
|
||||
delete instance.dataValues.playlist
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -25,13 +25,13 @@ module.exports = (sequelize) => {
|
|||
explicit: DataTypes.BOOLEAN
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'FeedEpisode'
|
||||
modelName: 'feedEpisode'
|
||||
})
|
||||
|
||||
const { Feed } = sequelize.models
|
||||
const { feed } = sequelize.models
|
||||
|
||||
Feed.hasMany(FeedEpisode)
|
||||
FeedEpisode.belongsTo(Feed)
|
||||
feed.hasMany(FeedEpisode)
|
||||
FeedEpisode.belongsTo(feed)
|
||||
|
||||
return FeedEpisode
|
||||
}
|
||||
|
|
@ -21,10 +21,10 @@ module.exports = (sequelize) => {
|
|||
sequelize,
|
||||
freezeTableName: true, // sequelize uses datum as singular of data
|
||||
name: {
|
||||
singular: 'FileMetadata',
|
||||
plural: 'FileMetadata'
|
||||
singular: 'fileMetadata',
|
||||
plural: 'fileMetadata'
|
||||
},
|
||||
modelName: 'FileMetadata'
|
||||
modelName: 'fileMetadata'
|
||||
})
|
||||
|
||||
return FileMetadata
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ module.exports = (sequelize) => {
|
|||
cleanName: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Genre'
|
||||
modelName: 'genre'
|
||||
})
|
||||
|
||||
return Genre
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ module.exports = (sequelize) => {
|
|||
lastScanVersion: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Library'
|
||||
modelName: 'library'
|
||||
})
|
||||
|
||||
return Library
|
||||
|
|
|
|||
|
|
@ -11,15 +11,15 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'LibraryFile'
|
||||
modelName: 'libraryFile'
|
||||
})
|
||||
|
||||
const { LibraryItem, FileMetadata } = sequelize.models
|
||||
LibraryItem.hasMany(LibraryFile)
|
||||
LibraryFile.belongsTo(LibraryItem)
|
||||
const { libraryItem, fileMetadata } = sequelize.models
|
||||
libraryItem.hasMany(LibraryFile)
|
||||
LibraryFile.belongsTo(libraryItem)
|
||||
|
||||
FileMetadata.hasOne(LibraryFile, { foreignKey: 'FileMetadataId' })
|
||||
LibraryFile.belongsTo(FileMetadata, { as: 'FileMetadata', foreignKey: 'FileMetadataId' })
|
||||
fileMetadata.hasOne(LibraryFile, { foreignKey: 'fileMetadataId' })
|
||||
LibraryFile.belongsTo(fileMetadata, { as: 'fileMetadata', foreignKey: 'fileMetadataId' })
|
||||
|
||||
return LibraryFile
|
||||
}
|
||||
|
|
@ -12,12 +12,12 @@ module.exports = (sequelize) => {
|
|||
path: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'LibraryFolder'
|
||||
modelName: 'libraryFolder'
|
||||
})
|
||||
|
||||
const { Library } = sequelize.models
|
||||
Library.hasMany(LibraryFolder)
|
||||
LibraryFolder.belongsTo(Library)
|
||||
const { library } = sequelize.models
|
||||
library.hasMany(LibraryFolder)
|
||||
LibraryFolder.belongsTo(library)
|
||||
|
||||
return LibraryFolder
|
||||
}
|
||||
|
|
@ -1,7 +1,13 @@
|
|||
const { DataTypes, Model } = require('sequelize')
|
||||
|
||||
module.exports = (sequelize) => {
|
||||
class LibraryItem extends Model { }
|
||||
class LibraryItem extends Model {
|
||||
getMedia(options) {
|
||||
if (!this.mediaType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.mediaType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
||||
LibraryItem.init({
|
||||
id: {
|
||||
|
|
@ -12,6 +18,7 @@ module.exports = (sequelize) => {
|
|||
ino: DataTypes.STRING,
|
||||
path: DataTypes.STRING,
|
||||
relPath: DataTypes.STRING,
|
||||
mediaId: DataTypes.UUIDV4,
|
||||
mediaType: DataTypes.STRING,
|
||||
isFile: DataTypes.BOOLEAN,
|
||||
isMissing: DataTypes.BOOLEAN,
|
||||
|
|
@ -23,12 +30,50 @@ module.exports = (sequelize) => {
|
|||
lastScanVersion: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'LibraryItem'
|
||||
modelName: 'libraryItem'
|
||||
})
|
||||
|
||||
const { LibraryFolder } = sequelize.models
|
||||
LibraryFolder.hasMany(LibraryItem)
|
||||
LibraryItem.belongsTo(LibraryFolder)
|
||||
const { libraryFolder, book, podcast } = sequelize.models
|
||||
libraryFolder.hasMany(LibraryItem)
|
||||
LibraryItem.belongsTo(libraryFolder)
|
||||
|
||||
book.hasOne(LibraryItem, {
|
||||
foreignKey: 'mediaId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaType: 'book'
|
||||
}
|
||||
})
|
||||
LibraryItem.belongsTo(book, { foreignKey: 'mediaId', constraints: false })
|
||||
|
||||
podcast.hasOne(LibraryItem, {
|
||||
foreignKey: 'mediaId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaType: 'podcast'
|
||||
}
|
||||
})
|
||||
LibraryItem.belongsTo(podcast, { foreignKey: 'mediaId', constraints: false })
|
||||
|
||||
LibraryItem.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
for (const instance of findResult) {
|
||||
if (instance.mediaType === 'book' && instance.book !== undefined) {
|
||||
instance.media = instance.book
|
||||
instance.dataValues.media = instance.dataValues.book
|
||||
} else if (instance.mediaType === 'podcast' && instance.podcast !== undefined) {
|
||||
instance.media = instance.podcast
|
||||
instance.dataValues.media = instance.dataValues.podcast
|
||||
}
|
||||
// To prevent mistakes:
|
||||
delete instance.book
|
||||
delete instance.dataValues.book
|
||||
delete instance.podcast
|
||||
delete instance.dataValues.podcast
|
||||
}
|
||||
})
|
||||
|
||||
return LibraryItem
|
||||
}
|
||||
|
|
@ -13,13 +13,13 @@ module.exports = (sequelize) => {
|
|||
value: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'LibrarySetting'
|
||||
modelName: 'librarySetting'
|
||||
})
|
||||
|
||||
const { Library } = sequelize.models
|
||||
const { library } = sequelize.models
|
||||
|
||||
Library.hasMany(LibrarySetting)
|
||||
LibrarySetting.belongsTo(Library)
|
||||
library.hasMany(LibrarySetting)
|
||||
LibrarySetting.belongsTo(library)
|
||||
|
||||
return LibrarySetting
|
||||
}
|
||||
|
|
@ -17,13 +17,13 @@ module.exports = (sequelize) => {
|
|||
tags: DataTypes.JSON
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'MediaFile'
|
||||
modelName: 'mediaFile'
|
||||
})
|
||||
|
||||
const { FileMetadata } = sequelize.models
|
||||
const { fileMetadata } = sequelize.models
|
||||
|
||||
FileMetadata.hasOne(MediaFile, { foreignKey: 'FileMetadataId' })
|
||||
MediaFile.belongsTo(FileMetadata, { as: 'FileMetadata', foreignKey: 'FileMetadataId' })
|
||||
fileMetadata.hasOne(MediaFile, { foreignKey: 'fileMetadataId' })
|
||||
MediaFile.belongsTo(fileMetadata, { as: 'fileMetadata', foreignKey: 'fileMetadataId' })
|
||||
|
||||
return MediaFile
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ module.exports = (sequelize) => {
|
|||
class MediaProgress extends Model {
|
||||
getMediaItem(options) {
|
||||
if (!this.mediaItemType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${this.mediaItemType}`
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.mediaItemType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ module.exports = (sequelize) => {
|
|||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
},
|
||||
MediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemType: DataTypes.STRING,
|
||||
duration: DataTypes.FLOAT,
|
||||
currentTime: DataTypes.FLOAT,
|
||||
|
|
@ -28,46 +28,52 @@ module.exports = (sequelize) => {
|
|||
finishedAt: DataTypes.DATE
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'MediaProgress'
|
||||
modelName: 'mediaProgress'
|
||||
})
|
||||
|
||||
const { Book, PodcastEpisode, User } = sequelize.models
|
||||
Book.hasMany(MediaProgress, {
|
||||
foreignKey: 'MediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'Book'
|
||||
}
|
||||
})
|
||||
MediaProgress.belongsTo(Book, { foreignKey: 'MediaItemId', constraints: false })
|
||||
const { book, podcastEpisode, user } = sequelize.models
|
||||
|
||||
PodcastEpisode.hasMany(MediaProgress, {
|
||||
foreignKey: 'MediaItemId',
|
||||
book.hasMany(MediaProgress, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'PodcastEpisode'
|
||||
mediaItemType: 'book'
|
||||
}
|
||||
})
|
||||
MediaProgress.belongsTo(PodcastEpisode, { foreignKey: 'MediaItemId', constraints: false })
|
||||
MediaProgress.belongsTo(book, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
podcastEpisode.hasMany(MediaProgress, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'podcastEpisode'
|
||||
}
|
||||
})
|
||||
MediaProgress.belongsTo(podcastEpisode, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
MediaProgress.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
|
||||
for (const instance of findResult) {
|
||||
if (instance.mediaItemType === 'Book' && instance.Book !== undefined) {
|
||||
instance.MediaItem = instance.Book
|
||||
} else if (instance.mediaItemType === 'PodcastEpisode' && instance.PodcastEpisode !== undefined) {
|
||||
instance.MediaItem = instance.PodcastEpisode
|
||||
if (instance.mediaItemType === 'book' && instance.book !== undefined) {
|
||||
instance.mediaItem = instance.book
|
||||
instance.dataValues.mediaItem = instance.dataValues.book
|
||||
} else if (instance.mediaItemType === 'podcastEpisode' && instance.podcastEpisode !== undefined) {
|
||||
instance.mediaItem = instance.podcastEpisode
|
||||
instance.dataValues.mediaItem = instance.dataValues.podcastEpisode
|
||||
}
|
||||
// To prevent mistakes:
|
||||
delete instance.Book
|
||||
delete instance.dataValues.Book
|
||||
delete instance.PodcastEpisode
|
||||
delete instance.dataValues.PodcastEpisode
|
||||
delete instance.book
|
||||
delete instance.dataValues.book
|
||||
delete instance.podcastEpisode
|
||||
delete instance.dataValues.podcastEpisode
|
||||
}
|
||||
})
|
||||
|
||||
User.hasMany(MediaProgress)
|
||||
MediaProgress.belongsTo(User)
|
||||
user.hasMany(MediaProgress)
|
||||
MediaProgress.belongsTo(user)
|
||||
|
||||
return MediaProgress
|
||||
}
|
||||
|
|
@ -37,13 +37,13 @@ module.exports = (sequelize) => {
|
|||
chapters: DataTypes.JSON
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'MediaStream'
|
||||
modelName: 'mediaStream'
|
||||
})
|
||||
|
||||
const { MediaFile } = sequelize.models
|
||||
const { mediaFile } = sequelize.models
|
||||
|
||||
MediaFile.hasMany(MediaStream)
|
||||
MediaStream.belongsTo(MediaFile)
|
||||
mediaFile.hasMany(MediaStream)
|
||||
MediaStream.belongsTo(mediaFile)
|
||||
|
||||
return MediaStream
|
||||
}
|
||||
|
|
@ -22,7 +22,7 @@ module.exports = (sequelize) => {
|
|||
extraData: DataTypes.JSON
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Notification'
|
||||
modelName: 'notification'
|
||||
})
|
||||
|
||||
return Notification
|
||||
|
|
|
|||
|
|
@ -15,12 +15,12 @@ module.exports = (sequelize) => {
|
|||
description: DataTypes.TEXT
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Person'
|
||||
modelName: 'person'
|
||||
})
|
||||
|
||||
const { FileMetadata } = sequelize.models
|
||||
FileMetadata.hasMany(Person, { foreignKey: 'ImageFileId' })
|
||||
Person.belongsTo(FileMetadata, { as: 'ImageFile', foreignKey: 'ImageFileId' }) // Ref: https://sequelize.org/docs/v6/core-concepts/assocs/#defining-an-alias
|
||||
const { fileMetadata } = sequelize.models
|
||||
fileMetadata.hasMany(Person, { foreignKey: 'imageFileId' })
|
||||
Person.belongsTo(fileMetadata, { as: 'imageFile', foreignKey: 'imageFileId' }) // Ref: https://sequelize.org/docs/v6/core-concepts/assocs/#defining-an-alias
|
||||
|
||||
return Person
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@ module.exports = (sequelize) => {
|
|||
class PlaybackSession extends Model {
|
||||
getMediaItem(options) {
|
||||
if (!this.mediaItemType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${this.mediaItemType}`
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.mediaItemType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
|
@ -15,7 +15,7 @@ module.exports = (sequelize) => {
|
|||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
},
|
||||
MediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemType: DataTypes.STRING,
|
||||
displayTitle: DataTypes.STRING,
|
||||
displayAuthor: DataTypes.STRING,
|
||||
|
|
@ -27,48 +27,53 @@ module.exports = (sequelize) => {
|
|||
serverVersion: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'PlaybackSession'
|
||||
modelName: 'playbackSession'
|
||||
})
|
||||
|
||||
const { Book, PodcastEpisode, User, Device } = sequelize.models
|
||||
const { book, podcastEpisode, user, device } = sequelize.models
|
||||
|
||||
User.hasMany(PlaybackSession)
|
||||
PlaybackSession.belongsTo(User)
|
||||
user.hasMany(PlaybackSession)
|
||||
PlaybackSession.belongsTo(user)
|
||||
|
||||
Device.hasMany(PlaybackSession)
|
||||
PlaybackSession.belongsTo(Device)
|
||||
device.hasMany(PlaybackSession)
|
||||
PlaybackSession.belongsTo(device)
|
||||
|
||||
Book.hasMany(PlaybackSession, {
|
||||
foreignKey: 'MediaItemId',
|
||||
book.hasMany(PlaybackSession, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'Book'
|
||||
mediaItemType: 'book'
|
||||
}
|
||||
})
|
||||
PlaybackSession.belongsTo(Book, { foreignKey: 'MediaItemId', constraints: false })
|
||||
PlaybackSession.belongsTo(book, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
PodcastEpisode.hasOne(PlaybackSession, {
|
||||
foreignKey: 'MediaItemId',
|
||||
podcastEpisode.hasOne(PlaybackSession, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'PodcastEpisode'
|
||||
mediaItemType: 'podcastEpisode'
|
||||
}
|
||||
})
|
||||
PlaybackSession.belongsTo(PodcastEpisode, { foreignKey: 'MediaItemId', constraints: false })
|
||||
PlaybackSession.belongsTo(podcastEpisode, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
PlaybackSession.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
|
||||
for (const instance of findResult) {
|
||||
if (instance.mediaItemType === 'Book' && instance.Book !== undefined) {
|
||||
instance.MediaItem = instance.Book
|
||||
} else if (instance.mediaItemType === 'PodcastEpisode' && instance.PodcastEpisode !== undefined) {
|
||||
instance.MediaItem = instance.PodcastEpisode
|
||||
if (instance.mediaItemType === 'book' && instance.book !== undefined) {
|
||||
instance.mediaItem = instance.book
|
||||
instance.dataValues.mediaItem = instance.dataValues.book
|
||||
} else if (instance.mediaItemType === 'podcastEpisode' && instance.podcastEpisode !== undefined) {
|
||||
instance.mediaItem = instance.podcastEpisode
|
||||
instance.dataValues.mediaItem = instance.dataValues.podcastEpisode
|
||||
}
|
||||
// To prevent mistakes:
|
||||
delete instance.Book
|
||||
delete instance.dataValues.Book
|
||||
delete instance.PodcastEpisode
|
||||
delete instance.dataValues.PodcastEpisode
|
||||
delete instance.book
|
||||
delete instance.dataValues.book
|
||||
delete instance.podcastEpisode
|
||||
delete instance.dataValues.podcastEpisode
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ module.exports = (sequelize) => {
|
|||
date: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'PlaybackSessionListenTime'
|
||||
modelName: 'playbackSessionListenTime'
|
||||
})
|
||||
|
||||
const { PlaybackSession } = sequelize.models
|
||||
const { playbackSession } = sequelize.models
|
||||
|
||||
PlaybackSession.hasMany(PlaybackSessionListenTime)
|
||||
PlaybackSessionListenTime.belongsTo(PlaybackSession)
|
||||
playbackSession.hasMany(PlaybackSessionListenTime)
|
||||
PlaybackSessionListenTime.belongsTo(playbackSession)
|
||||
|
||||
return PlaybackSessionListenTime
|
||||
}
|
||||
|
|
@ -13,15 +13,15 @@ module.exports = (sequelize) => {
|
|||
description: DataTypes.TEXT
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Playlist'
|
||||
modelName: 'playlist'
|
||||
})
|
||||
|
||||
const { Library, User } = sequelize.models
|
||||
Library.hasMany(Playlist)
|
||||
Playlist.belongsTo(Library)
|
||||
const { library, user } = sequelize.models
|
||||
library.hasMany(Playlist)
|
||||
Playlist.belongsTo(library)
|
||||
|
||||
User.hasMany(Playlist)
|
||||
Playlist.belongsTo(User)
|
||||
user.hasMany(Playlist)
|
||||
Playlist.belongsTo(user)
|
||||
|
||||
return Playlist
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@ module.exports = (sequelize) => {
|
|||
class PlaylistMediaItem extends Model {
|
||||
getMediaItem(options) {
|
||||
if (!this.mediaItemType) return Promise.resolve(null)
|
||||
const mixinMethodName = `get${this.mediaItemType}`
|
||||
const mixinMethodName = `get${sequelize.uppercaseFirst(this.mediaItemType)}`
|
||||
return this[mixinMethodName](options)
|
||||
}
|
||||
}
|
||||
|
|
@ -15,53 +15,58 @@ module.exports = (sequelize) => {
|
|||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
},
|
||||
MediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemId: DataTypes.UUIDV4,
|
||||
mediaItemType: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
timestamps: true,
|
||||
updatedAt: false,
|
||||
modelName: 'PlaylistMediaItem'
|
||||
modelName: 'playlistMediaItem'
|
||||
})
|
||||
|
||||
const { Book, PodcastEpisode, Playlist } = sequelize.models
|
||||
const { book, podcastEpisode, playlist } = sequelize.models
|
||||
|
||||
Book.hasMany(PlaylistMediaItem, {
|
||||
foreignKey: 'MediaItemId',
|
||||
book.hasMany(PlaylistMediaItem, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'Book'
|
||||
mediaItemType: 'book'
|
||||
}
|
||||
})
|
||||
PlaylistMediaItem.belongsTo(Book, { foreignKey: 'MediaItemId', constraints: false })
|
||||
PlaylistMediaItem.belongsTo(book, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
PodcastEpisode.hasOne(PlaylistMediaItem, {
|
||||
foreignKey: 'MediaItemId',
|
||||
podcastEpisode.hasOne(PlaylistMediaItem, {
|
||||
foreignKey: 'mediaItemId',
|
||||
constraints: false,
|
||||
scope: {
|
||||
mediaItemType: 'PodcastEpisode'
|
||||
mediaItemType: 'podcastEpisode'
|
||||
}
|
||||
})
|
||||
PlaylistMediaItem.belongsTo(PodcastEpisode, { foreignKey: 'MediaItemId', constraints: false })
|
||||
PlaylistMediaItem.belongsTo(podcastEpisode, { foreignKey: 'mediaItemId', constraints: false })
|
||||
|
||||
PlaylistMediaItem.addHook('afterFind', findResult => {
|
||||
if (!findResult) return
|
||||
|
||||
if (!Array.isArray(findResult)) findResult = [findResult]
|
||||
|
||||
for (const instance of findResult) {
|
||||
if (instance.mediaItemType === 'Book' && instance.Book !== undefined) {
|
||||
instance.MediaItem = instance.Book
|
||||
} else if (instance.mediaItemType === 'PodcastEpisode' && instance.PodcastEpisode !== undefined) {
|
||||
instance.MediaItem = instance.PodcastEpisode
|
||||
if (instance.mediaItemType === 'book' && instance.book !== undefined) {
|
||||
instance.mediaItem = instance.book
|
||||
instance.dataValues.mediaItem = instance.dataValues.book
|
||||
} else if (instance.mediaItemType === 'podcastEpisode' && instance.podcastEpisode !== undefined) {
|
||||
instance.mediaItem = instance.podcastEpisode
|
||||
instance.dataValues.mediaItem = instance.dataValues.podcastEpisode
|
||||
}
|
||||
// To prevent mistakes:
|
||||
delete instance.Book
|
||||
delete instance.dataValues.Book
|
||||
delete instance.PodcastEpisode
|
||||
delete instance.dataValues.PodcastEpisode
|
||||
delete instance.book
|
||||
delete instance.dataValues.book
|
||||
delete instance.podcastEpisode
|
||||
delete instance.dataValues.podcastEpisode
|
||||
}
|
||||
})
|
||||
|
||||
Playlist.hasMany(PlaylistMediaItem)
|
||||
PlaylistMediaItem.belongsTo(Playlist)
|
||||
playlist.hasMany(PlaylistMediaItem)
|
||||
PlaylistMediaItem.belongsTo(playlist)
|
||||
|
||||
return PlaylistMediaItem
|
||||
}
|
||||
|
|
@ -9,7 +9,6 @@ module.exports = (sequelize) => {
|
|||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true
|
||||
},
|
||||
// Metadata
|
||||
title: DataTypes.STRING,
|
||||
author: DataTypes.STRING,
|
||||
releaseDate: DataTypes.STRING,
|
||||
|
|
@ -32,15 +31,13 @@ module.exports = (sequelize) => {
|
|||
lastCoverSearch: DataTypes.DATE
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Podcast'
|
||||
modelName: 'podcast'
|
||||
})
|
||||
|
||||
const { LibraryItem, FileMetadata } = sequelize.models
|
||||
LibraryItem.hasOne(Podcast)
|
||||
Podcast.belongsTo(LibraryItem)
|
||||
const { fileMetadata } = sequelize.models
|
||||
|
||||
FileMetadata.hasOne(Podcast, { foreignKey: 'ImageFileId' })
|
||||
Podcast.belongsTo(FileMetadata, { as: 'ImageFile', foreignKey: 'ImageFileId' }) // Ref: https://sequelize.org/docs/v6/core-concepts/assocs/#defining-an-alias
|
||||
fileMetadata.hasOne(Podcast, { foreignKey: 'imageFileId' })
|
||||
Podcast.belongsTo(fileMetadata, { as: 'imageFile', foreignKey: 'imageFileId' }) // Ref: https://sequelize.org/docs/v6/core-concepts/assocs/#defining-an-alias
|
||||
|
||||
return Podcast
|
||||
}
|
||||
|
|
@ -23,12 +23,12 @@ module.exports = (sequelize) => {
|
|||
publishedAt: DataTypes.DATE
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'PodcastEpisode'
|
||||
modelName: 'podcastEpisode'
|
||||
})
|
||||
|
||||
const { Podcast } = sequelize.models
|
||||
Podcast.hasMany(PodcastEpisode)
|
||||
PodcastEpisode.belongsTo(Podcast)
|
||||
const { podcast } = sequelize.models
|
||||
podcast.hasMany(PodcastEpisode)
|
||||
PodcastEpisode.belongsTo(podcast)
|
||||
|
||||
return PodcastEpisode
|
||||
}
|
||||
|
|
@ -11,21 +11,21 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'PodcastGenre',
|
||||
modelName: 'podcastGenre',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Podcast, Genre } = sequelize.models
|
||||
Podcast.belongsToMany(Genre, { through: PodcastGenre })
|
||||
Genre.belongsToMany(Podcast, { through: PodcastGenre })
|
||||
const { podcast, genre } = sequelize.models
|
||||
podcast.belongsToMany(genre, { through: PodcastGenre })
|
||||
genre.belongsToMany(podcast, { through: PodcastGenre })
|
||||
|
||||
Podcast.hasMany(PodcastGenre)
|
||||
PodcastGenre.belongsTo(Podcast)
|
||||
podcast.hasMany(PodcastGenre)
|
||||
PodcastGenre.belongsTo(podcast)
|
||||
|
||||
Genre.hasMany(PodcastGenre)
|
||||
PodcastGenre.belongsTo(Genre)
|
||||
genre.hasMany(PodcastGenre)
|
||||
PodcastGenre.belongsTo(genre)
|
||||
|
||||
return PodcastGenre
|
||||
}
|
||||
|
|
@ -11,21 +11,21 @@ module.exports = (sequelize) => {
|
|||
}
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'PodcastTag',
|
||||
modelName: 'podcastTag',
|
||||
timestamps: false
|
||||
})
|
||||
|
||||
// Super Many-to-Many
|
||||
// ref: https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/#the-best-of-both-worlds-the-super-many-to-many-relationship
|
||||
const { Podcast, Tag } = sequelize.models
|
||||
Podcast.belongsToMany(Tag, { through: PodcastTag })
|
||||
Tag.belongsToMany(Podcast, { through: PodcastTag })
|
||||
const { podcast, tag } = sequelize.models
|
||||
podcast.belongsToMany(tag, { through: PodcastTag })
|
||||
tag.belongsToMany(podcast, { through: PodcastTag })
|
||||
|
||||
Podcast.hasMany(PodcastTag)
|
||||
PodcastTag.belongsTo(Podcast)
|
||||
podcast.hasMany(PodcastTag)
|
||||
PodcastTag.belongsTo(podcast)
|
||||
|
||||
Tag.hasMany(PodcastTag)
|
||||
PodcastTag.belongsTo(Tag)
|
||||
tag.hasMany(PodcastTag)
|
||||
PodcastTag.belongsTo(tag)
|
||||
|
||||
return PodcastTag
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ module.exports = (sequelize) => {
|
|||
description: DataTypes.TEXT
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Series'
|
||||
modelName: 'series'
|
||||
})
|
||||
|
||||
return Series
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ module.exports = (sequelize) => {
|
|||
type: DataTypes.INTEGER
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Setting'
|
||||
modelName: 'setting'
|
||||
})
|
||||
|
||||
return Setting
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ module.exports = (sequelize) => {
|
|||
cleanName: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'Tag'
|
||||
modelName: 'tag'
|
||||
})
|
||||
|
||||
return Tag
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ module.exports = (sequelize) => {
|
|||
extraData: DataTypes.JSON
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'User'
|
||||
modelName: 'user'
|
||||
})
|
||||
|
||||
return User
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ module.exports = (sequelize) => {
|
|||
value: DataTypes.STRING
|
||||
}, {
|
||||
sequelize,
|
||||
modelName: 'UserPermission'
|
||||
modelName: 'userPermission'
|
||||
})
|
||||
|
||||
const { User } = sequelize.models
|
||||
const { user } = sequelize.models
|
||||
|
||||
User.hasMany(UserPermission)
|
||||
UserPermission.belongsTo(User)
|
||||
user.hasMany(UserPermission)
|
||||
UserPermission.belongsTo(user)
|
||||
|
||||
return UserPermission
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue