From b62e88c4ede79d9baf1a7631bdb5a5600796e1dd Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 20 Mar 2023 15:52:33 -0500 Subject: [PATCH] Update routes/controllers/db structure --- server/Server.js | 5 +- server/controllers2/LibraryItemController.js | 265 ------------------ server/controllers2/item.controller.js | 18 ++ server/db/item.db.js | 269 +++++++++++++++++++ server/routers/ApiRouter2.js | 15 -- server/routes/index.js | 8 + server/routes/items.js | 8 + 7 files changed, 306 insertions(+), 282 deletions(-) delete mode 100644 server/controllers2/LibraryItemController.js create mode 100644 server/controllers2/item.controller.js create mode 100644 server/db/item.db.js delete mode 100644 server/routers/ApiRouter2.js create mode 100644 server/routes/index.js create mode 100644 server/routes/items.js diff --git a/server/Server.js b/server/Server.js index f094def2..68e4c461 100644 --- a/server/Server.js +++ b/server/Server.js @@ -21,8 +21,9 @@ const Db = require('./Db') const Database = require('./Database') const SocketAuthority = require('./SocketAuthority') +const routes = require('./routes/index') + const ApiRouter = require('./routers/ApiRouter') -const ApiRouter2 = require('./routers/ApiRouter2') const HlsRouter = require('./routers/HlsRouter') const StaticRouter = require('./routers/StaticRouter') @@ -171,7 +172,7 @@ class Server { // Static folder router.use(express.static(Path.join(global.appRoot, 'static'))) - router.use('/api/v1', new ApiRouter2(this).router) + router.use('/api/v1', routes) router.use('/api', this.authMiddleware.bind(this), this.apiRouter.router) router.use('/hls', this.authMiddleware.bind(this), this.hlsRouter.router) router.use('/s', this.authMiddleware.bind(this), this.staticRouter.router) diff --git a/server/controllers2/LibraryItemController.js b/server/controllers2/LibraryItemController.js deleted file mode 100644 index e6ea6f42..00000000 --- a/server/controllers2/LibraryItemController.js +++ /dev/null @@ -1,265 +0,0 @@ -const { Sequelize } = require('sequelize') -const Database = require('../Database') - -class LibraryItemController { - constructor() { } - - // Example get library item full, expanded, minified - async get(req, res) { - const key = req.query.minified == 1 ? 'minified' : req.query.expanded == 1 ? 'expanded' : 'full' - const include = { - minified: [ - { - 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: [] - } - }, - ] - } - ], - full: [ - { - 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: [] - } - }, - ] - } - ], - expanded: [ - { - 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' - }, - { - model: Database.models.libraryFolder, - include: 'library' - } - ] - } - const LibraryItem = await Database.models.libraryItem.findByPk(req.params.id, { - include: include[key] - }) - - res.json(LibraryItem) - } -} -module.exports = new LibraryItemController() \ No newline at end of file diff --git a/server/controllers2/item.controller.js b/server/controllers2/item.controller.js new file mode 100644 index 00000000..683d0c87 --- /dev/null +++ b/server/controllers2/item.controller.js @@ -0,0 +1,18 @@ +const itemDb = require('../db/item.db') + +const getLibraryItem = async (req, res) => { + let libraryItem = null + if (req.query.minified == 1) { + libraryItem = await itemDb.getLibraryItemMinified(req.params.id) + } else if (req.query.expanded == 1) { + libraryItem = await itemDb.getLibraryItemExpanded(req.params.id) + } else { + libraryItem = await itemDb.getLibraryItemFull(req.params.id) + } + + res.json(libraryItem) +} + +module.exports = { + getLibraryItem +} \ No newline at end of file diff --git a/server/db/item.db.js b/server/db/item.db.js new file mode 100644 index 00000000..36aa511b --- /dev/null +++ b/server/db/item.db.js @@ -0,0 +1,269 @@ +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' + }, + { + model: Database.models.libraryFolder, + include: 'library' + } + ] + }) +} + +module.exports = { + getLibraryItemMinified, + getLibraryItemFull, + getLibraryItemExpanded +} \ No newline at end of file diff --git a/server/routers/ApiRouter2.js b/server/routers/ApiRouter2.js deleted file mode 100644 index b740c31e..00000000 --- a/server/routers/ApiRouter2.js +++ /dev/null @@ -1,15 +0,0 @@ -const express = require('express') -const LibraryItemController = require('../controllers2/LibraryItemController') - -class ApiRouter2 { - constructor(Server) { - this.router = express() - this.router.disable('x-powered-by') - this.init() - } - - init() { - this.router.get('/items/:id', LibraryItemController.get.bind(this)) - } -} -module.exports = ApiRouter2 diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 00000000..b74add6c --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,8 @@ +const express = require('express') +const items = require('./items') + +const router = express.Router() + +router.use('/items', items) + +module.exports = router \ No newline at end of file diff --git a/server/routes/items.js b/server/routes/items.js new file mode 100644 index 00000000..642bac55 --- /dev/null +++ b/server/routes/items.js @@ -0,0 +1,8 @@ +const express = require('express') +const LibraryItemController = require('../controllers2/item.controller') + +const router = express.Router() + +router.get('/:id', LibraryItemController.getLibraryItem) + +module.exports = router \ No newline at end of file