request returns all requested items. Optional sort, query and filter params.
This commit is contained in:
		| @@ -1,15 +1,82 @@ | |||||||
| const assert = require('assert') | const assert = require('assert') | ||||||
|  | const configuration = require('src/config/configuration').getInstance(); | ||||||
|  | const Cache = require('src/tmdb/cache'); | ||||||
|  | const TMDB = require('src/tmdb/tmdb'); | ||||||
|  | const cache = new Cache(); | ||||||
|  | const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); | ||||||
| const establishedDatabase = require('src/database/database'); | const establishedDatabase = require('src/database/database'); | ||||||
|  | const utils = require('./utils'); | ||||||
|  |  | ||||||
| class RequestRepository { | class RequestRepository { | ||||||
|   constructor(database) { |   constructor(database) { | ||||||
|     this.database = database || establishedDatabase; |     this.database = database || establishedDatabase; | ||||||
|     this.queries = { |     this.queries = { | ||||||
|       add: 'insert into request (id,title,year,type) values(?,?,?,?)', |       add: 'insert into request (id,title,year,type) values(?,?,?,?)', | ||||||
|  |       fetchAll: 'select id, type from request', | ||||||
|  |       fetchAllSort: `select id, type from request order by ? ?`, | ||||||
|  |       fetchAllFilter: `select id, type from request where ? is "?"`, | ||||||
|  |       fetchAllQuery: `select id, type from request where title like "%?%" or year like "%?%"`, | ||||||
|  |       fetchAllFilterAndSort: `select id, type from request where ? is "?" order by ? ?`, | ||||||
|  |       downloaded: '(select status from requests where id is request.id and type is request.type limit 1)', | ||||||
|  |       // deluge: '(select status from deluge_torrent where id is request.id and type is request.type limit 1)', | ||||||
|  |       // fetchAllFilterStatus: 'select * from request where ' | ||||||
|       read: 'select * from request where id is ? and type is ?' |       read: 'select * from request where id is ? and type is ?' | ||||||
|     }; |     }; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   sortAndFilterToDbQuery(by, direction, filter, query) { | ||||||
|  |     let dbQuery = undefined; | ||||||
|  |  | ||||||
|  |     if (query !== undefined) { | ||||||
|  |       const dbParams = [query, query]; | ||||||
|  |       const dbquery = this.queries.fetchAllQuery | ||||||
|  |  | ||||||
|  |       dbQuery = dbquery.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') | ||||||
|  |     } | ||||||
|  |     else if (by !== undefined && filter !== undefined) { | ||||||
|  |       const paramToColumnAndValue = { | ||||||
|  |         movie: ['type', 'movie'], | ||||||
|  |         show: ['type', 'show'] | ||||||
|  |       } | ||||||
|  |       const dbParams = paramToColumnAndValue[filter].concat([by, direction]); | ||||||
|  |       const query = this.queries.fetchAllFilterAndSort; | ||||||
|  |  | ||||||
|  |       dbQuery = query.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') | ||||||
|  |     } | ||||||
|  |     else if (by !== undefined) { | ||||||
|  |       const dbParams = [by, direction]; | ||||||
|  |       const query = this.queries.fetchAllSort; | ||||||
|  |  | ||||||
|  |       dbQuery = query.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') | ||||||
|  |     } | ||||||
|  |     else if (filter !== undefined) { | ||||||
|  |       const paramToColumnAndValue = { | ||||||
|  |         movie: ['type', 'movie'], | ||||||
|  |         show: ['type', 'show'], | ||||||
|  |         downloaded: [this.queries.downloaded, 'downloaded'] | ||||||
|  |         // downloading: [this.database.delugeStatus, 'downloading'] | ||||||
|  |       } | ||||||
|  |       const dbParams = paramToColumnAndValue[filter] | ||||||
|  |       const query = this.queries.fetchAllFilter; | ||||||
|  |  | ||||||
|  |       dbQuery = query.split('').map((char) => char === '?' ? dbParams.shift() : char).join('') | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       dbQuery = this.queries.fetchAll; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return dbQuery | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   mapToTmdbByType(rows) { | ||||||
|  |     return rows.map((row) => { | ||||||
|  |       if (row.type === 'movie') | ||||||
|  |         return tmdb.movieInfo(row.id) | ||||||
|  |       else if (row.type === 'show') | ||||||
|  |         return tmdb.showInfo(row.id) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Add tmdb movie|show to requests |    * Add tmdb movie|show to requests | ||||||
|    * @param {tmdb} tmdb class of movie|show to add |    * @param {tmdb} tmdb class of movie|show to add | ||||||
| @@ -28,6 +95,24 @@ class RequestRepository { | |||||||
|       throw new Error('Could not add request'); |       throw new Error('Could not add request'); | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   fetchAll(sort_by=undefined, sort_direction='asc', filter_param=undefined, query=undefined) { | ||||||
|  |     if (sort_by !== undefined && ! utils.validSort(sort_by, sort_direction)) { | ||||||
|  |       throw new Error('Invalid sort parameters') | ||||||
|  |     } else if (filter_param !== undefined && ! utils.validFilter(filter_param)) { | ||||||
|  |       throw new Error('Invalid filter parameter') | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return Promise.resolve() | ||||||
|  |       .then(() => this.sortAndFilterToDbQuery(sort_by, sort_direction, filter_param, query)) | ||||||
|  |       .then((dbQuery) => this.database.all(dbQuery)) | ||||||
|  |       .then((rows) => Promise.all(this.mapToTmdbByType(rows))) | ||||||
|  |       .catch((err) => { throw new Error(`err ${err}`) }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   //   return Promise.resolve() | ||||||
|  |   //     .then(() => this.database.get(this.)) | ||||||
|  |   // } | ||||||
| } | } | ||||||
|  |  | ||||||
| module.exports = RequestRepository; | module.exports = RequestRepository; | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								seasoned_api/src/request/utils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								seasoned_api/src/request/utils.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | // TODO : test title and date are valid matches to columns in the database | ||||||
|  |  | ||||||
|  | const validSortParams = ['title', 'date'] | ||||||
|  | const validSortDirections = ['asc', 'desc'] | ||||||
|  | const validFilterParams = ['movie', 'show', 'seeding', 'downloading', 'paused', 'finished', 'downloaded'] | ||||||
|  |  | ||||||
|  | function validSort(by, direction) { | ||||||
|  |    if (! validSortParams.includes(by)) { | ||||||
|  |       return false | ||||||
|  |    } | ||||||
|  |    else if (! validSortDirections.includes(direction)) { | ||||||
|  |       return false | ||||||
|  |    } | ||||||
|  |     | ||||||
|  |    return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function validFilter(filter_param) { | ||||||
|  |   return validFilterParams.includes(filter_param) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | module.exports = { validSort, validFilter } | ||||||
| @@ -101,6 +101,7 @@ router.get('/v1/plex/hook', require('./controllers/plex/hookDump.js')); | |||||||
|  * Requests |  * Requests | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | router.get('/v2/request', require('./controllers/request/fetchAllRequests.js')); | ||||||
| router.post('/v2/request', require('./controllers/request/requestTmdbId.js')); | router.post('/v2/request', require('./controllers/request/requestTmdbId.js')); | ||||||
| router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); | router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); | ||||||
| router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); | router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); | ||||||
|   | |||||||
| @@ -0,0 +1,49 @@ | |||||||
|  | const configuration = require('src/config/configuration').getInstance(); | ||||||
|  | const Cache = require('src/tmdb/cache'); | ||||||
|  | const TMDB = require('src/tmdb/tmdb'); | ||||||
|  | const RequestRepository = require('src/request/request'); | ||||||
|  | const cache = new Cache(); | ||||||
|  | const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); | ||||||
|  | const request = new RequestRepository(); | ||||||
|  |  | ||||||
|  | const requestAsTmdb = (type, id) => { | ||||||
|  |   if (type !== undefined) { | ||||||
|  |     type = type.toLowerCase(); | ||||||
|  |  | ||||||
|  |     if (type === 'movie') { | ||||||
|  |       return tmdb.movieInfo(id); | ||||||
|  |     } else if (type === 'show') { | ||||||
|  |       return tmdb.showInfo(id); | ||||||
|  |     } else { | ||||||
|  |       throw new Error("Unprocessable Entity: Invalid type for body parameter 'type'. Allowed values: movie|show"); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   throw new Error("tmdbType body parameter not defined. Allowed values: movie|show") | ||||||
|  |  | ||||||
|  | } | ||||||
|  | /** | ||||||
|  |  * Controller: Request by id with type param | ||||||
|  |  * @param {Request} req http request variable | ||||||
|  |  * @param {Response} res | ||||||
|  |  * @returns {Callback} | ||||||
|  |  */ | ||||||
|  | function requestTmdbIdController(req, res) { | ||||||
|  |   const { filter, sort, query } = req.query; | ||||||
|  |   let sort_by = sort_direction = undefined; | ||||||
|  |  | ||||||
|  |   if (sort !== undefined && sort.includes(':')) { | ||||||
|  |     [sort_by, sort_direction] = sort.split(':') | ||||||
|  |   } | ||||||
|  |   // log, but disregard erroros sort param | ||||||
|  |   // non valid sort type, throw from request.fetchAll(sort, filter) | ||||||
|  |  | ||||||
|  |   Promise.resolve() | ||||||
|  |   // .then(() => requestAsTmdb(type, id)) | ||||||
|  |   .then(() => request.fetchAll(sort_by, sort_direction, filter, query)) | ||||||
|  |   .then((result) => res.send(result)) | ||||||
|  |   .catch((error) => { | ||||||
|  |     res.status(404).send({ success: false, error: error.message }); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | module.exports = requestTmdbIdController; | ||||||
		Reference in New Issue
	
	Block a user