diff --git a/.gitignore b/.gitignore index 45a7670..346434d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ coverage .DS_Store .prettierignore .prettierrc.json -.sequelizerc \ No newline at end of file +.sequelizerc +config/local.js \ No newline at end of file diff --git a/config/auth.js b/config/auth.js new file mode 100644 index 0000000..c5a13b4 --- /dev/null +++ b/config/auth.js @@ -0,0 +1,5 @@ +const authConfig = { + tdawApiUrl: 'https://tastedive.com/api/similar', + token: process.env.TDAW_API_TOKEN, +}; +export default authConfig; diff --git a/config/development.env b/config/development.env deleted file mode 100644 index 649e92e..0000000 --- a/config/development.env +++ /dev/null @@ -1,2 +0,0 @@ -NODE_ENV=test -POSTGRES_SERVICE_URL=postgres://postgres@localhost:5432/recommend_development?logging=false \ No newline at end of file diff --git a/config/local.js b/config/local.js deleted file mode 100644 index 7307b2d..0000000 --- a/config/local.js +++ /dev/null @@ -1,6 +0,0 @@ -const localConfig = { - hostname: 'localhost', - port: 8080, -}; - -export default localConfig; diff --git a/config/production.js b/config/production.js new file mode 100644 index 0000000..be39307 --- /dev/null +++ b/config/production.js @@ -0,0 +1,8 @@ +const prodConfig = { + googleClientID: process.env.GOOGLE_CLIENT_ID, + googleClientSecret: process.env.GOOGLE_CLIENT_SECRET, + cookieKey: process.env.COOKIE_KEY, + port: process.env.PORT, +}; + +export default prodConfig; diff --git a/config/test.env b/config/test.env deleted file mode 100644 index dc250aa..0000000 --- a/config/test.env +++ /dev/null @@ -1,2 +0,0 @@ -NODE_ENV=test -POSTGRES_SERVICE_URL=postgres://postgres@localhost:5432/recommend_test?logging=false \ No newline at end of file diff --git a/package.json b/package.json index 4cf7cd9..1952e9c 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "1.0.0", "description": "", "main": "index.js", + "engines": { + "node": "10.15.0", + "npm": "6.4.1" + }, "scripts": { "test": "cross-env NODE_ENV=test PLEX_API_TOKEN=testPlexApiToken TDAW_API_TOKEN=testTdawToken nyc --reporter=html --reporter=text mocha --require babel-core/register 'test/**/*.test.js' --exit", "db:clean": "npm run db:drop && npm run db:create && npm run db:migrate", @@ -16,7 +20,8 @@ "db:reset": "NODE_ENV=test npx sequelize db:migrate:undo:all && NODE_ENV=test npx sequelize db:migrate && npx sequelize db:migrate:undo:all && npx sequelize db:migrate", "start": "nodemon --exec babel-node index.js", "server": "nodemon --exec babel-node index.js", - "client": "npm run start --prefix client" + "client": "npm run start --prefix client", + "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client" }, "nyc": { "reporter": [ diff --git a/server/controllers/auth.controller.js b/server/controllers/auth.controller.js new file mode 100644 index 0000000..e7d07a1 --- /dev/null +++ b/server/controllers/auth.controller.js @@ -0,0 +1,22 @@ +import {Router} from 'express'; +import passport from 'passport'; +import authService from '../services/auth'; + +const router = Router(); + +router.get('/google', authService.getAuthToken); + +router.get('/users', plexService.getUsers); + +router.get('/most-watched', plexService.getMostWatched); +router.get('/import/most-watched', plexService.importMostWatched); + +router.get('/sections', plexService.getSections); +router.get('/import/sections', plexService.importSections); + +router.get('/library/:id', plexService.getLibraryDataBySection); +router.get('/import/libraries', plexService.importLibraries); + +router.get('/import/all', plexService.importAll); + +export default router; diff --git a/server/routes/auth.route.js b/server/routes/auth.route.js new file mode 100644 index 0000000..f299870 --- /dev/null +++ b/server/routes/auth.route.js @@ -0,0 +1,9 @@ +import authController from '../controllers/auth.controller'; + +const express = require('express'); + +const router = express.Router(); + +router.use(authController); + +export default router; diff --git a/server/services/auth/passport.js b/server/services/auth/passport.js new file mode 100644 index 0000000..d4708c8 --- /dev/null +++ b/server/services/auth/passport.js @@ -0,0 +1,36 @@ +const passport = require('passport'); +const GoogleStrategy = require('passport-google-oauth20').Strategy; +const keys = require('../config/keys'); + +const User = mongoose.model('users'); + +passport.serializeUser((user, done) => { + done(null, user.id); +}); + +passport.deserializeUser((id, done) => { + User.findById(id).then(user => { + done(null, user); + }); +}); + +passport.use( + new GoogleStrategy( + { + clientID: keys.googleClientID, + clientSecret: keys.googleClientSecret, + callbackURL: '/auth/google/callback', + proxy: true, + }, + async (accessToken, refreshToken, profile, done) => { + const existingUser = await User.findOne({googleId: profile.id}); + + if (existingUser) { + return done(null, existingUser); + } + + const user = await new User({googleId: profile.id}).save(); + done(null, user); + }, + ), +);