diff options
| author | Pitu <[email protected]> | 2017-01-20 03:28:26 -0300 |
|---|---|---|
| committer | Pitu <[email protected]> | 2017-01-20 03:28:26 -0300 |
| commit | bae03cdc25e0d52c4e2ca628d21eed0ca63a5c60 (patch) | |
| tree | b69f45ccdfa6f100df00a0060528dfd31255f0fe | |
| parent | Album delete WIP (diff) | |
| download | host.fuwn.me-bae03cdc25e0d52c4e2ca628d21eed0ca63a5c60.tar.xz host.fuwn.me-bae03cdc25e0d52c4e2ca628d21eed0ca63a5c60.zip | |
File delete, album delete and album rename. Sugoooi!
| -rw-r--r-- | controllers/albumsController.js | 30 | ||||
| -rw-r--r-- | controllers/tokenController.js | 2 | ||||
| -rw-r--r-- | controllers/uploadController.js | 35 | ||||
| -rw-r--r-- | database/db.js | 5 | ||||
| -rw-r--r-- | pages/panel.html | 1 | ||||
| -rw-r--r-- | public/js/panel.js | 374 | ||||
| -rw-r--r-- | routes/api.js | 3 |
7 files changed, 322 insertions, 128 deletions
diff --git a/controllers/albumsController.js b/controllers/albumsController.js index 47ab1d5..8b5b5dd 100644 --- a/controllers/albumsController.js +++ b/controllers/albumsController.js @@ -35,8 +35,8 @@ albumsController.list = function(req, res, next){ for(let album of albums) album.files = albumsCount[album.id] return res.json({ success: true, albums }) - }) - }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) } albumsController.create = function(req, res, next){ @@ -58,7 +58,7 @@ albumsController.create = function(req, res, next){ }).then(() => { return res.json({ success: true }) }) - }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) } albumsController.delete = function(req, res, next){ @@ -71,8 +71,30 @@ albumsController.delete = function(req, res, next){ db.table('albums').where('id', id).update({ enabled: 0 }).then(() => { return res.json({ success: true }) - }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) } +albumsController.rename = function(req, res, next){ + if(req.headers.auth !== config.adminToken) + return res.status(401).json({ success: false, description: 'not-authorized'}) + + let id = req.body.id + if(id === undefined || id === '') + return res.json({ success: false, description: 'No album specified' }) + + let name = req.body.name + if(name === undefined || name === '') + return res.json({ success: false, description: 'No name specified' }) + + db.table('albums').where('name', name).then((results) => { + if(results.length !== 0) + return res.json({ success: false, description: 'Name already in use' }) + + db.table('albums').where('id', id).update({ name: name }).then(() => { + return res.json({ success: true }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + +} module.exports = albumsController
\ No newline at end of file diff --git a/controllers/tokenController.js b/controllers/tokenController.js index e302869..ad2b469 100644 --- a/controllers/tokenController.js +++ b/controllers/tokenController.js @@ -54,7 +54,7 @@ tokenController.change = function(req, res, next){ config.adminToken = token res.json({ success: true }) - }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) } module.exports = tokenController
\ No newline at end of file diff --git a/controllers/uploadController.js b/controllers/uploadController.js index 87b3ab6..af9f592 100644 --- a/controllers/uploadController.js +++ b/controllers/uploadController.js @@ -4,7 +4,7 @@ const multer = require('multer') const randomstring = require('randomstring') const db = require('knex')(config.database) //const crypto = require('crypto') -//const fs = require('fs') +const fs = require('fs') let uploadsController = {} @@ -94,11 +94,40 @@ uploadsController.upload = function(req, res, next){ }) }) - }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) }) } +uploadsController.delete = function(req, res){ + + if(req.headers.auth !== config.adminToken) + return res.status(401).json({ success: false, description: 'not-authorized'}) + + let id = req.body.id + if(id === undefined || id === '') + return res.json({ success: false, description: 'No file specified' }) + + db.table('files').where('id', id).then((file) => { + + fs.stat('./' + config.uploads.folder + '/' + file[0].name, function (err, stats) { + + if (err) { return res.json({ success: false, description: err.toString() }) } + + fs.unlink('./' + config.uploads.folder + '/' + file[0].name, function(err){ + if (err) { return res.json({ success: false, description: err.toString() }) } + + db.table('files').where('id', id).del().then(() =>{ + return res.json({ success: true }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + + }) + }) + + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + +} + uploadsController.list = function(req, res){ if(req.headers.auth !== config.adminToken) @@ -141,7 +170,7 @@ uploadsController.list = function(req, res){ }) }) - }) + }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) } module.exports = uploadsController
\ No newline at end of file diff --git a/database/db.js b/database/db.js index 4af2f21..551c8a5 100644 --- a/database/db.js +++ b/database/db.js @@ -51,9 +51,8 @@ let init = function(db, config){ ] ).then(() => { printAndSave(config, clientToken, adminToken) - }) - - }) + }).catch(function(error) { console.log(error) }) + }).catch(function(error) { console.log(error) }) }) diff --git a/pages/panel.html b/pages/panel.html index a8ae048..edf3959 100644 --- a/pages/panel.html +++ b/pages/panel.html @@ -7,6 +7,7 @@ <link rel="stylesheet" type="text/css" href="/css/style.css"> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.15.3/axios.min.js"></script> + <script type="text/javascript" src="https://use.fontawesome.com/cd26baa9bd.js"></script> <script type="text/javascript" src="/js/panel.js"></script> </head> <body> diff --git a/public/js/panel.js b/public/js/panel.js index f59d3c6..5608ad2 100644 --- a/public/js/panel.js +++ b/public/js/panel.js @@ -20,10 +20,10 @@ panel.verifyToken = function(token, reloadOnError = false){ type: 'admin', token: token }) - .then(function (response) { + .then(function (response) { - if(response.data.success === false){ - swal({ + if(response.data.success === false){ + swal({ title: "An error ocurred", text: response.data.description, type: "error" @@ -34,18 +34,18 @@ panel.verifyToken = function(token, reloadOnError = false){ } }) return; - } + } - axios.defaults.headers.common['auth'] = token; - localStorage.admintoken = token; + axios.defaults.headers.common['auth'] = token; + localStorage.admintoken = token; panel.token = token; return panel.prepareDashboard(); - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); } @@ -76,26 +76,27 @@ panel.getUploads = function(album = undefined){ url = '/api/album/' + album axios.get(url) - .then(function (response) { - if(response.data.success === false){ - if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); - else return swal("An error ocurred", response.data.description, "error"); - } - - panel.page.innerHTML = ''; - var container = document.createElement('div'); + .then(function (response) { + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } + + panel.page.innerHTML = ''; + var container = document.createElement('div'); container.innerHTML = ` <table class="table is-striped is-narrow"> - <thead> - <tr> - <th>File</th> - <th>Album</th> - <th>Date</th> - </tr> - </thead> - <tbody id="table"> - </tbody> - </table>`; + <thead> + <tr> + <th>File</th> + <th>Album</th> + <th>Date</th> + <th></th> + </tr> + </thead> + <tbody id="table"> + </tbody> + </table>`; panel.page.appendChild(container); var table = document.getElementById('table'); @@ -105,56 +106,100 @@ panel.getUploads = function(album = undefined){ var tr = document.createElement('tr'); tr.innerHTML = ` <tr> - <th><a href="${item.file}" target="_blank">${item.file}</a></th> - <th>${item.album}</th> - <td>${item.date}</td> - </tr> - `; + <th><a href="${item.file}" target="_blank">${item.file}</a></th> + <th>${item.album}</th> + <td>${item.date}</td> + <td> + <a class="button is-small is-danger is-outlined" title="Delete album" onclick="panel.deleteFile(${item.id})"> + <span class="icon is-small"> + <i class="fa fa-trash-o"></i> + </span> + </a> + </td> + </tr> + `; table.appendChild(tr); } - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); } +panel.deleteFile = function(id){ + swal({ + title: "Are you sure?", + text: "You wont be able to recover the file!", + type: "warning", + showCancelButton: true, + confirmButtonColor: "#ff3860", + confirmButtonText: "Yes, delete it!", + closeOnConfirm: false + }, + function(){ + + axios.post('/api/upload/delete', { + id: id + }) + .then(function (response) { + + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } + + swal("Deleted!", "The file has been deleted.", "success"); + panel.getUploads(); + return; + + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); + + } + ); +} + panel.getAlbums = function(){ axios.get('/api/albums') - .then(function (response) { - if(response.data.success === false){ - if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); - else return swal("An error ocurred", response.data.description, "error"); - } + .then(function (response) { + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } - panel.page.innerHTML = ''; - var container = document.createElement('div'); + panel.page.innerHTML = ''; + var container = document.createElement('div'); container.className = "container"; container.innerHTML = ` <h2 class="subtitle">Create new album</h2> <p class="control has-addons has-addons-centered"> - <input id="albumName" class="input" type="text" placeholder="Name"> - <a id="submitAlbum" class="button is-primary">Submit</a> + <input id="albumName" class="input" type="text" placeholder="Name"> + <a id="submitAlbum" class="button is-primary">Submit</a> </p> <h2 class="subtitle">List of albums</h2> <table class="table is-striped is-narrow"> - <thead> - <tr> - <th>Name</th> - <th>Files</th> - <th>Created At</th> - </tr> - </thead> - <tbody id="table"> - </tbody> - </table>`; + <thead> + <tr> + <th>Name</th> + <th>Files</th> + <th>Created At</th> + <th></th> + </tr> + </thead> + <tbody id="table"> + </tbody> + </table>`; panel.page.appendChild(container); var table = document.getElementById('table'); @@ -164,11 +209,23 @@ panel.getAlbums = function(){ var tr = document.createElement('tr'); tr.innerHTML = ` <tr> - <th>${item.name}</th> - <th>${item.files}</th> - <td>${item.date}</td> - </tr> - `; + <th>${item.name}</th> + <th>${item.files}</th> + <td>${item.date}</td> + <td> + <a class="button is-small is-primary is-outlined" title="Edit name" onclick="panel.renameAlbum(${item.id})"> + <span class="icon is-small"> + <i class="fa fa-pencil"></i> + </span> + </a> + <a class="button is-small is-danger is-outlined" title="Delete album" onclick="panel.deleteAlbum(${item.id})"> + <span class="icon is-small"> + <i class="fa fa-trash-o"></i> + </span> + </a> + </td> + </tr> + `; table.appendChild(tr); } @@ -178,11 +235,94 @@ panel.getAlbums = function(){ }); - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); + +} + +panel.renameAlbum = function(id){ + + swal({ + title: "Rename album", + text: "New name you want to give the album:", + type: "input", + showCancelButton: true, + closeOnConfirm: false, + animation: "slide-from-top", + inputPlaceholder: "My super album" + },function(inputValue){ + if (inputValue === false) return false; + if (inputValue === "") { + swal.showInputError("You need to write something!"); + return false + } + + axios.post('/api/albums/rename', { + id: id, + name: inputValue + }) + .then(function (response) { + + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else if(response.data.description === 'Name already in use') swal.showInputError("That name is already in use!"); + else swal("An error ocurred", response.data.description, "error"); + return; + } + + swal("Success!", "Your album was renamed to: " + inputValue, "success"); + panel.getAlbumsSidebar(); + panel.getAlbums(); + return; + + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); + + }); + +} + +panel.deleteAlbum = function(id){ + swal({ + title: "Are you sure?", + text: "This won't delete your files, only the album!", + type: "warning", + showCancelButton: true, + confirmButtonColor: "#ff3860", + confirmButtonText: "Yes, delete it!", + closeOnConfirm: false + }, + function(){ + + axios.post('/api/albums/delete', { + id: id + }) + .then(function (response) { + + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } + + swal("Deleted!", "Your album has been deleted.", "success"); + panel.getAlbumsSidebar(); + panel.getAlbums(); + return; + + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); + + } + ); } @@ -191,36 +331,36 @@ panel.submitAlbum = function(){ axios.post('/api/albums', { name: document.getElementById('albumName').value }) - .then(function (response) { + .then(function (response) { - if(response.data.success === false){ - if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); - else return swal("An error ocurred", response.data.description, "error"); - } + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } - swal("Woohoo!", "Album was added successfully", "success"); + swal("Woohoo!", "Album was added successfully", "success"); panel.getAlbumsSidebar(); panel.getAlbums(); return; - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); } panel.getAlbumsSidebar = function(){ axios.get('/api/albums/sidebar') - .then(function (response) { - if(response.data.success === false){ - if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); - else return swal("An error ocurred", response.data.description, "error"); - } + .then(function (response) { + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } - var albumsContainer = document.getElementById('albumsContainer'); + var albumsContainer = document.getElementById('albumsContainer'); albumsContainer.innerHTML = ''; if(response.data.albums === undefined) return; @@ -241,11 +381,11 @@ panel.getAlbumsSidebar = function(){ } - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); } @@ -256,28 +396,28 @@ panel.getAlbum = function(item){ panel.changeTokens = function(){ axios.get('/api/tokens') - .then(function (response) { - if(response.data.success === false){ - if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); - else return swal("An error ocurred", response.data.description, "error"); - } + .then(function (response) { + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } - panel.page.innerHTML = ''; - var container = document.createElement('div'); + panel.page.innerHTML = ''; + var container = document.createElement('div'); container.className = "container"; container.innerHTML = ` <h2 class="subtitle">Manage your tokens</h2> <label class="label">Client token:</label> <p class="control has-addons"> - <input id="clientToken" class="input is-expanded" type="text" placeholder="Your client token"> - <a id="submitClientToken" class="button is-primary">Save</a> + <input id="clientToken" class="input is-expanded" type="text" placeholder="Your client token"> + <a id="submitClientToken" class="button is-primary">Save</a> </p> <label class="label">Admin token:</label> <p class="control has-addons"> - <input id="adminToken" class="input is-expanded" type="text" placeholder="Your admin token"> - <a id="submitAdminToken" class="button is-primary">Save</a> + <input id="adminToken" class="input is-expanded" type="text" placeholder="Your admin token"> + <a id="submitAdminToken" class="button is-primary">Save</a> </p> `; @@ -295,11 +435,11 @@ panel.changeTokens = function(){ }); - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); } @@ -309,14 +449,14 @@ panel.submitToken = function(type, token){ type: type, token: token }) - .then(function (response) { + .then(function (response) { - if(response.data.success === false){ - if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); - else return swal("An error ocurred", response.data.description, "error"); - } + if(response.data.success === false){ + if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token); + else return swal("An error ocurred", response.data.description, "error"); + } - swal({ + swal({ title: "Woohoo!", text: 'Your token was changed successfully.', type: "success" @@ -331,11 +471,11 @@ panel.submitToken = function(type, token){ }) - }) - .catch(function (error) { - return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); - console.log(error); - }); + }) + .catch(function (error) { + return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error"); + console.log(error); + }); } diff --git a/routes/api.js b/routes/api.js index b7c4453..f007de7 100644 --- a/routes/api.js +++ b/routes/api.js @@ -13,12 +13,15 @@ routes.get ('/check', (req, res, next) => { routes.get ('/uploads', (req, res, next) => uploadController.list(req, res)) routes.post ('/upload', (req, res, next) => uploadController.upload(req, res, next)) +routes.post ('/upload/delete', (req, res, next) => uploadController.delete(req, res, next)) routes.post ('/upload/:albumid', (req, res, next) => uploadController.upload(req, res, next)) routes.get ('/album/:id', (req, res, next) => uploadController.list(req, res, next)) routes.get ('/albums', (req, res, next) => albumsController.list(req, res, next)) routes.get ('/albums/:sidebar', (req, res, next) => albumsController.list(req, res, next)) routes.post ('/albums', (req, res, next) => albumsController.create(req, res, next)) +routes.post ('/albums/delete', (req, res, next) => albumsController.delete(req, res, next)) +routes.post ('/albums/rename', (req, res, next) => albumsController.rename(req, res, next)) routes.get ('/albums/test', (req, res, next) => albumsController.test(req, res, next)) routes.get ('/tokens', (req, res, next) => tokenController.list(req, res)) |