* When a user gets a new shared message, it will popup instantly * When a new website is scraped, it will update in real time * Various other little bug fixes and improvements * Sharing displays correct notes and handles shared notes correctly * Tags were not displaying on notes, they do now. They better.
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //
 | |
| // All actions in noteController.js
 | |
| //
 | |
| 
 | |
| 
 | |
| const db = require('@config/database')
 | |
| 
 | |
| const Note = require('@models/Note')
 | |
| 
 | |
| let ShareNote = module.exports = {}
 | |
| 
 | |
| // Share a note with a user, given the correct username
 | |
| ShareNote.addUser = (userId, noteId, rawTextId, username) => {
 | |
| 	return new Promise((resolve, reject) => {
 | |
| 
 | |
| 		let shareUserId = null
 | |
| 		let newNoteShare = null
 | |
| 		const cleanUser = username.toLowerCase().trim()
 | |
| 
 | |
| 		//Check that user actually exists
 | |
| 		db.promise().query(`SELECT id FROM user WHERE LOWER(username) = ?`, [cleanUser])
 | |
| 		.then((rows, fields) => {
 | |
| 
 | |
| 			if(rows[0].length == 0){
 | |
| 				throw new Error('User Does Not Exist')
 | |
| 			}
 | |
| 
 | |
| 			shareUserId = rows[0][0]['id']
 | |
| 
 | |
| 			//Check if note has already been added for user
 | |
| 			return db.promise()
 | |
| 			.query('SELECT id FROM note WHERE user_id = ? AND note_raw_text_id = ?', [shareUserId, rawTextId])
 | |
| 			
 | |
| 		})
 | |
| 		.then((rows, fields) => {
 | |
| 
 | |
| 			if(rows[0].length != 0){
 | |
| 				throw new Error('User Already Has Note')
 | |
| 			}
 | |
| 
 | |
| 			//Lookup note to share with user, clone this data to create users new note
 | |
| 			return db.promise()
 | |
| 			.query(`SELECT * FROM note WHERE id = ? LIMIT 1`, [noteId])
 | |
| 		})
 | |
| 		.then((rows, fields) => {
 | |
| 
 | |
| 			newNoteShare = rows[0][0]
 | |
| 
 | |
| 			//Modify note with the share attributes we want
 | |
| 			delete newNoteShare['id']
 | |
| 			delete newNoteShare['opened']
 | |
| 			newNoteShare['share_user_id'] = userId //User who shared the note 
 | |
| 			newNoteShare['user_id'] = shareUserId //User who gets note
 | |
| 
 | |
| 			//Setup db colums, db values and number of '?' to put into prepared statement
 | |
| 			let dbColumns = []
 | |
| 			let dbValues = []
 | |
| 			let escapeChars = []
 | |
| 
 | |
| 			//Pull out all the data we need from object to create prepared statemnt
 | |
| 			Object.keys(newNoteShare).forEach( key => {
 | |
| 				escapeChars.push('?')
 | |
| 				dbColumns.push(key)
 | |
| 				dbValues.push(newNoteShare[key])
 | |
| 			})
 | |
| 		
 | |
| 			//Stick all the note value back into query, insert updated note
 | |
| 			return db.promise()
 | |
| 			.query(`INSERT INTO note (${dbColumns.join()}) VALUES (${escapeChars.join()})`, dbValues)
 | |
| 		})
 | |
| 		.then((rows, fields) => {
 | |
| 
 | |
| 			//Update note share status to 2
 | |
| 			return db.promise()
 | |
| 			.query('UPDATE note SET shared = 2 WHERE id = ?', [noteId])
 | |
| 
 | |
| 		})
 | |
| 		.then((rows, fields) => {
 | |
| 			//Success!
 | |
| 			return resolve({'success':true, shareUserId})
 | |
| 		})
 | |
| 		.catch(error => {
 | |
| 			console.log(error)
 | |
| 			resolve(false)
 | |
| 		})
 | |
| 	})
 | |
| }
 | |
| 
 | |
| // Get users who see a shared note
 | |
| ShareNote.getUsers = (userId, rawTextId) => {
 | |
| 	return new Promise((resolve, reject) => {
 | |
| 		db.promise()
 | |
| 		.query(`
 | |
| 			SELECT username, note.id as noteId
 | |
| 			FROM note 
 | |
| 			JOIN user ON (user.id = note.user_id)
 | |
| 			WHERE note_raw_text_id = ?
 | |
| 			AND share_user_id = ?
 | |
| 			AND user_id != ?
 | |
| 			`, [rawTextId, userId, userId])
 | |
| 		.then((rows, fields) => {
 | |
| 
 | |
| 			//Return a list of user names
 | |
| 			return resolve (rows[0])
 | |
| 		})
 | |
| 	})
 | |
| }
 | |
| 
 | |
| // Remove a user from a shared note
 | |
| ShareNote.removeUser = (userId, noteId) => {
 | |
| 	return new Promise((resolve, reject) => {
 | |
| 
 | |
| 		const Note = require('@models/Note')
 | |
| 
 | |
| 		let rawTextId = null
 | |
| 		let removeUserId = null
 | |
| 		
 | |
| 		//note.id = noteId, share_user_id = userId
 | |
| 		db.promise()
 | |
| 		.query('SELECT note_raw_text_id, user_id FROM note WHERE id = ? AND share_user_id = ?', [noteId, userId])
 | |
| 		.then( (rows, fields) => {
 | |
| 
 | |
| 			rawTextId = rows[0][0]['note_raw_text_id']
 | |
| 			removeUserId = rows[0][0]['user_id']
 | |
| 
 | |
| 			//Delete note entry for other user - remove users access
 | |
| 			if(removeUserId && Number.isInteger(removeUserId)){
 | |
| 				//Delete this users access to the note
 | |
| 				return Note.delete(removeUserId, noteId)
 | |
| 
 | |
| 			} else {
 | |
| 				
 | |
| 				return new Promise((resolve, reject) => { resolve(true) })
 | |
| 			}
 | |
| 
 | |
| 		})
 | |
| 		.then(stuff => {
 | |
| 			resolve(true)
 | |
| 		})
 | |
| 		.catch(error => {
 | |
| 			console.log(error)
 | |
| 			resolve(false)
 | |
| 		})
 | |
| 
 | |
| 
 | |
| 	})
 | |
| } |