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 ) => {
//Create new note, return created or finger your butt
} )
}
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 = `
SELECT notes . id , SUBSTRING ( text , 1 , 200 ) as text , updated , color
FROM notes
LEFT JOIN notes _tags ON ( notes . id = notes _tags . note _id )
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
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
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
} )
}