Files
app/nextjs/server.js
2019-09-04 16:10:55 +02:00

241 lines
8.3 KiB
JavaScript

const express = require('express')
const next = require('next')
require('dotenv').config()
const mailer = require("./src/mailer.js")
const axios = require('axios')
const { join } = require('path');
const { parse } = require('url');
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
const passport = require('passport')
const FacebookStrategy = require('passport-facebook').Strategy
const LinkedInStrategy = require('passport-linkedin-oauth2').Strategy
const bodyParser = require('body-parser');
passport.use(new FacebookStrategy({
clientID: process.env.NODE_ENV === 'production' ? process.env.TT_FACEBOOK_ID : process.env.FACEBOOK_ID,
clientSecret: process.env.NODE_ENV === 'production' ? process.env.TT_FACEBOOK_SECRET : process.env.FACEBOOK_SECRET,
callbackURL: process.env.FRONT_SERVER + "/auth/facebook/callback",
enableProof: true,
passReqToCallback: true
},
function (req, token, tokenSecret, profile, done) {
process.nextTick(function () {
//console.log("fb verifyfunction")
// To keep the example simple, the user's Linkedin profile is returned to
// represent the logged-in user. In a typical application, you would want
// to associate the Linkedin account with a user record in your database,
// and return that user instead.
// console.log(token)
// console.log(profile)
// ! as we are in pure JWT strategie we pass token to authentify on our web services
return done(null, token);
});
}
));
passport.use(new LinkedInStrategy({
clientID: process.env.NODE_ENV === 'production' ? process.env.TT_LINKEDIN_ID : process.env.LINKEDIN_ID,
clientSecret: process.env.NODE_ENV === 'production' ? process.env.TT_LINKEDIN_SECRET : process.env.LINKEDIN_SECRET,
callbackURL: process.env.FRONT_SERVER + "/auth/linkedin/callback",
//scope: ['r_emailaddress', 'r_liteprofile', 'r_basicprofile'],
// profileFields: ['id', 'first-name', 'last-name', 'location', 'email-address', 'picture-urls::(original)'],
passReqToCallback: true
},
function (req, token, tokenSecret, profile, done) {
//console.log("===linkedin verifyfunction===")
process.nextTick(function () {
// To keep the example simple, the user's Linkedin profile is returned to
// represent the logged-in user. In a typical application, you would want
// to associate the Linkedin account with a user record in your database,
// and return that user instead.
//console.log(token)
// ! as we are in pure JWT strategy we pass token to authentify on our web services
console.log(token)
console.log(profile)
return done(null, token);
});
}
));
app.prepare()
.then(() => {
var jsonParser = bodyParser.json()
// Get Express and instance of Express from NextAuth
const server = express()
server.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
server.use(passport.initialize());
server.use('/', express.static(__dirname + '/.next/'))
server.get('/auth/facebook',
passport.authorize('facebook', { scope: ['email', 'public_profile'], session: false, failureRedirect: 'Login' }));
server.get('/auth/facebook/callback',
passport.authorize('facebook', { failureRedirect: '/Login', session: false }),
(req, res) => {
// console.log('facebookcallback')
//console.log(req.account)//don't understand why !
// console.log(req.accessToken)
// console.log(req)
axios.post(process.env.SERVER_URL + "/api/login_check_oauth", { 'oauth-token': req.account, 'oauth-type': 'facebook' })
.then((resApi) => {
console.log('$$$$$$$$$$$retreive user from token validation$$$$$$$$$$$$$$')
console.log(resApi)
return res.redirect('/AuthRouter?JWT=' + resApi.data.token)
}
).catch(err => { console.log(err) })
})
server.get('/auth/linkedin',
passport.authenticate('linkedin', { scope: ['r_basicprofile', 'r_emailaddress', 'r_liteprofile'], session: false, failureRedirect: '/Login' }));
server.get('/auth/linkedin/callback',
passport.authenticate('linkedin', { failureRedirect: '/Login', session: false }),
function (req, res) {
console.log(req)
// if (error) {
// console.log(error)
// return res.redirect('/Login?error=' + error.message)
// }
// console.log('-linkedincallback')
// console.log(req.accessToken)
// console.log('--linkedincallback')
// console.log(req.account)
// console.log('---linkedincallback')
// console.log(req)
// console.log(token)
axios.post(process.env.SERVER_URL + "/api/login_check_oauth", { 'oauth-token': req.user, 'oauth-type': 'linkedin' })
.then((resApi) => {
console.log('$$$$$$$$$$$retreive user from token validation$$$$$$$$$$$$$$')
console.log(resApi)
// return res.redirect('/AuthRouter?JWT=' + resApi.data.token)
return res.redirect('/AuthRouter?JWT=' + resApi.data.token)
}
).catch(err => {
console.log(err)
})
});
server.get('/Candidature/:id', (req, res) => {
const actualPage = '/Candidature'
const queryParams = { id: req.params.id }
app.render(req, res, actualPage, queryParams)
})
server.get('/Offre/:id-:rest', (req, res) => {
const actualPage = '/Offre'
const queryParams = { id: req.params.id }
app.render(req, res, actualPage, queryParams)
})
server.get('/Entreprise/:id-:rest', (req, res) => {
const actualPage = '/Entreprise'
const queryParams = { id: req.params.id }
app.render(req, res, actualPage, queryParams)
})
server.get('/Reponse', (req, res) => {
const actualPage = '/Reponse'
const queryParams = { adId: req.query.adId, companyId:req.query.companyId }
app.render(req, res, actualPage, queryParams)
})
server.get('/VerifyEmail/:email', (req, res) => {
const actualPage = '/VerifyEmail'
const queryParams = { email: req.params.email }
app.render(req, res, actualPage, queryParams)
})
server.get('/ConfirmAccount/:token/:email', (req, res) => {
const actualPage = '/ConfirmAccount'
const queryParams = { token: req.params.token, email: req.params.email }
app.render(req, res, actualPage, queryParams)
})
server.post('/NewsletterSubscription', jsonParser, (req, res) => {
let email = req.body.email;
if (!!!email) {
res.status(404).json({ success: false, message: 'Mauvais paramètre.' });
}
var mailjet = require('node-mailjet')
.connect(process.env.MJ_APIKEY_PUBLIC, process.env.MJ_APIKEY_PRIVATE)
let error = null;
let mailjetResponse = mailjet.post('contact')
.request({ Email: email })
.then(rep => res.json({ success: true }), rep => res.json({ success: false, message: rep.message }))
.catch((err) => {
});
})
server.post('/sendConfirmationEmail', jsonParser, (req, res) => {
const token = req.body.confirmationToken
const email = req.body.email
const nom = req.body.lastname
const prenom = req.body.firstname
const tokenUrl = `${process.env.FRONT_SERVER}/ConfirmAccount/${token}/${email}`
mailer.sendConfirmationEmail(nom, prenom, tokenUrl, email);
res.json({ status: 'success' });
})
server.get('/static/js/*.js', (req, res) => {
const parsedUrl = parse(req.url, true);
const { pathname } = parsedUrl;
const filePath = join(__dirname, '.next', pathname);
app.serveStatic(req, res, filePath);
})
server.get('/manifest.json', (req, res) => {
const parsedUrl = parse(req.url, true);
const { pathname } = parsedUrl;
const filePath = join(__dirname, '/static/', pathname);
app.serveStatic(req, res, filePath);
})
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(process.env.PORT, (err) => {
if (err) throw err
console.log('> Ready on ' + process.env.FRONT_SERVER + ' PORT :'+ process.env.PORT)
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})