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