it('verify creating a resource filter', function(callback) { // Ensure unspecified resource types searches all undeleted resources var filterUnspecifiedResources = SearchUtil.filterResources(); assert.strictEqual(filterUnspecifiedResources.and.length, 2); assert.strictEqual(filterUnspecifiedResources.and[0].term._type, 'resource'); assert.strictEqual(filterUnspecifiedResources.and[1].not.exists.field, 'deleted'); // Ensure empty resource types searches all var filterEmptyResources = SearchUtil.filterResources([]); assert.strictEqual(filterEmptyResources.and.length, 2); assert.strictEqual(filterEmptyResources.and[0].term._type, 'resource'); assert.strictEqual(filterEmptyResources.and[1].not.exists.field, 'deleted'); // Sanity check with one resource type var filterOneResource = SearchUtil.filterResources(['content']); assert.strictEqual(filterOneResource.and.length, 3); assert.strictEqual(filterOneResource.and[0].term._type, 'resource'); assert.strictEqual(filterOneResource.and[1].terms.resourceType[0], 'content'); assert.strictEqual(filterOneResource.and[2].not.exists.field, 'deleted'); var filterAllDeletedResources = SearchUtil.filterResources(null, SearchConstants.deleted.ONLY); assert.strictEqual(filterAllDeletedResources.and.length, 2); assert.strictEqual(filterAllDeletedResources.and[0].term._type, 'resource'); assert.strictEqual(filterAllDeletedResources.and[1].exists.field, 'deleted'); var filterAllDeletedAndExistingResources = SearchUtil.filterResources(null, SearchConstants.deleted.BOTH); assert.strictEqual(filterAllDeletedAndExistingResources.term._type, 'resource'); return callback(); });
var _search = function(ctx, opts, callback) { // The query and filter objects for the Query DSL var query = _createQuery(ctx, opts); var filterResources = SearchUtil.filterResources(opts.resourceTypes); SearchUtil.filterScopeAndAccess(ctx, opts.scope, _needsFilterByExplicitAccess(ctx, opts), function(err, filterScopeAndAccess) { if (err) { return callback(err); } // Create the filtered query var filter = SearchUtil.filterAnd(filterResources, filterScopeAndAccess); var filteredQuery = SearchUtil.createFilteredQuery(query, filter); // Give results from the current tenant a slight boost var boostingQuery = { 'function_score': { 'score_mode': 'sum', 'boost_mode': 'sum', 'functions': [{ 'filter': { 'term': { 'tenantAlias': ctx.tenant().alias } }, 'boost_factor': 1.5 }], 'query': filteredQuery } }; // Wrap the query and filter into the top-level Query DSL "query" object return callback(null, SearchUtil.createQuery(boostingQuery, null, opts)); }); };
module.exports = function(ctx, opts, callback) { // Sanitize custom search options opts = opts || {}; opts.limit = OaeUtil.getNumberParam(opts.limit, 10, 1, 25); var validator = new Validator(); validator.check(null, {'code': 401, 'msg': 'Only authenticated users can use email search'}).isLoggedInUser(ctx); validator.check(opts.q, {'code': 400, 'msg': 'An invalid email address has been specified'}).isEmail(); if (validator.hasErrors()) { return callback(validator.getFirstError()); } // Ensure the email address being searched is lower case so it is case insensitive var email = opts.q.toLowerCase(); var filterResources = SearchUtil.filterResources(['user']); var filterInteractingTenants = SearchUtil.filterInteractingTenants(ctx.user().tenant.alias); // When searching for users by email, we can ignore profile visibility in lieu of an email // exact match. The user profile is still "scrubbed" of private information on its way out, // however we enable the ability for a user to share with that profile if they know the email // address var query = SearchUtil.createEmailQuery(email); var queryOpts = _.extend({}, opts, {'minScore': 0}); var filter = SearchUtil.filterAnd(filterResources, filterInteractingTenants); return callback(null, SearchUtil.createQuery(query, filter, queryOpts)); };
it('verify creating a resource filter', function(callback) { // Ensure unspecified resource types searches all var filterUnspecifiedResources = SearchUtil.filterResources(); assert.ok(filterUnspecifiedResources.term); assert.equal(filterUnspecifiedResources.term._type, 'resource'); // Ensure empty resource types searches all var filterEmptyResources = SearchUtil.filterResources([]); assert.ok(filterUnspecifiedResources.term); assert.equal(filterUnspecifiedResources.term._type, 'resource'); // Sanity check with one resource type var filterOneResource = SearchUtil.filterResources(['content']); assert.ok(filterOneResource.and); assert.equal(filterOneResource.and[0].term._type, 'resource'); assert.equal(filterOneResource.and[1].terms.resourceType[0], 'content'); return callback(); });
var _search = function(ctx, opts, callback) { // The query object for the Query DSL var query = SearchUtil.createQueryStringQuery(opts.q); // The filter object for the Query DSL var filter = SearchUtil.filterAnd( SearchUtil.filterResources(['user']), SearchUtil.createHasChildQuery(FollowingConstants.search.MAPPING_RESOURCE_FOLLOWING, SearchUtil.filterTerms('following', [opts.userId])) ); // Wrap the query and filter into the top-level Query DSL "query" object and return it return callback(null, SearchUtil.createQuery(query, filter, opts)); };
var _search = function(ctx, opts, callback) { // The query and filter objects for the Query DSL var query = _createQuery(ctx, opts); var filterResources = SearchUtil.filterResources(opts.resourceTypes); SearchUtil.filterScopeAndAccess(ctx, opts.scope, _needsFilterByExplicitAccess(ctx, opts), function(err, filterScopeAndAccess) { if (err) { return callback(err); } var filter = SearchUtil.filterAnd(filterResources, filterScopeAndAccess); // Wrap the query and filter into the top-level Query DSL "query" object return callback(null, SearchUtil.createQuery(query, filter, opts)); }); };