diff --git a/index.js b/index.js index a0ea43b..b233a28 100644 --- a/index.js +++ b/index.js @@ -7,12 +7,12 @@ const Router = require('koa-router') const views = require('koa-views') const staticDir = require('koa-static') const bodyParser = require('koa-bodyparser') -const koaBody = require('koa-body')({multipart: true, uploadDir: '.'}) const session = require('koa-session') /* IMPORT CUSTOM MODULES */ -const User = require('./modules/user') -const Order = require('./modules/order') +const User = require('./routes/user') +const Menu = require('./routes/menu') +const Order = require('./routers/order') const app = new Koa() const router = new Router() @@ -26,228 +26,11 @@ app.use(views(`${__dirname}/views`, { extension: 'handlebars' }, {map: { handleb const defaultPort = 8080 const port = process.env.PORT || defaultPort -const dbUsers = './databases/users.db' -const dbMenu = './databases/menu.db' -/** - * The secure home page. - * - * @name Home Page - * @route {GET} / - * @authentication This route requires cookie-based authentication. - */ -// eslint-disable-next-line complexity -router.get('/', async ctx => { - try { - const auth = ctx.session.authorised - if(auth !== 'Admin' || auth !== 'Kitchen' || auth !== 'Waiting') { - return ctx.redirect('/login?msg=you need to log in') - } - const data = {} - if(ctx.query.msg) data.msg = ctx.query.msg - await ctx.render('index') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) +app.use(User.routes()) +app.use(Menu.routes()) +app.use(Order.routers()) -/** - * The user registration page. - * - * @name Register Page - * @route {GET} /register - */ -router.get('/register', async ctx => await ctx.render('register')) - -/** - * The script to process new user registrations. - * - * @name Register Script - * @route {POST} /register - */ -router.post('/register', koaBody, async ctx => { - try { - // extract the data from the request - const body = ctx.request.body - // call the functions in the module - const user = await new User(dbUsers) - await user.register(body.user, body.pass, body.auth) - // redirect to the home page - ctx.redirect(`/?msg=new user "${body.name}" added`) - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/login', async ctx => { - const data = {} - if(ctx.query.msg) data.msg = ctx.query.msg - if(ctx.query.user) data.user = ctx.query.user - await ctx.render('login', data) -}) - -router.post('/login', async ctx => { - try { - const body = ctx.request.body - const user = await new User(dbUsers) - await user.login(body.user, body.pass) - const auth = await user.getAuth(body.user) - ctx.session.authorised = auth.auth - return ctx.redirect('/mainmenu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/logout', async ctx => { - ctx.session.authorised = null - ctx.redirect('/?msg=you are now logged out') -}) - -router.get('/mainmenu', async ctx => { - try{ - const auth = ctx.session.authorised - if(auth === 'Admin' || auth === 'Kitchen' || auth === 'Waiting') { - await ctx.render('mainmenu') - } else ctx.redirect('/login?msg=you need to log in') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/order', async ctx => { - try{ - const auth = ctx.session.authorised - if(auth === 'Admin' || auth === 'Waiting') { - const order = await new Order(dbMenu) - const numbers = order.createTableNumbers() - await ctx.render('order', {number: numbers}) - } else await ctx.render('mainmenu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/order/:tableNumber', async ctx => { - try{ - const currentTableNumber = ctx.params.tableNumber - const order = await new Order(dbMenu) - const itemNames = await order.getItemsName() - const itemAmount = await order.getAmount(currentTableNumber, itemNames) - const data = order.createItemObject(itemNames, itemAmount, currentTableNumber) - const numbers = order.createTableNumbers() - if (ctx.params.tableNumber === 'Select') { - ctx.redirect('/order/select?msg=Select a Table Number') - } else{ - await ctx.render('order', {items: data, number: numbers, table: currentTableNumber}) - } - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.post('/order/:tableNumber', async ctx => { - try { - const body = ctx.request.body - const order = await new Order(dbMenu) - if(body.submit === 'Add') { - await order.addToOrder(body) - } else if (body.submit === 'Remove') { - await order.removeFromOrder(body) - } - ctx.redirect(ctx.params.tableNumber) - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/ready', async ctx => { - try{ - const auth = ctx.session.authorised - if(auth === 'Admin' || auth === 'Kitchen') { - const order = await new Order(dbMenu) - const unready = await order.getNotReadyOrders() - const ready = await order.getReadyOrders() - await ctx.render('ready', {unreadyOrder: unready, readyOrder: ready}) - } else await ctx.render('mainmenu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.post('/ready', async ctx => { - try { - const body = ctx.request.body - const order = await new Order(dbMenu) - if (body.submit === 'Ready') { - await order.setReady(body.ID) - } else if (body.submit === 'Unready') { - await order.setUnready(body.ID) - } - await ctx.redirect('/ready') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/adding', async ctx => { - try{ - const auth = ctx.session.authorised - if(auth === 'Admin' || auth === 'Waiting') { - await ctx.render('adding') - } else await ctx.render('mainmenu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.post('/adding', async ctx => { - try { - const body = ctx.request.body - const order = await new Order(dbMenu) - order.createPrice(body) - await order.addItem(body) - await ctx.redirect('/menu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/menu', async ctx => { - try{ - const auth = ctx.session.authorised - if(auth === 'Admin') { - const order = await new Order(dbMenu) - const data = await order.getItemsName() - await ctx.render('menu', {items: data}) - } else await ctx.redirect('/mainmenu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.get('/edit/:itemID', async ctx => { - try{ - const order = await new Order(dbMenu) - const data = await order.getItemInfo(ctx.params.itemID) - order.splitPrice(data[0]) - await ctx.render('edit', {items: data}) - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) - -router.post('/edit', async ctx => { - try { - const body = ctx.request.body - const order = await new Order(dbMenu) - order.createPrice(body) - await order.editItem(body) - await ctx.redirect('/menu') - } catch(err) { - await ctx.render('error', {message: err.message}) - } -}) app.use(router.routes()) module.exports = app.listen(port, async() => console.log(`listening on port ${port}`)) diff --git a/modules/user.js b/modules/user.js index 1e3f663..ff37fa7 100644 --- a/modules/user.js +++ b/modules/user.js @@ -54,4 +54,10 @@ module.exports = class User { const record = await this.db.get(sql) return record } + + async checkAuth(auth) { + if(auth !== 'Admin' || auth !== 'Kitchen' || auth !== 'Waiting') { + return true + } else false + } } diff --git a/routes/menu.js b/routes/menu.js new file mode 100644 index 0000000..7dd8528 --- /dev/null +++ b/routes/menu.js @@ -0,0 +1,115 @@ +'use strict' + +/* MODULE IMPORTS */ +const Router = require('koa-router') + +const router = new Router() + +const dbMenu = '../databases/menu.db' + +/* MODULE IMPORTS */ +const Order = require('../modules/order') + +router.get('/mainmenu', async ctx => { + try{ + const auth = ctx.session.authorised + if(auth === 'Admin' || auth === 'Kitchen' || auth === 'Waiting') { + await ctx.render('mainmenu') + } else ctx.redirect('/login?msg=you need to log in') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/ready', async ctx => { + try{ + const auth = ctx.session.authorised + if(auth === 'Admin' || auth === 'Kitchen') { + const order = await new Order(dbMenu) + const unready = await order.getNotReadyOrders() + const ready = await order.getReadyOrders() + await ctx.render('ready', {unreadyOrder: unready, readyOrder: ready}) + } else await ctx.render('mainmenu') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.post('/ready', async ctx => { + try { + const body = ctx.request.body + const order = await new Order(dbMenu) + if (body.submit === 'Ready') { + await order.setReady(body.ID) + } else if (body.submit === 'Unready') { + await order.setUnready(body.ID) + } + const unready = await order.getNotReadyOrders() + const ready = await order.getReadyOrders() + await ctx.render('ready', {unreadyOrder: unready, readyOrder: ready}) + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/adding', async ctx => { + try{ + const auth = ctx.session.authorised + if(auth === 'Admin' || auth === 'Waiting') { + await ctx.render('adding') + } else await ctx.render('mainmenu') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.post('/adding', async ctx => { + try { + const body = ctx.request.body + const order = await new Order(dbMenu) + order.createPrice(body) + await order.addItem(body) + await ctx.render('adding') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/menu', async ctx => { + try{ + const auth = ctx.session.authorised + if(auth === 'Admin') { + const order = await new Order(dbMenu) + const data = await order.getItemsName() + await ctx.render('menu', {items: data}) + } else await ctx.render('mainmenu') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/edit/:itemID', async ctx => { + try{ + const order = await new Order(dbMenu) + const data = await order.getItemInfo(ctx.params.itemID) + order.splitPrice(data[0]) + await ctx.render('edit', {items: data}) + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.post('/edit', async ctx => { + try { + const body = ctx.request.body + const order = await new Order(dbMenu) + order.createPrice(body) + await order.editItem(body) + const data = await order.getItemsName() + await ctx.render('menu', {items: data}) + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +module.exports = router diff --git a/routes/order.js b/routes/order.js new file mode 100644 index 0000000..8231252 --- /dev/null +++ b/routes/order.js @@ -0,0 +1,59 @@ +'use strict' + +/* MODULE IMPORTS */ +const Router = require('koa-router') + +const router = new Router() + +const dbMenu = '../databases/menu.db' + +/* MODULE IMPORTS */ +const Order = require('../modules/order') + +router.get('/order', async ctx => { + try{ + const auth = ctx.session.authorised + if(auth === 'Admin' || auth === 'Waiting') { + const order = await new Order(dbMenu) + const numbers = order.createTableNumbers() + await ctx.render('order', {number: numbers}) + } else await ctx.render('mainmenu') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/order/:tableNumber', async ctx => { + try{ + const currentTableNumber = ctx.params.tableNumber + const order = await new Order(dbMenu) + const itemNames = await order.getItemsName() + const itemAmount = await order.getAmount(currentTableNumber, itemNames) + const data = order.createItemObject(itemNames, itemAmount, currentTableNumber) + const numbers = order.createTableNumbers() + if (ctx.params.tableNumber === 'Select') { + ctx.redirect('/order/select?msg=Select a Table Number') + } else{ + await ctx.render('order', {items: data, number: numbers, table: currentTableNumber}) + } + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.post('/order/:tableNumber', async ctx => { + try { + const body = ctx.request.body + const order = await new Order(dbMenu) + if(body.submit === 'Add') { + await order.addToOrder(body) + } else if (body.submit === 'Remove') { + await order.removeFromOrder(body) + } + ctx.redirect(ctx.params.tableNumber) + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +module.exports = router diff --git a/routes/user.js b/routes/user.js new file mode 100644 index 0000000..e59c8e6 --- /dev/null +++ b/routes/user.js @@ -0,0 +1,85 @@ +//Routes File + +'use strict' + +/* MODULE IMPORTS */ +const Router = require('koa-router') +const koaBody = require('koa-body')({multipart: true, uploadDir: '.'}) + +const router = new Router() + +const dbUsers = '../databases/users.db' + +/* IMPORT CUSTOM MODULES */ +const User = require('../modules/user') + +router.get('/', async ctx => { + try { + const auth = ctx.session.authorised + const user = await new User(dbUsers) + const authenticated = user.checkAuth(auth) + if(authenticated === true) { + return ctx.redirect('/login?msg=you need to log in') + } + const data = {} + if(ctx.query.msg) data.msg = ctx.query.msg + await ctx.render('index') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +/** + * The user registration page. + * + * @name Register Page + * @route {GET} /register + */ +router.get('/register', async ctx => await ctx.render('register')) + +/** + * The script to process new user registrations. + * + * @name Register Script + * @route {POST} /register + */ +router.post('/register', koaBody, async ctx => { + try { + // extract the data from the request + const body = ctx.request.body + // call the functions in the module + const user = await new User(dbUsers) + await user.register(body.user, body.pass, body.auth) + // redirect to the home page + ctx.redirect(`/?msg=new user "${body.name}" added`) + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/login', async ctx => { + const data = {} + if(ctx.query.msg) data.msg = ctx.query.msg + if(ctx.query.user) data.user = ctx.query.user + await ctx.render('login', data) +}) + +router.post('/login', async ctx => { + try { + const body = ctx.request.body + const user = await new User(dbUsers) + await user.login(body.user, body.pass) + const auth = await user.getAuth(body.user) + ctx.session.authorised = auth.auth + return ctx.render('mainmenu') + } catch(err) { + await ctx.render('error', {message: err.message}) + } +}) + +router.get('/logout', async ctx => { + ctx.session.authorised = null + ctx.redirect('/?msg=you are now logged out') +}) + +module.exports = router