getProducts method
Get products with pagination and advanced filtering.
Retrieves a paginated list of products from the catalog with comprehensive filtering options including search, category, price range, and stock status.
params
optional filter parameters object
page
the page number to retrieve (starts from 1)
pageSize
number of products per page (default: 20)
searchQuery
optional search term to filter products by name/description
categoryId
optional category ID to filter products by category
sortBy
field to sort by (e.g., 'name', 'price', 'created_at')
sortOrder
sort direction ('ASC' or 'DESC')
filters
additional custom filters to apply
minPrice
minimum price filter
maxPrice
maximum price filter
attributes
specific attributes to include in response
inStock
filter by stock availability
brand
filter by brand name
tags
filter by product tags
Returns a ProductListResponse containing the product list and pagination info.
Implementation
Future<ProductListResponse> getProducts({
ProductFilterParams? params,
int page = 1,
int pageSize = 20,
String? searchQuery,
String? categoryId,
String? sortBy,
String? sortOrder,
Map<String, dynamic>? filters,
double? minPrice,
double? maxPrice,
List<String>? attributes,
bool? inStock,
String? brand,
List<String>? tags,
}) async {
try {
// Build query parameters
final queryParams = <String, dynamic>{
'searchCriteria[pageSize]': pageSize,
'searchCriteria[currentPage]': page,
};
// Add search query if provided
if (searchQuery != null && searchQuery.isNotEmpty) {
queryParams['searchCriteria[filterGroups][0][filters][0][field]'] =
'name';
queryParams['searchCriteria[filterGroups][0][filters][0][value]'] =
'%$searchQuery%';
queryParams['searchCriteria[filterGroups][0][filters][0][conditionType]'] =
'like';
}
// Add category filter if provided
if (categoryId != null && categoryId.isNotEmpty) {
queryParams['searchCriteria[filterGroups][1][filters][0][field]'] =
'category_id';
queryParams['searchCriteria[filterGroups][1][filters][0][value]'] =
categoryId;
queryParams['searchCriteria[filterGroups][1][filters][0][conditionType]'] =
'eq';
}
// Add price filters if provided
if (minPrice != null) {
queryParams['searchCriteria[filterGroups][2][filters][0][field]'] =
'price';
queryParams['searchCriteria[filterGroups][2][filters][0][value]'] =
minPrice;
queryParams['searchCriteria[filterGroups][2][filters][0][conditionType]'] =
'gteq';
}
if (maxPrice != null) {
final priceGroupIndex = minPrice != null ? 3 : 2;
queryParams['searchCriteria[filterGroups][$priceGroupIndex][filters][0][field]'] =
'price';
queryParams['searchCriteria[filterGroups][$priceGroupIndex][filters][0][value]'] =
maxPrice;
queryParams['searchCriteria[filterGroups][$priceGroupIndex][filters][0][conditionType]'] =
'lteq';
}
// Add stock filter if provided
if (inStock != null) {
final stockGroupIndex = _getNextFilterGroupIndex(queryParams);
queryParams['searchCriteria[filterGroups][$stockGroupIndex][filters][0][field]'] =
'stock_status';
queryParams['searchCriteria[filterGroups][$stockGroupIndex][filters][0][value]'] =
inStock ? 1 : 0;
queryParams['searchCriteria[filterGroups][$stockGroupIndex][filters][0][conditionType]'] =
'eq';
}
// Add custom filters if provided
if (filters != null) {
final filterGroupIndex = _getNextFilterGroupIndex(queryParams);
var filterIndex = 0;
for (final entry in filters.entries) {
queryParams['searchCriteria[filterGroups][$filterGroupIndex][filters][$filterIndex][field]'] =
entry.key;
queryParams['searchCriteria[filterGroups][$filterGroupIndex][filters][$filterIndex][value]'] =
entry.value;
queryParams['searchCriteria[filterGroups][$filterGroupIndex][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 get products: ${response.statusMessage}');
}
} on DioException catch (e) {
throw Exception('Failed to get products: ${e.message}');
} catch (e) {
throw Exception('Failed to get products: $e');
}
}