More filtering of messages results without ACS

+ filterMessageListByReadACS()
* Use filterMessageListByReadACS() in my messages
* Use filterMessageListByReadACS() in message search
This commit is contained in:
Bryan Ashby 2019-09-11 22:03:24 -06:00
parent 36afcc0298
commit afd6d4265f
No known key found for this signature in database
GPG Key ID: B49EB437951D2542
3 changed files with 49 additions and 26 deletions

View File

@ -33,6 +33,7 @@ exports.changeMessageConference = changeMessageConference;
exports.changeMessageArea = changeMessageArea; exports.changeMessageArea = changeMessageArea;
exports.hasMessageConfAndAreaRead = hasMessageConfAndAreaRead; exports.hasMessageConfAndAreaRead = hasMessageConfAndAreaRead;
exports.filterMessageAreaTagsByReadACS = filterMessageAreaTagsByReadACS; exports.filterMessageAreaTagsByReadACS = filterMessageAreaTagsByReadACS;
exports.filterMessageListByReadACS = filterMessageListByReadACS;
exports.tempChangeMessageConfAndArea = tempChangeMessageConfAndArea; exports.tempChangeMessageConfAndArea = tempChangeMessageConfAndArea;
exports.getMessageListForArea = getMessageListForArea; exports.getMessageListForArea = getMessageListForArea;
exports.getNewMessageCountInAreaForUser = getNewMessageCountInAreaForUser; exports.getNewMessageCountInAreaForUser = getNewMessageCountInAreaForUser;
@ -420,6 +421,29 @@ function filterMessageAreaTagsByReadACS(client, areaTags) {
}); });
} }
function filterMessageListByReadACS(client, messageList) {
//
// Filter out messages belonging to conf/areas the user
// doesn't have access to.
//
// Keep a cache around for quick lookup.
const acsCache = new Map(); // areaTag:boolean
return messageList.filter(msg => {
let cached = acsCache.get(msg.areaTag);
if(false === cached) {
return false;
}
if(true === cached) {
return true;
}
cached = hasMessageConfAndAreaRead(client, msg.areaTag);
acsCache.set(msg.areaTag, cached);
return cached;
});
}
function getNewMessageCountInAreaForUser(userId, areaTag, cb) { function getNewMessageCountInAreaForUser(userId, areaTag, cb) {
getMessageAreaLastReadId(userId, areaTag, (err, lastMessageId) => { getMessageAreaLastReadId(userId, areaTag, (err, lastMessageId) => {
lastMessageId = lastMessageId || 0; lastMessageId = lastMessageId || 0;

View File

@ -7,6 +7,8 @@ const {
getSortedAvailMessageConferences, getSortedAvailMessageConferences,
getAvailableMessageAreasByConfTag, getAvailableMessageAreasByConfTag,
getSortedAvailMessageAreasByConfTag, getSortedAvailMessageAreasByConfTag,
hasMessageConfAndAreaRead,
filterMessageListByReadACS,
} = require('./message_area.js'); } = require('./message_area.js');
const Errors = require('./enig_error.js').Errors; const Errors = require('./enig_error.js').Errors;
const Message = require('./message.js'); const Message = require('./message.js');
@ -101,6 +103,14 @@ exports.getModule = class MessageBaseSearch extends MenuModule {
limit : 2048, // :TODO: best way to handle this? we should probably let the user know if some results are returned limit : 2048, // :TODO: best way to handle this? we should probably let the user know if some results are returned
}; };
const returnNoResults = () => {
return this.gotoMenu(
this.menuConfig.config.noResultsMenu || 'messageSearchNoResults',
{ menuFlags : [ 'popParent' ] },
cb
);
};
if(isAdvanced) { if(isAdvanced) {
filter.toUserName = value.toUserName; filter.toUserName = value.toUserName;
filter.fromUserName = value.fromUserName; filter.fromUserName = value.fromUserName;
@ -113,7 +123,11 @@ exports.getModule = class MessageBaseSearch extends MenuModule {
(area, areaTag) => areaTag (area, areaTag) => areaTag
); );
} else if(value.areaTag) { } else if(value.areaTag) {
filter.areaTag = value.areaTag; // specific conf + area if(hasMessageConfAndAreaRead(this.client, value.areaTag)) {
filter.areaTag = value.areaTag; // specific conf + area
} else {
return returnNoResults();
}
} }
} }
@ -122,12 +136,14 @@ exports.getModule = class MessageBaseSearch extends MenuModule {
return cb(err); return cb(err);
} }
// don't include results without ACS -- if the user searched by
// explicit conf/area tag, we should have already filtered (above)
if(!value.confTag && !value.areaTag) {
messageList = filterMessageListByReadACS(this.client, messageList);
}
if(0 === messageList.length) { if(0 === messageList.length) {
return this.gotoMenu( return returnNoResults();
this.menuConfig.config.noResultsMenu || 'messageSearchNoResults',
{ menuFlags : [ 'popParent' ] },
cb
);
} }
const menuOpts = { const menuOpts = {

View File

@ -6,7 +6,7 @@ const MenuModule = require('./menu_module.js').MenuModule;
const Message = require('./message.js'); const Message = require('./message.js');
const UserProps = require('./user_property.js'); const UserProps = require('./user_property.js');
const { const {
hasMessageConfAndAreaRead filterMessageListByReadACS
} = require('./message_area.js'); } = require('./message_area.js');
exports.moduleInfo = { exports.moduleInfo = {
@ -34,25 +34,8 @@ exports.getModule = class MyMessagesModule extends MenuModule {
return this.prevMenu(); return this.prevMenu();
} }
// // don't include results without ACS
// We need to filter out messages belonging to conf/areas the user this.messageList = filterMessageListByReadACS(this.client, messageList);
// doesn't have access to.
//
// Keep a cache around for quick lookup.
//
const acsCache = new Map(); // areaTag:boolean
this.messageList = messageList.filter(msg => {
let cached = acsCache.get(msg.areaTag);
if(false === cached) {
return false;
}
if(true === cached) {
return true;
}
cached = hasMessageConfAndAreaRead(this.client, msg.areaTag);
acsCache.set(msg.areaTag, cached);
return cached;
});
this.finishedLoading(); this.finishedLoading();
}); });