32 lines
1.3 KiB
PHP
32 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace Krzysiej\RyobiCrawler\Controller;
|
|
|
|
use Krzysiej\RyobiCrawler\Models\Product;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\Routing\Attribute\Route;
|
|
|
|
final class PromosController extends BaseController
|
|
{
|
|
#[Route('/promos/{promo?}', name: 'app_promos')]
|
|
public function __invoke(?string $promo): Response
|
|
{
|
|
$products = Product::when(is_null($promo), fn($q) => $q->whereRaw('priceCurrent < productStandardPrice'))
|
|
->orderByDesc('starred')
|
|
->orderByDesc('created_by')
|
|
->with(['currentPrice', 'lowestPrice'])
|
|
->when(!is_null($promo), fn($q) => $q->whereRaw("json_extract(promotions, '$.slug') LIKE ?", $promo))
|
|
->get();
|
|
|
|
|
|
$promos = Product::select($this->database->getConnection()->raw("distinct json_extract(promotions, '$.slug') as slug, json_extract(promotions, '$.tag') as tag"))
|
|
->addSelect('countries.locale')
|
|
->whereRaw("json_extract(promotions, '$.tag') is not null")
|
|
->join('countries', 'products.country_id', '=', 'countries.id')
|
|
->get()
|
|
->groupBy('locale');
|
|
|
|
return $this->render('productList.html.twig', ['products' => $products, 'listType' => 'promos' . $promo, 'promos' => $promos->toArray()]);
|
|
}
|
|
}
|