| 253 | } |
| 254 | |
| 255 | function buildGmailSearchQuery(config: { |
| 256 | labelIds?: string[] |
| 257 | labelFilterBehavior?: 'INCLUDE' | 'EXCLUDE' |
| 258 | searchQuery?: string |
| 259 | }): string { |
| 260 | let labelQuery = '' |
| 261 | if (config.labelIds && config.labelIds.length > 0) { |
| 262 | const labelParts = config.labelIds.map((label) => `label:${label}`).join(' OR ') |
| 263 | labelQuery = |
| 264 | config.labelFilterBehavior === 'INCLUDE' |
| 265 | ? config.labelIds.length > 1 |
| 266 | ? `(${labelParts})` |
| 267 | : labelParts |
| 268 | : config.labelIds.length > 1 |
| 269 | ? `-(${labelParts})` |
| 270 | : `-${labelParts}` |
| 271 | } |
| 272 | |
| 273 | let searchQueryPart = '' |
| 274 | if (config.searchQuery?.trim()) { |
| 275 | searchQueryPart = config.searchQuery.trim() |
| 276 | if (searchQueryPart.includes(' OR ') || searchQueryPart.includes(' AND ')) { |
| 277 | searchQueryPart = `(${searchQueryPart})` |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | let baseQuery = '' |
| 282 | if (labelQuery && searchQueryPart) { |
| 283 | baseQuery = `${labelQuery} ${searchQueryPart}` |
| 284 | } else if (searchQueryPart) { |
| 285 | baseQuery = searchQueryPart |
| 286 | } else if (labelQuery) { |
| 287 | baseQuery = labelQuery |
| 288 | } else { |
| 289 | baseQuery = 'in:inbox' |
| 290 | } |
| 291 | |
| 292 | return baseQuery |
| 293 | } |
| 294 | |
| 295 | async function searchEmails( |
| 296 | accessToken: string, |