{
if (query.length < 1) {
return;
}
const searchQuery = tsquery(query.trim() + '*');
- const queryResults = await this.db
+ let queryResults = this.db
.selectFrom('pages')
.select([
'id',
@@ -43,18 +49,71 @@ export class SearchService {
'highlight',
),
])
- .select((eb) => this.pageRepo.withSpace(eb))
- .where('spaceId', '=', searchParams.spaceId)
.where('tsv', '@@', sql`to_tsquery(${searchQuery})`)
.$if(Boolean(searchParams.creatorId), (qb) =>
qb.where('creatorId', '=', searchParams.creatorId),
)
.orderBy('rank', 'desc')
.limit(searchParams.limit | 20)
- .offset(searchParams.offset || 0)
- .execute();
+ .offset(searchParams.offset || 0);
- const searchResults = queryResults.map((result) => {
+ if (!searchParams.shareId) {
+ queryResults = queryResults.select((eb) => this.pageRepo.withSpace(eb));
+ }
+
+ if (searchParams.spaceId) {
+ // search by spaceId
+ queryResults = queryResults.where('spaceId', '=', searchParams.spaceId);
+ } else if (opts.userId && !searchParams.spaceId) {
+ // only search spaces the user is a member of
+ const userSpaceIds = await this.spaceMemberRepo.getUserSpaceIds(
+ opts.userId,
+ );
+ if (userSpaceIds.length > 0) {
+ queryResults = queryResults
+ .where('spaceId', 'in', userSpaceIds)
+ .where('workspaceId', '=', opts.workspaceId);
+ } else {
+ return [];
+ }
+ } else if (searchParams.shareId && !searchParams.spaceId && !opts.userId) {
+ // search in shares
+ const shareId = searchParams.shareId;
+ const share = await this.shareRepo.findById(shareId);
+ if (!share || share.workspaceId !== opts.workspaceId) {
+ return [];
+ }
+
+ const pageIdsToSearch = [];
+ if (share.includeSubPages) {
+ const pageList = await this.pageRepo.getPageAndDescendants(
+ share.pageId,
+ {
+ includeContent: false,
+ },
+ );
+
+ pageIdsToSearch.push(...pageList.map((page) => page.id));
+ } else {
+ pageIdsToSearch.push(share.pageId);
+ }
+
+ if (pageIdsToSearch.length > 0) {
+ queryResults = queryResults
+ .where('id', 'in', pageIdsToSearch)
+ .where('workspaceId', '=', opts.workspaceId);
+ } else {
+ return [];
+ }
+ } else {
+ return [];
+ }
+
+ //@ts-ignore
+ queryResults = await queryResults.execute();
+
+ //@ts-ignore
+ const searchResults = queryResults.map((result: SearchResponseDto) => {
if (result.highlight) {
result.highlight = result.highlight
.replace(/\r\n|\r|\n/g, ' ')