|
7 | 7 |
|
8 | 8 | 'use strict' |
9 | 9 |
|
10 | | -import { MeiliSearchError } from './errors' |
11 | | - |
| 10 | +import { |
| 11 | + MeiliSearchError, |
| 12 | + MeiliSearchCommunicationError, |
| 13 | + versionErrorHintMessage, |
| 14 | + MeiliSearchApiError, |
| 15 | +} from './errors' |
12 | 16 | import { |
13 | 17 | Config, |
14 | 18 | SearchResponse, |
@@ -302,30 +306,49 @@ class Index<T extends Record<string, any> = Record<string, any>> { |
302 | 306 | /// |
303 | 307 |
|
304 | 308 | /** |
305 | | - * Get documents of an index |
| 309 | + * Get documents of an index. |
306 | 310 | * |
307 | | - * @param parameters - Parameters to browse the documents |
308 | | - * @returns Promise containing Document responses |
| 311 | + * @param parameters - Parameters to browse the documents. Parameters can |
| 312 | + * contain the `filter` field only available in Meilisearch v1.2 and newer |
| 313 | + * @returns Promise containing the returned documents |
309 | 314 | */ |
310 | 315 | async getDocuments<D extends Record<string, any> = T>( |
311 | 316 | parameters: DocumentsQuery<D> = {} |
312 | 317 | ): Promise<ResourceResults<D[]>> { |
313 | | - const url = `indexes/${this.uid}/documents` |
314 | | - |
315 | | - const fields = (() => { |
316 | | - if (Array.isArray(parameters?.fields)) { |
317 | | - return parameters?.fields?.join(',') |
| 318 | + parameters = removeUndefinedFromObject(parameters) |
| 319 | + |
| 320 | + // In case `filter` is provided, use `POST /documents/fetch` |
| 321 | + if (parameters.filter !== undefined) { |
| 322 | + try { |
| 323 | + const url = `indexes/${this.uid}/documents/fetch` |
| 324 | + |
| 325 | + return await this.httpRequest.post< |
| 326 | + DocumentsQuery, |
| 327 | + Promise<ResourceResults<D[]>> |
| 328 | + >(url, parameters) |
| 329 | + } catch (e) { |
| 330 | + if (e instanceof MeiliSearchCommunicationError) { |
| 331 | + e.message = versionErrorHintMessage(e.message, 'getDocuments') |
| 332 | + } else if (e instanceof MeiliSearchApiError) { |
| 333 | + e.message = versionErrorHintMessage(e.message, 'getDocuments') |
| 334 | + } |
| 335 | + |
| 336 | + throw e |
318 | 337 | } |
319 | | - return undefined |
320 | | - })() |
| 338 | + // Else use `GET /documents` method |
| 339 | + } else { |
| 340 | + const url = `indexes/${this.uid}/documents` |
321 | 341 |
|
322 | | - return await this.httpRequest.get<Promise<ResourceResults<D[]>>>( |
323 | | - url, |
324 | | - removeUndefinedFromObject({ |
| 342 | + // Transform fields to query parameter string format |
| 343 | + const fields = Array.isArray(parameters?.fields) |
| 344 | + ? { fields: parameters?.fields?.join(',') } |
| 345 | + : {} |
| 346 | + |
| 347 | + return await this.httpRequest.get<Promise<ResourceResults<D[]>>>(url, { |
325 | 348 | ...parameters, |
326 | | - fields, |
| 349 | + ...fields, |
327 | 350 | }) |
328 | | - ) |
| 351 | + } |
329 | 352 | } |
330 | 353 |
|
331 | 354 | /** |
|
0 commit comments