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
+27 -22
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
}
+27 -22
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
}
})
+6 -8
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
}
+8 -8
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
}
+4 -4
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
}
+8 -8
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
}
+8 -8
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
}
+8 -8
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
}
+8 -8
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
}
+4 -4
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
}
+8 -8
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
}
+4 -4
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
}
+6 -5
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
}
+44 -38
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
}
})
+4 -4
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
}
+3 -3
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
+1 -1
View File
@@ -13,7 +13,7 @@ module.exports = (sequelize) => {
cleanName: DataTypes.STRING
}, {
sequelize,
modelName: 'Genre'
modelName: 'genre'
})
return Genre
+1 -1
View File
@@ -18,7 +18,7 @@ module.exports = (sequelize) => {
lastScanVersion: DataTypes.STRING
}, {
sequelize,
modelName: 'Library'
modelName: 'library'
})
return Library
+6 -6
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
}
+4 -4
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
}
+50 -5
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
}
+4 -4
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
}
+4 -4
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
}
+32 -26
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
}
+4 -4
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
}
+1 -1
View File
@@ -22,7 +22,7 @@ module.exports = (sequelize) => {
extraData: DataTypes.JSON
}, {
sequelize,
modelName: 'Notification'
modelName: 'notification'
})
return Notification
+4 -4
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
}
+29 -24
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
}
})
+4 -4
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
}
+6 -6
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
}
+27 -22
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
}
+4 -7
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
}
+4 -4
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
}
+8 -8
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
}
+8 -8
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
}
+1 -1
View File
@@ -13,7 +13,7 @@ module.exports = (sequelize) => {
description: DataTypes.TEXT
}, {
sequelize,
modelName: 'Series'
modelName: 'series'
})
return Series
+1 -1
View File
@@ -12,7 +12,7 @@ module.exports = (sequelize) => {
type: DataTypes.INTEGER
}, {
sequelize,
modelName: 'Setting'
modelName: 'setting'
})
return Setting
+1 -1
View File
@@ -13,7 +13,7 @@ module.exports = (sequelize) => {
cleanName: DataTypes.STRING
}, {
sequelize,
modelName: 'Tag'
modelName: 'tag'
})
return Tag
+1 -1
View File
@@ -26,7 +26,7 @@ module.exports = (sequelize) => {
extraData: DataTypes.JSON
}, {
sequelize,
modelName: 'User'
modelName: 'user'
})
return User
+4 -4
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
}