Added New Folder feature in Image Editor + Winston init refactor
This commit is contained in:
		
							
								
								
									
										12
									
								
								agent.js
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								agent.js
									
									
									
									
									
								
							| @@ -5,22 +5,14 @@ | |||||||
| // =========================================== | // =========================================== | ||||||
|  |  | ||||||
| global.ROOTPATH = __dirname; | global.ROOTPATH = __dirname; | ||||||
|  | global.PROCNAME = 'AGENT'; | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| // Load Winston | // Load Winston | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
|  |  | ||||||
| var _isDebug = process.env.NODE_ENV === 'development'; | var _isDebug = process.env.NODE_ENV === 'development'; | ||||||
|  | global.winston = require('./lib/winston')(_isDebug); | ||||||
| global.winston = require('winston'); |  | ||||||
| winston.remove(winston.transports.Console) |  | ||||||
| winston.add(winston.transports.Console, { |  | ||||||
|   level: (_isDebug) ? 'info' : 'warn', |  | ||||||
|   prettyPrint: true, |  | ||||||
|   colorize: true, |  | ||||||
|   silent: false, |  | ||||||
|   timestamp: true |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| // Fetch internal handshake key | // Fetch internal handshake key | ||||||
|   | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -6,6 +6,7 @@ let vueImage = new Vue({ | |||||||
| 		isLoadingText: '', | 		isLoadingText: '', | ||||||
| 		newFolderName: '', | 		newFolderName: '', | ||||||
| 		newFolderShow: false, | 		newFolderShow: false, | ||||||
|  | 		newFolderError: false, | ||||||
| 		fetchFromUrlURL: '', | 		fetchFromUrlURL: '', | ||||||
| 		fetchFromUrlShow: false, | 		fetchFromUrlShow: false, | ||||||
| 		folders: [], | 		folders: [], | ||||||
| @@ -52,11 +53,38 @@ let vueImage = new Vue({ | |||||||
|  |  | ||||||
| 		}, | 		}, | ||||||
| 		newFolder: (ev) => { | 		newFolder: (ev) => { | ||||||
|  | 			vueImage.newFolderName = ''; | ||||||
|  | 			vueImage.newFolderError = false; | ||||||
| 			vueImage.newFolderShow = true; | 			vueImage.newFolderShow = true; | ||||||
|  | 			_.delay(() => { $('#txt-editor-newfoldername').focus(); }, 400); | ||||||
| 		}, | 		}, | ||||||
| 		newFolderDiscard: (ev) => { | 		newFolderDiscard: (ev) => { | ||||||
| 			vueImage.newFolderShow = false; | 			vueImage.newFolderShow = false; | ||||||
| 		}, | 		}, | ||||||
|  | 		newFolderCreate: (ev) => { | ||||||
|  |  | ||||||
|  | 			let regFolderName = new RegExp("^[a-z0-9][a-z0-9\-]*[a-z0-9]$"); | ||||||
|  | 			vueImage.newFolderName = _.kebabCase(_.trim(vueImage.newFolderName)); | ||||||
|  |  | ||||||
|  | 			if(_.isEmpty(vueImage.newFolderName) || !regFolderName.test(vueImage.newFolderName)) { | ||||||
|  | 				vueImage.newFolderError = true; | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			vueImage.newFolderDiscard(); | ||||||
|  | 			vueImage.isLoading = true; | ||||||
|  | 			vueImage.isLoadingText = 'Creating new folder...'; | ||||||
|  |  | ||||||
|  | 			Vue.nextTick(() => { | ||||||
|  | 				socket.emit('uploadsCreateFolder', { foldername: vueImage.newFolderName }, (data) => { | ||||||
|  | 					vueImage.folders = data; | ||||||
|  | 					vueImage.currentFolder = vueImage.newFolderName; | ||||||
|  | 					vueImage.images = []; | ||||||
|  | 					vueImage.isLoading = false; | ||||||
|  | 				}); | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 		}, | ||||||
| 		fetchFromUrl: (ev) => { | 		fetchFromUrl: (ev) => { | ||||||
| 			vueImage.fetchFromUrlShow = true; | 			vueImage.fetchFromUrlShow = true; | ||||||
| 		}, | 		}, | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								lib/winston.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								lib/winston.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | var winston = require('winston'); | ||||||
|  |  | ||||||
|  | module.exports = (isDebug) => { | ||||||
|  |  | ||||||
|  | 	winston.remove(winston.transports.Console) | ||||||
|  | 	winston.add(winston.transports.Console, { | ||||||
|  | 		level: (isDebug) ? 'info' : 'warn', | ||||||
|  | 		prettyPrint: true, | ||||||
|  | 		colorize: true, | ||||||
|  | 		silent: false, | ||||||
|  | 		timestamp: true | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	return winston; | ||||||
|  |  | ||||||
|  | }; | ||||||
| @@ -25,6 +25,7 @@ module.exports = (confPath) => { | |||||||
| 		title: "Requarks Wiki", | 		title: "Requarks Wiki", | ||||||
| 		host: "http://localhost", | 		host: "http://localhost", | ||||||
| 		port: process.env.PORT, | 		port: process.env.PORT, | ||||||
|  | 		wsPort: 8080, | ||||||
| 		db: "mongodb://localhost/wiki", | 		db: "mongodb://localhost/wiki", | ||||||
| 		redis: null, | 		redis: null, | ||||||
| 		sessionSecret: null, | 		sessionSecret: null, | ||||||
|   | |||||||
| @@ -72,13 +72,13 @@ module.exports = { | |||||||
|  |  | ||||||
| 		let self = this; | 		let self = this; | ||||||
|  |  | ||||||
| 		winston.info('[GIT] Checking Git repository...'); | 		winston.info('[' + PROCNAME + '][GIT] Checking Git repository...'); | ||||||
|  |  | ||||||
| 		//-> Check if path is accessible | 		//-> Check if path is accessible | ||||||
|  |  | ||||||
| 		return fs.mkdirAsync(self._repo.path).catch((err) => { | 		return fs.mkdirAsync(self._repo.path).catch((err) => { | ||||||
| 			if(err.code !== 'EEXIST') { | 			if(err.code !== 'EEXIST') { | ||||||
| 				winston.error('Invalid Git repository path or missing permissions.'); | 				winston.error('[' + PROCNAME + '][GIT] Invalid Git repository path or missing permissions.'); | ||||||
| 			} | 			} | ||||||
| 		}).then(() => { | 		}).then(() => { | ||||||
|  |  | ||||||
| @@ -116,10 +116,10 @@ module.exports = { | |||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
| 		}).catch((err) => { | 		}).catch((err) => { | ||||||
| 			winston.error('Git remote error!'); | 			winston.error('[' + PROCNAME + '][GIT] Git remote error!'); | ||||||
| 			throw err; | 			throw err; | ||||||
| 		}).then(() => { | 		}).then(() => { | ||||||
| 			winston.info('[GIT] Git repository is OK.'); | 			winston.info('[' + PROCNAME + '][GIT] Git repository is OK.'); | ||||||
| 			return true; | 			return true; | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| @@ -147,12 +147,12 @@ module.exports = { | |||||||
|  |  | ||||||
| 		// Fetch | 		// Fetch | ||||||
|  |  | ||||||
| 		winston.info('[GIT] Performing pull from remote repository...'); | 		winston.info('[' + PROCNAME + '][GIT] Performing pull from remote repository...'); | ||||||
| 		return self._git.pull('origin', self._repo.branch).then((cProc) => { | 		return self._git.pull('origin', self._repo.branch).then((cProc) => { | ||||||
| 			winston.info('[GIT] Pull completed.'); | 			winston.info('[' + PROCNAME + '][GIT] Pull completed.'); | ||||||
| 		}) | 		}) | ||||||
| 		.catch((err) => { | 		.catch((err) => { | ||||||
| 			winston.error('Unable to fetch from git origin!'); | 			winston.error('[' + PROCNAME + '][GIT] Unable to fetch from git origin!'); | ||||||
| 			throw err; | 			throw err; | ||||||
| 		}) | 		}) | ||||||
| 		.then(() => { | 		.then(() => { | ||||||
| @@ -164,14 +164,14 @@ module.exports = { | |||||||
|  |  | ||||||
| 				if(_.includes(out, 'commit')) { | 				if(_.includes(out, 'commit')) { | ||||||
|  |  | ||||||
| 					winston.info('[GIT] Performing push to remote repository...'); | 					winston.info('[' + PROCNAME + '][GIT] Performing push to remote repository...'); | ||||||
| 					return self._git.push('origin', self._repo.branch).then(() => { | 					return self._git.push('origin', self._repo.branch).then(() => { | ||||||
| 						return winston.info('[GIT] Push completed.'); | 						return winston.info('[' + PROCNAME + '][GIT] Push completed.'); | ||||||
| 					}); | 					}); | ||||||
|  |  | ||||||
| 				} else { | 				} else { | ||||||
|  |  | ||||||
| 					winston.info('[GIT] Push skipped. Repository is already in sync.'); | 					winston.info('[' + PROCNAME + '][GIT] Push skipped. Repository is already in sync.'); | ||||||
|  |  | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| @@ -181,7 +181,7 @@ module.exports = { | |||||||
|  |  | ||||||
| 		}) | 		}) | ||||||
| 		.catch((err) => { | 		.catch((err) => { | ||||||
| 			winston.error('Unable to push changes to remote!'); | 			winston.error('[' + PROCNAME + '][GIT] Unable to push changes to remote!'); | ||||||
| 			throw err; | 			throw err; | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,11 +1,13 @@ | |||||||
| "use strict"; | "use strict"; | ||||||
|  |  | ||||||
| var fs = require('fs'), | var path = require('path'), | ||||||
| 	path = require('path'), |  | ||||||
| 	loki = require('lokijs'), | 	loki = require('lokijs'), | ||||||
| 	Promise = require('bluebird'), | 	Promise = require('bluebird'), | ||||||
|  | 	fs = Promise.promisifyAll(require('fs-extra')), | ||||||
| 	_ = require('lodash'); | 	_ = require('lodash'); | ||||||
|  |  | ||||||
|  | var regFolderName = new RegExp("^[a-z0-9][a-z0-9\-]*[a-z0-9]$"); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Local Data Storage |  * Local Data Storage | ||||||
|  * |  * | ||||||
| @@ -114,36 +116,20 @@ module.exports = { | |||||||
| 	 */ | 	 */ | ||||||
| 	createBaseDirectories(appconfig) { | 	createBaseDirectories(appconfig) { | ||||||
|  |  | ||||||
| 		winston.info('[SERVER] Create data directories if they don\'t exist...'); | 		winston.info('[SERVER] Checking data directories...'); | ||||||
|  |  | ||||||
| 		try { | 		try { | ||||||
| 			fs.mkdirSync(appconfig.datadir.db); | 			fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.db)); | ||||||
|  | 			fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.db, './cache')); | ||||||
|  | 			fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.db, './thumbs')); | ||||||
|  |  | ||||||
|  | 			fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.repo)); | ||||||
|  | 			fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.repo, './uploads')); | ||||||
| 		} catch (err) { | 		} catch (err) { | ||||||
| 			if(err.code !== 'EEXIST') { | 			winston.error(err); | ||||||
| 				winston.error(err); |  | ||||||
| 				process.exit(1); |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		try { | 		winston.info('[SERVER] Data and Repository directories are OK.'); | ||||||
| 			fs.mkdirSync(path.join(appconfig.datadir.db, 'cache')); |  | ||||||
| 		} catch (err) { |  | ||||||
| 			if(err.code !== 'EEXIST') { |  | ||||||
| 				winston.error(err); |  | ||||||
| 				process.exit(1); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		try { |  | ||||||
| 			fs.mkdirSync(path.join(appconfig.datadir.db, 'thumbs')); |  | ||||||
| 		} catch (err) { |  | ||||||
| 			if(err.code !== 'EEXIST') { |  | ||||||
| 				winston.error(err); |  | ||||||
| 				process.exit(1); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		winston.info('[SERVER] Data directories are OK.'); |  | ||||||
|  |  | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| @@ -171,6 +157,32 @@ module.exports = { | |||||||
| 		return this._uploadsFolders; | 		return this._uploadsFolders; | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Creates an uploads folder. | ||||||
|  | 	 * | ||||||
|  | 	 * @param      {String}  folderName  The folder name | ||||||
|  | 	 * @return     {Promise}  Promise of the operation | ||||||
|  | 	 */ | ||||||
|  | 	createUploadsFolder(folderName) { | ||||||
|  |  | ||||||
|  | 		let self = this; | ||||||
|  |  | ||||||
|  | 		folderName = _.kebabCase(_.trim(folderName)); | ||||||
|  |  | ||||||
|  | 		if(_.isEmpty(folderName) || !regFolderName.test(folderName)) { | ||||||
|  | 			return Promise.resolve(self.getUploadsFolders()); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return fs.ensureDirAsync(path.join(self._uploadsPath, folderName)).then(() => { | ||||||
|  | 			if(!_.includes(self._uploadsFolders, folderName)) { | ||||||
|  | 				self._uploadsFolders.push(folderName); | ||||||
|  | 				self._uploadsFolders = _.sortBy(self._uploadsFolders); | ||||||
|  | 			} | ||||||
|  | 			return self.getUploadsFolders(); | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Sets the uploads files. | 	 * Sets the uploads files. | ||||||
| 	 * | 	 * | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								server.js
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								server.js
									
									
									
									
									
								
							| @@ -5,23 +5,14 @@ | |||||||
| // =========================================== | // =========================================== | ||||||
|  |  | ||||||
| global.ROOTPATH = __dirname; | global.ROOTPATH = __dirname; | ||||||
|  | global.PROCNAME = 'SERVER'; | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| // Load Winston | // Load Winston | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
|  |  | ||||||
| var _isDebug = process.env.NODE_ENV === 'development'; | var _isDebug = process.env.NODE_ENV === 'development'; | ||||||
|  | global.winston = require('./lib/winston')(_isDebug); | ||||||
| global.winston = require('winston'); |  | ||||||
| winston.remove(winston.transports.Console) |  | ||||||
| winston.add(winston.transports.Console, { |  | ||||||
|   level: (_isDebug) ? 'info' : 'warn', |  | ||||||
|   prettyPrint: true, |  | ||||||
|   colorize: true, |  | ||||||
|   silent: false, |  | ||||||
|   timestamp: true |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| winston.info('[SERVER] Requarks Wiki is initializing...'); | winston.info('[SERVER] Requarks Wiki is initializing...'); | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| @@ -66,7 +57,6 @@ var ctrl = autoload(path.join(ROOTPATH, '/controllers')); | |||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
|  |  | ||||||
| global.app = express(); | global.app = express(); | ||||||
| var _isDebug = (app.get('env') === 'development'); |  | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| // Security | // Security | ||||||
|   | |||||||
| @@ -60,6 +60,7 @@ | |||||||
| 					img(v-bind:src="'/uploads/t/' + img.uid + '.png'") | 					img(v-bind:src="'/uploads/t/' + img.uid + '.png'") | ||||||
| 					span: strong {{ img.basename }} | 					span: strong {{ img.basename }} | ||||||
| 					span {{ img.filesize | filesize }} | 					span {{ img.filesize | filesize }} | ||||||
|  | 				em(v-show="images.length < 1") This folder is empty. | ||||||
|  |  | ||||||
| 	.modal(v-bind:class="{ 'is-active': newFolderShow }") | 	.modal(v-bind:class="{ 'is-active': newFolderShow }") | ||||||
| 		.modal-background | 		.modal-background | ||||||
| @@ -72,8 +73,8 @@ | |||||||
| 						.content | 						.content | ||||||
| 							label.label Enter the new folder name: | 							label.label Enter the new folder name: | ||||||
| 							p.control | 							p.control | ||||||
| 								input.input(type='text', placeholder='folder name', v-model='newFolderName') | 								input.input#txt-editor-newfoldername(type='text', placeholder='folder name', v-model='newFolderName', v-on:keyup.enter="newFolderCreate", v-on:keyup.esc="newFolderDiscard") | ||||||
| 								span.help.is-danger.is-hidden This folder name is invalid! | 								span.help.is-danger(v-show="newFolderError") This folder name is invalid! | ||||||
| 					footer.card-footer | 					footer.card-footer | ||||||
| 						a.card-footer-item(v-on:click="newFolderDiscard") Discard | 						a.card-footer-item(v-on:click="newFolderDiscard") Discard | ||||||
| 						a.card-footer-item(v-on:click="newFolderCreate") Create | 						a.card-footer-item(v-on:click="newFolderCreate") Create | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								ws-server.js
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								ws-server.js
									
									
									
									
									
								
							| @@ -5,22 +5,14 @@ | |||||||
| // =========================================== | // =========================================== | ||||||
|  |  | ||||||
| global.ROOTPATH = __dirname; | global.ROOTPATH = __dirname; | ||||||
|  | global.PROCNAME = 'WS'; | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| // Load Winston | // Load Winston | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
|  |  | ||||||
| var _isDebug = process.env.NODE_ENV === 'development'; | var _isDebug = process.env.NODE_ENV === 'development'; | ||||||
|  | global.winston = require('./lib/winston')(_isDebug); | ||||||
| global.winston = require('winston'); |  | ||||||
| winston.remove(winston.transports.Console) |  | ||||||
| winston.add(winston.transports.Console, { |  | ||||||
| 	level: (_isDebug) ? 'info' : 'warn', |  | ||||||
| 	prettyPrint: true, |  | ||||||
| 	colorize: true, |  | ||||||
| 	silent: false, |  | ||||||
| 	timestamp: true |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // ---------------------------------------- | // ---------------------------------------- | ||||||
| // Fetch internal handshake key | // Fetch internal handshake key | ||||||
| @@ -141,6 +133,12 @@ io.on('connection', (socket) => { | |||||||
| 		cb(lcdata.getUploadsFolders()); | 		cb(lcdata.getUploadsFolders()); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
|  | 	socket.on('uploadsCreateFolder', (data, cb) => { | ||||||
|  | 		lcdata.createUploadsFolder(data.foldername).then((fldList) => { | ||||||
|  | 			cb(fldList); | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
| 	socket.on('uploadsSetFiles', (data, cb) => { | 	socket.on('uploadsSetFiles', (data, cb) => { | ||||||
| 		if(internalAuth.validateKey(data.auth)) { | 		if(internalAuth.validateKey(data.auth)) { | ||||||
| 			lcdata.setUploadsFiles(data.content); | 			lcdata.setUploadsFiles(data.content); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user