diff --git a/server/models/Document.js b/server/models/Document.js index c542d7c29..819edd835 100644 --- a/server/models/Document.js +++ b/server/models/Document.js @@ -258,6 +258,11 @@ Document.searchForTeam = async ( const wildcardQuery = `${sequelize.escape(query)}:*`; const collectionIds = await team.collectionIds(); + // If the team has access no public collections then shortcircuit the rest of this + if (!collectionIds.length) { + return []; + } + // Build the SQL query to get documentIds, ranking, and search term context const sql = ` SELECT @@ -328,6 +333,11 @@ Document.searchForUser = async ( collectionIds = await user.collectionIds(); } + // If the user has access to no collections then shortcircuit the rest of this + if (!collectionIds.length) { + return []; + } + let dateFilter; if (options.dateFilter) { dateFilter = `1 ${options.dateFilter}`; diff --git a/server/models/Document.test.js b/server/models/Document.test.js new file mode 100644 index 000000000..1d52b74e1 --- /dev/null +++ b/server/models/Document.test.js @@ -0,0 +1,45 @@ +/* eslint-disable flowtype/require-valid-file-annotation */ +import { flushdb } from '../test/support'; +import { Document } from '../models'; +import { buildDocument, buildCollection, buildTeam } from '../test/factories'; + +beforeEach(flushdb); +beforeEach(jest.resetAllMocks); + +describe('#searchForTeam', () => { + test('should return search results from public collections', async () => { + const team = await buildTeam(); + const collection = await buildCollection({ teamId: team.id }); + const document = await buildDocument({ + teamId: team.id, + collectionId: collection.id, + title: 'test', + }); + + const results = await Document.searchForTeam(team, 'test'); + expect(results.length).toBe(1); + expect(results[0].document.id).toBe(document.id); + }); + + test('should not return search results from private collections', async () => { + const team = await buildTeam(); + const collection = await buildCollection({ + private: true, + teamId: team.id, + }); + await buildDocument({ + teamId: team.id, + collectionId: collection.id, + title: 'test', + }); + + const results = await Document.searchForTeam(team, 'test'); + expect(results.length).toBe(0); + }); + + test('should handle no collections', async () => { + const team = await buildTeam(); + const results = await Document.searchForTeam(team, 'test'); + expect(results.length).toBe(0); + }); +});