public function getProducts($category_id, $language_id, $params)
 {
     $paging = array_get($params, 'paging', []);
     $page_index = 1;
     $page_size = 10;
     if (count($paging) > 0) {
         $page_index = count($paging) == 2 ? $paging[0] : 1;
         $page_size = count($paging) == 2 ? $paging[1] : $paging[0];
     }
     // force current page to 5
     //Paginator::setCurrentPage($page_index);
     Paginator::currentPageResolver(function () use($page_index) {
         return $page_index;
     });
     $query = Product::select('id', 'price', 'tax_class_id', 'price', 'image', 'views', 'pd.name as name', 'pd.description as description')->join('products_to_categories as pc', function ($join) use($category_id) {
         $join->on('products.id', '=', 'pc.product_id');
         $join->where('pc.category_id', '=', $category_id);
     })->leftJoin('products_descriptions AS pd', function ($join) use($language_id) {
         $join->on('products.id', '=', 'pd.product_id');
         $join->where('pd.language_id', '=', Context::getLanguageId());
     });
     $sorting = array_get($params, 'sorting', []);
     if (count($sorting) > 0) {
         $tokens = explode(":", $sorting[0]);
         $sort_column = $tokens[0];
         $sort_direction = count($tokens) > 1 ? $tokens[1] : 'asc';
         switch ($sort_column) {
             case 'price':
                 $query->orderBy('price', $sort_direction);
                 break;
             case 'popular':
                 $query->orderBy('views', $sort_direction);
                 break;
             case 'newest':
                 $query->orderBy('created_at', $sort_direction);
                 break;
         }
     }
     $items = $query->paginate($page_size);
     foreach ($items as $item) {
         $this->calculateTax($item);
     }
     return $items;
 }