/
user.js
83 lines (77 loc) · 2.41 KB
/
user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
const mongoose = require("../helpers/db"),
googleAuthLib = require("google-auth-library"),
googleOAuthConfig = require("../helpers/authentication/configuration").google;
const schema = mongoose.Schema({
name: String,
email: String,
dateRegistered: Date,
googleId: String,
storages: [{ type: mongoose.Schema.Types.ObjectId, ref: "Storage" }],
refreshToken: String,
accessToken: String,
expiresAt: Date
});
schema.statics.findOrCreate = function(
accessToken,
refreshToken,
params,
profile
) {
return new Promise(resolve => {
const userObj = new this();
this.findOne({ googleId: profile.id }, (err, result) => {
if (!result) {
userObj.googleId = profile.id;
userObj.name = profile.displayName;
userObj.email = profile.emails[0].value;
userObj.basicHttpAuth = false;
userObj.dateRegistered = Date.now();
const now = new Date();
userObj.expiresAt = now.setTime(now.getTime() + 1000 * 3599);
userObj.refreshToken = refreshToken;
userObj.accessToken = accessToken;
userObj.save((error, user) => resolve({ error, user }));
} else {
result.refreshToken = refreshToken;
result
.save()
.then(() => this.refreshAccessCode(result.googleId))
.then(result => resolve({ error: null, user: result }));
}
});
});
};
schema.statics.refreshAccessCode = function(googleId) {
return new Promise((resolve, reject) => {
this.findOne({ googleId }, (err, result) => {
const now = new Date();
if (now.getTime() < result.expiresAt) {
const oauth2Client = new googleAuthLib.OAuth2Client(
googleOAuthConfig.clientID,
googleOAuthConfig.clientSecret,
googleOAuthConfig.callbackURL
);
oauth2Client.setCredentials({
refresh_token: result.refreshToken
});
oauth2Client.getAccessToken().then(response => {
this.findOneAndUpdate(
{ googleId },
{
$set: {
accessToken: response.token,
expiresAt: now.setTime(now.getTime() + 1000 * 3590) // A bit less than 1 hour
}
},
{ new: true }
)
.then(doc => resolve(doc))
.catch(err => reject(err));
});
} else {
resolve(result);
}
});
});
};
module.exports = mongoose.model("User", schema);