diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index 640a8449d..6b63a73a8 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -148,6 +148,50 @@ const appendInFilter = (builder: ESBuilder, filter: InFilter): ESBuilder => { gte: 'now-14d', }, }) + case InFilter.LIBRARY: + return builder.query('nested', { + path: 'labels', + query: { + bool: { + should: [ + { + term: { + 'labels.name': 'library', + }, + }, + { + bool: { + must_not: { + terms: { + 'labels.name': ['newsletter', 'rss'], + }, + }, + should: [], + }, + }, + ], + minimum_should_match: 1, + }, + }, + }) + case InFilter.SUBSCRIPTION: + return builder + .andQuery('nested', { + path: 'labels', + query: { + terms: { + 'labels.name': ['newsletter', 'rss'], + }, + }, + }) + .notQuery('nested', { + path: 'labels', + query: { + term: { + 'labels.name': 'library', + }, + }, + }) } return builder } diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 7e4fbd08d..ccd488bb5 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -22,6 +22,8 @@ export enum InFilter { INBOX, ARCHIVE, TRASH, + SUBSCRIPTION, + LIBRARY, } export interface SearchFilter { @@ -123,7 +125,12 @@ const parseInFilter = ( return InFilter.ARCHIVE case 'TRASH': return InFilter.TRASH + case 'SUBSCRIPTION': + return InFilter.SUBSCRIPTION + case 'LIBRARY': + return InFilter.LIBRARY } + return query ? InFilter.ALL : InFilter.INBOX }