diff --git a/app.js b/app.js index cf87f1a..9340404 100644 --- a/app.js +++ b/app.js @@ -24,6 +24,7 @@ class Nodezzarella { var db = require('./lib/db/'+config.db+'/db'); new db().connectDB(configDB).then((connexion) => { global.dbConnexion = connexion; + global.dbConf = configDB; this.run(); }); } diff --git a/classes/Article.class.js b/classes/Article.class.js index 7f9a0b0..f78100e 100644 --- a/classes/Article.class.js +++ b/classes/Article.class.js @@ -8,16 +8,19 @@ var id, content, date, img, + categorieName, + categorieID, slug; class Article { - constructor(id, title, author, date, img, slug, content = null){ + 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):''; } @@ -49,6 +52,14 @@ class Article { this.slug = slug; } + setCategorieID(categorieID){ + this.categorieID = categorieID; + } + + setCategorieName(name){ + this.categorieName = name; + } + getId(){ return this.id; } @@ -77,6 +88,10 @@ class Article { return this.slug; } + getcategorieID(){ + return this.categorieID; + } + } module.exports = Article; diff --git a/classes/Controllers/Categories.class.js b/classes/Controllers/Categories.class.js index bdae1a0..cd2c01a 100644 --- a/classes/Controllers/Categories.class.js +++ b/classes/Controllers/Categories.class.js @@ -10,9 +10,12 @@ const log = require('color-logs')(true, true, "Categories.class.js"), 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]) + ""; + 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 + "
"; @@ -24,6 +27,10 @@ hbs.registerHelper('listArticle', function(tabs, options) { 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']){ @@ -35,7 +42,6 @@ hbs.registerHelper('listNav', function(tabs, options) { hbs.registerHelper('article', function(tabs, options) { var out = ''; - log.debug(options['data']['root']); for(var x in options['data']['root']){ out = out + "" + options.fn(options['data']['root'][x]) + ""; @@ -60,7 +66,7 @@ class Categories { ] }, "condition" : "", - "limit": "" + "join": "" }).then((result) => { return new Promise((resolve, reject) => { fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => { @@ -79,10 +85,10 @@ class Categories { /** * hydrate global var - * @param {type} slug : url of categorie + * @param {type} select : object of select {id = id} * @returns {Promise} data of categories */ - getCategorie(slug){ + getCategorie(select){ var db = new dbConnector(); return db.get({ "select" : { @@ -93,10 +99,8 @@ class Categories { "description" ] }, - "condition" : { - "uri" : slug - }, - "limit" : "" + "condition" : select, + "join" : "" }).then((result) => { return new Promise((resolve, reject) => { var data = JSON.parse(result); @@ -112,9 +116,10 @@ class Categories { /** * * @param {} categorie : object categorie + * @param {string} returnFormat : format of return [object, json, html] * @returns { listArticleToHTML} a list of article in HTML format */ - getListArticles(categorie){ + getListArticles(categorie, returnFormat){ var db = new dbConnector(); return db.get({ "select" : { @@ -124,25 +129,74 @@ class Categories { "slug", "author", "date", - "img" + "img", + "categorie_id" ] }, "condition" : { "categorie_id" : categorie.getId() }, - "limit" : "" + "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)); + 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()); } - resolve(this.listArticlesToHTML(categorie)); + 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].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 : object categorie @@ -155,7 +209,7 @@ class Categories { return articles; }); var template = hbs.compile(source); - var html = template(categorie.getArticles()); + var html = template(categorie); resolve(html); }); }); @@ -178,6 +232,7 @@ class Categories { "author", "date", "img", + "categorie_id", "content" ] }, @@ -185,11 +240,11 @@ class Categories { "categorie_id" : categorie.getId(), "slug" : uri }, - "limit" : "" + "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].content)); + 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); diff --git a/connectorSelectQuery.json b/connectorSelectQuery.json new file mode 100644 index 0000000..b022beb --- /dev/null +++ b/connectorSelectQuery.json @@ -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" + } +} diff --git a/lib/db/rethinkdb/db.js b/lib/db/rethinkdb/db.js index 54a5265..f967c84 100644 --- a/lib/db/rethinkdb/db.js +++ b/lib/db/rethinkdb/db.js @@ -2,7 +2,7 @@ const r = require("rethinkdb"), promise = require('promise'), fs = require('fs'), log = require("color-logs")(true, true, "RethinDB connector"); - + class rethinkdb{ static constructor(){ @@ -12,13 +12,21 @@ class rethinkdb{ get(query){ return new Promise((resolve, reject) => { - var nbOfTable = Object.keys(query.select).length; - - /** + /* * 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); } @@ -31,21 +39,17 @@ class rethinkdb{ 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) - } - - /** - * make join query - */ - if(nbOfTable > 1){ - + formatedQuery = formatedQuery.pluck(selectCollumn); } /** * run query */ + //log.debug(formatedQuery); + formatedQuery.run(dbConnexion).then((cursor) => { return cursor.toArray(); }).then((result) => { @@ -54,19 +58,6 @@ class rethinkdb{ throw err; log.error(err); }); - /*formatedQuery.run(dbConnexion, (err, result) => { - if(err) throw err; - var jsonReturn = []; - console.log(typeof result); - result.each(function(err, row) { - if (err) throw err; - log.debug(row); - jsonReturn.push(row); - //console.log(i); - }); - resolve(jsonReturn); - - });*/ }); } @@ -106,6 +97,9 @@ class rethinkdb{ } 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, diff --git a/lib/router.js b/lib/router.js index 52b4920..cd92408 100644 --- a/lib/router.js +++ b/lib/router.js @@ -15,18 +15,17 @@ router.get("/", function(req, res){ var categories = new Categories(); Promise.all([ - categories.getNav() + categories.getNav(), + categories.getHomeListArticles("html") ]).then((data) => { var nav = data[0]; - var content = /*data[1]*/ ""; - var disclaimer = /*data[2]*/ ""; + var content = data[1]; res.setHeader("Content-type", "text/html"); var tplData = { "blogName": config.siteTitle, "title": config.siteHomeTitle, "nav": nav, "content": content, - "disclaimer": disclaimer }; res.render('template.hbs', tplData); }).catch((err) => { @@ -43,15 +42,13 @@ router.get("/:uri/", function(req, res){ ]).then(data => { var nav = data[0]; var categorie = data[1]; - categories.getListArticles(categorie).then((result) => { - log.debug(result) + 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, - "disclaimer": '' }; res.render('template.hbs', tplData); }) @@ -77,7 +74,6 @@ router.get("/:categories/:slug", function(req, res){ "title": categorie.getTitle() + " - "+config.siteHomeTitle, "nav": nav, "content": result, - "disclaimer": '' }; res.render('template.hbs', tplData); }) diff --git a/views/articles/disclaimer.hbs b/views/articles/disclaimer.hbs deleted file mode 100644 index 21eb166..0000000 --- a/views/articles/disclaimer.hbs +++ /dev/null @@ -1,8 +0,0 @@ -
-
{{categorie}}
- -

{{title}}

- - - -
\ No newline at end of file diff --git a/views/articles/list.hbs b/views/articles/list.hbs index a540ba8..4198502 100644 --- a/views/articles/list.hbs +++ b/views/articles/list.hbs @@ -1,3 +1,13 @@ +{{#disclamer article}} +
+
{{categorieName}}
+ +

{{title}}

+ + + +
+{{/disclamer}}
@@ -10,7 +20,7 @@
-
{{categorie}}
+
{{categorieName}}

{{title}}

diff --git a/views/template.hbs b/views/template.hbs index 25a42ad..40baeb7 100644 --- a/views/template.hbs +++ b/views/template.hbs @@ -17,7 +17,6 @@
--> -{{{disclaimer}}} {{{content}}}