Browse Source

File delete, album delete and album rename. Sugoooi!

Pitu 7 years ago
parent
commit
bae03cdc25

+ 26 - 4
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

+ 1 - 1
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

+ 32 - 3
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

+ 2 - 3
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) })
 
 	})
 

+ 1 - 0
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>

+ 257 - 117
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);
+	});
 
 }
 

+ 3 - 0
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))