Skip to content

Commit 9bfc561

Browse files
authored
typescript refactor (#62)
* typescript refactor * tyescript modifications * cleanup
1 parent 429f153 commit 9bfc561

18 files changed

+359
-93
lines changed

Diff for: .gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ yarn-error.log*
2020

2121
# server
2222
/server/.env
23-
/server/node_modules
23+
/server/node_modules
24+
/server/dist

Diff for: server/Dockerfile

+3-7
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,10 @@ FROM node:12-alpine
55
LABEL maintainer="Sawyer Blue Burnett"
66

77
# Copy dependencies
8-
COPY package.json yarn.lock ./
8+
COPY package.json yarn.lock tsconfig.json ./
99
# Install dependencies
1010
RUN yarn
11-
12-
COPY passport-setup.js server.js ./
13-
# Copy rest of files
14-
COPY models/ ./models
15-
COPY routes/ ./routes
16-
COPY controllers/ ./controllers
11+
COPY src/ ./src
12+
RUN yarn build
1713

1814
EXPOSE 80

Diff for: server/models/user.js

-14
This file was deleted.

Diff for: server/nodemon.json

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"watch": ["src/"],
3+
"ext": "ts",
4+
"execMap": {
5+
"ts": "node -r ts-node/register"
6+
},
7+
"restartable": "rs",
8+
"ignore": [".git", "node_modules/", "dist/"]
9+
}

Diff for: server/package.json

+14-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
"main": "server.js",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1",
8-
"start": "node server.js",
9-
"dev": "nodemon server.js"
8+
"build": "tsc",
9+
"start": "node dist/server.js",
10+
"dev": "nodemon --config nodemon.json src/server.ts"
1011
},
1112
"keywords": [],
1213
"author": "",
@@ -26,5 +27,16 @@
2627
"nodemon": "^1.19.3",
2728
"passport": "^0.4.0",
2829
"passport-google-oauth20": "^2.0.0"
30+
},
31+
"devDependencies": {
32+
"@types/cors": "^2.8.10",
33+
"@types/dotenv": "^8.2.0",
34+
"@types/express": "^4.17.11",
35+
"@types/mongoose": "^5.10.3",
36+
"@types/node": "^14.14.35",
37+
"@types/passport": "^1.0.6",
38+
"@types/passport-google-oauth20": "^2.0.7",
39+
"ts-node": "^9.1.1",
40+
"typescript": "^4.2.3"
2941
}
3042
}

Diff for: server/routes/auth-routes.js

-25
This file was deleted.

Diff for: server/routes/session-routes.js

-14
This file was deleted.

Diff for: server/controllers/authController.js renamed to server/src/controllers/authController.ts

+20-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
const passport = require('passport');
1+
import passport from 'passport';
2+
import { NextFunction, Request, Response } from 'express';
23
const CLIENT_HOME_PAGE_URL = process.env.CLIENT_HOME_PAGE_URL;
34
const GOOGLE_STRATEGY = 'google';
45

5-
exports.loginSuccess = function(req, res) {
6+
export const loginSuccess = function(req: Request, res: Response) {
67
if (req.user) {
8+
const message = 'user has successfully authenticated';
9+
console.log(message);
710
res.json({
811
success: true,
9-
message: 'user has successfully authenticated',
12+
message: message,
1013
user: req.user,
1114
cookies: req.cookies,
1215
});
@@ -15,27 +18,37 @@ exports.loginSuccess = function(req, res) {
1518
}
1619
};
1720

18-
exports.loginFailed = function(req, res) {
21+
export const loginFailed = function(req: Request, res: Response) {
22+
console.log('failed authentication attempt');
1923
res.status(401).json({
2024
success: false,
2125
message: 'user failed to authenticate.',
2226
});
2327
};
2428

25-
exports.logout = function(req, res) {
29+
export const logout = function(req: Request, res: Response) {
30+
console.log('logout attempted');
2631
req.logout();
2732
res.redirect(CLIENT_HOME_PAGE_URL);
2833
};
2934

30-
exports.authenticate = function(req, res, next) {
35+
export const authenticate = function(
36+
req: Request,
37+
res: Response,
38+
next: NextFunction
39+
) {
3140
passport.authenticate(GOOGLE_STRATEGY, { scope: ['profile', 'email'] })(
3241
req,
3342
res,
3443
next
3544
);
3645
};
3746

38-
exports.redirect = function(req, res, next) {
47+
export const redirect = function(
48+
req: Request,
49+
res: Response,
50+
next: NextFunction
51+
) {
3952
passport.authenticate(GOOGLE_STRATEGY, {
4053
failureRedirect: '/login/failed',
4154
successRedirect: CLIENT_HOME_PAGE_URL,

Diff for: server/controllers/sessionController.js renamed to server/src/controllers/sessionController.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
const Session = require('../models/session');
1+
import { Session } from '../models/session';
2+
import { Request, Response } from 'express';
23

3-
exports.retrieveSessions = async function(req, res) {
4-
// move auth checks into a helper function
4+
export const retrieveSessions = async function(req: Request, res: Response) {
55
if (req.user) {
6+
console.log('retrieving sessions for user');
67
Session.find(
78
{ userId: req.user.id },
89
null,
@@ -22,7 +23,8 @@ exports.retrieveSessions = async function(req, res) {
2223
}
2324
};
2425

25-
exports.saveSessions = async function(req, res) {
26+
export const saveSessions = async function(req: Request, res: Response) {
27+
console.log('saving a user session');
2628
const body = req.body;
2729

2830
if (!body.notes || !body.notes.text) {
@@ -46,8 +48,9 @@ exports.saveSessions = async function(req, res) {
4648
}
4749
};
4850

49-
exports.getSessionSummary = async function(req, res) {
51+
export const getSessionSummary = async function(req: Request, res: Response) {
5052
if (req.user) {
53+
console.log('retrieving session summary for user');
5154
const aggregate = await Session.aggregate([
5255
{ $match: { userId: req.user.id } },
5356
{

Diff for: server/src/index.d.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
declare module Express {
2+
interface AuthInfo {}
3+
interface User {
4+
id?: string;
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
const mongoose = require('mongoose');
2-
const Schema = mongoose.Schema;
1+
import { Schema, model } from 'mongoose';
32

43
const sessionSchema = new Schema({
54
userId: String,
@@ -10,6 +9,4 @@ const sessionSchema = new Schema({
109
},
1110
});
1211

13-
const Session = mongoose.model('session', sessionSchema);
14-
15-
module.exports = Session;
12+
export const Session = model('session', sessionSchema);

Diff for: server/src/models/user.ts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Schema, model, Document } from 'mongoose';
2+
3+
export type UserDocument = Document & {
4+
firstName: string;
5+
lastName: string;
6+
screenName: string;
7+
googleId: string;
8+
emailAddress: string;
9+
};
10+
11+
const userSchema = new Schema<UserDocument>({
12+
firstName: String,
13+
lastName: String,
14+
screenName: String,
15+
googleId: String,
16+
emailAddress: String,
17+
});
18+
19+
export const User = model<UserDocument>('User', userSchema);

Diff for: server/passport-setup.js renamed to server/src/passport-setup.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
const passport = require('passport');
2-
const GoogleStrategy = require('passport-google-oauth20').Strategy;
3-
const User = require('./models/user');
1+
import passport from 'passport';
2+
import { Strategy } from 'passport-google-oauth20';
3+
import { User } from './models/user';
44

55
passport.use(
6-
new GoogleStrategy(
6+
new Strategy(
77
{
88
clientID: process.env.CLIENT_ID,
99
clientSecret: process.env.CLIENT_SECRET,
@@ -32,11 +32,11 @@ passport.use(
3232
)
3333
);
3434

35-
passport.serializeUser(function(user, done) {
35+
passport.serializeUser((user, done) => {
3636
done(null, user.id);
3737
});
3838

39-
passport.deserializeUser(function(id, done) {
39+
passport.deserializeUser((id, done) => {
4040
User.findById(id)
4141
.then((user) => {
4242
done(null, user);

Diff for: server/src/routes/auth-routes.ts

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { NextFunction, Request, Response, Router } from 'express';
2+
3+
import {
4+
loginFailed,
5+
authenticate,
6+
loginSuccess,
7+
logout,
8+
redirect,
9+
} from '../controllers/authController';
10+
11+
export const router = Router();
12+
13+
router.use((req: Request, res: Response, next: NextFunction) => {
14+
console.log('request to auth endpoint at Time: ', new Date().toISOString());
15+
next();
16+
});
17+
18+
// when login is successful, retrieve user info
19+
router.get('/login/success', loginSuccess);
20+
21+
// when login failed, send failed msg
22+
router.get('/login/failed', loginFailed);
23+
24+
// when user logs out, redirect to client
25+
router.get('/logout', logout);
26+
27+
// call authenticate for google strategy
28+
router.get('/google', authenticate);
29+
30+
// redirect after auth completes successfully
31+
router.get('/google/redirect', redirect);

Diff for: server/src/routes/session-routes.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { NextFunction, Request, Response, Router } from 'express';
2+
3+
import {
4+
retrieveSessions,
5+
getSessionSummary,
6+
saveSessions,
7+
} from '../controllers/sessionController';
8+
export const router = Router();
9+
10+
router.use((req: Request, res: Response, next: NextFunction) => {
11+
next();
12+
});
13+
14+
router.get('/', retrieveSessions);
15+
16+
router.post('/save', saveSessions);
17+
18+
router.get('/summary', getSessionSummary);

Diff for: server/server.js renamed to server/src/server.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
require('dotenv').config();
2-
const express = require('express');
3-
const passport = require('passport');
4-
const authRoutes = require('./routes/auth-routes');
5-
const sessionRoutes = require('./routes/session-routes');
6-
const mongoose = require('mongoose');
7-
const cors = require('cors');
2+
import express from 'express';
3+
import mongoose from 'mongoose';
4+
import passport from 'passport';
5+
import { router as authRoutes } from './routes/auth-routes';
6+
import { router as sessionRoutes } from './routes/session-routes';
7+
import cors from 'cors';
88
const offline = process.env.OFFLINE === 'true' ? true : false;
99
require('./passport-setup');
1010

@@ -33,7 +33,6 @@ if (!offline) {
3333
console.log('offline mode: will not connect to mongodb');
3434
}
3535

36-
// Create a new Express application.
3736
var app = express();
3837

3938
app.set('port', process.env.PORT || 8080);

Diff for: server/tsconfig.json

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"compilerOptions": {
3+
"module": "commonjs",
4+
"esModuleInterop": true,
5+
"allowSyntheticDefaultImports": true,
6+
"target": "es6",
7+
"noImplicitAny": true,
8+
"moduleResolution": "node",
9+
"sourceMap": true,
10+
"outDir": "dist",
11+
"baseUrl": ".",
12+
"paths": {
13+
"*": ["node_modules/*", "src/types/*"]
14+
}
15+
},
16+
"ts-node": {
17+
"files": true
18+
},
19+
"include": ["src/**/*"],
20+
"exclude": ["node_modules"]
21+
}

0 commit comments

Comments
 (0)