Merge branch 'release/v0.2.0'
This commit is contained in:
commit
9365d82bef
Binary file not shown.
Before Width: | Height: | Size: 458 KiB |
File diff suppressed because one or more lines are too long
168
app.js
168
app.js
|
@ -1,11 +1,13 @@
|
|||
const express = require('express'),
|
||||
cors = require("cors"),
|
||||
app = express(),
|
||||
log = require("color-logs")(true, true, "Dryusdan.fr"),
|
||||
fs = require("fs"),
|
||||
path = require('path'),
|
||||
promise = require('promise'),
|
||||
hbs = require('hbs');
|
||||
const express = require('express'),
|
||||
cors = require("cors"),
|
||||
app = express(),
|
||||
session = require('express-session'),
|
||||
bodyParser = require('body-parser'),
|
||||
cookieParser = require('cookie-parser'),
|
||||
helmet = require('helmet'),
|
||||
log = require("color-logs")(true, true, "Nodezzarella app"),
|
||||
fs = require("fs"),
|
||||
promise = require('promise');
|
||||
|
||||
log.info("Application started and now preparing");
|
||||
|
||||
|
@ -15,105 +17,69 @@ var corsOptions = {
|
|||
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
|
||||
"preflightContinue": false
|
||||
};
|
||||
/**
|
||||
* Create menu html
|
||||
*/
|
||||
const config = require("./ressources/config.json");
|
||||
var Template = require("./classes/Template.class");
|
||||
var Categories = require("./classes/Categories.class");
|
||||
var Articles = require("./classes/Articles.class");
|
||||
|
||||
class App {
|
||||
constructor(rootPath, port){
|
||||
global.config = require("./config.json");
|
||||
|
||||
class Nodezzarella {
|
||||
constructor(rootPath){
|
||||
this.getDBType().then((configDB) => {
|
||||
if(!configDB.flatFile){
|
||||
var db = require('./lib/db/'+config.db+'/db');
|
||||
new db().connectDB(configDB).then((connexion) => {
|
||||
global.dbConnexion = connexion;
|
||||
global.dbConf = configDB;
|
||||
this.run();
|
||||
});
|
||||
}
|
||||
else{
|
||||
this.run();
|
||||
}
|
||||
}).catch((err) => {
|
||||
new Error("Nodezzarella can't initialize");
|
||||
});
|
||||
}
|
||||
|
||||
getDBType(){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.access("./lib/db/"+config.db+"/config.json", fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||
if(error){
|
||||
reject(new Error("File not exist"));
|
||||
}
|
||||
else{
|
||||
resolve(require("./lib/db/"+config.db+"/config.json"));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
run(){
|
||||
var routes = require("./lib/router");
|
||||
log.info("HTTP server listening on port", config.appPort);
|
||||
log.info("Application ready");
|
||||
app.set('trust proxy', 1);
|
||||
app.use(cookieParser());
|
||||
app.use(bodyParser.urlencoded({ extended: true }));
|
||||
app.use(bodyParser.json());
|
||||
app.use(session({
|
||||
secret: 'Nodezzarella',
|
||||
resave: true,
|
||||
saveUninitialized: true,
|
||||
cookie: { secure: false, maxAge: 3600*24*31 }
|
||||
}))
|
||||
app.use(config.webroot || "/", routes);
|
||||
app.use(function(req, res, next) {
|
||||
res.status(404);
|
||||
res.send("404 not found");
|
||||
return;
|
||||
});
|
||||
|
||||
/**
|
||||
* Listen to http://0.0.0.0:port
|
||||
*/
|
||||
app.listen(port);
|
||||
log.info("HTTP server listening on port", port);
|
||||
log.info("Application ready");
|
||||
var template = new Template();
|
||||
|
||||
app.get("/", function(req, res){
|
||||
var categories = new Categories();
|
||||
Promise.all([
|
||||
template.getNav(),
|
||||
categories.getHome(),
|
||||
categories.getDisclaimer()
|
||||
]).then(data => {
|
||||
var nav = data[0];
|
||||
var content = data[1];
|
||||
var disclaimer = data[2];
|
||||
res.setHeader("Content-type", "text/html");
|
||||
var tplData = {
|
||||
"blogName": config.blogName,
|
||||
"title": config.homeTitle,
|
||||
"nav": nav,
|
||||
"content": content,
|
||||
"disclaimer": disclaimer
|
||||
};
|
||||
res.render('template.hbs', tplData);
|
||||
}).catch(err => {
|
||||
res.setHeader("Content-type", "text/plain");
|
||||
|
||||
res.end("erreur");
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
app.get("/:slug", function(req, res){
|
||||
var categories = new Categories();
|
||||
Promise.all([
|
||||
template.getNav(),
|
||||
categories.getListArticles(req.params.slug),
|
||||
categories.getCategorie(req.params.slug)
|
||||
]).then(data => {
|
||||
var nav = data[0];
|
||||
var content = data[1];
|
||||
var dataCategories = data[2];
|
||||
res.setHeader("Content-type", "text/html");
|
||||
var tplData = {
|
||||
"blogName": config.blogName,
|
||||
"title": dataCategories.title+" - "+ config.blogName,
|
||||
"nav": nav,
|
||||
"content": content,
|
||||
"disclaimer": ''
|
||||
};
|
||||
res.render('template.hbs', tplData);
|
||||
}).catch(err => {
|
||||
res.setHeader("Content-type", "text/plain");
|
||||
|
||||
res.end("erreur");
|
||||
});
|
||||
});
|
||||
app.get("/:categories/:slug", function(req, res){
|
||||
var categories = new Categories();
|
||||
var articles = new Articles();
|
||||
Promise.all([
|
||||
template.getNav(),
|
||||
categories.getCategorie(req.params.categories),
|
||||
articles.getArticle(req.params.categories, req.params.slug)
|
||||
]).then(data => {
|
||||
var nav = data[0];
|
||||
var dataCategories = data[1];
|
||||
var content = data[2];
|
||||
res.setHeader("Content-type", "text/html");
|
||||
var tplData = {
|
||||
"blogName": config.blogName,
|
||||
"title": articles.title+" - "+dataCategories.title+" - "+ config.blogName,
|
||||
"nav": nav,
|
||||
"content": content,
|
||||
"disclaimer": ''
|
||||
};
|
||||
res.render('template.hbs', tplData);
|
||||
}).catch(err => {
|
||||
res.setHeader("Content-type", "text/plain");
|
||||
res.end("erreur");
|
||||
});
|
||||
});
|
||||
app.use(express.static("./public"));
|
||||
app.disable('x-powered-by');
|
||||
app.listen(config.appPort || 8888);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new App("/", config.appPort);
|
||||
new Nodezzarella("/");
|
|
@ -0,0 +1,7 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
const log = require('color-logs')(true, true, "Article.class.js"),
|
||||
markdown = require('markdown').markdown,
|
||||
promise = require('promise');
|
||||
|
||||
var id,
|
||||
title,
|
||||
author,
|
||||
content,
|
||||
date,
|
||||
img,
|
||||
categorieName,
|
||||
categorieID,
|
||||
slug;
|
||||
|
||||
class Article {
|
||||
constructor(id, title, author, date, img, slug, categorieID, content = null){
|
||||
this.setId(id);
|
||||
this.setTitle(title);
|
||||
this.setAuthor(author);
|
||||
this.setDate(date);
|
||||
this.setImg(img);
|
||||
this.setSlug(slug);
|
||||
this.setCategorieID(categorieID);
|
||||
(content !== null)?this.setContent(content):'';
|
||||
}
|
||||
|
||||
setId(id){
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
setTitle(title){
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
setAuthor(author){
|
||||
this.author = author;
|
||||
}
|
||||
|
||||
setContent(content){
|
||||
this.content = markdown.toHTML(content);
|
||||
}
|
||||
|
||||
setImg(img){
|
||||
this.img = img;
|
||||
}
|
||||
|
||||
setDate(date){
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
setSlug(slug){
|
||||
this.slug = slug;
|
||||
}
|
||||
|
||||
setCategorieID(categorieID){
|
||||
this.categorieID = categorieID;
|
||||
}
|
||||
|
||||
setCategorieName(name){
|
||||
this.categorieName = name;
|
||||
}
|
||||
|
||||
getId(){
|
||||
return this.id;
|
||||
}
|
||||
|
||||
getTitle(){
|
||||
return this.title;
|
||||
}
|
||||
|
||||
getAuthor(){
|
||||
return this.author;
|
||||
}
|
||||
|
||||
getContent(){
|
||||
return this.content;
|
||||
}
|
||||
|
||||
getDate(){
|
||||
return this.date;
|
||||
}
|
||||
|
||||
getImg(){
|
||||
return this.img;
|
||||
}
|
||||
|
||||
getSlug(){
|
||||
return this.slug;
|
||||
}
|
||||
|
||||
getcategorieID(){
|
||||
return this.categorieID;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = Article;
|
|
@ -0,0 +1,86 @@
|
|||
const log = require('color-logs')(true, true, "Categorie.class.js");
|
||||
|
||||
var id,
|
||||
title,
|
||||
uri,
|
||||
articles,
|
||||
description;
|
||||
|
||||
class Categorie {
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} title : title of categorie
|
||||
* @param {string} uri : uri of categorie
|
||||
* @param {string} description : description of categorie
|
||||
*/
|
||||
constructor(id, title, uri, description){
|
||||
this.setId(id);
|
||||
this.setTitle(title);
|
||||
this.setUri(uri);
|
||||
this.setDescription(description);
|
||||
this.articles = new Array();
|
||||
}
|
||||
|
||||
setId(id){
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
setTitle(title){
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
setUri(uri){
|
||||
this.uri = uri;
|
||||
}
|
||||
|
||||
setDescription(description){
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {object <Article>} article : array of article object owned by this categorie
|
||||
*/
|
||||
setArticle(article){
|
||||
this.articles.push(article);
|
||||
}
|
||||
|
||||
getId(){
|
||||
return this.id;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {string} title of categorie
|
||||
*/
|
||||
getTitle(){
|
||||
return this.title;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {string} uri of categorie
|
||||
*/
|
||||
getUri(){
|
||||
return this.uri;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {string} description of categories
|
||||
*/
|
||||
getDescription(){
|
||||
return this.description;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {array} article array of categories
|
||||
*/
|
||||
getArticles(){
|
||||
return this.articles;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Categorie;
|
|
@ -1,131 +0,0 @@
|
|||
const log = require('color-logs')(true, true, "Categories.class.js"),
|
||||
path = require('path'),
|
||||
hbs = require('handlebars'),
|
||||
promise = require('promise'),
|
||||
fs = require("fs");
|
||||
|
||||
hbs.registerHelper('listArticle', function(tabs, options) {
|
||||
var i = 1;
|
||||
var out = '';
|
||||
for(var x in options['data']['root']){
|
||||
|
||||
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
||||
if(i == 3){
|
||||
i= 1;
|
||||
out = out + "</div><div class=\"row\">";
|
||||
}
|
||||
else{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
});
|
||||
|
||||
class Categories {
|
||||
|
||||
/**
|
||||
* hydrate global var
|
||||
* @param {type} slug : url of categorie
|
||||
* @returns {Promise} data of categories
|
||||
*/
|
||||
getCategorie(slug){
|
||||
return new Promise((resolve, reject) => {
|
||||
var path = "./ressources/"+slug+"/params.json";
|
||||
fs.access(path, fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||
if(error)
|
||||
resolve(new Error("File not exist"));
|
||||
else
|
||||
resolve(require("."+path));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {Promise} the list of article
|
||||
*/
|
||||
getHome(){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
||||
var data = require('../ressources/lastArticles.json');
|
||||
hbs.registerHelper('articles', (articles) =>{
|
||||
return articles;
|
||||
});
|
||||
var template = hbs.compile(source);
|
||||
var html = template(data);
|
||||
resolve(html);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
getDisclaimer(){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile('./views/articles/disclaimer.hbs', 'utf-8', (error, source) => {
|
||||
var data = require('../ressources/disclaimer.json');
|
||||
hbs.registerHelper('articles', (articles) =>{
|
||||
return articles;
|
||||
});
|
||||
var template = hbs.compile(source);
|
||||
var html = template(data);
|
||||
resolve(html);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {type} slug : url of categorie
|
||||
* @returns {Promise} the list of article in this categorie
|
||||
*/
|
||||
getListArticles(slug){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
||||
var pathOfArticles = "./ressources/"+slug+"";
|
||||
var dataObj = {};
|
||||
fs.readdir(pathOfArticles, (err, files)=> {
|
||||
if(err){
|
||||
resolve(new Error("File not exist"));
|
||||
}
|
||||
else{
|
||||
var i = 0;
|
||||
files.forEach((file) => {
|
||||
if(file != "params.json"){
|
||||
if(path.extname(file) == ".json"){
|
||||
dataObj[i] = require('.'+pathOfArticles+"/"+file);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
var objectSize = Object.keys(dataObj).length;
|
||||
var data = "{";
|
||||
for(var x in dataObj){
|
||||
if(x < objectSize-1){
|
||||
data += "\""+x+"\""+":"+JSON.stringify(dataObj[x])+',';
|
||||
}
|
||||
else{
|
||||
data += "\""+x+"\""+":"+JSON.stringify(dataObj[x])+'';
|
||||
}
|
||||
}
|
||||
data += "}";
|
||||
data = JSON.parse(data);
|
||||
|
||||
hbs.registerHelper('articles', (articles) =>{
|
||||
return articles;
|
||||
});
|
||||
|
||||
var template = hbs.compile(source);
|
||||
var html = template(data);
|
||||
resolve(html);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
module.exports = Categories;
|
|
@ -4,12 +4,6 @@ const log = require('color-logs')(true, true, "Articles.class.js"),
|
|||
markdown = require('markdown').markdown,
|
||||
fs = require("fs");
|
||||
|
||||
var title,
|
||||
author,
|
||||
content,
|
||||
date,
|
||||
slug;
|
||||
|
||||
class Articles {
|
||||
|
||||
getArticle(categorie, article){
|
|
@ -0,0 +1,264 @@
|
|||
const log = require('color-logs')(true, true, "Categories.class.js"),
|
||||
path = require('path'),
|
||||
hbs = require('handlebars'),
|
||||
promise = require('promise'),
|
||||
dbConnector = require('../../lib/db/'+config.db+"/db.js");
|
||||
fs = require("fs"),
|
||||
Categorie = require('../Categorie.class.js');
|
||||
Article = require('../Article.class.js');
|
||||
|
||||
hbs.registerHelper('listArticle', function(tabs, options) {
|
||||
var i = 1;
|
||||
var out = '';
|
||||
log.debug();
|
||||
var articles = options['data']['root'].getArticles();
|
||||
articles.shift();
|
||||
log.debug(articles);
|
||||
for(var x in articles){
|
||||
out = out + "" + options.fn(articles[x]) + "";
|
||||
if(i == 3){
|
||||
i= 1;
|
||||
out = out + "</div><div class=\"row\">";
|
||||
}
|
||||
else{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
});
|
||||
|
||||
hbs.registerHelper('disclamer', function(tabs, options) {
|
||||
return options.fn(options['data']['root'].getArticles()[0]) + "";
|
||||
});
|
||||
|
||||
hbs.registerHelper('listNav', function(tabs, options) {
|
||||
var out = '';
|
||||
for(var x in options['data']['root']){
|
||||
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
||||
|
||||
}
|
||||
return out;
|
||||
});
|
||||
|
||||
hbs.registerHelper('article', function(tabs, options) {
|
||||
var out = '';
|
||||
for(var x in options['data']['root']){
|
||||
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
||||
|
||||
}
|
||||
return out;
|
||||
});
|
||||
|
||||
class Categories {
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {<Promise>} html : the html code of navbar
|
||||
*/
|
||||
getNav(){
|
||||
var db = new dbConnector();
|
||||
return db.get({
|
||||
"select" : {
|
||||
"categories" : [
|
||||
"title",
|
||||
"uri",
|
||||
"description"
|
||||
]
|
||||
},
|
||||
"condition" : "",
|
||||
"join": ""
|
||||
}).then((result) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
|
||||
hbs.registerHelper('nav', (nav) =>{
|
||||
return nav;
|
||||
});
|
||||
var template = hbs.compile(source);
|
||||
var html = template(JSON.parse(result));
|
||||
resolve(html);
|
||||
});
|
||||
});
|
||||
}).catch((err) => {
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* hydrate global var
|
||||
* @param {type} select : object of select {id = id}
|
||||
* @returns {Promise} data of categories
|
||||
*/
|
||||
getCategorie(select){
|
||||
var db = new dbConnector();
|
||||
return db.get({
|
||||
"select" : {
|
||||
"categories" : [
|
||||
"id",
|
||||
"title",
|
||||
"uri",
|
||||
"description"
|
||||
]
|
||||
},
|
||||
"condition" : select,
|
||||
"join" : ""
|
||||
}).then((result) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
var data = JSON.parse(result);
|
||||
result = null;
|
||||
var categorie = new Categorie(data[0].id, data[0].title, data[0].uri, data[0].description);
|
||||
resolve(categorie);
|
||||
});
|
||||
}).catch((err) => {
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {<Categorie>} categorie : object categorie
|
||||
* @param {string} returnFormat : format of return [object, json, html]
|
||||
* @returns {<Promise> listArticleToHTML} a list of article in HTML format
|
||||
*/
|
||||
getListArticles(categorie, returnFormat){
|
||||
var db = new dbConnector();
|
||||
return db.get({
|
||||
"select" : {
|
||||
"articles" : [
|
||||
"id",
|
||||
"title",
|
||||
"slug",
|
||||
"author",
|
||||
"date",
|
||||
"img",
|
||||
"categorie_id"
|
||||
]
|
||||
},
|
||||
"condition" : {
|
||||
"categorie_id" : categorie.getId()
|
||||
},
|
||||
"join" : ""
|
||||
}).then((result) => {
|
||||
return new Promise((resolve) => {
|
||||
var data = JSON.parse(result);
|
||||
for(var i in data){
|
||||
categorie.setArticle(new Article(data[i].id,data[i].title, data[i].author, data[i].date, data[i].img, data[i].slug, data[i].categorie_id));
|
||||
categorie.getArticles()[i].setCategorieName(categorie.getTitle());
|
||||
}
|
||||
switch(returnFormat){
|
||||
case 'html':
|
||||
resolve(this.listArticlesToHTML(categorie));
|
||||
break;
|
||||
case 'json':
|
||||
break;
|
||||
case 'object':
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
getHomeListArticles(returnFormat){
|
||||
var db = new dbConnector();
|
||||
return db.get({
|
||||
"select" : {
|
||||
"articles" : []
|
||||
},
|
||||
"condition" : "",
|
||||
"join" : {
|
||||
"left" : "categorie_id",
|
||||
"right" : {
|
||||
"db" : "categories",
|
||||
"index" : "id"
|
||||
}
|
||||
}
|
||||
}).then((result) => {
|
||||
return new Promise((resolve) => {
|
||||
var data = JSON.parse(result);
|
||||
//log.debug(data);
|
||||
var categorie = new Categorie(0, "home", "/", "home");
|
||||
for(var i in data){
|
||||
categorie.setArticle(new Article(data[i].left.id,data[i].left.title, data[i].left.author, data[i].left.date, data[i].left.img, "/"+data[i].right.uri+"/"+data[i].left.slug, data[i].left.categorie_id));
|
||||
categorie.getArticles()[i].setCategorieName(data[i].right.title);
|
||||
}
|
||||
switch(returnFormat){
|
||||
case 'html':
|
||||
resolve(this.listArticlesToHTML(categorie));
|
||||
break;
|
||||
case 'json':
|
||||
break;
|
||||
case 'object':
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param {<Categorie>} categorie : object categorie
|
||||
* @returns {<Promise>} a list of article in HTML format
|
||||
*/
|
||||
listArticlesToHTML(categorie){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
||||
hbs.registerHelper('articles', (articles) =>{
|
||||
return articles;
|
||||
});
|
||||
var template = hbs.compile(source);
|
||||
var html = template(categorie);
|
||||
resolve(html);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {<Categorie>} categorie : object categorie
|
||||
* @param {string} uri the uri of article
|
||||
* @returns {<Promise>} a compiled article in HTML
|
||||
*/
|
||||
getArticle(categorie, uri){
|
||||
var db = new dbConnector();
|
||||
return db.get({
|
||||
"select" : {
|
||||
"articles" : [
|
||||
"id",
|
||||
"title",
|
||||
"slug",
|
||||
"author",
|
||||
"date",
|
||||
"img",
|
||||
"categorie_id",
|
||||
"content"
|
||||
]
|
||||
},
|
||||
"condition" : {
|
||||
"categorie_id" : categorie.getId(),
|
||||
"slug" : uri
|
||||
},
|
||||
"join" : ""
|
||||
}).then((result) => {
|
||||
return new Promise((resolve) => {
|
||||
var data = JSON.parse(result);
|
||||
categorie.setArticle(new Article(data[0].id,data[0].title, data[0].author, data[0].date, data[0].img, data[0].slug, data[0].categorie_id, data[0].content));
|
||||
fs.readFile('./views/articles/article.hbs', 'utf-8', (error, source) => {
|
||||
if(error){
|
||||
log.error(error);
|
||||
}
|
||||
hbs.registerHelper('displayArticle', (article) =>{
|
||||
return article;
|
||||
});
|
||||
var template = hbs.compile(source);
|
||||
var html = template(categorie.getArticles());
|
||||
resolve(html);
|
||||
});
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Categories;
|
|
@ -0,0 +1,61 @@
|
|||
const crypto = require('crypto'),
|
||||
moment = require("moment"),
|
||||
jwt = require('jsonwebtoken'),
|
||||
log = require('color-logs')(true, true, "JWTHandler.class.js");
|
||||
moment.locale("fr");
|
||||
|
||||
class JWTHandler {
|
||||
|
||||
constructor() {
|
||||
this.secret = crypto.createHash('sha256').update("La vie sans gâteau c'est possible, mais c'est sans intérêt", "UTF-8").digest("base64");
|
||||
log.debug(this.secret);
|
||||
}
|
||||
|
||||
verify(token, secret, cb){
|
||||
jwt.verify(token, secret, {
|
||||
issuer: "Nodezzarella",
|
||||
clockTolerance: 3
|
||||
}, function(err, decoded) {
|
||||
if (err) {
|
||||
cb(err, null);
|
||||
} else {
|
||||
cb(false, decoded);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
sign(payload, cb){
|
||||
let baseObject = {
|
||||
iat: moment().unix(),
|
||||
exp: moment().add(1, "day").unix(),
|
||||
iss: "Orbital-Blaze"
|
||||
};
|
||||
jwt.sign(Object.assign(baseObject, payload), this.secret, {
|
||||
algorithm: 'HS256'
|
||||
}, function(err, token) {
|
||||
if (err) throw err;
|
||||
cb(token);
|
||||
});
|
||||
}
|
||||
|
||||
protect(req, res, next){
|
||||
var that = this;
|
||||
return function (req, res, next){
|
||||
that.verify(req.header("Authorization"), that.secret, function(err, decoded){
|
||||
if (err) {
|
||||
res.status(403).json({
|
||||
status: 403,
|
||||
message: "Token expired",
|
||||
expDate: moment(err.expiredAt).unix()
|
||||
});
|
||||
}else{
|
||||
req.token = decoded;
|
||||
next();
|
||||
return;
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = JWTHandler;
|
|
@ -20,7 +20,9 @@ class Template {
|
|||
* @returns {Promise} the navbar in html compiled
|
||||
*/
|
||||
|
||||
getNav(){
|
||||
|
||||
|
||||
/*getNav(){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
|
||||
const articles = require("../ressources/categories.json");
|
||||
|
@ -34,9 +36,10 @@ class Template {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
getToot(){
|
||||
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{
|
||||
"appPort": "8888",
|
||||
"blogName": "Dryusdan",
|
||||
"homeTitle": "Dryusdan.fr, blog d'un passionné d'informatique"
|
||||
"siteTitle": "Dryusdan",
|
||||
"siteHomeTitle": "Dryusdan.fr, blog d'un passionné d'informatique",
|
||||
"db": "rethinkdb",
|
||||
"webroot" : "/",
|
||||
"login": "root",
|
||||
"password": "root"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"select": {
|
||||
"table" : [
|
||||
"field1",
|
||||
"field2"
|
||||
]
|
||||
},
|
||||
"join" : {
|
||||
"left" : "field_to_index",
|
||||
"right" : {
|
||||
"db" : "tableName",
|
||||
"index" : "field_to_index"
|
||||
}
|
||||
},
|
||||
"condition" : {
|
||||
"field1" : "equal",
|
||||
"field2" : "equal"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"flatFile": true
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
class jsonFileDB{
|
||||
|
||||
get(){
|
||||
|
||||
}
|
||||
|
||||
post(){
|
||||
|
||||
}
|
||||
|
||||
update(){
|
||||
|
||||
}
|
||||
|
||||
remove(){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = jsonFileDB;
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"flatFile": false,
|
||||
"host":"172.20.1.2",
|
||||
"port":"28015",
|
||||
"username":"",
|
||||
"password":"",
|
||||
"dbName":"nodezzarella"
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
const r = require("rethinkdb"),
|
||||
promise = require('promise'),
|
||||
fs = require('fs'),
|
||||
log = require("color-logs")(true, true, "RethinDB connector");
|
||||
|
||||
class rethinkdb{
|
||||
|
||||
static constructor(){
|
||||
|
||||
}
|
||||
|
||||
get(query){
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
/*
|
||||
* select table
|
||||
*/
|
||||
var formatedQuery = r.table(Object.keys(query.select)[0]);
|
||||
|
||||
/*
|
||||
* create join
|
||||
*/
|
||||
if(typeof query.join === "object"){
|
||||
formatedQuery = formatedQuery.eqJoin(query.join.left, r.db(dbConf.dbName).table(query.join.right.db))
|
||||
}
|
||||
|
||||
/*
|
||||
* form filter / condition of qyert
|
||||
*/
|
||||
if(query.condition !== ""){
|
||||
formatedQuery = formatedQuery.filter(query.condition);
|
||||
}
|
||||
/**
|
||||
* select collumn of table
|
||||
*/
|
||||
for (var collumn in query.select){
|
||||
if(query.select.hasOwnProperty(collumn)){
|
||||
var selectCollumn = query.select[collumn];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// r.db("nodezzarella").table("articles").eqJoin("categorie_id", r.db("nodezzarella").table("categories")).pluck({"left":["id"]})
|
||||
|
||||
if(selectCollumn.length > 0){
|
||||
formatedQuery = formatedQuery.pluck(selectCollumn);
|
||||
}
|
||||
|
||||
/**
|
||||
* run query
|
||||
*/
|
||||
//log.debug(formatedQuery);
|
||||
|
||||
formatedQuery.run(dbConnexion).then((cursor) => {
|
||||
return cursor.toArray();
|
||||
}).then((result) => {
|
||||
resolve(JSON.stringify(result));
|
||||
}).catch((err)=>{
|
||||
throw err;
|
||||
log.error(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
post(){
|
||||
/*r.db("nodezzarella").table("categories").insert([{
|
||||
"title": "global test",
|
||||
"uri":"global-test",
|
||||
"description":"desc"
|
||||
},
|
||||
{
|
||||
"title": "test",
|
||||
"uri":"test",
|
||||
"description":"desc2"
|
||||
}])*/
|
||||
//https://www.rethinkdb.com/api/javascript/insert/
|
||||
}
|
||||
|
||||
update(){
|
||||
|
||||
}
|
||||
|
||||
remove(){
|
||||
|
||||
}
|
||||
|
||||
getDBConfig(){
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.access("./config.json", fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||
if(error){
|
||||
reject(new Error("File not exist"));
|
||||
}
|
||||
else{
|
||||
resolve(require("./config.json"));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
connectDB(config){
|
||||
this.host = config.host;
|
||||
this.port = config.port;
|
||||
this.dbName = config.dbName;
|
||||
log.info("Application connecting to database...");
|
||||
return r.connect({
|
||||
host: config.host,
|
||||
port: config.port,
|
||||
db: config.dbName
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = rethinkdb;
|
|
@ -0,0 +1,89 @@
|
|||
const express = require("express"),
|
||||
router = express.Router(),
|
||||
promise = require('promise'),
|
||||
hbs = require('hbs'),
|
||||
path = require('path'),
|
||||
log = require("color-logs")(true, true, "Router"),
|
||||
session = require('express-session'),
|
||||
Template = require('../classes/Template.class.js'),
|
||||
Article = require('../classes/Article.class.js'),
|
||||
Categorie = require('../classes/Categorie.class.js'),
|
||||
Articles = require('../classes/Controllers/Articles.class.js'),
|
||||
Categories = require('../classes/Controllers/Categories.class.js');
|
||||
|
||||
var template = new Template();
|
||||
router.get("/", function(req, res){
|
||||
var categories = new Categories();
|
||||
Promise.all([
|
||||
categories.getNav(),
|
||||
categories.getHomeListArticles("html")
|
||||
]).then((data) => {
|
||||
var nav = data[0];
|
||||
var content = data[1];
|
||||
res.setHeader("Content-type", "text/html");
|
||||
var tplData = {
|
||||
"blogName": config.siteTitle,
|
||||
"title": config.siteHomeTitle,
|
||||
"nav": nav,
|
||||
"content": content,
|
||||
};
|
||||
res.render('template.hbs', tplData);
|
||||
}).catch((err) => {
|
||||
console.log(err);
|
||||
throw err;
|
||||
});
|
||||
});
|
||||
|
||||
router.get("/:uri/", function(req, res){
|
||||
var categories = new Categories();
|
||||
Promise.all([
|
||||
categories.getNav(),
|
||||
categories.getCategorie(req.params.uri),
|
||||
]).then(data => {
|
||||
var nav = data[0];
|
||||
var categorie = data[1];
|
||||
categories.getListArticles(categorie, "html").then((result) => {
|
||||
res.setHeader("Content-type", "text/html");
|
||||
var tplData = {
|
||||
"blogName": config.siteTitle,
|
||||
"title": categorie.getTitle() + " - "+config.siteHomeTitle,
|
||||
"nav": nav,
|
||||
"content": result,
|
||||
};
|
||||
res.render('template.hbs', tplData);
|
||||
})
|
||||
}).catch(err => {
|
||||
res.setHeader("Content-type", "text/plain");
|
||||
res.end("erreur");
|
||||
});
|
||||
});
|
||||
|
||||
router.get("/:categories/:slug", function(req, res){
|
||||
var categories = new Categories();
|
||||
var articles = new Articles();
|
||||
Promise.all([
|
||||
categories.getNav(),
|
||||
categories.getCategorie(req.params.categories)
|
||||
]).then(data => {
|
||||
var nav = data[0];
|
||||
var categorie = data[1];
|
||||
categories.getArticle(categorie, req.params.slug).then((result) => {
|
||||
res.setHeader("Content-type", "text/html");
|
||||
var tplData = {
|
||||
"blogName": config.siteTitle,
|
||||
"title": categorie.getTitle() + " - "+config.siteHomeTitle,
|
||||
"nav": nav,
|
||||
"content": result,
|
||||
};
|
||||
res.render('template.hbs', tplData);
|
||||
})
|
||||
}).catch(err => {
|
||||
log.debug(err);
|
||||
res.setHeader("Content-type", "text/plain");
|
||||
res.end("erreur");
|
||||
});
|
||||
});
|
||||
|
||||
router.use(express.static("./public"));
|
||||
|
||||
module.exports = router;
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "nodezzarela",
|
||||
"name": "nodezzarella",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
|
@ -33,11 +33,53 @@
|
|||
"version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
||||
},
|
||||
"base64url": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
|
||||
"integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs="
|
||||
},
|
||||
"bluebird": {
|
||||
"version": "2.11.0",
|
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz",
|
||||
"integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE="
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.17.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
|
||||
"integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.7",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
|
||||
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"buffer-equal-constant-time": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
|
||||
},
|
||||
"bytes": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
|
||||
"integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
||||
"optional": true
|
||||
},
|
||||
"camelize": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
|
||||
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
|
||||
},
|
||||
"center-align": {
|
||||
"version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||
|
@ -63,10 +105,37 @@
|
|||
"version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
|
||||
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
|
||||
},
|
||||
"connect": {
|
||||
"version": "3.6.2",
|
||||
"resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz",
|
||||
"integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=",
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.7",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
|
||||
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz",
|
||||
"integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"content-disposition": {
|
||||
"version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
|
||||
},
|
||||
"content-security-policy-builder": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz",
|
||||
"integrity": "sha1-2R8bB2I2wRmFDH3umSS/VeBXcrM="
|
||||
},
|
||||
"content-type": {
|
||||
"version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
|
||||
"integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
|
||||
|
@ -75,14 +144,39 @@
|
|||
"version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||
},
|
||||
"cookie-parser": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
|
||||
"integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU="
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||
},
|
||||
"cors": {
|
||||
"version": "https://registry.npmjs.org/cors/-/cors-2.8.1.tgz",
|
||||
"integrity": "sha1-YYGqVqu0WiglvjMEcDdHrk6dI4M="
|
||||
},
|
||||
"crc": {
|
||||
"version": "3.4.4",
|
||||
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
|
||||
"integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
|
||||
},
|
||||
"dasherize": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
|
||||
"integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
|
||||
},
|
||||
"dashify": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz",
|
||||
"integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4="
|
||||
},
|
||||
"debug": {
|
||||
"version": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
|
||||
"integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E="
|
||||
|
@ -100,6 +194,21 @@
|
|||
"version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||
},
|
||||
"dns-prefetch-control": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz",
|
||||
"integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI="
|
||||
},
|
||||
"dont-sniff-mimetype": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz",
|
||||
"integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g="
|
||||
},
|
||||
"ecdsa-sig-formatter": {
|
||||
"version": "1.0.9",
|
||||
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
|
||||
"integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE="
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||
|
@ -116,10 +225,42 @@
|
|||
"version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
|
||||
"integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
|
||||
},
|
||||
"expect-ct": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz",
|
||||
"integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ="
|
||||
},
|
||||
"express": {
|
||||
"version": "https://registry.npmjs.org/express/-/express-4.15.2.tgz",
|
||||
"integrity": "sha1-rxB/wUhQRFfy3Kmm8lcdcSm5ezU="
|
||||
},
|
||||
"express-jwt": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.0.tgz",
|
||||
"integrity": "sha1-PZDNZYAuYzYlLxnmo98+FJ4MXqA="
|
||||
},
|
||||
"express-session": {
|
||||
"version": "1.15.4",
|
||||
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.4.tgz",
|
||||
"integrity": "sha1-Xizc9t7+PB7aTpgPE7mGzFjPuVQ=",
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.8",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"express-unless": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.0.tgz",
|
||||
"integrity": "sha1-XHlec5JXFRLdKPUgs4V6UrISYaI="
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.1.tgz",
|
||||
"integrity": "sha1-vNFdFonA5e1ym29/VBpt+YQRfbg=",
|
||||
|
@ -138,6 +279,11 @@
|
|||
"version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
|
||||
"integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
|
||||
},
|
||||
"frameguard": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz",
|
||||
"integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk="
|
||||
},
|
||||
"fresh": {
|
||||
"version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
|
||||
"integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44="
|
||||
|
@ -156,10 +302,50 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"helmet": {
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/helmet/-/helmet-3.6.1.tgz",
|
||||
"integrity": "sha1-kfOqf6TJRnFZX7Vo39jChImjiL4="
|
||||
},
|
||||
"helmet-csp": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.4.0.tgz",
|
||||
"integrity": "sha1-flOhVxZ6BkWq3XF30SrmxgXBhC4="
|
||||
},
|
||||
"hide-powered-by": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz",
|
||||
"integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys="
|
||||
},
|
||||
"hoek": {
|
||||
"version": "2.16.3",
|
||||
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
|
||||
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
|
||||
},
|
||||
"hpkp": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
|
||||
"integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
|
||||
},
|
||||
"hsts": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/hsts/-/hsts-2.0.0.tgz",
|
||||
"integrity": "sha1-pSI0xgcN7PIUsra3C7FE0H5Hdsc="
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
|
||||
"integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc="
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.15",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
|
||||
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
|
||||
},
|
||||
"ienoopen": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz",
|
||||
"integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms="
|
||||
},
|
||||
"inherits": {
|
||||
"version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
|
@ -172,6 +358,38 @@
|
|||
"version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
|
||||
"integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
|
||||
},
|
||||
"isemail": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
|
||||
"integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo="
|
||||
},
|
||||
"joi": {
|
||||
"version": "6.10.1",
|
||||
"resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
|
||||
"integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY="
|
||||
},
|
||||
"jsonwebtoken": {
|
||||
"version": "7.4.1",
|
||||
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz",
|
||||
"integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=",
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"jwa": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
|
||||
"integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU="
|
||||
},
|
||||
"jws": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
|
||||
"integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI="
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
|
||||
"integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c="
|
||||
|
@ -181,6 +399,21 @@
|
|||
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
|
||||
"optional": true
|
||||
},
|
||||
"lodash.once": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||
},
|
||||
"lodash.reduce": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
|
||||
"integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
|
||||
},
|
||||
"lodash.set": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
||||
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
||||
},
|
||||
"longest": {
|
||||
"version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
||||
|
@ -218,6 +451,11 @@
|
|||
"version": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.18.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
|
||||
"integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
|
||||
},
|
||||
"ms": {
|
||||
"version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
|
||||
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
|
||||
|
@ -226,6 +464,11 @@
|
|||
"version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
|
||||
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
||||
},
|
||||
"nocache": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
|
||||
"integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA="
|
||||
},
|
||||
"nopt": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
|
||||
|
@ -235,6 +478,11 @@
|
|||
"version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
|
||||
},
|
||||
"on-headers": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
|
||||
"integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
|
||||
},
|
||||
"optimist": {
|
||||
"version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY="
|
||||
|
@ -247,6 +495,11 @@
|
|||
"version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||
},
|
||||
"platform": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz",
|
||||
"integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE="
|
||||
},
|
||||
"promise": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/promise/-/promise-8.0.0.tgz",
|
||||
|
@ -260,19 +513,44 @@
|
|||
"version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
|
||||
"integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
|
||||
},
|
||||
"random-bytes": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
|
||||
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
|
||||
},
|
||||
"range-parser": {
|
||||
"version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
||||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
|
||||
"integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y="
|
||||
},
|
||||
"referrer-policy": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz",
|
||||
"integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk="
|
||||
},
|
||||
"repeat-string": {
|
||||
"version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
||||
},
|
||||
"rethinkdb": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.3.3.tgz",
|
||||
"integrity": "sha1-PcZYbiL6HavuDSVOZL0ON5+tL3I="
|
||||
},
|
||||
"right-align": {
|
||||
"version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
||||
"optional": true
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
|
||||
},
|
||||
"send": {
|
||||
"version": "https://registry.npmjs.org/send/-/send-0.15.1.tgz",
|
||||
"integrity": "sha1-igI1TCbm9cynAAZfXwzeupDse18="
|
||||
|
@ -293,6 +571,11 @@
|
|||
"version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
|
||||
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
|
||||
},
|
||||
"topo": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
|
||||
"integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU="
|
||||
},
|
||||
"type-is": {
|
||||
"version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
|
||||
"integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA="
|
||||
|
@ -314,6 +597,11 @@
|
|||
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||
"optional": true
|
||||
},
|
||||
"uid-safe": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz",
|
||||
"integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE="
|
||||
},
|
||||
"unpipe": {
|
||||
"version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||
|
@ -339,6 +627,16 @@
|
|||
"version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
|
||||
},
|
||||
"x-xss-protection": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz",
|
||||
"integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk="
|
||||
},
|
||||
"xtend": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
|
||||
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
|
||||
},
|
||||
"yargs": {
|
||||
"version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "nodezzarela",
|
||||
"name": "nodezzarella",
|
||||
"version": "1.0.0",
|
||||
"keywords": [
|
||||
"util",
|
||||
|
@ -15,12 +15,17 @@
|
|||
},
|
||||
"contributors": [],
|
||||
"dependencies": {
|
||||
"body-parser": "^1.17.2",
|
||||
"color-logs": "0.6.1",
|
||||
"cookie-parser": "^1.4.3",
|
||||
"cors": "2.8.1",
|
||||
"express": "4.15.2",
|
||||
"express-session": "^1.15.4",
|
||||
"handlebars": "4.0.6",
|
||||
"hbs": "4.0.1",
|
||||
"helmet": "^3.6.1",
|
||||
"markdown": "^0.5.0",
|
||||
"promise": "^8.0.0"
|
||||
"promise": "^8.0.0",
|
||||
"rethinkdb": "^2.3.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<nav>
|
||||
|
||||
{{#listNav data}}<div class="navItem"><a href="{{slug}}">{{title}}</a></div>{{/listNav}}
|
||||
{{#listNav data}}<div class="navItem"><a href="/{{uri}}/">{{title}}</a></div>{{/listNav}}
|
||||
<!--<div class="navItem"><a href="index.html">Accueil</a></div>
|
||||
<div class="navItem"><a href="portfolio.html">Portfolio</a></div>
|
||||
<div class="navItem">Contact</div>-->
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
<div id="disclaimer">
|
||||
<h2>Espace admin</h2>
|
||||
<img class="separator" src="/assets/img/separator.png">
|
||||
</div>
|
||||
<main class="transparent">
|
||||
<section>
|
||||
<article>
|
||||
<!-- <div class="articleTitle">
|
||||
<h1></h1>
|
||||
<p class="author">Par </p>
|
||||
</div>-->
|
||||
<div class="content">
|
||||
<form action="" method="post">
|
||||
<input type="input" name="login">
|
||||
<input type="password" name="password">
|
||||
<input type="submit" name="connexion">
|
||||
</form>
|
||||
</div>
|
||||
</article>
|
||||
</section>
|
||||
</main>
|
|
@ -1,18 +1,20 @@
|
|||
<main>
|
||||
<section>
|
||||
<nav>
|
||||
<button class="prev"><!--<img src="/assets/img/prev.png">Précédent--></button>
|
||||
<img class="blackAsset separator" src="/assets/img/separator.png">
|
||||
<button class="next"><!--Suivant<img src="/assets/img/next.png">--></button>
|
||||
</nav>
|
||||
<article>
|
||||
<div class="articleTitle">
|
||||
<h1>{{title}}</h1>
|
||||
<p class="author">Par {{author}}</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
{{{content}}}
|
||||
</div>
|
||||
</article>
|
||||
</section>
|
||||
</main>
|
||||
{{#article data}}
|
||||
<main>
|
||||
<section>
|
||||
<nav>
|
||||
<button class="prev"><!--<img src="/assets/img/prev.png">Précédent--></button>
|
||||
<img class="blackAsset separator" src="/assets/img/separator.png">
|
||||
<button class="next"><!--Suivant<img src="/assets/img/next.png">--></button>
|
||||
</nav>
|
||||
<article>
|
||||
<div class="articleTitle">
|
||||
<h1>{{title}}</h1>
|
||||
<p class="author">Par {{author}}</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
{{{content}}}
|
||||
</div>
|
||||
</article>
|
||||
</section>
|
||||
</main>
|
||||
{{/article}}
|
|
@ -1,8 +0,0 @@
|
|||
<div id="disclaimer">
|
||||
<div class="titleLegend">{{categorie}}</div>
|
||||
<img class="separator" src="assets/img/separator.png">
|
||||
<h2>{{title}}</h2>
|
||||
<a href="{{slug}}">
|
||||
<button>Consulter</button>
|
||||
</a>
|
||||
</div>
|
|
@ -1,3 +1,13 @@
|
|||
{{#disclamer article}}
|
||||
<div id="disclaimer">
|
||||
<div class="titleLegend">{{categorieName}}</div>
|
||||
<img class="separator" src="/assets/img/separator.png">
|
||||
<h2>{{title}}</h2>
|
||||
<a href="{{slug}}">
|
||||
<button>Consulter</button>
|
||||
</a>
|
||||
</div>
|
||||
{{/disclamer}}
|
||||
<main class="transparent">
|
||||
<section>
|
||||
<div class="flexgrid">
|
||||
|
@ -10,7 +20,7 @@
|
|||
</div>
|
||||
<div class="tileLegend">
|
||||
<div class="content">
|
||||
<div class="titleLegend">{{categorie}}</div>
|
||||
<div class="titleLegend">{{categorieName}}</div>
|
||||
<img class="blackAsset separator" src="/assets/img/separator.png">
|
||||
<h2>{{title}}</h2>
|
||||
</div>
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
<meta charset="UTF-8">
|
||||
<title>{{title}}</title>
|
||||
<link rel="stylesheet" href="/assets/css/global.css">
|
||||
<link href='https://miaou.drycat.fr/favicon.ico' rel='icon' type='image/x-icon'>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
|
@ -16,7 +17,6 @@
|
|||
<button> </button>
|
||||
</div>
|
||||
</div>-->
|
||||
{{{disclaimer}}}
|
||||
{{{content}}}
|
||||
<footer>
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Administration è {{title}}</title>
|
||||
<link rel="stylesheet" href="/assets/css/global.css">
|
||||
<link href='https://miaou.drycat.fr/favicon.ico' rel='icon' type='image/x-icon'>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div id="logo"><a href="/">{{blogName}}</a></div>
|
||||
{{{nav}}}
|
||||
</header>
|
||||
<!--<div class="search">
|
||||
<div class="inputContainer">
|
||||
<input type="search" placeholder="Rechercher...">
|
||||
<button> </button>
|
||||
</div>
|
||||
</div>-->
|
||||
{{{content}}}
|
||||
<footer>
|
||||
|
||||
</footer>
|
||||
<script src="/assets/js/jquery-2.2.0.min.js"></script>
|
||||
<script src="/assets/js/parallax.js"></script>
|
||||
<script src="/assets/js/searchInput.js"></script>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue