diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c9dc060 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# This is the top-most .editorconfig file; do not search in parent directories. +root = true + +# All files. +[*] +end_of_line = LF +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[Makefile] +indent_style = tab diff --git a/.gitignore b/.gitignore index 8b7ef35..612c601 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /vendor composer.lock +.phpunit.result.cache diff --git a/composer.json b/composer.json index ec33283..6e2632d 100644 --- a/composer.json +++ b/composer.json @@ -9,11 +9,21 @@ "doctrine/orm": "^2.12", "symfony/framework-bundle": "*" }, + "require-dev": { + "vimeo/psalm": "^4.24", + "psalm/plugin-symfony": "^3.1", + "phpunit/phpunit": "^9.5" + }, "autoload": { "psr-4": { "Pcm\\SearchBundle\\": "src/" } - }, + }, + "autoload-dev": { + "psr-4": { + "Pcm\\SearchBundle\\": "tests/" + } + }, "authors": [ { "name": "Matt Feeny", @@ -23,9 +33,5 @@ "name": "Bradley Goode", "email": "bg@pcmsystems.co.uk" } - ], - "require-dev": { - "vimeo/psalm": "^4.24", - "psalm/plugin-symfony": "^3.1" - } + ] } diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 index 0000000..6655f73 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,4 @@ +services: + Pcm\SearchBundle\EventSubscriber\SearchableSubscriber: + tags: + - { name: doctrine.event_subscriber } diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..e8f8e0c --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,13 @@ + + + + + ./tests/ + + + + + ./src + + + diff --git a/src/Service/SearchService.php b/src/Service/SearchService.php index 92e8727..f37a49d 100644 --- a/src/Service/SearchService.php +++ b/src/Service/SearchService.php @@ -14,7 +14,14 @@ class SearchService { public function __construct(private EntityManagerInterface $em) {} - public function index($entity) + /** + * Given an $entity that implements SearchableInterface, this method + * creates or updates a SearchIndex $entity + * + * @param SearchableInterface $entity + * @return void + */ + public function index(SearchableInterface $entity) { $searchIndex = $this->createSearchResult($entity); @@ -22,7 +29,14 @@ class SearchService $this->em->flush(); } - public function unIndex($entity) + /** + * Given an $entity that implements SearchableInterface, this method removes + * the item from the search index + * + * @param SearchableInterface $entity + * @return void + */ + public function unIndex(SearchableInterface $entity) { $class = get_class($entity); @@ -37,6 +51,14 @@ class SearchService } } + /** + * Given an entity that implements SearchableInterface, this method first checks + * if the relevant SearchIndex entity exists. If it doesn't, it's created. The + * title and index data are set based on the methods in the $entity + * + * @param SearchableInterface $entity + * @return SearchIndex + */ public function createSearchResult(SearchableInterface $entity): SearchIndex { $values = []; @@ -76,7 +98,8 @@ class SearchService } /** - * Finds all searchable Doctrine entities. + * Finds all searchable Doctrine entities the implement SearchableInterface + * @return array */ public function getSearchableClasses(): array { diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29