Skip to content
This repository was archived by the owner on Nov 16, 2023. It is now read-only.

Commit eb9bc30

Browse files
committed
augment express.Request with User model
Update User model update "any" types to more specific
1 parent 1409fd7 commit eb9bc30

File tree

5 files changed

+27
-31
lines changed

5 files changed

+27
-31
lines changed

src/config/passport.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ import passport from "passport";
22
import passportLocal from "passport-local";
33
import passportFacebook from "passport-facebook";
44
import _ from "lodash";
5-
6-
// import { User, UserType } from '../models/User';
75
import { User, UserDocument } from "../models/User";
86
import { Request, Response, NextFunction } from "express";
9-
107
const LocalStrategy = passportLocal.Strategy;
118
const FacebookStrategy = passportFacebook.Strategy;
129

13-
passport.serializeUser<any, any>((user, done) => {
10+
passport.serializeUser((user: UserDocument, done) => {
1411
done(undefined, user.id);
1512
});
1613

@@ -25,12 +22,12 @@ passport.deserializeUser((id, done) => {
2522
* Sign in using Email and Password.
2623
*/
2724
passport.use(new LocalStrategy({ usernameField: "email" }, (email, password, done) => {
28-
User.findOne({ email: email.toLowerCase() }, (err, user: any) => {
25+
User.findOne({ email: email.toLowerCase() }, (err, user: UserDocument) => {
2926
if (err) { return done(err); }
3027
if (!user) {
3128
return done(undefined, false, { message: `Email ${email} not found.` });
3229
}
33-
user.comparePassword(password, (err: Error, isMatch: boolean) => {
30+
user.comparePassword(password, (err, isMatch) => {
3431
if (err) { return done(err); }
3532
if (isMatch) {
3633
return done(undefined, user);
@@ -66,15 +63,15 @@ passport.use(new FacebookStrategy({
6663
callbackURL: "/auth/facebook/callback",
6764
profileFields: ["name", "email", "link", "locale", "timezone"],
6865
passReqToCallback: true
69-
}, (req: any, accessToken, refreshToken, profile, done) => {
66+
}, (req, accessToken, refreshToken, profile, done) => {
7067
if (req.user) {
7168
User.findOne({ facebook: profile.id }, (err, existingUser) => {
7269
if (err) { return done(err); }
7370
if (existingUser) {
7471
req.flash("errors", { msg: "There is already a Facebook account that belongs to you. Sign in with that account or delete it, then link it with your current account." });
7572
done(err);
7673
} else {
77-
User.findById(req.user.id, (err, user: any) => {
74+
User.findById(req.user.id, (err, user) => {
7875
if (err) { return done(err); }
7976
user.facebook = profile.id;
8077
user.tokens.push({ kind: "facebook", accessToken });
@@ -100,7 +97,7 @@ passport.use(new FacebookStrategy({
10097
req.flash("errors", { msg: "There is already an account using this email address. Sign in to that account and link it with Facebook manually from Account Settings." });
10198
done(err);
10299
} else {
103-
const user: any = new User();
100+
const user: UserDocument = new User();
104101
user.email = profile._json.email;
105102
user.facebook = profile.id;
106103
user.tokens.push({ kind: "facebook", accessToken });
@@ -133,8 +130,7 @@ export const isAuthenticated = (req: Request, res: Response, next: NextFunction)
133130
export const isAuthorized = (req: Request, res: Response, next: NextFunction) => {
134131
const provider = req.path.split("/").slice(-1)[0];
135132

136-
const user = req.user as UserDocument;
137-
if (_.find(user.tokens, { kind: provider })) {
133+
if (_.find(req.user.tokens, { kind: provider })) {
138134
next();
139135
} else {
140136
res.redirect(`/auth/${provider}`);

src/controllers/api.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
"use strict";
2-
31
import graph from "fbgraph";
42
import { Response, Request, NextFunction } from "express";
5-
import { UserDocument } from "../models/User";
63

74

85
/**
@@ -20,10 +17,9 @@ export const getApi = (req: Request, res: Response) => {
2017
* Facebook API example.
2118
*/
2219
export const getFacebook = (req: Request, res: Response, next: NextFunction) => {
23-
const user = req.user as UserDocument;
24-
const token = user.tokens.find((token: any) => token.kind === "facebook");
20+
const token = req.user.tokens.find(token => token.kind === "facebook");
2521
graph.setAccessToken(token.accessToken);
26-
graph.get(`${user.facebook}?fields=id,name,email,first_name,last_name,gender,link,locale,timezone`, (err: Error, results: graph.FacebookUser) => {
22+
graph.get(`${req.user.facebook}?fields=id,name,email,first_name,last_name,gender,link,locale,timezone`, (err: Error, results: graph.FacebookUser) => {
2723
if (err) { return next(err); }
2824
res.render("api/facebook", {
2925
title: "Facebook API",

src/controllers/user.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@ export const postUpdateProfile = (req: Request, res: Response, next: NextFunctio
142142
return res.redirect("/account");
143143
}
144144

145-
const user = req.user as UserDocument;
146-
User.findById(user.id, (err, user: UserDocument) => {
145+
User.findById(req.user.id, (err, user) => {
147146
if (err) { return next(err); }
148147
user.email = req.body.email || "";
149148
user.profile.name = req.body.name || "";
@@ -179,8 +178,7 @@ export const postUpdatePassword = (req: Request, res: Response, next: NextFuncti
179178
return res.redirect("/account");
180179
}
181180

182-
const user = req.user as UserDocument;
183-
User.findById(user.id, (err, user: UserDocument) => {
181+
User.findById(req.user.id, (err, user) => {
184182
if (err) { return next(err); }
185183
user.password = req.body.password;
186184
user.save((err: WriteError) => {
@@ -196,8 +194,7 @@ export const postUpdatePassword = (req: Request, res: Response, next: NextFuncti
196194
* Delete user account.
197195
*/
198196
export const postDeleteAccount = (req: Request, res: Response, next: NextFunction) => {
199-
const user = req.user as UserDocument;
200-
User.remove({ _id: user.id }, (err) => {
197+
User.remove({ _id: req.user.id }, (err) => {
201198
if (err) { return next(err); }
202199
req.logout();
203200
req.flash("info", { msg: "Your account has been deleted." });
@@ -211,10 +208,8 @@ export const postDeleteAccount = (req: Request, res: Response, next: NextFunctio
211208
*/
212209
export const getOauthUnlink = (req: Request, res: Response, next: NextFunction) => {
213210
const provider = req.params.provider;
214-
const user = req.user as UserDocument;
215-
User.findById(user.id, (err, user: any) => {
211+
User.findById(req.user.id, (err, user) => {
216212
if (err) { return next(err); }
217-
user[provider] = undefined;
218213
user.tokens = user.tokens.filter((token: AuthToken) => token.kind !== provider);
219214
user.save((err: WriteError) => {
220215
if (err) { return next(err); }
@@ -267,7 +262,7 @@ export const postReset = (req: Request, res: Response, next: NextFunction) => {
267262
User
268263
.findOne({ passwordResetToken: req.params.token })
269264
.where("passwordResetExpires").gt(Date.now())
270-
.exec((err, user: any) => {
265+
.exec((err, user) => {
271266
if (err) { return next(err); }
272267
if (!user) {
273268
req.flash("errors", { msg: "Password reset token is invalid or has expired." });
@@ -346,14 +341,14 @@ export const postForgot = (req: Request, res: Response, next: NextFunction) => {
346341
});
347342
},
348343
function setRandomToken(token: AuthToken, done: Function) {
349-
User.findOne({ email: req.body.email }, (err, user: any) => {
344+
User.findOne({ email: req.body.email }, (err, user) => {
350345
if (err) { return done(err); }
351346
if (!user) {
352347
req.flash("errors", { msg: "Account with that email address does not exist." });
353348
return res.redirect("/forgot");
354349
}
355350
user.passwordResetToken = token;
356-
user.passwordResetExpires = Date.now() + 3600000; // 1 hour
351+
user.passwordResetExpires = new Date(Date.now() + 3600000); // 1 hour
357352
user.save((err: WriteError) => {
358353
done(err, token, user);
359354
});

src/models/User.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import mongoose from "mongoose";
55
export type UserDocument = mongoose.Document & {
66
email: string;
77
password: string;
8-
passwordResetToken: string;
8+
passwordResetToken: AuthToken;
99
passwordResetExpires: Date;
1010

1111
facebook: string;
@@ -23,7 +23,7 @@ export type UserDocument = mongoose.Document & {
2323
gravatar: (size: number) => string;
2424
};
2525

26-
type comparePasswordFunction = (candidatePassword: string, cb: (err: any, isMatch: any) => {}) => void;
26+
type comparePasswordFunction = (candidatePassword: string, cb: (err: Error, isMatch: boolean) => void) => void;
2727

2828
export interface AuthToken {
2929
accessToken: string;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {UserDocument} from "../models/User";
2+
import {Request} from "express";
3+
4+
declare module 'express' {
5+
export interface User extends UserDocument {}
6+
export interface Request {
7+
user?: User;
8+
}
9+
}

0 commit comments

Comments
 (0)