getProducts method

Future<ProductListResponse> getProducts({
  1. ProductFilterParams? params,
  2. int page = 1,
  3. int pageSize = 20,
  4. String? searchQuery,
  5. String? categoryId,
  6. String? sortBy,
  7. String? sortOrder,
  8. Map<String, dynamic>? filters,
  9. double? minPrice,
  10. double? maxPrice,
  11. List<String>? attributes,
  12. bool? inStock,
  13. String? brand,
  14. List<String>? tags,
})

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