2019-07-19 13:51:57 -07:00
let db = require ( '@config/database' )
2019-07-24 11:06:50 -07:00
let Tags = require ( '@models/Tags' )
let Attachment = require ( '@models/Attachment' )
var rp = require ( 'request-promise' ) ;
var SolrNode = require ( 'solr-node' ) ;
2019-07-19 13:51:57 -07:00
let Notes = module . exports = { }
2019-07-24 11:06:50 -07:00
// Create client
var client = new SolrNode ( {
host : '127.0.0.1' ,
port : '8983' ,
core : 'note' ,
protocol : 'http'
} ) ;
2019-07-19 13:51:57 -07:00
Notes . create = ( userId , noteText ) => {
return new Promise ( ( resolve , reject ) => {
2019-07-24 11:06:50 -07:00
if ( userId == null || userId < 10 ) { reject ( 'User Id required to create note' ) }
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 ) => {
2019-07-24 11:06:50 -07:00
//Process note text and attachment data
Attachment . scanTextForWebsites ( userId , noteId , noteText ) . then ( attachmentText => {
//
// Update Solr index
//
Tags . string ( userId , noteId ) . then ( tagString => {
// JSON Data
var data = {
'id' : noteId , //string - ID of note
'user_id' : userId , //int
'note_text' : noteText ,
'notes_tags' : tagString ,
'attachment_text' : attachmentText ,
} ;
// Update document to Solr server
client . update ( data , function ( err , result ) {
if ( err ) { console . log ( err ) ; return ; }
console . log ( 'Note Solr Update, node/solrid (' + noteId + '):' ) ;
console . log ( result . responseHeader )
} ) ;
} )
} )
//Send back updated response
2019-07-19 13:51:57 -07:00
resolve ( rows [ 0 ] )
} )
. catch ( console . log )
} )
}
Notes . delete = ( userId , noteId ) => {
return new Promise ( ( resolve , reject ) => {
2019-07-29 00:22:47 -07:00
// DELETE FROM notes WHERE notes.id = 290 AND notes.user = 61;
// DELETE FROM attachment WHERE attachment.note_id = 290 AND attachment.user_id = 61;
// DELETE FROM notes_tags WHERE notes_tags.note_id = 290 AND notes_tags.user_id = 61;
db . promise ( ) . query ( 'DELETE FROM notes WHERE notes.id = ? AND notes.user = ?' , [ noteId , userId ] )
. then ( ( rows , fields ) => {
db . promise ( ) . query ( 'DELETE FROM attachment WHERE attachment.note_id = ? AND attachment.user_id = ?' , [ noteId , userId ] )
. then ( ( rows , fields ) => {
db . promise ( ) . query ( 'DELETE FROM notes_tags WHERE notes_tags.note_id = ? AND notes_tags.user_id = ?' , [ noteId , userId ] )
. then ( ( rows , fields ) => {
console . log ( 'All Deleted' )
resolve ( true )
} )
} )
} )
2019-07-19 13:51:57 -07:00
} )
}
Notes . get = ( userId , noteId ) => {
return new Promise ( ( resolve , reject ) => {
db . promise ( )
2019-07-24 11:06:50 -07:00
. query ( 'SELECT text, updated, raw_input, color 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 )
} )
}
2019-07-24 11:06:50 -07:00
Notes . solrQuery = ( userId , searchQuery , searchTags ) => {
2019-07-19 13:51:57 -07:00
return new Promise ( ( resolve , reject ) => {
2019-07-24 11:06:50 -07:00
if ( searchQuery != '' && searchQuery != null ) {
let urlQuery = ` /solr/note/select?hl.fl=note_text&hl=on&q=user_id: ${ userId } AND note_text: ${ searchQuery } &wt=json `
urlQuery = ` /solr/note/select?
hl . fl = note _text , attachment _text , notes _tags &
hl = on &
q = user _id : $ { userId } AND ( note _text : $ { searchQuery } OR attachment _text : $ { searchQuery } OR notes _tags : $ { searchQuery } ) &
wt = json &
fl = id &
hl . fl = note _text , attachment _text , notes _tags &
hl . snippets = 20 &
hl . maxAnalyzedChars = 100000 `
rp ( 'http://127.0.0.1:8983' + urlQuery )
. then ( function ( htmlString ) {
let solrResult = JSON . parse ( htmlString )
resolve ( solrResult )
} )
} else {
resolve ( [ ] )
2019-07-19 13:51:57 -07:00
}
2019-07-24 11:06:50 -07:00
} )
}
2019-07-19 13:51:57 -07:00
2019-07-24 11:06:50 -07:00
Notes . search = ( userId , searchQuery , searchTags ) => {
return new Promise ( ( resolve , reject ) => {
2019-07-19 13:51:57 -07:00
//Define return data objects
let returnData = {
'notes' : [ ] ,
'tags' : [ ]
}
2019-07-24 11:06:50 -07:00
Notes . solrQuery ( userId , searchQuery , searchTags ) . then ( solrResult => {
let highlights = solrResult . highlighting
//Parse Note ID's from solr search
let solrNoteIds = [ ]
if ( solrResult . response ) {
solrResult . response . docs . forEach ( item => {
solrNoteIds . push ( parseInt ( item . id ) )
} )
}
//Default note lookup gets all notes
let noteSearchQuery = `
2019-07-29 00:22:47 -07:00
SELECT notes . id , SUBSTRING ( notes . text , 1 , 400 ) as text , updated , color , count ( distinct notes _tags . id ) as tag _count , count ( distinct attachment . id ) as attachment _count
2019-07-24 11:06:50 -07:00
FROM notes
LEFT JOIN notes _tags ON ( notes . id = notes _tags . note _id )
2019-07-29 00:22:47 -07:00
LEFT JOIN attachment ON ( notes . id = attachment . note _id AND attachment . attachment _type = 1 )
2019-07-24 11:06:50 -07:00
WHERE user = ? `
let searchParams = [ userId ]
if ( solrNoteIds . length > 0 ) {
searchParams . push ( solrNoteIds )
noteSearchQuery += ' AND notes.id IN (?)'
}
// 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 (?)'
2019-07-19 13:51:57 -07:00
}
2019-07-24 11:06:50 -07:00
//Finish up note query
noteSearchQuery += ' GROUP BY notes.id ORDER BY updated DESC, created DESC, id DESC'
2019-07-19 13:51:57 -07:00
db . promise ( )
2019-07-24 11:06:50 -07:00
. query ( noteSearchQuery , searchParams )
. then ( ( noteRows , noteFields ) => {
//Push all notes
returnData [ 'notes' ] = noteRows [ 0 ]
//pull out all note ids so we can fetch all tags for those notes
let noteIds = [ ]
returnData [ 'notes' ] . forEach ( note => {
//Grab note ID for finding tags
noteIds . push ( note . id )
//Attempt to pull string out of first tag in note
2019-07-29 00:22:47 -07:00
let reg = note . text . match ( /<([\w]+)[^>]*>(.*?)<\/\1>/g )
//Pull out first html tag contents, that is the title
if ( reg != null && reg [ 0 ] ) {
note . title = reg [ 0 ] //First line from HTML
} else {
note . title = note . text //Entire note
2019-07-24 11:06:50 -07:00
}
2019-07-29 00:22:47 -07:00
//Clean up html title
note . title = note . title
2019-07-24 11:06:50 -07:00
. replace ( /&[#A-Za-z0-9]+;/g , '' ) //Rip out all HTML entities
. replace ( /<[^>]+>/g , '' ) //Rip out all HTML tags
2019-07-29 00:22:47 -07:00
//Generate Subtext
if ( note . text != '' && note . title != '' ) {
note . subtext = note . text
. replace ( /&[#A-Za-z0-9]+;/g , ' ' ) //Rip out all HTML entities
. replace ( /<[^>]+>/g , ' ' ) //Rip out all HTML tags
. replace ( /\s+/g , ' ' ) //Remove all whitespace
. substring ( note . title . length + 2 )
}
2019-07-24 11:06:50 -07:00
note . note _highlights = [ ]
note . attachment _highlights = [ ]
note . tag _highlights = [ ]
//Push in solr highlights
if ( highlights && highlights [ note . id ] && highlights [ note . id ] . note _text ) {
note [ 'note_highlights' ] = highlights [ note . id ] . note _text
}
if ( highlights && highlights [ note . id ] && highlights [ note . id ] . attachment _text ) {
note [ 'attachment_highlights' ] = highlights [ note . id ] . attachment _text
}
if ( highlights && highlights [ note . id ] && highlights [ note . id ] . notes _tags ) {
note [ 'tag_highlights' ] = highlights [ note . id ] . notes _tags
}
} )
//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 ]
2019-07-19 13:51:57 -07:00
2019-07-24 11:06:50 -07:00
resolve ( returnData )
} )
. catch ( console . log )
2019-07-19 13:51:57 -07:00
} )
. catch ( console . log )
} )
. catch ( console . log )
2019-07-24 11:06:50 -07:00
2019-07-19 13:51:57 -07:00
} )
}