2019-07-19 13:51:57 -07:00
let db = require ( '@config/database' )
let Notes = module . exports = { }
Notes . create = ( userId , noteText ) => {
return new Promise ( ( resolve , reject ) => {
2019-07-20 16:07:22 -07:00
const created = Math . round ( ( + new Date ) / 1000 )
2019-07-19 13:51:57 -07:00
db . promise ( )
. query ( 'INSERT INTO notes (user, text, created) VALUES (?,?,?)' , [ userId , noteText , created ] )
. then ( ( rows , fields ) => {
resolve ( rows [ 0 ] . insertId ) //Only return the new note ID when creating a new note
} )
. catch ( console . log )
} )
}
2019-07-21 09:28:07 -07:00
Notes . update = ( userId , noteId , noteText , fancyInput , color ) => {
2019-07-19 13:51:57 -07:00
return new Promise ( ( resolve , reject ) => {
2019-07-20 16:07:22 -07:00
const now = Math . round ( ( + new Date ) / 1000 )
2019-07-19 13:51:57 -07:00
db . promise ( )
2019-07-21 09:28:07 -07:00
. query ( 'UPDATE notes SET text = ?, raw_input = ?, updated = ?, color = ? WHERE id = ? AND user = ? LIMIT 1' , [ noteText , fancyInput , now , color , noteId , userId ] )
2019-07-19 13:51:57 -07:00
. then ( ( rows , fields ) => {
resolve ( rows [ 0 ] )
} )
. catch ( console . log )
} )
}
Notes . delete = ( userId , noteId ) => {
return new Promise ( ( resolve , reject ) => {
//Create new note, return created or finger your butt
} )
}
Notes . get = ( userId , noteId ) => {
return new Promise ( ( resolve , reject ) => {
db . promise ( )
2019-07-21 09:28:07 -07:00
. query ( 'SELECT text, updated, raw_input FROM notes WHERE user = ? AND id = ? LIMIT 1' , [ userId , noteId ] )
2019-07-19 13:51:57 -07:00
. then ( ( rows , fields ) => {
resolve ( rows [ 0 ] [ 0 ] )
} )
. catch ( console . log )
} )
}
Notes . getLatest = ( userId ) => {
return new Promise ( ( resolve , reject ) => {
db . promise ( )
. query ( 'SELECT id, SUBSTRING(text, 1, 100) as text FROM notes WHERE user = ? ORDER BY updated DESC, created DESC' , [ userId ] )
. then ( ( rows , fields ) => {
resolve ( rows [ 0 ] )
} )
. catch ( console . log )
} )
}
Notes . search = ( userId , searchQuery , searchTags ) => {
return new Promise ( ( resolve , reject ) => {
//Default note lookup gets all notes
let noteSearchQuery = `
2019-07-21 09:28:07 -07:00
SELECT notes . id , SUBSTRING ( text , 1 , 200 ) as text , updated , color
2019-07-19 13:51:57 -07:00
FROM notes
LEFT JOIN notes _tags ON ( notes . id = notes _tags . note _id )
WHERE user = ? `
let searchParams = [ userId ]
if ( searchQuery != '' ) {
//If a search query is defined, search notes for that word
searchParams . push ( '%' + searchQuery + '%' )
noteSearchQuery += ' AND text LIKE ?'
}
if ( searchTags . length > 0 ) {
//If tags are passed, use those tags in search
searchParams . push ( searchTags )
noteSearchQuery += ' AND notes_tags.tag_id IN (?)'
}
//Finish up note query
2019-07-20 16:07:22 -07:00
noteSearchQuery += ' GROUP BY notes.id ORDER BY updated DESC, created DESC, id DESC'
2019-07-19 13:51:57 -07:00
//Define return data objects
let returnData = {
'notes' : [ ] ,
'tags' : [ ]
}
db . promise ( )
. query ( noteSearchQuery , searchParams )
. then ( ( noteRows , noteFields ) => {
//Push all notes
returnData [ 'notes' ] = noteRows [ 0 ]
2019-07-20 16:07:22 -07:00
//pull out all note ids so we can fetch all tags for those notes
2019-07-19 13:51:57 -07:00
let noteIds = [ ]
returnData [ 'notes' ] . forEach ( note => {
2019-07-20 16:07:22 -07:00
//Grab note ID for finding tags
2019-07-19 13:51:57 -07:00
noteIds . push ( note . id )
2019-07-20 16:07:22 -07:00
//Attempt to pull string out of first tag in note
let reg = note . text . match ( /<([\w]+)[^>]*>(.*?)<\/\1>/ )
if ( reg != null ) {
note . text = reg [ 2 ]
}
//Return all notes with HTML tags pulled out
note . text = note . text
. replace ( /&[#A-Za-z0-9]+;/g , '' ) //Rip out all HTML entities
. replace ( /<[^>]+>/g , '' ) //Rip out all HTML tags
2019-07-19 13:51:57 -07:00
} )
//If no notes are returned, there are no tags, return empty
if ( noteIds . length == 0 ) {
resolve ( returnData )
}
//Only show tags of selected notes
db . promise ( )
. query ( ` SELECT tags.id, tags.text, count(tags.id) as usages FROM notes_tags
JOIN tags ON ( tags . id = notes _tags . tag _id )
WHERE notes _tags . user _id = ?
AND note _id IN ( ? )
GROUP BY tags . id
ORDER BY usages DESC ; ` ,[userId, noteIds])
. then ( ( tagRows , tagFields ) => {
returnData [ 'tags' ] = tagRows [ 0 ]
resolve ( returnData )
} )
. catch ( console . log )
} )
. catch ( console . log )
} )
}