searchProducts method
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');
}
}