EOL-Labs/mely

View on GitHub
lib/routes/index.js

Summary

Maintainability
F
2 wks
Test Coverage
var crypto = require("crypto");
var moment = require("moment");
var marked = require("marked");
var joi = require("joi");
var changeCase = require("change-case");
var nodemailer = require("nodemailer");
var smtpTransport = require("nodemailer-smtp-transport");
var chance = require("chance").Chance();
var mail = require("../../config/mail");
var mailTransport = nodemailer.createTransport(smtpTransport(mail.mailconfig));
var email = require("../email").templates.email_template();
var Mely = require("../../lib");

exports.routes = [
//first step routes
{
    method: "GET",
    path: "/welcome",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            Mely.System.getSystemCount({
            }, function(err, count){
                if(count > 0){
                    reply().redirect("/login");
                }
                else{
                    pageDetails.title = "Welcome to Mely!";
                    reply.view("welcome",pageDetails);
                }
            });
        },
        auth: false
    }
},
{
    method: "POST",
    path: "/welcome",
    config:{
        handler: function(request, reply){
            Mely.System.createSystem({
                name: request.payload["mely-name"],
                description: request.payload["mely-description"] ? request.payload["mely-description"] : null
            }, function(err, system){
                if(err) reply(err);
                Mely.User.createUser({
                    email: request.payload["mely-email"],
                    password: crypto.createHash('sha256').update(request.payload["mely-password"]).digest("hex"),
                    systemid: system.id
                }, function(err, user){
                    if(err) reply(err);
                    if(user !== undefined){
                        Mely.Theme.createTheme({
                            systemid: system.id,
                            name: "Mely v0.2.0",
                            description: "Default Theme for Mely",
                            headback: "FFFFFF",
                            headfontcolor: "000000",
                            headfontsize: 26,
                            menuback: "FFFFFF",
                            menufontcolor: "000000",
                            menufontsize: 15,
                            posttitlecolor: "000000",
                            posttitlesize: 13,
                            postcontentcolor: "000000",
                            postcontentsize: 11,
                            pagetitlecolor: "000000",
                            pagetitlesize: 12,
                            pagecontentcolor: "000000",
                            pagecontentsize: 12
                        }, function(err, theme){
                            if(err) reply(err);
                            Mely.Theme.activateTheme({
                                systemid: system.id,
                                id: theme.ThemeId
                            }, function(err, theme){
                                if(err) reply(err);
                                if(theme !== undefined){
                                    var html = email.replace("##EmailType","Welcome");
                                    html = html.replace("##EmailGreeting","Welcome to Mely!");
                                    html = html.replace("##EmailContent","So you've decided to us Mely for you blog or website. That is awesome and we love that you are using this great new product!");
                                    var message = {
                                        from: mail.mailconfig.from,
                                        to: request.payload["mely-email"],
                                        subject: "Welcome to Mely!",
                                        html: html
                                    }
                                    mailTransport.sendMail(message, function(error){
                                        if(err) reply(err);
                                        console.log('Message sent successfully!');
                                        reply().redirect("/login");
                                    });
                                }
                            });
                        });
                    }
                });
            });
        },
        validate:{
            payload:{
                "mely-name": joi.string().required(),
                "mely-password": joi.string().required(),
                "mely-email": joi.string().email().required(),
                "mely-description": joi.string(),

            }
        },
        auth: false
    }
},
//login & password reset routes
{
    method: "GET",
    path: "/login",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            Mely.System.getSystemCount({
            }, function(err, count){
            if(count > 0){
                if (request.auth.isAuthenticated){
                    reply().redirect("/admin");
                }
                else{
                    pageDetails.title = "Mely:Login";
                    reply.view("login/index", pageDetails);
                }
            }
            else{
                reply().redirect("/welcome");
            }
            });
        },
        auth:{
            mode: "try"
        }
    }    
},
{
    method: "POST",
    path: "/login",
    config:{
        handler: function(request,reply){
            Mely.User.loginUser({
                email: request.payload["mely-email"],
                password: crypto.createHash('sha256').update(request.payload["mely-password"]).digest("hex")
            }, function(err, user){
                if(err) reply(err);
                if(user !== null){
                    request.auth.session.set(user.dataValues);
                    reply().redirect("/admin");
                }
                else{
                    reply().redirect("/login?invalid");
                }
            });
        },
        validate:{
            payload:{
                "mely-email": joi.string().email().required(),
                "mely-password": joi.string().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/logout",
    config:{
        handler: function(request, reply){
            request.auth.session.clear();
            reply().redirect("/login");
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/reset",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            pageDetails.title = "Mely: Reset Password";
            reply.view("reset/index", pageDetails);
        },
        auth:{
            mode: "try"
        }
    }
},
{
    method: "POST",
    path: "/reset",
    config:{
        handler: function(request, reply){
            var password = chance.word({length: 10});
            console.log(password);
            var passwordHashed = crypto.createHash('sha256').update(password).digest("hex");
            Mely.User.resetPassword({
                email: request.payload["mely-email"],
                password: passwordHashed,
            }, function(err, user){
                if(err === "No Email"){
                    reply().redirect("/reset?success");
                }
                else{
                    var html = email.replace("##EmailType","Password Reset");
                    html = html.replace("##EmailGreeting","About that password...");
                    html = html.replace("##EmailContent","Your password has been reset: " + password);
                    var message = {
                        from: mail.mailconfig.from,
                        to: request.payload["mely-email"],
                        subject: "Password Reset",
                        html: html
                    }
                    mailTransport.sendMail(message, function(error){
                        if(err) reply(err);
                        console.log('Message sent successfully!');
                        reply().redirect("/reset?success");
                    });
                }
            });
        },
        auth:{
            mode: "try"
        },
        validate:{
            payload:{
                "mely-email": joi.string().email().required()
            }
        }
    }
},
//admin route
{
    method: "GET",
    path: "/admin",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            pageDetails.title = "Mely:Admin";
            reply.view("admin/index", pageDetails);
        }
    }
},
//user routes
{
    method: "GET",
    path: "/admin/user",
    config:{
        handler: function(request, reply){
            Mely.User.getUser({
                systemid: request.auth.credentials.SystemId
            }, function(err, users){
                if(err) reply(err);
                var userList = [];
                for(var user in users){
                    if (users.hasOwnProperty(user)) {
                        var row = {};
                        row.userid = users[user].id;
                        row.email = users[user].email_address;
                        row.createdDate = moment(users[user].createdAt).format("MMMM Do YYYY, h:mm:ss a");
                        row.updatedDate = moment(users[user].updatedAt).format("MMMM Do YYYY, h:mm:ss a");
                        row.status = users[user].status;
                        userList.push(row);
                    }
                }
                reply(userList);
            });
        },
    }
},
{
    method: "POST",
    path: "/admin/user",
    config:{
        handler: function(request, reply){
            Mely.User.createUser({
                email: request.payload["mely-email"],
                password: crypto.createHash('sha256').update(request.payload["mely-password"]).digest("hex"),
                systemid: request.auth.credentials.SystemId
            }, function(err, user){
                if(err) reply(err);
                if(user !== undefined){
                    var html = email.replace("##EmailType","Administration");
                    html = html.replace("##EmailGreeting","Someone though you were awesome");
                    html = html.replace("##EmailContent","You can login with your email and password that was given to you.");
                    var message = {
                        from: mail.mailconfig.from,
                        to: request.payload["mely-email"],
                        subject: "You have been added to a Mely System!",
                        html: html
                    }
                    mailTransport.sendMail(message, function(error){
                        if(err) reply(err);
                        console.log('Message sent successfully!');
                        reply("New User Added");
                    });
                }
            });
        },
        validate:{
            payload:{
                "mely-email": joi.string().email().required(),
                "mely-password": joi.string().required()
            }
        }
    }
},
{
    method: "DELETE",
    path: "/admin/user/{id}",
    config:{
        handler: function(request, reply){
            Mely.User.deleteUser({
                id: request.params.id
            }, function(err, user){
                if(err) reply(err);
                reply("deleted");
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
//page routes
{
    method: "GET",
    path: "/admin/page",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            Mely.Page.getPage({
                systemid: request.auth.credentials.SystemId
            }, function(err, pages){
                if(err) reply(err);
                var pageList = [];
                for(var page in pages){
                    if (pages.hasOwnProperty(page)) {
                        var row = {};
                        row.pageId = pages[page].id;
                        row.title = pages[page].title;
                        row.order = pages[page].ordernum;
                        row.onmenu = pages[page].onmenu === true ? 1 : 0;
                        row.status = pages[page].status
                        pageList.push(row);
                    }
                }
                reply(pageList);
            });
        }
    }
},
{
    method: "GET",
    path: "/admin/page/{id}",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            Mely.Page.getPage({
                systemid: request.auth.credentials.SystemId,
                id: request.params.id
            }, function(err, pages){
                if(err) reply(err);
                var pageList = [];
                for(var page in pages){
                    if (pages.hasOwnProperty(page)){
                        var row = {};
                        row.pageid = pages[page].id;
                        row.title = pages[page].title;
                        row.content = pages[page].content;
                        row.order = pages[page].ordernum;
                        row.onmenu = pages[page].onmenu === true ? 1 : 0;
                        row.status = pages[page].status;
                        pageList.push(row);
                    }    
                }
                reply(pageList[0]);
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
{
    method: "POST",
    path: "/admin/page",
    config:{
        handler: function(request, reply){
            Mely.Page.createPage({
                title:request.payload["mely-page-title"],
                content:request.payload["mely-page-content"],
                systemid:request.auth.credentials.SystemId,
                userid:request.auth.credentials.id,
                status:request.payload["mely-page-status"],
                order:request.payload["page-order"],
                menuview:request.payload["mely-page-menuview"]
            },function(err,page){
                if(err) reply(err);
                reply("Page Added");
            });
        },
        validate:{
            payload:{
                "mely-page-title": joi.string().required(),
                "mely-page-content": joi.string().required(),
                "mely-page-status": joi.number().required(),
                "page-order": joi.number().required(),
                "mely-page-menuview": joi.number().required(),
            }
        }
    }
},
{
    method: "PUT",
    path: "/admin/page",
    config:{
        handler: function(request, reply){
            Mely.Page.updatePage({
                id: request.payload["mely-pageid"],
                title: request.payload["mely-page-title"],
                content: request.payload["mely-page-content"],
                status: request.payload["mely-page-status"],
                order: request.payload["page-order"],
                menuview: request.payload["mely-page-menuview"]
            }, function(err, page){
                if(err) reply(err);
                reply("Page Edited");
            });
        },
        validate:{
            payload:{
                "mely-pageid": joi.number().required(),
                "mely-page-title": joi.string().required(),
                "mely-page-content": joi.string().required(),
                "mely-page-status": joi.number().required(),
                "page-order": joi.number().required(),
                "mely-page-menuview": joi.number().required(),
            }
        }
    }
},
{
    method: "DELETE",
    path: "/admin/page/{id}",
    config:{
        handler: function(request, reply){
            Mely.Page.deletePage({
                id: request.params.id
            }, function(err, user){
                if(err) reply(err);
                reply("Page Deleted");
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
//post routes
{
    method: "GET",
    path: "/admin/post",
    config:{
        handler: function(request, reply){
            Mely.Post.getPost({
                systemid: request.auth.credentials.SystemId
            }, function(err, posts){
                if(err) reply(err);
                var postList = [];
                for(var post in posts){
                    if (posts.hasOwnProperty(post)){
                        var row = {};
                        row.postId = posts[post].id;
                        row.title = posts[post].title;
                        row.comments_allowed = posts[post].comments_allowed === true ? 1 : 0;
                        row.status = posts[post].status;
                        row.createdDate = moment(posts[post].createdAt).format("MMMM Do YYYY h:mm a");
                        postList.push(row);
                    }
                }
                reply(postList);
            });
        }
    }
},
{
    method: "GET",
    path: "/admin/post/{id}",
    config:{
        handler: function(request, reply){
            Mely.Post.getPost({
                systemid: request.auth.credentials.SystemId,
                id: request.params.id
            }, function(err, posts){
                if(err) reply(err);
                var postList = [];
                for(var post in posts){
                    if (posts.hasOwnProperty(post)) {
                        var row = {};
                        row.postid = posts[post].id;
                        row.title = posts[post].title;
                        row.content = posts[post].content;
                        row.comments_allowed = posts[post].comments_allowed === true ? 1 : 0;
                        row.status = posts[post].status;
                        postList.push(row);
                    }
                }
                reply(postList[0]);
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
{
    method: "POST",
    path: "/admin/post",
    config:{
        handler: function(request, reply){
            Mely.Post.createPost({
                title:request.payload["mely-post-title"],
                content:request.payload["mely-post-content"],
                systemid:request.auth.credentials.SystemId,
                userid:request.auth.credentials.id,
                status:request.payload["mely-post-status"],
                comments:request.payload["mely-post-comments"]
            },function(err,post){
                if(err) reply(err);
                reply("Post Added");
            });
        },
        validate:{
            payload:{
                "mely-post-title": joi.string().required(),
                "mely-post-content": joi.string().required(),
                "mely-post-status": joi.number().required(),
                "mely-post-comments": joi.number().required()
            }
        }
    }
},
{
    method: "PUT",
    path: "/admin/post",
    config:{
        handler: function(request, reply){
            Mely.Post.updatePost({
                id: request.payload["mely-postid"],
                title: request.payload["mely-post-title"],
                content: request.payload["mely-post-content"],
                status: request.payload["mely-post-status"],
                comments: request.payload["mely-post-comments"]
            }, function(err, post){
                if(err) reply(err);
                reply("Post Edited");
            });
        },
        validate:{
            payload:{
                "mely-postid": joi.number().required(),
                "mely-post-title": joi.string().required(),
                "mely-post-content": joi.string().required(),
                "mely-post-status": joi.number().required(),
                "mely-post-comments": joi.number().required()
            }
        }
    }
},
{
    method: "DELETE",
    path: "/admin/post/{id}",
    config:{
        handler: function(request, reply){
            Mely.Post.deletePost({
                id: request.params.id
            }, function(err, user){
                if(err) reply(err);
                reply("Post Deleted");
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
{
    method: "GET",
    path: "/admin/comment",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            pageDetails.title = "Mely: Comments";
            Mely.Comment.getComment({
                systemid:request.auth.credentials.SystemId
            }, function(err, comments){
                if(err) reply(err);
                var Comments = [];
                for (var comment in comments) {
                    if (comments.hasOwnProperty(comment)){
                        var row = {};
                        row.commentid = comments[comment].id;
                        row.postid = comments[comment].PostId;
                        row.approved = comments[comment].approved;
                        row.commentemail = comments[comment].email;
                        row.commentcontent = comments[comment].content;
                        row.commentcreatedate = moment(comments[comment].createdAt).format('MMMM Do YYYY h:mm a');
                        row.commentmodifydate = moment(comments[comment].updatedAt).format('MMMM Do YYYY h:mm a');
                        Comments.push(row);
                    }
                }
                reply(Comments);
            });            
        }
    }
},
{
    method: "GET",
    path: "/admin/post/comment/{id}/{direction}",
    config:{
        handler: function(request, reply){
            Mely.Comment.approveComment({
                commentid: request.params["id"],
                direction: request.params["direction"] === "true" ? true : false
            }, function(err, comments){
                if(err) reply(err);
                reply("comment status changed");
            });            
        },
        validate:{
            params:{
                id: joi.number().required(),
                direction: joi.string().required()
            }
        }
    }
},
//theme routes
{
    method: "GET",
    path: "/admin/theme",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            Mely.Theme.getTheme({
                systemid: request.auth.credentials.SystemId
            }, function(err, themes){
                if(err) reply(err);
                var themeList = [];
                for(var theme in themes){
                    if (themes.hasOwnProperty(theme)){
                        var row = {};
                        row.themeid = themes[theme].id;
                        row.name = themes[theme].name;
                        row.description = themes[theme].description;
                        row.status = themes[theme].active;
                        themeList.push(row);
                    }
                }
                reply(themeList);
            });
        }
    }
},
{
    method: "GET",
    path: "/admin/theme/{id}",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            Mely.Theme.getTheme({
                systemid: request.auth.credentials.SystemId,
                id: request.params.id
            }, function(err, themes){
                if(err) reply(err);
                var theme = {};
                theme.themeID = themes[0].id;
                theme.name = themes[0].name;
                theme.description = themes[0].description;
                Mely.Theme.getThemeSetting({
                    id: themes[0].id
                }, function(err, themesetting){
                    if(err) reply(err);
                    theme.headbackcolor = themesetting[0].header_backgroundcolor;
                    theme.headfontcolor = themesetting[0].header_fontcolor;
                    theme.headfontsize = themesetting[0].header_fontsize;
                    theme.headerimage = themesetting[0].headerfilename;
                    theme.menubackcolor = themesetting[0].menu_backgroundcolor;
                    theme.menufontcolor = themesetting[0].menu_fontcolor;
                    theme.menufontsize = themesetting[0].menu_fontsize;
                    theme.posttitlecolor = themesetting[0].post_titlefontcolor;
                    theme.posttitlefontsize = themesetting[0].post_titlefontsize;
                    theme.postcontentcolor = themesetting[0].post_contentfontcolor;
                    theme.postcontentfontsize = themesetting[0].post_contentfontsize;
                    theme.pagetitlecolor = themesetting[0].page_titlefontcolor;
                    theme.pagetitlefontsize = themesetting[0].page_titlefontsize;
                    theme.pagecontentcolor = themesetting[0].page_contentfontcolor;
                    theme.pagecontentfontsize = themesetting[0].page_contentfontsize;
                    reply(theme);
                });
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
{
    method: "POST",
    path: "/admin/theme",
    config:{
        handler: function(request, reply){
            Mely.Theme.createTheme({
                systemid: request.auth.credentials.SystemId,
                name: request.payload.themename,
                description: request.payload.themedescription,
                headback: request.payload.headerbackcolor,
                headfontcolor: request.payload.headerfontcolor,
                headfontsize: request.payload.headerfontsize,
                logo: ((request.payload.headerimage !== undefined) ? request.payload.headerimage.hapi.filename : null),
                menuback: request.payload.menubackcolor,
                menufontcolor: request.payload.menufontcolor,
                menufontsize: request.payload.menufontsize,
                posttitlecolor: request.payload.posttitlecolor,
                posttitlesize: request.payload.posttitlefontsize,
                postcontentcolor: request.payload.postcontentcolor,
                postcontentsize: request.payload.postcontentfontsize,
                pagetitlecolor: request.payload.pagetitlecolor,
                pagetitlesize: request.payload.pagetitlefontsize,
                pagecontentcolor: request.payload.pagecontentcolor,
                pagecontentsize: request.payload.pagecontentfontsize
            }, function(err, theme){
                if(err) reply(err);
                if(theme !== undefined){
                    if(request.payload.headerimage !== undefined){
                        var fs = require('fs');
                        fs.writeFileSync("./static/img/" + request.payload.headerimage.hapi.filename, request.payload.headerimage._data);
                    }
                    reply("Theme Added")
                }
            });
        },
        validate:{
            payload:{
                themename: joi.string().required(),
                themedescription: joi.string().required(),
                headerbackcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                headerfontcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                headerfontsize: joi.number().greater(0).required(),
                headerimage: joi.any(),
                menubackcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                menufontcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                menufontsize: joi.number().greater(0).required(),
                posttitlecolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                posttitlefontsize: joi.number().greater(0).required(),
                postcontentcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                postcontentfontsize: joi.number().greater(0).required(),
                pagetitlecolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                pagetitlefontsize: joi.number().greater(0).required(),
                pagecontentcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                pagecontentfontsize: joi.number().greater(0).required()
            }
        },
        payload:{
            output: "stream",
            parse: true
        },
    }
},
{
    method: "PUT",
    path: "/admin/theme",
    config:{
        handler: function(request, reply){
            Mely.Theme.updateTheme({
                id: request.payload.id,
                name: request.payload.themename,
                description: request.payload.themedescription,
                headback: request.payload.headerbackcolor,
                headfontcolor: request.payload.headerfontcolor,
                headfontsize: request.payload.headerfontsize,
                logo: ((request.payload.headerimage !== undefined) ? request.payload.headerimage.hapi.filename : null),
                menuback: request.payload.menubackcolor,
                menufontcolor: request.payload.menufontcolor,
                menufontsize: request.payload.menufontsize,
                posttitlecolor: request.payload.posttitlecolor,
                posttitlesize: request.payload.posttitlefontsize,
                postcontentcolor: request.payload.postcontentcolor,
                postcontentsize: request.payload.postcontentfontsize,
                pagetitlecolor: request.payload.pagetitlecolor,
                pagetitlesize: request.payload.pagetitlefontsize,
                pagecontentcolor: request.payload.pagecontentcolor,
                pagecontentsize: request.payload.pagecontentfontsize
            }, function(err, theme){
                if(err) reply(err);
                if(theme !== undefined){
                    if(request.payload.headerimage !== undefined){
                        var fs = require('fs');
                        fs.writeFileSync("./static/img/" + request.payload.headerimage.hapi.filename, request.payload.headerimage._data);
                    }
                    reply("Theme Updated");
                }
            });
        },
        validate:{
            payload:{
                id: joi.number().required(),
                themename: joi.string().required(),
                themedescription: joi.string().required(),
                headerbackcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                headerfontcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                headerfontsize: joi.number().greater(0).required(),
                headerimage: joi.any(),
                menubackcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                menufontcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                menufontsize: joi.number().greater(0).required(),
                posttitlecolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                posttitlefontsize: joi.number().greater(0).required(),
                postcontentcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                postcontentfontsize: joi.number().greater(0).required(),
                pagetitlecolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                pagetitlefontsize: joi.number().greater(0).required(),
                pagecontentcolor: joi.string().regex(/^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).required(),
                pagecontentfontsize: joi.number().greater(0).required()
            }
        },
        payload:{
            output: "stream",
            parse: true
        },
    }
},
{
    method: "GET",
    path: "/admin/theme/activate/{id}",
    config:{
        handler: function(request, reply){
            Mely.Theme.activateTheme({
                systemid: request.auth.credentials.SystemId,
                id: request.params.id
            }, function(err, theme){
                if(err) reply(err);
                reply("Theme activated")
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        }
    }
},
{
    method: "GET",
    path: "/admin/file",
    config:{
        handler: function(request, reply){
            Mely.Theme.getThemeFiles({
            }, function(err, files){
                if(err) reply(err);
                reply(files);
            });
        }
    }
},
{
    method: "GET",
    path: "/admin/file/{id}",
    config:{
        handler: function(request, reply){
            Mely.Theme.getFileContents({
                id: request.params.id
            }, function(err, file){
                if(err) reply(err);
                reply(file);
            });
        },
        validate:{
            params:{
                id: joi.string().required()
            }
        }
    }
},
{
    method: "POST",
    path: "/admin/file/save",
    config:{
        handler: function(request, reply){
            Mely.Theme.writeFileContents({
                filename: request.payload.filename,
                content: request.payload.content
            }, function(err, result){
                if(err) reply(err);
                reply(result);
            });
        },
        validate:{
            payload:{
                filename: joi.string().required(),
                content: joi.string().required()
            }
        }
    }
},
//blog routes
{
    method: "GET",
    path: "/api/post",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.Post.getPost({
                    systemid: blogid,
                    status: 2
                }, function(err, posts){
                    if(err) reply(err);
                    var postList = [];
                    for(var post in posts){
                        if (posts.hasOwnProperty(post)){
                            var row = {};
                            row.id = posts[post].id;
                            row.userid = posts[post].UserId;
                            row.title = posts[post].title;
                            row.content = marked(posts[post].content);
                            row.createdAt = moment(posts[post].createdAt).format('MMMM Do YYYY h:mm a');
                            row.comments_allowed = posts[post].comments_allowed === true ? 1 : 0;
                            postList.push(row);
                        }
                    }
                    reply(postList);
                });
            });
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/api/post/{id}",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.Post.getPost({
                    systemid: blogid,
                    status: request.query.draft === "" ? 1 : 2,
                    id: request.params.id
                }, function(err, posts){
                    if(err) reply(err);
                    var postList = [];
                    for(var post in posts){
                        if (posts.hasOwnProperty(post)){
                            var row = {};
                            row.id = posts[post].id;
                            row.userid = posts[post].UserId;
                            row.title = posts[post].title;
                            row.content = marked(posts[post].content);
                            row.createdAt = moment(posts[post].createdAt).format('MMMM Do YYYY h:mm a');
                            row.comments_allowed = posts[post].comments_allowed === true ? 1 : 0;
                            postList.push(row);
                        }
                    }
                    reply(postList);
                });
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/api/author/{id}",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.User.getUser({
                    systemid: blogid,
                    userid: request.params.id
                }, function(err, user){
                    if(err) reply(err);
                    reply(user[0].email_address);
                });
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/api/comment/{id}",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.Comment.getComment({
                    systemid: blogid,
                    postid: request.params.id,
                    approved: 1
                }, function(err, comments){
                    if(err) reply(err);
                    var Comments = [];
                    for (var comment in comments) {
                        if (comments.hasOwnProperty(comment)){
                            var row = {};
                            row.commentid = comments[comment].id;
                            row.postid = comments[comment].PostId;
                            row.approved = comments[comment].approved;
                            row.commentemail = comments[comment].email;
                            row.commentcontent = comments[comment].content;
                            row.commentcreatedate = moment(comments[comment].createdAt).format('MMMM Do YYYY h:mm a');
                            row.commentmodifydate = moment(comments[comment].updatedAt).format('MMMM Do YYYY h:mm a');
                            row.upvote = comments[comment].upvote;
                            row.downvote = comments[comment].downvote;
                            Comments.push(row);
                        }
                    }
                    reply(Comments);
                });
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/api/page/{pagename}",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.Page.getPage({
                    systemid: blogid,
                    status: request.query.draft === "" ? 1 : 2,
                    title: request.params.pagename.replace("_"," ")
                }, function(err, page){
                    if(err) reply(err);
                    var Page = [];
                    for (var item in page){
                        if (page.hasOwnProperty(item)){
                            var pageRecord = {};
                            pageRecord.pageTitle = page[item].title;
                            pageRecord.pageContent = marked(page[item].content);
                            Page.push(pageRecord);
                        }
                    }
                    reply(Page);
                });
            });
        },
        validate:{
            params:{
                pagename: joi.string().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/api/menu",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.Page.getPage({
                    systemid: blogid,
                    status: 2
                }, function(err, pages){
                    var Pages = [];
                    for (var page in pages){
                        if (pages.hasOwnProperty(page)){
                            if(pages[page].onmenu){
                                var pageRecord = {};
                                pageRecord.id = pages[page].id;
                                pageRecord.title = pages[page].title;
                                pageRecord.link = changeCase.lowerCase(pages[page].title.replace(" ","_"));
                                pageRecord.onmenu = pages[page].onmenu;
                                Pages.push(pageRecord);
                            }
                        }
                    }
                    reply(Pages);
                });
            });
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/api/theme",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, result){
                var blogid = result.id;
                Mely.Theme.getTheme({
                    systemid: blogid,
                    active: true
                }, function(err, theme){
                    if(err) reply(err);
                    Mely.Theme.getThemeSetting({
                        id: theme[0].id
                    }, function(err, themesetting){
                        var themeRecord = {};
                        themeRecord.themeLogo = themesetting[0].headerfilename;
                        themeRecord.themeHeaderBackground = themesetting[0].header_backgroundcolor;
                        themeRecord.themeHeaderFontColor = themesetting[0].header_fontcolor;
                        themeRecord.themeHeaderFontSize = themesetting[0].header_fontsize;
                        themeRecord.themeMenuBackground = themesetting[0].menu_backgroundcolor;
                        themeRecord.themeMenuFontColor = themesetting[0].menu_fontcolor;
                        themeRecord.themeMenuFontSize = themesetting[0].menu_fontsize;
                        themeRecord.themePostTitleFontColor = themesetting[0].post_titlefontcolor;
                        themeRecord.themePostTitleFontSize = themesetting[0].post_titlefontsize;
                        themeRecord.themePostContentFontColor = themesetting[0].post_contentfontcolor;
                        themeRecord.themePostContentFontSize = themesetting[0].post_contentfontsize;
                        themeRecord.themePageTitleFontColor = themesetting[0].page_titlefontcolor;
                        themeRecord.themePageTitleFontSize = themesetting[0].page_titlefontsize;
                        themeRecord.themePageContentFontColor = themesetting[0].page_contentfontcolor;
                        themeRecord.themePageContentFontSize = themesetting[0].page_contentfontsize;
                        reply(themeRecord);
                    });
                });
            });
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            pageDetails.title = "Mely";
            Mely.System.getSystemCount({
            }, function(err, count){
                if(count > 0){
                    Mely.System.getSystem({
                    }, function(err, system){
                        if(err) reply(err);
                        pageDetails.system = {
                            title: system.name,
                            tag: system.description
                        };
                        reply.view("mely/index", pageDetails);
                    });
                }
                else{
                    reply().redirect("/welcome");
                }
            });
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/{pagename}",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            pageDetails.title = "Mely";
            Mely.System.getSystemCount({
            }, function(err, count){
                if(count > 0){
                    Mely.System.getSystem({
                    }, function(err, system){
                        if(err) reply(err);
                        pageDetails.system = {
                            title: system.name,
                            tag: system.description
                        };
                        reply.view("mely/page", pageDetails);
                    });
                }
                else{
                    reply().redirect("/welcome");
                }
            });
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/post/{id}",
    config:{
        handler: function(request, reply){
            var pageDetails = {};
            pageDetails.title = "Mely";
            Mely.System.getSystemCount({
            }, function(err, count){
                if(count > 0){
                    Mely.System.getSystem({
                    }, function(err, system){
                        if(err) reply(err);
                        pageDetails.system = {
                            title: system.name,
                            tag: system.description
                        };
                        reply.view("mely/post", pageDetails);
                    });
                }
                else{
                    reply().redirect("/welcome");
                }
            });
        },
        auth: false
    }
},
{
    method: "POST",
    path: "/comment",
    config:{
        handler: function(request, reply){
            Mely.System.getSystem({
            }, function(err, system){
                if(err) reply(err);
                Mely.Comment.createComment({
                    systemid: system.id,
                    email: request.payload["email"],
                    content: request.payload["content"],
                    postid: request.payload["postid"]
                }, function(err, comment){
                    if(err) reply(err);
                    reply().redirect("/post/" + request.payload["postid"] + "#");
                });
            });
        },
        validate:{
            payload:{
                email: joi.string().email().required(),
                content: joi.string().required(),
                postid: joi.number().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/comment/{id}/up",
    config:{
        handler: function(request, reply){
            Mely.Comment.upComment({
                commentid:request.params["id"]
            }, function(err, comment){
                if(err) reply(err);
                reply("Upvoted");
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/comment/{id}/down",
    config:{
        handler: function(request, reply){
            Mely.Comment.downComment({
                commentid:request.params["id"]
            }, function(err, comment){
                if(err) reply(err);
                reply("Downvoted");
            });
        },
        validate:{
            params:{
                id: joi.number().required()
            }
        },
        auth: false
    }
},
//misc routes
{
    method: "*",
    path: "/{path*}",
    config: {
        handler: {
            directory: {
                path: "./static/",
                listing: false,
                redirectToSlash:true
            }
        },
        auth: false
    }
},
{
    method: "GET",
    path: "/favicon.ico",
    handler:{
        file: "favicon.ico"
    },
    config:{
        cache:{
            expiresIn: 86400000
        }
    }
}
];