From dfe5c3497817eea421aa1c76c9d5a9e8815261ef Mon Sep 17 00:00:00 2001 From: mjrode Date: Sun, 3 Mar 2019 21:19:10 -0600 Subject: [PATCH] WIP: Building out error handling. --- server/controllers/tdaw.controller.js | 1 + server/index.js | 14 ++++++++++++++ server/services/helpers.js | 17 ++++++++++------- server/services/plex/index.js | 14 +++++++------- server/services/plex/plexApi.js | 7 ++----- server/services/recommend/index.js | 0 server/services/tdaw/index.js | 8 ++++++++ server/services/tdaw/tdawApi.js | 12 ++++++++++-- test/server/services/plex/index.test.js | 12 ++++++++++++ test/server/services/plex/plexApi.test.js | 19 +++++++++++++++++++ 10 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 server/services/recommend/index.js diff --git a/server/controllers/tdaw.controller.js b/server/controllers/tdaw.controller.js index 80943eb..fa14562 100644 --- a/server/controllers/tdaw.controller.js +++ b/server/controllers/tdaw.controller.js @@ -4,5 +4,6 @@ import tdawService from '../services/tdaw'; const router = Router(); router.get('/similar', tdawService.similarMedia); +router.get('/most-watched', tdawService.mostWatched); export default router; diff --git a/server/index.js b/server/index.js index f453cbb..f948613 100644 --- a/server/index.js +++ b/server/index.js @@ -1,5 +1,6 @@ import express from 'express'; import {json, urlencoded} from 'body-parser'; +// eslint-disable-next-line import/named import {sequelize} from './db/models'; import plex from './routes/plex.route'; import tdaw from './routes/tdaw.route'; @@ -21,6 +22,19 @@ export default () => { server.use('/plex', plex); server.use('/tdaw', tdaw); + server.get('*', function(req, res, next) { + const err = new Error('Page Not Found'); + err.statusCode = 404; + next(err); + }); + + // eslint-disable-next-line no-unused-vars + server.use(function(err, req, res, next) { + console.error(err.message); // Log error message in our server's console + // eslint-disable-next-line no-param-reassign + if (!err.statusCode) err.statusCode = 500; // If err has no specified error code, set error code to 'Internal Server Error (500)' + res.status(err.statusCode).send(err.message); // All HTTP requests must have a response, so let's send back an error with its status code and message + }); return server; }; diff --git a/server/services/helpers.js b/server/services/helpers.js index 4817ca2..f1b4011 100644 --- a/server/services/helpers.js +++ b/server/services/helpers.js @@ -20,9 +20,13 @@ const buildUrl = function(urlParams) { delete params.host; const urlHash = params; + console.log('hash', urlHash); + + if (typeof urlHash !== 'object') { + throw new Error(`Invalid urlParams: ${urlHash}`); + } return buildUrlPackage(host, urlHash); } catch (error) { - console.log(error); return error; } }; @@ -37,16 +41,16 @@ const request = async function(url) { return resolve(formatResponse(response)); }) .catch(error => { - console.log(error); if (error.response) { - console.log('Status Error--', error.response.status); - console.log('Headers Error--', error.response.headers); + console.log('Error: Status--', error.response.status); + console.log('Error: Headers--', error.response.headers); return reject(error.response); } if (error.request) { - console.log('Request Error--', error.request); + // eslint-disable-next-line no-underscore-dangle + console.log('Error: Request Path--', error.request._options.path); } else { - console.log('Error', error.message); + console.log('Error:', error.message); } return reject(error); }); @@ -55,7 +59,6 @@ const request = async function(url) { const handleError = (res, method) => err => { console.log('Error in', method); - console.log(err); const {code, message} = err.responseData || { code: 500, message: 'An unknown error occurred.', diff --git a/server/services/plex/index.js b/server/services/plex/index.js index 1daf351..dd3c4b6 100644 --- a/server/services/plex/index.js +++ b/server/services/plex/index.js @@ -12,13 +12,13 @@ const getAuthToken = async (req, res) => { }); }; -const getUsers = async (req, res) => { - try { - const users = await plexApi.getUsers(); - res.json(users); - } catch (error) { - helpers.handleError(res, getUsers.name); - } +const getUsers = (req, res) => { + plexApi + .getUsers() + .then(users => { + res.json(users); + }) + .catch(helpers.handleError(res, getUsers.name)); }; const getMostWatched = async (req, res) => { diff --git a/server/services/plex/plexApi.js b/server/services/plex/plexApi.js index 58da19d..4812cef 100644 --- a/server/services/plex/plexApi.js +++ b/server/services/plex/plexApi.js @@ -51,11 +51,7 @@ const getUsers = async function() { const response = await helpers.request(getUsersUrl); return response.MediaContainer.User; } catch (error) { - return { - code: error.status, - message: error.statusText, - url: error.config.url, - }; + return error; } }; @@ -97,6 +93,7 @@ const getLibraryDataBySection = async function({sectionId}) { const response = await helpers.request(getLibraryDataBySectionUrl); return response.MediaContainer.Metadata; } catch (error) { + console.log('caught error', error); return { code: error.status, message: error.statusText, diff --git a/server/services/recommend/index.js b/server/services/recommend/index.js new file mode 100644 index 0000000..e69de29 diff --git a/server/services/tdaw/index.js b/server/services/tdaw/index.js index 95913cc..dd646bc 100644 --- a/server/services/tdaw/index.js +++ b/server/services/tdaw/index.js @@ -12,6 +12,14 @@ const similarMedia = async (req, res) => { } }; +const mostWatched = async (req, res) => { + console.log('was i called'); + const response = await tdawApi.mostWatched(); + console.log(response); + res.json(response); +}; + export default { similarMedia, + mostWatched, }; diff --git a/server/services/tdaw/tdawApi.js b/server/services/tdaw/tdawApi.js index 5d5875e..70c63b8 100644 --- a/server/services/tdaw/tdawApi.js +++ b/server/services/tdaw/tdawApi.js @@ -1,5 +1,6 @@ import config from '../../../config'; import helpers from '../helpers'; +import models from '../../db/models'; const tdawMediaUrl = function(mediaName, mediaType) { return { @@ -18,7 +19,7 @@ const similarMedia = async function(mediaName, mediaType) { const urlParams = tdawMediaUrl(mediaName, mediaType); const mediaUrl = helpers.buildUrl(urlParams); const response = await helpers.request(mediaUrl); - return response.Results; + return response; } catch (error) { console.log(error); return { @@ -29,4 +30,11 @@ const similarMedia = async function(mediaName, mediaType) { } }; -export default {similarMedia, tdawMediaUrl}; +const mostWatched = async () => { + return models.PlexLibrary.findAll({ + order: [['views', 'DESC']], + limit: 10, + }); +}; + +export default {similarMedia, tdawMediaUrl, mostWatched}; diff --git a/test/server/services/plex/index.test.js b/test/server/services/plex/index.test.js index f30646d..ea90a46 100644 --- a/test/server/services/plex/index.test.js +++ b/test/server/services/plex/index.test.js @@ -22,6 +22,17 @@ describe('Users', () => { done(); }); }); + + it('should handle request error', (done) => { + chai + .request(app) + .get('/plex/users') + .end((err, res) => { + res.should.have.status(500); + res.body.message.should.equal('An unknown error occurred.'); + done(); + }); + }); }); }); @@ -102,6 +113,7 @@ describe('Library Data', () => { .get('/api/users?X-Plex-Token') .end((err, res) => { res.should.have.status(404); + res.text.should.equal('Page Not Found'); done(); }); }); diff --git a/test/server/services/plex/plexApi.test.js b/test/server/services/plex/plexApi.test.js index c217fd3..284c713 100644 --- a/test/server/services/plex/plexApi.test.js +++ b/test/server/services/plex/plexApi.test.js @@ -21,6 +21,12 @@ describe('plexApi', () => { url.should.equal('https://plex.tv/api/users?X-Plex-Token=testPlexApiToken'); }); + it('handles error when building url', () => { + const urlParams = 'invalid params'; + const url = helpers.buildUrl(urlParams); + url.message.should.equal('Invalid urlParams: invalid params'); + }); + it('returns users', async () => { nocks.plexUsers(); @@ -44,4 +50,17 @@ describe('plexApi', () => { plexResponses.getLibraryDataBySectionRaw.MediaContainer.Metadata, ); }); + + // it.only('handles error if passed incorrect parameters', async (done) => { + // try { + // await plexApi.getLibraryDataBySection('incorrect param'); + // } catch (error) { + // console.log('CAUGHTEM', error); + // error.code.should.equal(401); + // error.message.should.equal('Unauthorized'); + // error.code.should.equal( + // 'https://plex.mjrflix.com/library/sections/undefined/all?X-Plex-Token=testPlexApiToken', + // ); + // } + // }); });