let db = require('@config/database') let Tag = module.exports = {} Tag.removeTagFromNote = (userId, tagId) => { return new Promise((resolve, reject) => { db.promise() .query(`DELETE FROM note_tag WHERE id = ? AND user_id = ? LIMIT 1;`, [tagId, userId]) .then((rows, fields) => { resolve(rows[0]) //Return new ID }) .catch(console.log) }) } Tag.addToNote = (userId, noteId, tagText) => { return new Promise((resolve, reject) => { //Lookup tag Tag.lookup(tagText) .then( lookup => { //Tag does not exist, insert new tag, then associate it with a note if(lookup.length == 0){ //Insert new tag Tag.add(tagText) .then( newTagId => { Tag.associateWithNote(userId, noteId, newTagId) .then( result => { resolve(result) }) }) } //Tag already exists, associate it with a note if(lookup.length > 0){ Tag.associateWithNote(userId, noteId, lookup[0].id) .then( result => { resolve(result) }) } }) }) } Tag.associateWithNote = (userId, noteId, tagId) => { return new Promise((resolve, reject) => { //Check if tag already exists on note before adding note db.promise() .query(`SELECT * FROM note_tag WHERE note_id = ? AND tag_id = ? AND user_id = ?;`, [noteId, tagId, userId]) .then((rows, fields) => { //If matching tag does not exist on note if(rows[0].length == 0){ //Add tag to note db.promise() .query(`INSERT INTO note_tag (note_id, tag_id, user_id) VALUES (?,?,?);`, [noteId, tagId, userId]) .then((rows, fields) => { resolve(rows[0]) }) .catch(console.log) } else { reject('Error: Tag already exists on note.') } }) .catch(console.log) }) } Tag.add = (tagText) => { return new Promise((resolve, reject) => { db.promise() .query(`INSERT INTO tag (text, hash) VALUES (?,?);`, [tagText,0]) .then((rows, fields) => { resolve(rows[0].insertId) //Return new ID }) .catch(console.log) }) } Tag.get = (userId, noteId) => { return new Promise((resolve, reject) => { //Update last opened date of note const now = Math.round((+new Date)/1000) db.promise() .query('UPDATE note SET opened = ? WHERE id = ? AND user_id = ? LIMIT 1', [now, noteId, userId]) .then((rows, fields) => {}) db.promise() .query(`SELECT note_tag.id, tag.text FROM note_tag JOIN tag ON (tag.id = note_tag.tag_id) WHERE user_id = ? AND note_id = ?;`, [userId, noteId]) .then((rows, fields) => { resolve(rows[0]) //Return all tags found by query }) .catch(console.log) }) } Tag.string = (userId, noteId) => { return new Promise((resolve, reject) => { Tag.get(userId, noteId).then(tagArray => { let tagString = '' tagArray.forEach( (tag, i) => { if(i > 0){ tagString += ',' } tagString += tag.text }) //Output comma delimited list of tag strings resolve(tagString) }) }) } Tag.lookup = (tagText) => { return new Promise((resolve, reject) => { db.promise() .query(`SELECT * FROM tag WHERE text = ?;`, [tagText]) .then((rows, fields) => { resolve(rows[0]) //Return all tags found by query }) .catch(console.log) }) } //Suggest note tags - don't suggest tags already on note Tag.suggest = (userId, noteId, tagText) => { tagText += '%' return new Promise((resolve, reject) => { db.promise() .query(`SELECT text FROM note_tag JOIN tag ON note_tag.tag_id = tag.id WHERE note_tag.user_id = ? AND tag.text LIKE ? AND note_tag.tag_id NOT IN ( SELECT note_tag.tag_id FROM note_tag WHERE note_tag.note_id = ? ) GROUP BY text LIMIT 6`, [userId, tagText, noteId]) .then((rows, fields) => { resolve(rows[0]) //Return new ID }) .catch(console.log) }) } //Latest Tags - don't suggest tags already on note Tag.latest = (userId, noteId) => { return new Promise((resolve, reject) => { db.promise() .query(`SELECT tag.text FROM note_tag JOIN tag ON note_tag.tag_id = tag.id JOIN note ON note_tag.note_id = note.id WHERE note_tag.user_id = ? AND note_tag.tag_id NOT IN ( SELECT note_tag.tag_id FROM note_tag WHERE note_tag.note_id = ? ) GROUP BY tag.text, note.updated ORDER BY note.updated DESC LIMIT 8;`, [userId, noteId]) .then((rows, fields) => { resolve(rows[0]) //Return found tags }) .catch(console.log) }) }