formations/cesi/architecture_n_tiers/ressources/exercices/ex_microbloggr_solution/services/home_page/src/server.js

112 lines
3.0 KiB
JavaScript

const express = require('express');
const session = require('express-session');
var RedisStore = require('connect-redis')(session);
const app = express();
const morgan = require('morgan');
const request = require('request-promise-native');
const bodyParser = require('body-parser');
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(morgan('combined'));
app.use(session({
store: new RedisStore({host: 'redis'}),
secret: process.env.SESSION_SECRET, // Ce secret doit être partagé par tous les microservices *_page
cookie: { maxAge: 60000 },
resave: false,
saveUninitialized: true,
}));
// On utilise le module "body-parser"
// pour faciliter la désérialisation des données
// du formulaire
app.use(bodyParser.urlencoded({extended: false}));
// GET /
// Retourne la page d'accueil de MicroBloggr ou redirige vers la
// page de login si l'utilisateur n'est pas identifié
app.get('/', (req, res) => {
// On vérifie si un utilisateur a été associé à la session HTTP
if (req.session.user) {
const user = req.session.user;
// On récupère la liste des statuts depuis le microservice "statuses"
fetchUserStatuses(user.username)
.then(result => {
// Si le microservice "statuses" n'a pas pu nous renvoyer
// la liste des statuts
if (!result.ok) {
return res.status(500).send(result.error);
}
// Si oui, on affichage la page d'accueil
return res.render('index', { user: req.session.user, statuses: result.statuses });
})
.catch(err => {
console.error(err);
return res.status(500).send(err.stack);
});
} else {
// Si non, on redirige l'utilisateur vers la page de login
return res.redirect(302, '/login');
}
});
// POST /
// Gère l'envoi du formulaire de création d'un nouveau statut
app.post('/', (req, res) => {
// On vérifie si un utilisateur a été associé à la session HTTP
if (!req.session.user) {
return res.status(302).redirect("/login");
}
const user = req.session.user;
const statusText = req.body.status;
addUserStatus(user.username, statusText)
.then(result => {
if (!result.ok) {
return res.status(500).send(result.error);
}
// On redirige vers la page d'accueil
// pour afficher le nouveau statut
return res.status(303).redirect("/");
})
.catch(err => {
console.error(err);
return res.status(500).send(err.stack);
});
});
// Récupère la liste des statuts d'un utilisateur donné
function fetchUserStatuses(username) {
return request({
uri: `http://statuses:8080/statuses/${username}`,
method: 'GET',
json: true
})
;
}
// Récupère la liste des statuts d'un utilisateur donné
function addUserStatus(username, text) {
return request({
uri: `http://statuses:8080/statuses`,
method: 'POST',
body: { username, text },
json: true
})
;
}
app.listen(8080, () => console.log('listening on port 8080'));