2023-03-20 21:52:33 +01:00
|
|
|
const { Sequelize } = require('sequelize')
|
|
|
|
const Database = require('../Database')
|
|
|
|
|
|
|
|
const getLibraryItemMinified = (libraryItemId) => {
|
|
|
|
return Database.models.libraryItem.findByPk(libraryItemId, {
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.book,
|
|
|
|
attributes: [
|
|
|
|
'id', 'title', 'subtitle', 'publishedYear', 'publishedDate', 'publisher', 'description', 'isbn', 'asin', 'language', 'explicit',
|
|
|
|
[Sequelize.literal('(SELECT COUNT(*) FROM "audioTracks" WHERE "audioTracks"."mediaItemId" = book.id)'), 'numAudioTracks'],
|
|
|
|
[Sequelize.literal('(SELECT COUNT(*) FROM "bookChapters" WHERE "bookChapters"."bookId" = book.id)'), 'numChapters']
|
|
|
|
],
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'authors',
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'narrators',
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.series,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: ['sequence']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.podcast,
|
|
|
|
attributes: [
|
|
|
|
'id', 'title', 'author', 'releaseDate', 'feedURL', 'imageURL', 'description', 'itunesPageURL', 'itunesId', 'itunesArtistId', 'language', 'podcastType', 'explicit', 'autoDownloadEpisodes',
|
|
|
|
[Sequelize.literal('(SELECT COUNT(*) FROM "podcastEpisodes" WHERE "podcastEpisodes"."podcastId" = podcast.id)'), 'numPodcastEpisodes']
|
|
|
|
],
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const getLibraryItemFull = (libraryItemId) => {
|
|
|
|
return Database.models.libraryItem.findByPk(libraryItemId, {
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.book,
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.audioTrack
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'authors',
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'narrators',
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.series,
|
|
|
|
through: {
|
|
|
|
attributes: ['sequence']
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.bookChapter
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.eBookFile,
|
|
|
|
include: 'fileMetadata'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.podcast,
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.podcastEpisode,
|
|
|
|
include: {
|
|
|
|
model: Database.models.audioTrack
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const getLibraryItemExpanded = (libraryItemId) => {
|
|
|
|
return Database.models.libraryItem.findByPk(libraryItemId, {
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.book,
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.fileMetadata,
|
|
|
|
as: 'imageFile'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.audioTrack,
|
|
|
|
include: {
|
|
|
|
model: Database.models.mediaFile,
|
|
|
|
include: [
|
|
|
|
'fileMetadata',
|
|
|
|
'mediaStreams'
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'authors',
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'narrators',
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.series,
|
|
|
|
through: {
|
|
|
|
attributes: ['sequence']
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.bookChapter
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.eBookFile,
|
|
|
|
include: 'fileMetadata'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.podcast,
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.fileMetadata,
|
|
|
|
as: 'imageFile'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.podcastEpisode,
|
|
|
|
include: {
|
|
|
|
model: Database.models.audioTrack,
|
|
|
|
include: {
|
|
|
|
model: Database.models.mediaFile,
|
|
|
|
include: [
|
|
|
|
'fileMetadata',
|
|
|
|
'mediaStreams'
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.libraryFile,
|
|
|
|
include: 'fileMetadata'
|
|
|
|
},
|
2023-03-21 23:06:08 +01:00
|
|
|
'libraryFolder',
|
|
|
|
'library'
|
|
|
|
]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const getLibraryItemsForLibrary = async (libraryId) => {
|
|
|
|
return Database.models.libraryItem.findAll({
|
|
|
|
where: {
|
|
|
|
libraryId
|
|
|
|
},
|
|
|
|
limit: 50,
|
|
|
|
order: [
|
|
|
|
[Database.models.book, 'title', 'DESC'],
|
|
|
|
[Database.models.podcast, 'title', 'DESC']
|
|
|
|
],
|
|
|
|
include: [
|
2023-03-20 21:52:33 +01:00
|
|
|
{
|
2023-03-21 23:06:08 +01:00
|
|
|
model: Database.models.book,
|
|
|
|
attributes: [
|
|
|
|
'id', 'title', 'subtitle', 'publishedYear', 'publishedDate', 'publisher', 'description', 'isbn', 'asin', 'language', 'explicit',
|
|
|
|
[Sequelize.literal('(SELECT COUNT(*) FROM "audioTracks" WHERE "audioTracks"."mediaItemId" = book.id)'), 'numAudioTracks'],
|
|
|
|
[Sequelize.literal('(SELECT COUNT(*) FROM "bookChapters" WHERE "bookChapters"."bookId" = book.id)'), 'numChapters']
|
|
|
|
],
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'authors',
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.person,
|
|
|
|
as: 'narrators',
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.series,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: ['sequence']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.podcast,
|
|
|
|
attributes: [
|
|
|
|
'id', 'title', 'author', 'releaseDate', 'feedURL', 'imageURL', 'description', 'itunesPageURL', 'itunesId', 'itunesArtistId', 'language', 'podcastType', 'explicit', 'autoDownloadEpisodes',
|
|
|
|
[Sequelize.literal('(SELECT COUNT(*) FROM "podcastEpisodes" WHERE "podcastEpisodes"."podcastId" = podcast.id)'), 'numPodcastEpisodes']
|
|
|
|
],
|
|
|
|
include: [
|
|
|
|
{
|
|
|
|
model: Database.models.genre,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
model: Database.models.tag,
|
|
|
|
attributes: ['id', 'name'],
|
|
|
|
through: {
|
|
|
|
attributes: []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
]
|
2023-03-20 21:52:33 +01:00
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
getLibraryItemMinified,
|
|
|
|
getLibraryItemFull,
|
2023-03-21 23:06:08 +01:00
|
|
|
getLibraryItemExpanded,
|
|
|
|
getLibraryItemsForLibrary
|
2023-03-20 21:52:33 +01:00
|
|
|
}
|