Permalink
Cannot retrieve contributors at this time
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?
Music-Website/index.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
280 lines (240 sloc)
7.07 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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}`) |