This repository has been archived on 2021-02-16. You can view files and clone it, but cannot push or open issues or pull requests.
Nodezzarella/classes/Controllers/Categories.class.js

264 lines
8.3 KiB
JavaScript

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;