Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
/* MODULE IMPORTS */
const http = require('http')
const Koa = require('koa')
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/accounts')
const Audio = require('./modules/audio')
const Comments = require('./modules/comments')
const Database = require('./modules/database')
const Playlists = require('./modules/playlists')
const Ratings = require('./modules/ratings')
const Search = require('./modules/search')
const ContentRenderer = require('./modules/contentRenderer')
const app = new Koa()
const router = new Router()
/* CONFIGURING THE MIDDLEWARE */
app.keys = ['darkSecret']
app.use(staticDir('public'))
app.use(bodyParser())
app.use(session(app))
app.use(views(
`${__dirname}/views`, { extension: 'handlebars' }, { map: { handlebars: 'handlebars' } }))
const localPort = 8080
const port = process.env.PORT || localPort
const dbName = 'public/website.db'
const reloadPage = {contentView: 'content_index', genre: 'none'}
let database = undefined
let user = undefined
let audio = undefined
let comments = undefined
let playlists = undefined
let ratings = undefined
let search = undefined
let contentRenderer = undefined
async function correctInstantiation() {
database = await new Database(dbName)
user = await new User(database)
audio = await new Audio(database)
comments = await new Comments(database)
playlists = await new Playlists(database)
ratings = await new Ratings(database)
search = await new Search(database)
contentRenderer = await new ContentRenderer(database)
}
/**
* The secure home page.
*
* @name Home Page
* @route {GET} /
* @authentication This route requires cookie-based authentication.
*/
router.get('/', async ctx => {
try {
if (ctx.session.authorised !== true) return ctx.redirect('/login')
const data = {}
if (ctx.query.msg) data.msg = ctx.query.msg
await ctx.render('template_index', reloadPage)
reloadPage.contentView = 'content_index'
reloadPage.genre = 'none'
} 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'))
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.get('/logout', async ctx => {
ctx.session.authorised = null
ctx.redirect('/')
})
/**
* The script to process new user registrations.
*
* @name Register Script
* @route {POST} /register
*/
router.post('/register', koaBody, async ctx => {
try {
const body = ctx.request.body
await user.register(body.user, body.pass)
ctx.redirect('/')
} catch (err) {
await ctx.render('error', { message: err.message })
}
})
router.post('/search', async ctx => {
try {
if (ctx.session.authorised !== true) return ctx.redirect('/login')
await ctx.render('content_search', {tracks: await search.search(ctx.request.body, ctx.session.user)})
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/rating', async ctx => {
try {
if (ctx.session.authorised !== true) return ctx.redirect('/login')
const ratingValue = ctx.request.body.num
const ratingType = ctx.request.body.ratingType
const id = ctx.request.body.identifier
ratings.newRating(ratingValue, ratingType, id, ctx.session.user)
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/checklogin', async ctx => {
try {
const body = ctx.request.body
let msg = 'ok'
const status = await user.checkLogin(body.user, body.pass)
if (status) {
ctx.session.authorised = true
ctx.session.user = body.user
} else {
msg = 'Invalid login or password!'
}
ctx.body = {status: status, user: body.user,
pass: body.pass, msg: msg}
return
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/loadcontent', async ctx => {
try {
if (ctx.session.authorised !== true) return ctx.redirect('/login')
const body = ctx.request.body
if (body.genre === 'none') {
await ctx.render(body.content)
return
}
if (!body.genreTitle) {
body.genreTitle = ''
}
await ctx.render(body.content, await contentRenderer.getBody(body, ctx.session.user))
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/upload', koaBody, async ctx => {
try {
if (ctx.session.authorised !== true) return ctx.redirect('/login')
const file = ctx.request.files.file
if (file.type !== 'audio/mp3') {
await ctx.render('error', { message: 'That is not a song' })
return
}
await audio.upload(ctx.session.user, ctx.request.body, file)
ctx.redirect('/')
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/listen', koaBody, async ctx => {
try {
const body = ctx.request.body
const file = ctx.request.files.playlist_picture
const type = file.type
if (type !== 'image/jpeg' && file.size>0) {
await ctx.render('error', { message: 'That is not a jpeg image' })
return
}
await playlists.create(ctx.session.user, body.playlists, file)
reloadPage.contentView = 'content_listen'
reloadPage.genre = 'listen'
ctx.redirect('/')
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/deletePlaylist', koaBody, async ctx => {
try {
await playlists.delete(ctx.request.body.playlistDelete)
reloadPage.contentView = 'content_listen'
reloadPage.genre = 'listen'
ctx.redirect('/')
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/deletetrack', async ctx => {
try {
if (ctx.session.authorised !== true) return ctx.redirect('/login')
const body = ctx.request.body
await audio.delete(body.trackID, body.trackName)
const sql = `SELECT * FROM uploads WHERE genre="${body.genre}";`
const data = await database.all(sql)
await ctx.render(body.content, {genretitle: body.genreTitle, genre: body.genre,
tracks: data,})
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/addComment', async ctx => {
try {
const body = ctx.request.body
await comments.comments(ctx.session.user, body.comments, body.genretitle, body.genre)
ctx.body = ''
return
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
router.post('/deleteComment', async ctx => {
try {
await comments.deleteComments(ctx.request.body.commentID)
ctx.body = ''
return
} catch (err) {
console.log(err)
await ctx.render('error', { message: err.message })
}
})
app.use(router.routes())
correctInstantiation()
http.createServer(app.callback()).listen(port, '127.0.0.1')
console.log(`listening on port ${port}`)