Update model casing & associations

This commit is contained in:
advplyr 2023-03-19 15:19:22 -05:00
parent 2131a65299
commit 54ca58e610
45 changed files with 830 additions and 561 deletions

View file

@ -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
}

View file

@ -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
}
})

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}
})

View file

@ -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
}

View file

@ -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

View file

@ -13,7 +13,7 @@ module.exports = (sequelize) => {
cleanName: DataTypes.STRING
}, {
sequelize,
modelName: 'Genre'
modelName: 'genre'
})
return Genre

View file

@ -18,7 +18,7 @@ module.exports = (sequelize) => {
lastScanVersion: DataTypes.STRING
}, {
sequelize,
modelName: 'Library'
modelName: 'library'
})
return Library

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -22,7 +22,7 @@ module.exports = (sequelize) => {
extraData: DataTypes.JSON
}, {
sequelize,
modelName: 'Notification'
modelName: 'notification'
})
return Notification

View file

@ -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
}

View file

@ -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
}
})

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -13,7 +13,7 @@ module.exports = (sequelize) => {
description: DataTypes.TEXT
}, {
sequelize,
modelName: 'Series'
modelName: 'series'
})
return Series

View file

@ -12,7 +12,7 @@ module.exports = (sequelize) => {
type: DataTypes.INTEGER
}, {
sequelize,
modelName: 'Setting'
modelName: 'setting'
})
return Setting

View file

@ -13,7 +13,7 @@ module.exports = (sequelize) => {
cleanName: DataTypes.STRING
}, {
sequelize,
modelName: 'Tag'
modelName: 'tag'
})
return Tag

View file

@ -26,7 +26,7 @@ module.exports = (sequelize) => {
extraData: DataTypes.JSON
}, {
sequelize,
modelName: 'User'
modelName: 'user'
})
return User

View file

@ -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
}