Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
use Setono\SyliusMeilisearchPlugin\Document\Product;
use Setono\SyliusMeilisearchPlugin\Event\QueryBuilderForDataProvisionCreated;
use Setono\SyliusMeilisearchPlugin\Filter\Entity\EntityFilterInterface;
use Setono\SyliusMeilisearchPlugin\Form\Type\IndexSettingsType;
use Setono\SyliusMeilisearchPlugin\Form\Type\SynonymType;
use Setono\SyliusMeilisearchPlugin\Indexer\DefaultIndexer;
use Setono\SyliusMeilisearchPlugin\Model\IndexSettings;
use Setono\SyliusMeilisearchPlugin\Model\Synonym;
use Setono\SyliusMeilisearchPlugin\Repository\IndexSettingsRepository;
use Setono\SyliusMeilisearchPlugin\Repository\SynonymRepository;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Resource\Factory\Factory;
Expand Down Expand Up @@ -174,6 +177,22 @@ private function addResourcesSection(ArrayNodeDefinition $node): void
->arrayNode('resources')
->addDefaultsIfNotSet()
->children()
->arrayNode('index_settings')
->addDefaultsIfNotSet()
->children()
->variableNode('options')->end()
->arrayNode('classes')
->addDefaultsIfNotSet()
->children()
->scalarNode('model')->defaultValue(IndexSettings::class)->cannotBeEmpty()->end()
->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
->scalarNode('repository')->defaultValue(IndexSettingsRepository::class)->cannotBeEmpty()->end()
->scalarNode('form')->defaultValue(IndexSettingsType::class)->end()
->scalarNode('factory')->defaultValue(Factory::class)->end()
->end()
->end()
->end()
->end()
->arrayNode('synonym')
->addDefaultsIfNotSet()
->children()
Expand Down
31 changes: 31 additions & 0 deletions src/DependencyInjection/SetonoSyliusMeilisearchExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,37 @@ public function prepend(ContainerBuilder $container): void
],
],
'grids' => [
'setono_sylius_meilisearch_admin_index_settings' => [
'driver' => [
'name' => SyliusResourceBundle::DRIVER_DOCTRINE_ORM,
'options' => [
'class' => '%setono_sylius_meilisearch.model.index_settings.class%',
],
],
'limits' => [100, 250, 500, 1000],
'fields' => [
'index' => [
'type' => 'string',
'label' => 'setono_sylius_meilisearch.ui.index',
],
],
'filters' => [
'search' => [
'type' => 'string',
'label' => 'sylius.ui.search',
'options' => [
'fields' => ['index'],
],
],
],
'actions' => [
'item' => [
'update' => [
'type' => 'update',
],
],
],
],
'setono_sylius_meilisearch_admin_synonym' => [
'driver' => [
'name' => SyliusResourceBundle::DRIVER_DOCTRINE_ORM,
Expand Down
8 changes: 8 additions & 0 deletions src/EventSubscriber/AddMenuSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ public function add(MenuBuilderEvent $event): void

$header = $this->getHeader($menu);

$header
->addChild('settings', [
'route' => 'setono_sylius_meilisearch_admin_index_settings_index',
])
->setLabel('setono_sylius_meilisearch.menu.admin.main.meilisearch.settings')
->setLabelAttribute('icon', 'cog')
;

$header
->addChild('synonyms', [
'route' => 'setono_sylius_meilisearch_admin_synonym_index',
Expand Down
40 changes: 40 additions & 0 deletions src/EventSubscriber/EnsureIndexSettingsAreCreatedSubscriber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\EventSubscriber;

use Setono\SyliusMeilisearchPlugin\Config\IndexRegistryInterface;
use Setono\SyliusMeilisearchPlugin\Factory\IndexSettingsFactoryInterface;
use Setono\SyliusMeilisearchPlugin\Repository\IndexSettingsRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

final class EnsureIndexSettingsAreCreatedSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly IndexRegistryInterface $indexRegistry,
private readonly IndexSettingsRepositoryInterface $indexSettingsRepository,
private readonly IndexSettingsFactoryInterface $indexSettingsFactory,
) {
}

public static function getSubscribedEvents(): array
{
return [
'setono_sylius_meilisearch.index_settings.index' => 'ensure',
];
}

public function ensure(): void
{
foreach ($this->indexRegistry->getNames() as $name) {
$indexSettings = $this->indexSettingsRepository->findOneByIndex($name);
if (null !== $indexSettings) {
continue;
}

$indexSettings = $this->indexSettingsFactory->createWithIndexName($name);
$this->indexSettingsRepository->add($indexSettings);
}
}
}
34 changes: 34 additions & 0 deletions src/Factory/IndexSettingsFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Factory;

use Setono\SyliusMeilisearchPlugin\Model\IndexSettingsInterface;
use Setono\SyliusMeilisearchPlugin\Settings\Settings;
use Sylius\Resource\Factory\FactoryInterface;

final class IndexSettingsFactory implements IndexSettingsFactoryInterface
{
public function __construct(
/** @var FactoryInterface<IndexSettingsInterface> $decorated */
private readonly FactoryInterface $decorated,
) {
}

public function createNew(): IndexSettingsInterface
{
$obj = $this->decorated->createNew();
$obj->setSettings(new Settings());

return $obj;
}

public function createWithIndexName(string $index): IndexSettingsInterface
{
$obj = $this->createNew();
$obj->setIndexName($index);

return $obj;
}
}
18 changes: 18 additions & 0 deletions src/Factory/IndexSettingsFactoryInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Factory;

use Setono\SyliusMeilisearchPlugin\Model\IndexSettingsInterface;
use Sylius\Resource\Factory\FactoryInterface;

/**
* @extends FactoryInterface<IndexSettingsInterface>
*/
interface IndexSettingsFactoryInterface extends FactoryInterface
{
public function createNew(): IndexSettingsInterface;

public function createWithIndexName(string $index): IndexSettingsInterface;
}
19 changes: 19 additions & 0 deletions src/Form/Type/IndexSettingsType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Form\Type;

use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;
use Symfony\Component\Form\FormBuilderInterface;

final class IndexSettingsType extends AbstractResourceType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('indexName', IndexChoiceType::class)
->add('settings', SettingsType::class)
;
}
}
34 changes: 34 additions & 0 deletions src/Form/Type/SettingsType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Form\Type;

use Setono\SyliusMeilisearchPlugin\Settings\Settings;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

final class SettingsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$reflection = new \ReflectionClass(Settings::class);
$properties = $reflection->getProperties(\ReflectionProperty::IS_PUBLIC);
foreach ($properties as $property) {
$builder->add($property->getName());
}
}

public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Settings::class,
]);
}

public function getBlockPrefix(): string
{
return 'setono_sylius_meilisearch_settings';
}
}
47 changes: 47 additions & 0 deletions src/Model/IndexSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Model;

use Setono\SyliusMeilisearchPlugin\Config\Index;
use Setono\SyliusMeilisearchPlugin\Settings\Settings;

class IndexSettings implements IndexSettingsInterface
{
protected ?int $id = null;

protected ?string $indexName = null;

protected ?Settings $settings = null;

public function getId(): ?int
{
return $this->id;
}

public function setId(?int $id): void
{
$this->id = $id;
}

public function getIndexName(): ?string
{
return $this->indexName;
}

public function setIndexName(Index|string|null $indexName): void
{
$this->indexName = $indexName instanceof Index ? $indexName->name : $indexName;
}

public function getSettings(): ?Settings
{
return $this->settings;
}

public function setSettings(?Settings $settings): void
{
$this->settings = $settings;
}
}
22 changes: 22 additions & 0 deletions src/Model/IndexSettingsInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Model;

use Setono\SyliusMeilisearchPlugin\Config\Index;
use Setono\SyliusMeilisearchPlugin\Settings\Settings;
use Sylius\Component\Resource\Model\ResourceInterface;

interface IndexSettingsInterface extends ResourceInterface
{
public function getId(): ?int;

public function getIndexName(): ?string;

public function setIndexName(Index|string|null $indexName): void;

public function getSettings(): ?Settings;

public function setSettings(?Settings $settings): void;
}
23 changes: 23 additions & 0 deletions src/Repository/IndexSettingsRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Repository;

use Setono\SyliusMeilisearchPlugin\Config\Index;
use Setono\SyliusMeilisearchPlugin\Model\IndexSettingsInterface;
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
use Webmozart\Assert\Assert;

class IndexSettingsRepository extends EntityRepository implements IndexSettingsRepositoryInterface
{
public function findOneByIndex(string|Index $index): ?IndexSettingsInterface
{
$index = $index instanceof Index ? $index->name : $index;

$obj = $this->findOneBy(['index' => $index]);
Assert::nullOrIsInstanceOf($obj, IndexSettingsInterface::class);

return $obj;
}
}
17 changes: 17 additions & 0 deletions src/Repository/IndexSettingsRepositoryInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Repository;

use Setono\SyliusMeilisearchPlugin\Config\Index;
use Setono\SyliusMeilisearchPlugin\Model\IndexSettingsInterface;
use Sylius\Resource\Doctrine\Persistence\RepositoryInterface;

/**
* @extends RepositoryInterface<IndexSettingsInterface>
*/
interface IndexSettingsRepositoryInterface extends RepositoryInterface
{
public function findOneByIndex(string|Index $index): ?IndexSettingsInterface;
}
16 changes: 16 additions & 0 deletions src/Resources/config/doctrine/model/IndexSettings.orm.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>

<doctrine-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<mapped-superclass name="Setono\SyliusMeilisearchPlugin\Model\IndexSettings"
table="setono_sylius_meilisearch__index_settings">
<id name="id" type="integer">
<generator strategy="AUTO"/>
</id>

<field name="indexName" type="string" unique="true"/>
<field name="settings" type="json"/>
</mapped-superclass>
</doctrine-mapping>
16 changes: 16 additions & 0 deletions src/Resources/config/routes/admin.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
setono_sylius_meilisearch_admin_index_settings:
resource: |
section: admin
alias: setono_sylius_meilisearch.index_settings
templates: "@SyliusAdmin\\Crud"
redirect: index
permission: true
grid: setono_sylius_meilisearch_admin_index_settings
vars:
all:
header: setono_sylius_meilisearch.ui.index_settings_header
subheader: setono_sylius_meilisearch.ui.index_settings_subheader
templates:
form: "@SetonoSyliusMeilisearchPlugin/admin/index_settings/_form.html.twig"
type: sylius.resource

setono_sylius_meilisearch_admin_synonym:
resource: |
section: admin
Expand Down
Loading