diff --git a/seasoned_api/src/tmdb/cache.js b/seasoned_api/src/tmdb/cache.js new file mode 100644 index 0000000..ab980d5 --- /dev/null +++ b/seasoned_api/src/tmdb/cache.js @@ -0,0 +1,44 @@ +const assert = require('assert'); +const establishedDatabase = require('src/database/database'); + +class Cache { + constructor(database) { + this.database = database || establishedDatabase + this.queries = { + 'read': 'SELECT value, time_to_live, created_at, DATETIME("now", "localtime") as now, ' + + 'DATETIME(created_at, "+" || time_to_live || " seconds") as expires ' + + 'FROM cache WHERE key = ? AND now < expires', + 'create': 'INSERT OR REPLACE INTO cache (key, value, time_to_live) VALUES (?, ?, ?)', + }; + } + + /** + * Retrieve an unexpired cache entry by key. + * @param {String} key of the cache entry + * @returns {Object} + */ + get(key) { + return Promise.resolve() + .then(() => this.database.get(this.queries.read, [key])) + .then((row) => { + assert(row, 'Could not find cache enrty with that key.'); + return JSON.parse(row.value); + }) + } + + /** + * Insert cache entry with key and value. + * @param {String} key of the cache entry + * @param {String} value of the cache entry + * @param {Number} timeToLive the number of seconds before entry expires + * @returnsĀ {Object} + */ + set(key, value, timeToLive = 60) { + const json = JSON.stringify(value); + return Promise.resolve() + .then(() => this.database.run(this.queries.create, [key, json, timeToLive])) + .then(() => value); + } +} + +module.exports = Cache; \ No newline at end of file diff --git a/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js b/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js index 90f5cda..e67f0a8 100644 --- a/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js +++ b/seasoned_api/src/webserver/controllers/tmdb/searchMedia.js @@ -1,6 +1,10 @@ +const SearchHistory = require('src/searchHistory/searchHistory'); const configuration = require('src/config/configuration').getInstance(); +const Cache = require('src/tmdb/cache'); const TMDB = require('src/tmdb/tmdb'); -const tmdb = new TMDB(configuration.get('tmdb', 'apiKey')); +const cache = new Cache(); +const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); +const searchHistory = new SearchHistory(); /** * Controller: Search for movies by query, page and optionally adult @@ -8,10 +12,17 @@ const tmdb = new TMDB(configuration.get('tmdb', 'apiKey')); * @param {Response} res * @returns {Callback} */ -function searchMoviesController(req, res) { +function searchMediaController(req, res) { + const user = req.loggedInUser; const { query, page, type } = req.query; Promise.resolve() + .then(() => { + if (user) { + return searchHistory.create(user, query); + } + return null; + } .then(() => tmdb.search(query, page, type)) .then((movies) => { if (movies !== undefined || movies.length > 0) { @@ -19,11 +30,10 @@ function searchMoviesController(req, res) { } else { res.status(404).send({ success: false, error: 'Search query did not return any results.'}) } - res.send(movies); }) .catch((error) => { res.status(500).send({ success: false, error: error.message }); }); } -module.exports = searchMoviesController; +module.exports = searchMediaController;