searchProducts method

Future<ProductListResponse> searchProducts(
  1. String query, {
  2. int page = 1,
  3. int pageSize = 20,
  4. Map<String, dynamic>? filters,
  5. String? sortBy,
  6. String? sortOrder,
})

Search products

Implementation

Future<ProductListResponse> searchProducts(
  String query, {
  int page = 1,
  int pageSize = 20,
  Map<String, dynamic>? filters,
  String? sortBy,
  String? sortOrder,
}) async {
  try {
    final queryParams = <String, dynamic>{
      'searchCriteria[filterGroups][0][filters][0][field]': 'name',
      'searchCriteria[filterGroups][0][filters][0][value]': '%$query%',
      'searchCriteria[filterGroups][0][filters][0][conditionType]': 'like',
      'searchCriteria[pageSize]': pageSize,
      'searchCriteria[currentPage]': page,
    };

    // Add additional search fields
    queryParams['searchCriteria[filterGroups][0][filters][1][field]'] = 'sku';
    queryParams['searchCriteria[filterGroups][0][filters][1][value]'] =
        '%$query%';
    queryParams['searchCriteria[filterGroups][0][filters][1][conditionType]'] =
        'like';

    queryParams['searchCriteria[filterGroups][0][filters][2][field]'] =
        'description';
    queryParams['searchCriteria[filterGroups][0][filters][2][value]'] =
        '%$query%';
    queryParams['searchCriteria[filterGroups][0][filters][2][conditionType]'] =
        'like';

    // Add custom filters if provided
    if (filters != null) {
      var filterIndex = 3;
      for (final entry in filters.entries) {
        queryParams['searchCriteria[filterGroups][0][filters][$filterIndex][field]'] =
            entry.key;
        queryParams['searchCriteria[filterGroups][0][filters][$filterIndex][value]'] =
            entry.value;
        queryParams['searchCriteria[filterGroups][0][filters][$filterIndex][conditionType]'] =
            'eq';
        filterIndex++;
      }
    }

    // Add sorting if provided
    if (sortBy != null && sortBy.isNotEmpty) {
      queryParams['searchCriteria[sortOrders][0][field]'] = sortBy;
      queryParams['searchCriteria[sortOrders][0][direction]'] =
          sortOrder ?? 'ASC';
    }

    // Add fields to select
    queryParams['fields'] =
        'items[id,sku,name,price,special_price,status,visibility,stock_status,stock_quantity,description,short_description,meta_title,meta_description,meta_keyword,categories,websites,custom_attributes,media_gallery_entries,options,product_links,tier_prices,reviews,created_at,updated_at]';

    final response = await _client.guestRequest<Map<String, dynamic>>(
      '/rest/V1/products',
      queryParameters: queryParams,
    );

    if (response.statusCode == 200) {
      return ProductListResponse.fromJson(response.data!);
    } else {
      throw Exception('Failed to search products: ${response.statusMessage}');
    }
  } on DioException catch (e) {
    throw Exception('Failed to search products: ${e.message}');
  } catch (e) {
    throw Exception('Failed to search products: $e');
  }
}