diff --git a/package-lock.json b/package-lock.json index b78c4fe510..4ee83afc96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -156,6 +156,7 @@ "@types/friendly-words": "^1.2.2", "@types/jest": "^29.5.14", "@types/node": "^16.18.126", + "@types/passport": "^1.0.17", "@types/react": "^16.14.0", "@types/react-dom": "^16.9.25", "@types/react-router-dom": "^5.3.3", @@ -14324,6 +14325,16 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "node_modules/@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -50746,6 +50757,15 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", diff --git a/package.json b/package.json index 866c5aaf62..69dcc7de00 100644 --- a/package.json +++ b/package.json @@ -138,6 +138,7 @@ "@types/friendly-words": "^1.2.2", "@types/jest": "^29.5.14", "@types/node": "^16.18.126", + "@types/passport": "^1.0.17", "@types/react": "^16.14.0", "@types/react-dom": "^16.9.25", "@types/react-router-dom": "^5.3.3", diff --git a/server/routes/api.routes.js b/server/routes/api.routes.ts similarity index 89% rename from server/routes/api.routes.js rename to server/routes/api.routes.ts index 60be3494cf..cb1b2fec2f 100644 --- a/server/routes/api.routes.js +++ b/server/routes/api.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import passport from 'passport'; import * as ProjectController from '../controllers/project.controller'; -const router = new Router(); +const router = Router(); router.get( '/:username/sketches', @@ -24,4 +24,5 @@ router.delete( ProjectController.deleteProject ); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/asset.routes.js b/server/routes/asset.routes.ts similarity index 89% rename from server/routes/asset.routes.js rename to server/routes/asset.routes.ts index ab3f52a083..381779386e 100644 --- a/server/routes/asset.routes.js +++ b/server/routes/asset.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import { getProjectAsset } from '../controllers/project.controller'; import { getFileContent } from '../controllers/file.controller'; -const router = new Router(); +const router = Router(); router.get('/:username/sketches/:project_id/*', getProjectAsset); router.get('/full/:project_id/*', getProjectAsset); @@ -14,4 +14,5 @@ router.get('/:username/embed/:project_id/*', getProjectAsset); router.get('/sketches/:project_id/assets/*?', getFileContent); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/aws.routes.js b/server/routes/aws.routes.ts similarity index 86% rename from server/routes/aws.routes.js rename to server/routes/aws.routes.ts index 7a1c6d7063..91a5751866 100644 --- a/server/routes/aws.routes.js +++ b/server/routes/aws.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import * as AWSController from '../controllers/aws.controller'; import isAuthenticated from '../utils/isAuthenticated'; -const router = new Router(); +const router = Router(); router.post('/S3/sign', isAuthenticated, AWSController.signS3); router.post( @@ -17,4 +17,5 @@ router.delete( ); router.get('/S3/objects', AWSController.listObjectsInS3ForUserRequestHandler); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/collection.routes.js b/server/routes/collection.routes.ts similarity index 92% rename from server/routes/collection.routes.js rename to server/routes/collection.routes.ts index 31316d6f5b..4ec02961b1 100644 --- a/server/routes/collection.routes.js +++ b/server/routes/collection.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import * as CollectionController from '../controllers/collection.controller'; import isAuthenticated from '../utils/isAuthenticated'; -const router = new Router(); +const router = Router(); // List collections router.get( @@ -41,4 +41,5 @@ router.delete( CollectionController.removeProjectFromCollection ); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/embed.routes.js b/server/routes/embed.routes.ts similarity index 92% rename from server/routes/embed.routes.js rename to server/routes/embed.routes.ts index d7f858ee7c..fee2a7840c 100644 --- a/server/routes/embed.routes.js +++ b/server/routes/embed.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; const editorUrl = process.env.EDITOR_URL; -const router = new Router(); +const router = Router(); // CAT redirecting these temporarily to editor URLS to prevent phishing // router.get('/:username/embed/:project_id', EmbedController.serveProject); @@ -21,4 +21,5 @@ router.get('/embed/:project_id', (req, res) => { res.redirect(301, `${editorUrl}/full/${projectId}`); }); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/file.routes.js b/server/routes/file.routes.ts similarity index 83% rename from server/routes/file.routes.js rename to server/routes/file.routes.ts index 4f545d0862..c0bc434917 100644 --- a/server/routes/file.routes.js +++ b/server/routes/file.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import * as FileController from '../controllers/file.controller'; import isAuthenticated from '../utils/isAuthenticated'; -const router = new Router(); +const router = Router(); router.post( '/projects/:project_id/files', @@ -15,4 +15,5 @@ router.delete( FileController.deleteFile ); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/passport.routes.js b/server/routes/passport.routes.js deleted file mode 100644 index 2bc639239c..0000000000 --- a/server/routes/passport.routes.js +++ /dev/null @@ -1,35 +0,0 @@ -import Router from 'express'; -import passport from 'passport'; - -const router = new Router(); - -const authenticateOAuth = (service) => (req, res, next) => { - passport.authenticate(service, { failureRedirect: '/login' }, (err, user) => { - if (err) { - // use query string param to show error; - res.redirect(`/account?error=${service}`); - return; - } - - if (!user) { - res.redirect(`/account?error=${service}NoUser`); - return; - } - - req.logIn(user, (loginErr) => { - if (loginErr) { - next(loginErr); - return; - } - res.redirect('/'); - }); - })(req, res, next); -}; - -router.get('/auth/github', passport.authenticate('github')); -router.get('/auth/github/callback', authenticateOAuth('github')); - -router.get('/auth/google', passport.authenticate('google')); -router.get('/auth/google/callback', authenticateOAuth('google')); - -export default router; diff --git a/server/routes/passport.routes.ts b/server/routes/passport.routes.ts new file mode 100644 index 0000000000..bde3bc2a2f --- /dev/null +++ b/server/routes/passport.routes.ts @@ -0,0 +1,44 @@ +import { Router, Request, Response, NextFunction } from 'express'; +import passport from 'passport'; + +const router = Router(); + +const authenticateOAuth = (service: string) => ( + req: Request, + res: Response, + next: NextFunction +) => { + passport.authenticate( + service, + { failureRedirect: '/login' }, + (err: any, user: any) => { + if (err) { + // use query string param to show error; + res.redirect(`/account?error=${service}`); + return; + } + + if (!user) { + res.redirect(`/account?error=${service}NoUser`); + return; + } + + req.logIn(user, (loginErr) => { + if (loginErr) { + next(loginErr); + return; + } + res.redirect('/'); + }); + } + )(req, res, next); +}; + +router.get('/auth/github', passport.authenticate('github')); +router.get('/auth/github/callback', authenticateOAuth('github')); + +router.get('/auth/google', passport.authenticate('google')); +router.get('/auth/google/callback', authenticateOAuth('google')); + +// eslint-disable-next-line import/no-default-export +export default router; diff --git a/server/routes/project.routes.js b/server/routes/project.routes.ts similarity index 91% rename from server/routes/project.routes.js rename to server/routes/project.routes.ts index 0610f929ab..26f6ee9501 100644 --- a/server/routes/project.routes.js +++ b/server/routes/project.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import * as ProjectController from '../controllers/project.controller'; import isAuthenticated from '../utils/isAuthenticated'; -const router = new Router(); +const router = Router(); router.post('/projects', isAuthenticated, ProjectController.createProject); @@ -28,4 +28,5 @@ router.get('/projects/:project_id/zip', ProjectController.downloadProjectAsZip); router.patch('/project/visibility', ProjectController.changeProjectVisibility); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/redirectEmbed.routes.js b/server/routes/redirectEmbed.routes.ts similarity index 92% rename from server/routes/redirectEmbed.routes.js rename to server/routes/redirectEmbed.routes.ts index 7f60633ea6..2747cd1edc 100644 --- a/server/routes/redirectEmbed.routes.js +++ b/server/routes/redirectEmbed.routes.ts @@ -1,6 +1,6 @@ import { Router } from 'express'; -const router = new Router(); +const router = Router(); router.get('/:username/embed/:project_id', (req, res) => { const { username, project_id: projectId } = req.params; @@ -23,4 +23,5 @@ router.get('/embed/:project_id', (req, res) => { res.redirect(301, `/full/${projectId}`); }); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/server.routes.js b/server/routes/server.routes.js index b6aeeca286..b0abba285d 100644 --- a/server/routes/server.routes.js +++ b/server/routes/server.routes.js @@ -8,13 +8,7 @@ import { } from '../controllers/project.controller'; import { collectionForUserExists } from '../controllers/collection.controller'; -const router = new Router(); - -// const fallback404 = (res) => (exists) => -// exists ? res.send(renderIndex()) : get404Sketch((html) => res.send(html)); - -// this is intended to be a temporary file -// until i figure out isomorphic rendering +const router = Router(); router.get('/', (req, res) => { res.send(renderIndex()); @@ -159,4 +153,5 @@ router.get('/code-of-conduct', (req, res) => { res.send(renderIndex()); }); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/session.routes.js b/server/routes/session.routes.ts similarity index 79% rename from server/routes/session.routes.js rename to server/routes/session.routes.ts index a153edb189..7383288e0f 100644 --- a/server/routes/session.routes.js +++ b/server/routes/session.routes.ts @@ -1,7 +1,7 @@ import { Router } from 'express'; import * as SessionController from '../controllers/session.controller'; -const router = new Router(); +const router = Router(); router.post('/login', SessionController.createSession); @@ -9,4 +9,5 @@ router.get('/session', SessionController.getSession); router.get('/logout', SessionController.destroySession); +// eslint-disable-next-line import/no-default-export export default router; diff --git a/server/routes/user.routes.js b/server/routes/user.routes.ts similarity index 93% rename from server/routes/user.routes.js rename to server/routes/user.routes.ts index a507c328bd..532ade8923 100644 --- a/server/routes/user.routes.js +++ b/server/routes/user.routes.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import * as UserController from '../controllers/user.controller'; import isAuthenticated from '../utils/isAuthenticated'; -const router = new Router(); +const router = Router(); router.post('/signup', UserController.createUser); @@ -39,4 +39,5 @@ router.get('/verify', UserController.verifyEmail); router.delete('/auth/github', UserController.unlinkGithub); router.delete('/auth/google', UserController.unlinkGoogle); +// eslint-disable-next-line import/no-default-export export default router;