-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.js
More file actions
145 lines (133 loc) · 4.59 KB
/
Copy pathserver.js
File metadata and controls
145 lines (133 loc) · 4.59 KB
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import express from 'express';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import bodyParser from 'body-parser';
import figlet from 'figlet';
import serveRoute from './Routes/serveRoute.js';
import dbConnect from './Services/dbConnection.js';
import cookieParser from 'cookie-parser';
import cors from 'cors';
import swaggerJSDoc from 'swagger-jsdoc';
import swaggerUi from 'swagger-ui-express';
import passport from 'passport';
import session from 'express-session';
import User from './Models/userModel.js';
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import JWT from 'jsonwebtoken';
import sendMail from './Services/mailService.js';
const app = express();
app.use(cors());
import { config } from 'dotenv';
import MailTemplates from './Mail/index.mail.js';
config();
app.use(cookieParser());
// Connect with Database...
dbConnect(process.env.DB_URI);
const viewsPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'views');
const publicPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'Public');
// Setup view engine...
app.set('view engine', 'ejs');
app.set('views', viewsPath);
// Middlewares...
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static(publicPath));
app.use(passport.initialize());
app.use(session(
{
secret: 'your_secret_key',
resave: false,
saveUninitialized: true
}
));
passport.use(new GoogleStrategy({
clientID: process.env.OAUTH_CLIENT_ID,
clientSecret: process.env.OAUTH_CLIENT_SECRET,
callbackURL: process.env.OAUTH_CALLBACK || "http://localhost:8000/auth/google/callback"
}, async function (accessToken, refreshToken, profile, cb) {
try {
let user = await User.findOne({ email: profile.emails[0].value });
if (!user) {
user = new User({
name: profile.displayName,
email: profile.emails[0].value,
profileImage: profile.photos[0].value
});
await user.save();
const emailData = MailTemplates.SignUp2MailtemplateContent(user.email, user.name);
await sendMail(emailData, (error, response) => {
if (error) {
console.log("Mail send error.");
} else {
console.log("Mail send successful.");
}
})
}
return cb(null, user);
} catch (error) {
return cb(error, null);
}
}));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser(async (id, done) => {
try {
const user = await User.findById(id);
done(null, user);
} catch (err) {
done(err, null);
}
});
// Swagger setup
const swaggerOptions = {
definition: {
openapi: "3.0.0",
info: {
title: "EchoWrite with Swagger",
version: "1.0.0",
description: "EchoWrite API documentation"
},
servers: [
{
url: `http://localhost:${process.env.PORT}`
}
],
},
apis: ["./Routes/*.js"]
};
const swaggerDocs = swaggerJSDoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs));
app.use('/', serveRoute);
app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));
app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/' }), async (req, res) => {
const checkUser = await User.findOne({ email: req.user.email });
if (!checkUser) {
return res.render('errorPage', { errorMessage: "Something Went Wrong in OAuth", backUrl: "/login" });
}
const payload = {
_id: checkUser._id,
username: checkUser.name,
email: checkUser.email,
profileimage: checkUser.profileImage
}
const token = JWT.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' });
res.cookie('usertoken', token).redirect('/');
// res.redirect('/user/profile');
});
// Connect with server...
app.listen(process.env.PORT, (err) => {
if (err) {
console.error("Error connecting to the server:", err);
} else {
figlet("Server Connected . . . .", (err, data) => {
if (err) {
console.error("Something went wrong!", err);
return;
}
console.log(data);
});
console.log(`Server running on port ${process.env.PORT}`);
}
});