Skip to content

Commit 135ab68

Browse files
Nelfiazawaze
authored andcommitted
Upgrade features from thelia 2.5 version
1 parent f8ac607 commit 135ab68

32 files changed

+711
-250
lines changed

Commands/GenerateIndexesCommand.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class GenerateIndexesCommand extends ContainerAwareCommand
1414
{
15-
public function configure()
15+
public function configure() : void
1616
{
1717
$this
1818
->setName('tntsearch:indexes')
@@ -23,16 +23,16 @@ public function execute(InputInterface $input, OutputInterface $output): int
2323
{
2424
$fs = new Filesystem();
2525

26-
/** @var IndexationProvider $indexationProvider */
27-
$indexationProvider = $this->getContainer()->get('tntsearch.indexation.provider');
28-
2926
if (is_dir(TntSearch::INDEXES_DIR)) {
3027
$fs->remove(TntSearch::INDEXES_DIR);
3128
}
3229

3330
ini_set('max_execution_time', 3600);
3431

3532
try {
33+
/** @var IndexationProvider $indexationProvider */
34+
$indexationProvider = $this->getContainer()->get('tntsearch.indexation.provider');
35+
3636
$indexationProvider->indexAll();
3737

3838
} catch (Exception $exception) {

CompilerPass/IndexPass.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ class IndexPass implements CompilerPassInterface
1212
* @param ContainerBuilder $container
1313
* @return void
1414
*/
15-
public function process(ContainerBuilder $container)
15+
16+
public function process(ContainerBuilder $container): void
17+
1618
{
1719
if (!$container->has('tntsearch.indexation.provider')) {
1820
return;

Config/config.xml

+13-11
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
</commands>
1010

1111
<loops>
12-
<loop name="tnt-search" class="TntSearch\Loop\SearchLoop"/>
12+
13+
<loop name="search_loop" class="TntSearch\Loop\SearchLoop"/>
1314
</loops>
1415

1516
<services>
@@ -25,12 +26,13 @@
2526
<argument type="service" id="tntsearch.stop.word"/>
2627
</service>
2728

28-
<service id="tntsearch.indexation.provider" class="TntSearch\Service\Provider\IndexationProvider">
29-
</service>
29+
<service id="tntsearch.indexation.provider" class="TntSearch\Service\Provider\IndexationProvider" />
3030

31-
<service id="tntsearch.update.index" class="TntSearch\Service\IndexItem">
31+
<!--Services-->
32+
<service id="tntsearch.update.index" class="TntSearch\Service\ItemIndexation">
3233
<argument type="service" id="tntsearch.indexation.provider"/>
3334
<argument type="service" id="tntsearch.provider"/>
35+
<argument type="service" id="event_dispatcher"/>
3436
</service>
3537

3638
<service id="tntsearch.stop.word" class="TntSearch\Service\StopWord">
@@ -41,8 +43,14 @@
4143
<argument type="service" id="event_dispatcher"/>
4244
</service>
4345

46+
<service id="tntsearch.search" class="TntSearch\Service\Search">
47+
<argument type="service" id="tntsearch.indexation.provider"/>
48+
<argument type="service" id="tntsearch.provider"/>
49+
</service>
50+
4451
<!--Indexation -->
4552
<service id="tntsearch.base.index" abstract="true">
53+
<argument type="service" id="event_dispatcher"/>
4654
<argument type="service" id="tntsearch.provider"/>
4755
</service>
4856

@@ -67,17 +75,11 @@
6775
<service id="tntsearch.index.folder" class="TntSearch\Index\Folder" parent="tntsearch.base.index" shared="false">
6876
<tag name="tntsearch.index"/>
6977
</service>
70-
71-
<!--Search -->
72-
<service id="tntsearch.search" class="TntSearch\Service\Search">
73-
<argument type="service" id="tntsearch.indexation.provider"/>
74-
<argument type="service" id="tntsearch.provider"/>
75-
</service>
7678
</services>
7779

7880
<hooks>
7981
<hook id="tntsearch.hook" class="TntSearch\Hook\BackHook">
80-
<tag name="hook.event_listener" event="module.configuration" type="back" method="onModuleConfiguration"/>
82+
<tag name="hook.event_listener" event="module.configuration" type="back" method="onModuleConfig"/>
8183
</hook>
8284
</hooks>
8385
</config>

Config/module.xml

+13-6
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,19 @@
1313
<language>en_US</language>
1414
<language>fr_FR</language>
1515
</languages>
16-
<version>1.0.0</version>
16+
<version>1.1.0</version>
1717
<authors>
18-
<author>
19-
<name>Nicolas Barbey</name>
20-
<email>nbarbey@openstudio.com</email>
21-
</author>
2218
<author>
2319
<name>Bertrand tourlonias</name>
20+
<company>OpenStudio</company>
2421
<email>btourlonias@openstudio.com</email>
22+
<website>www.openstudio.fr</website>
23+
</author>
24+
<author>
25+
<name>Nicolas Barbey</name>
26+
<company>OpenStudio</company>
27+
<email>nbarbey@openstudio.com</email>
28+
<website>www.openstudio.fr</website>
2529
</author>
2630
<author>
2731
<name>Franck Allimant</name>
@@ -31,7 +35,10 @@
3135
</author>
3236
</authors>
3337
<type>classic</type>
34-
<thelia>2.3.4</thelia>
38+
<required>
39+
<module version=">=1.0.24">OpenApi</module>
40+
</required>
41+
<thelia>2.4.0</thelia>
3542
<stability>other</stability>
3643
<mandatory>0</mandatory>
3744
<hidden>0</hidden>

Config/routing.xml

+10-6
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
55
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
66

7-
<route id="tntsearch.admin.search" path="/admin/search">
8-
<default key="_controller">TntSearch\Controller\SearchController::SearchAdminAction</default>
7+
<route id="tntsearch.generate.indexes" path="/admin/module/TntSearch/generate-indexes">
8+
<default key="_controller">TntSearch\Controller\IndexationController::generateIndexesAction</default>
99
</route>
1010

11-
<route id="tntsearch.generate.indexes" path="/admin/module/TntSearch/generateIndexes">
12-
<default key="_controller">TntSearch\Controller\IndexationController::generateIndexesAction</default>
11+
<route id="tntsearch.update.config" path="/admin/module/TntSearch/configuration" methods="post">
12+
<default key="_controller">TntSearch\Controller\ConfigurationController::configuration</default>
13+
</route>
14+
15+
<route id="tntsearch.admin.search" path="/admin/search">
16+
<default key="_controller">TntSearch\Controller\SearchController::searchAdminAction</default>
1317
</route>
1418

15-
<route id="tntsearch.update.config" path="/admin/module/TntSearch/update-configuration" methods="post">
16-
<default key="_controller">TntSearch\Controller\IndexationController::updateConfigAction</default>
19+
<route id="indexes_search" path="/open_api/tnt-search">
20+
<default key="_controller">TntSearch\Controller\Front\SearchOpenApiController::apiSearch</default>
1721
</route>
1822
</routes>

Connector/PropelConnector.php

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace TntSearch\Connector;
4+
5+
use Propel\Runtime\Connection\PdoConnection;
6+
use Propel\Runtime\Propel;
7+
use TeamTNT\TNTSearch\Connectors\Connector;
8+
9+
class PropelConnector extends Connector
10+
{
11+
/**
12+
* Establish a database connection to use propel
13+
*
14+
* @param array $config
15+
* @return PdoConnection
16+
*/
17+
public function connect(array $config): PdoConnection
18+
{
19+
return Propel::getConnection()->getWrappedConnection();
20+
}
21+
}
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace TntSearch\Controller;
4+
5+
use Symfony\Component\HttpFoundation\RedirectResponse;
6+
use Thelia\Controller\Admin\BaseAdminController;
7+
use Thelia\Tools\URL;
8+
use TntSearch\TntSearch;
9+
10+
class ConfigurationController extends BaseAdminController
11+
{
12+
public function configuration(): RedirectResponse
13+
{
14+
$request = $this->getRequest();
15+
16+
$onTheFlyUpdate = (bool)$request->get('on-the-fly-update',false);
17+
18+
TntSearch::setConfigValue(TntSearch::ON_THE_FLY_UPDATE, $onTheFlyUpdate);
19+
20+
return new RedirectResponse(URL::getInstance()->absoluteUrl("/admin/module/TntSearch"));
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<?php
2+
3+
namespace TntSearch\Controller\Front;
4+
5+
use OpenApi\Annotations as OA;
6+
use OpenApi\Model\Api\ModelFactory;
7+
use OpenApi\Service\OpenApiService;
8+
use Propel\Runtime\ActiveQuery\Criteria;
9+
use Symfony\Component\Routing\Annotation\Route;
10+
use Thelia\Controller\Front\BaseFrontController;
11+
use Thelia\Core\HttpFoundation\Request;
12+
use Thelia\Core\HttpFoundation\Response;
13+
use TntSearch\Service\Search;
14+
15+
/**
16+
* @Route("/open_api", name="tntsearch_search")
17+
*/
18+
class SearchOpenApiController extends BaseFrontController
19+
{
20+
/**
21+
*
22+
* @OA\Get(
23+
* path="/tnt-search",
24+
* tags={"TNTSearch", "Search"},
25+
* summary="Search products or category or folder or customer etc...",
26+
* @OA\Parameter(
27+
* name="q",
28+
* in="query",
29+
* @OA\Schema(
30+
* type="string"
31+
* )
32+
* ),
33+
* @OA\Parameter(
34+
* name="indexes",
35+
* in="query",
36+
* @OA\Schema(
37+
* type="string"
38+
* )
39+
* ),
40+
* @OA\Parameter(
41+
* name="limit",
42+
* in="query",
43+
* @OA\Schema(
44+
* type="integer"
45+
* )
46+
* ),
47+
* @OA\Parameter(
48+
* name="offset",
49+
* in="query",
50+
* @OA\Schema(
51+
* type="integer"
52+
* )
53+
* ),
54+
* @OA\Response(
55+
* response="200",
56+
* description="Success",
57+
* @OA\JsonContent()
58+
* ),
59+
* @OA\Response(
60+
* response="400",
61+
* description="Bad request",
62+
* @OA\JsonContent(ref="#/components/schemas/Error")
63+
* )
64+
* )
65+
*/
66+
public function apiSearch(): Response
67+
{
68+
/** @var Search $search */
69+
$search = $this->getContainer()->get('tntsearch.search');
70+
71+
/** @var Request $request */
72+
$request = $this->getRequest();
73+
74+
/** @var ModelFactory $modelFactory */
75+
$modelFactory = $this->getContainer()->get('open_api.model.factory');
76+
77+
78+
$resultsByIndex = $search->search(
79+
$request->get('q'),
80+
($index = $request->get('indexes')) ? explode(',', $index) : null,
81+
$request->getSession()->getLang()->getLocale(),
82+
$request->get('offset', 0),
83+
$request->get('limit', 100)
84+
);
85+
86+
$data = [];
87+
88+
foreach ($resultsByIndex as $index => $ids) {
89+
if (empty($ids)) {
90+
continue;
91+
}
92+
93+
$model = $search->buildPropelModelFromIndex($index);
94+
$modelTableMap = $search->buildPropelTableMapFromIndex($index);
95+
96+
$rows = $model->filterById($ids, Criteria::IN);
97+
98+
foreach ($ids as $singleId) {
99+
$givenIdMatched = 'given_id_matched_'.$singleId;
100+
$rows->withColumn($modelTableMap::COL_ID."='$singleId'", $givenIdMatched);
101+
$rows->orderBy($givenIdMatched, Criteria::DESC);
102+
}
103+
104+
$data[$index] = array_map(function ($row) use ($index, $modelFactory) {
105+
return $modelFactory->buildModel(ucwords($index), $row);
106+
}, iterator_to_array($rows));
107+
}
108+
109+
return $this->jsonResponse(json_encode($data));
110+
}
111+
}

Controller/IndexationController.php

+8-21
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,19 @@
1212

1313
class IndexationController extends BaseAdminController
1414
{
15-
public function updateConfigAction(): Response
16-
{
17-
$onTheFlyUpdate = (bool)$this->getRequest()->get('on-the-fly-update', false);
18-
19-
TntSearch::setConfigValue(TntSearch::ON_THE_FLY_UPDATE, $onTheFlyUpdate);
20-
21-
return $this->generateRedirect(URL::getInstance()->absoluteUrl("/admin/module/TntSearch"));
22-
}
23-
24-
/**
25-
* @return Response
26-
*/
2715
public function generateIndexesAction(): Response
2816
{
29-
$fs = new Filesystem();
30-
31-
/** @var IndexationProvider $indexationProvider */
32-
$indexationProvider = $this->getContainer()->get('tntsearch.indexation.provider');
33-
34-
if (is_dir(TntSearch::INDEXES_DIR)) {
35-
$fs->remove(TntSearch::INDEXES_DIR);
36-
}
37-
3817
ini_set('max_execution_time', 3600);
3918

4019
try {
20+
$fs = new Filesystem();
21+
22+
/** @var IndexationProvider $indexationProvider */
23+
$indexationProvider = $this->getContainer()->get('tntsearch.indexation.provider');
24+
25+
if (is_dir(TntSearch::INDEXES_DIR)) {
26+
$fs->remove(TntSearch::INDEXES_DIR);
27+
}
4128
$indexationProvider->indexAll();
4229

4330
} catch (Exception $exception) {

0 commit comments

Comments
 (0)