parent
5232fbf5c0
commit
1c39dd04fc
@ -1,135 +0,0 @@ |
|||||||
Meteor.methods |
|
||||||
messageSearch: (text, rid, limit) -> |
|
||||||
|
|
||||||
check text, String |
|
||||||
check rid, String |
|
||||||
check limit, Match.Optional(Number) |
|
||||||
|
|
||||||
if not Meteor.userId() |
|
||||||
throw new Meteor.Error 'error-invalid-user', 'Invalid user', { method: 'messageSearch' } |
|
||||||
|
|
||||||
### |
|
||||||
text = 'from:rodrigo mention:gabriel chat' |
|
||||||
### |
|
||||||
|
|
||||||
result = |
|
||||||
messages: [] |
|
||||||
users: [] |
|
||||||
channels: [] |
|
||||||
|
|
||||||
query = {} |
|
||||||
options = |
|
||||||
sort: |
|
||||||
ts: -1 |
|
||||||
limit: limit or 20 |
|
||||||
|
|
||||||
# Query for senders |
|
||||||
from = [] |
|
||||||
text = text.replace /from:([a-z0-9.-_]+)/ig, (match, username, index) -> |
|
||||||
from.push username |
|
||||||
return '' |
|
||||||
|
|
||||||
if from.length > 0 |
|
||||||
query['u.username'] = |
|
||||||
$regex: from.join('|') |
|
||||||
$options: 'i' |
|
||||||
|
|
||||||
|
|
||||||
# Query for mentions |
|
||||||
mention = [] |
|
||||||
text = text.replace /mention:([a-z0-9.-_]+)/ig, (match, username, index) -> |
|
||||||
mention.push username |
|
||||||
return '' |
|
||||||
|
|
||||||
if mention.length > 0 |
|
||||||
query['mentions.username'] = |
|
||||||
$regex: mention.join('|') |
|
||||||
$options: 'i' |
|
||||||
|
|
||||||
|
|
||||||
# Query in message text |
|
||||||
text = text.trim().replace(/\s\s/g, ' ') |
|
||||||
if text isnt '' |
|
||||||
# Regex search |
|
||||||
if /^\/.+\/[imxs]*$/.test text |
|
||||||
r = text.split('/') |
|
||||||
query.msg = |
|
||||||
$regex: r[1] |
|
||||||
$options: r[2] |
|
||||||
else if RocketChat.settings.get 'Message_AlwaysSearchRegExp' |
|
||||||
query.msg = |
|
||||||
$regex: text |
|
||||||
$options: 'i' |
|
||||||
else |
|
||||||
query.$text = |
|
||||||
$search: text |
|
||||||
options.fields = |
|
||||||
score: |
|
||||||
$meta: "textScore" |
|
||||||
|
|
||||||
# options.sort = |
|
||||||
# score: |
|
||||||
# $meta: 'textScore' |
|
||||||
|
|
||||||
if Object.keys(query).length > 0 |
|
||||||
query.t = { $ne: 'rm' } # hide removed messages (userful when searching for user messages) |
|
||||||
query._hidden = { $ne: true } # don't return _hidden messages |
|
||||||
|
|
||||||
# Filter by room |
|
||||||
if rid? |
|
||||||
query.rid = rid |
|
||||||
try |
|
||||||
if Meteor.call('canAccessRoom', rid, this.userId) isnt false |
|
||||||
if not RocketChat.settings.get 'Message_ShowEditedStatus' |
|
||||||
options.fields = { 'editedAt': 0 } |
|
||||||
result.messages = RocketChat.models.Messages.find(query, options).fetch() |
|
||||||
|
|
||||||
|
|
||||||
# make sure we don't return more than limit results |
|
||||||
# limit -= result.messages?.length |
|
||||||
|
|
||||||
# ### |
|
||||||
# # USERS |
|
||||||
# ### |
|
||||||
# if from.length is 0 and mention.length is 0 and text isnt '' |
|
||||||
# query = |
|
||||||
# username: |
|
||||||
# $regex: text |
|
||||||
# $options: 'i' |
|
||||||
|
|
||||||
# options = |
|
||||||
# limit: 5 |
|
||||||
# sort: |
|
||||||
# username: 1 |
|
||||||
# fields: |
|
||||||
# username: 1 |
|
||||||
# name: 1 |
|
||||||
# status: 1 |
|
||||||
# utcOffset: 1 |
|
||||||
|
|
||||||
# result.users = Meteor.users.find(query, options).fetch() |
|
||||||
|
|
||||||
|
|
||||||
# ### |
|
||||||
# # CHANNELS |
|
||||||
# ### |
|
||||||
# if from.length is 0 and mention.length is 0 and text isnt '' |
|
||||||
# query = |
|
||||||
# t: 'c' |
|
||||||
# name: |
|
||||||
# $regex: text |
|
||||||
# $options: 'i' |
|
||||||
|
|
||||||
# options = |
|
||||||
# limit: 5 |
|
||||||
# sort: |
|
||||||
# name: 1 |
|
||||||
# fields: |
|
||||||
# username: 1 |
|
||||||
# name: 1 |
|
||||||
# status: 1 |
|
||||||
# utcOffset: 1 |
|
||||||
|
|
||||||
# result.channels = ChatRoom.find(query, options).fetch() |
|
||||||
|
|
||||||
return result |
|
||||||
@ -0,0 +1,108 @@ |
|||||||
|
Meteor.methods({ |
||||||
|
messageSearch: function (text, rid, limit) { |
||||||
|
var from, mention, options, query, r, result; |
||||||
|
check(text, String); |
||||||
|
check(rid, String); |
||||||
|
check(limit, Match.Optional(Number)); |
||||||
|
if (!Meteor.userId()) { |
||||||
|
throw new Meteor.Error('error-invalid-user', 'Invalid user', { |
||||||
|
method: 'messageSearch' |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
text = 'from:rodrigo mention:gabriel chat' |
||||||
|
*/ |
||||||
|
result = { |
||||||
|
messages: [], |
||||||
|
users: [], |
||||||
|
channels: [] |
||||||
|
}; |
||||||
|
query = {}; |
||||||
|
options = { |
||||||
|
sort: { |
||||||
|
ts: -1 |
||||||
|
}, |
||||||
|
limit: limit || 20 |
||||||
|
}; |
||||||
|
|
||||||
|
// Query for senders
|
||||||
|
from = []; |
||||||
|
text = text.replace(/from:([a-z0-9.-_]+)/ig, function (match, username) { |
||||||
|
from.push(username); |
||||||
|
return ''; |
||||||
|
}); |
||||||
|
if (from.length > 0) { |
||||||
|
query['u.username'] = { |
||||||
|
$regex: from.join('|'), |
||||||
|
$options: 'i' |
||||||
|
}; |
||||||
|
} |
||||||
|
// Query for senders
|
||||||
|
mention = []; |
||||||
|
text = text.replace(/mention:([a-z0-9.-_]+)/ig, function (match, username) { |
||||||
|
mention.push(username); |
||||||
|
return ''; |
||||||
|
}); |
||||||
|
if (mention.length > 0) { |
||||||
|
query['mentions.username'] = { |
||||||
|
$regex: mention.join('|'), |
||||||
|
$options: 'i' |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
//Query for filtering on a specific day
|
||||||
|
// matches dd-MM-yyyy, dd/MM/yyyy, dd-MM-yyyy, prefixed by on:
|
||||||
|
// Example: on:15/09/2016
|
||||||
|
|
||||||
|
|
||||||
|
// Query in message text
|
||||||
|
text = text.trim().replace(/\s\s/g, ' '); |
||||||
|
if (text !== '') { |
||||||
|
if (/^\/.+\/[imxs]*$/.test(text)) { |
||||||
|
r = text.split('/'); |
||||||
|
query.msg = { |
||||||
|
$regex: r[1], |
||||||
|
$options: r[2] |
||||||
|
}; |
||||||
|
} else if (RocketChat.settings.get('Message_AlwaysSearchRegExp')) { |
||||||
|
query.msg = { |
||||||
|
$regex: text, |
||||||
|
$options: 'i' |
||||||
|
}; |
||||||
|
} else { |
||||||
|
query.$text = { |
||||||
|
$search: text |
||||||
|
}; |
||||||
|
options.fields = { |
||||||
|
score: { |
||||||
|
$meta: "textScore" |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
if (Object.keys(query).length > 0) { |
||||||
|
query.t = { |
||||||
|
$ne: 'rm' //hide removed messages (useful when searching for user messages)
|
||||||
|
}; |
||||||
|
query._hidden = { |
||||||
|
$ne: true // don't return _hidden messages
|
||||||
|
}; |
||||||
|
if (rid != null) { |
||||||
|
query.rid = rid; |
||||||
|
try { |
||||||
|
if (Meteor.call('canAccessRoom', rid, this.userId) !== false) { |
||||||
|
if (!RocketChat.settings.get('Message_ShowEditedStatus')) { |
||||||
|
options.fields = { |
||||||
|
'editedAt': 0 |
||||||
|
}; |
||||||
|
} |
||||||
|
result.messages = RocketChat.models.Messages.find(query, options).fetch(); |
||||||
|
} |
||||||
|
} catch (_error) { |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
}); |
||||||
Loading…
Reference in new issue