From 5dcbbdc1a97a6ae382b0815542066b7ca0789b71 Mon Sep 17 00:00:00 2001 From: alex-chevski Date: Tue, 23 Jan 2024 18:45:02 +0300 Subject: [PATCH] reduce complexity ListViewService --- app/Services/BlogPost/ListViewService.php | 67 ++++++++---------- app/Services/Recipe/ListViewService.php | 68 ++++++++----------- .../Criteried/AuthorCriteriaStrategy.php | 30 ++++++++ .../Strategy/Criteried/CriteriaStrategy.php | 15 ++++ .../Criteried/DefaultCriteriaStrategy.php | 21 ++++++ .../Criteried/SearchCriteriaStrategy.php | 25 +++++++ .../Criteried/TagCriteriaStrategy.php | 29 ++++++++ 7 files changed, 174 insertions(+), 81 deletions(-) create mode 100644 app/Services/Strategy/Criteried/AuthorCriteriaStrategy.php create mode 100644 app/Services/Strategy/Criteried/CriteriaStrategy.php create mode 100644 app/Services/Strategy/Criteried/DefaultCriteriaStrategy.php create mode 100644 app/Services/Strategy/Criteried/SearchCriteriaStrategy.php create mode 100644 app/Services/Strategy/Criteried/TagCriteriaStrategy.php diff --git a/app/Services/BlogPost/ListViewService.php b/app/Services/BlogPost/ListViewService.php index 5ffa3ed..7cf32a4 100644 --- a/app/Services/BlogPost/ListViewService.php +++ b/app/Services/BlogPost/ListViewService.php @@ -4,11 +4,13 @@ namespace App\Services\BlogPost; use App\Livewire\BlogPost\ListView; use App\Models\BlogPost; -use App\Models\Tag; -use App\Models\User; +use App\Services\Strategy\Criteried\AuthorCriteriaStrategy; +use App\Services\Strategy\Criteried\CriteriaStrategy; +use App\Services\Strategy\Criteried\DefaultCriteriaStrategy; +use App\Services\Strategy\Criteried\SearchCriteriaStrategy; +use App\Services\Strategy\Criteried\TagCriteriaStrategy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\MorphToMany; -use Illuminate\Support\Str; class ListViewService { @@ -28,49 +30,34 @@ class ListViewService private function getPrimaryCriteriedBlogPosts(): Builder|BlogPost|MorphToMany|array { - if ($this->parentState->author) { - $posts = $this->getAuthorBlogPosts(); - } elseif ($this->parentState->tag) { - $posts = $this->getTagBlogPosts(); - } elseif ($this->parentState->search && mb_strlen($this->parentState->search) > 2) { - $posts = $this->getSearchBlogPosts(); - } else { - $posts = (new BlogPost()); + $criteria = $this->getCriteriaStrategy(); + return $criteria->getBlogPosts(); + } + + private function getCriteriaStrategy(): CriteriaStrategy + { + $strategies = [ + 'author' => AuthorCriteriaStrategy::class, + 'tag' => TagCriteriaStrategy::class, + 'search' => SearchCriteriaStrategy::class, + ]; + + foreach ($strategies as $condition => $strategyClass) { + if ($this->parentState->{$condition}) { + return new $strategyClass($this->parentState->{$condition}); + } } - return $posts; + return new DefaultCriteriaStrategy(); } private function getSecondaryCriteriedBlogPosts(Builder|BlogPost|MorphToMany|array $posts): BlogPost|Builder { - if ($this->parentState->typeFilter === 'user') { - $posts = $posts->whereRelation('author', 'is_consultant', false); - } - - if ($this->parentState->typeFilter === 'consultant') { - $posts = $posts->whereRelation('author', 'is_consultant', true); - } - - return $posts; - } - - private function getAuthorBlogPosts(): array - { - $author = $this->parentState->author; - $user = User::find($author); - - return $user ? $user->author_of_blog_post()->distinct() : []; - } - - private function getTagBlogPosts(): MorphToMany - { - $tagId = Str::of($this->parentState->tag)->split('/-/')->first(); - return Tag::find($tagId)->blogPosts(); - } - - private function getSearchBlogPosts(): Builder - { - return BlogPost::where('title', 'rlike', $this->parentState->search); + return match ($this->parentState->typeFilter) { + 'user' => $posts->whereRelation('author', 'is_consultant', false), + 'consultant' => $posts->whereRelation('author', 'is_consultant', true), + default => $posts, + }; } // private function getTagsCollection(): array diff --git a/app/Services/Recipe/ListViewService.php b/app/Services/Recipe/ListViewService.php index 230f90f..bb5f827 100644 --- a/app/Services/Recipe/ListViewService.php +++ b/app/Services/Recipe/ListViewService.php @@ -4,11 +4,13 @@ namespace App\Services\Recipe; use App\Livewire\Recipe\ListView; use App\Models\Recipe; -use App\Models\Tag; -use App\Models\User; +use App\Services\Strategy\Criteried\AuthorCriteriaStrategy; +use App\Services\Strategy\Criteried\DefaultCriteriaStrategy; +use App\Services\Strategy\Criteried\SearchCriteriaStrategy; +use App\Services\Strategy\Criteried\TagCriteriaStrategy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\MorphToMany; -use Illuminate\Support\Str; +use App\Services\Strategy\Criteried\CriteriaStrategy; class ListViewService { @@ -35,7 +37,6 @@ class ListViewService ] )->reduce(function ($acc, $item) { [$type, $tagNames] = $item; - foreach ($tagNames as $name) { if (isset($acc[$type][$name])) { $acc[$type][$name] += 1; @@ -43,54 +44,39 @@ class ListViewService $acc[$type][$name] = 1; } } - return $acc; }); } private function getPrimaryCriteriedRecipes(): Builder|Recipe|MorphToMany|array { - if ($this->parentState->author) { - return $this->getAuthorRecipes(); - } - if ($this->parentState->tag) { - return $this->getTagRecipes(); - } - if ($this->parentState->search && mb_strlen($this->parentState->search) > 2) { - return $this->getSearchRecipes(); + $criteria = $this->getCriteriaStrategy(); + return $criteria->getRecipes(); + } + + private function getCriteriaStrategy(): CriteriaStrategy + { + $strategies = [ + 'author' => AuthorCriteriaStrategy::class, + 'tag' => TagCriteriaStrategy::class, + 'search' => SearchCriteriaStrategy::class, + ]; + + foreach ($strategies as $condition => $strategyClass) { + if ($this->parentState->{$condition}) { + return new $strategyClass($this->parentState->{$condition}); + } } - return new Recipe(); + return new DefaultCriteriaStrategy(); } private function getSecondaryCriteriedRecipes(Builder|Recipe|MorphToMany|array $recipes): Recipe { - if ($this->parentState->typeFilter === 'user') { - $recipes = $recipes->whereRelation('author', 'is_consultant', false); - } - - if ($this->parentState->typeFilter === 'consultant') { - $recipes = $recipes->whereRelation('author', 'is_consultant', true); - } - - return $recipes; - } - - private function getAuthorRecipes(): array - { - $author = $this->parentState->author; - $user = User::find($author); - return $user ? $user->author_of_recipe() : []; - } - - private function getTagRecipes(): MorphToMany - { - $tagId = Str::of($this->parentState->tag)->split('/-/')->first(); - return Tag::find($tagId)->recipes(); - } - - private function getSearchRecipes(): Builder - { - return Recipe::where('title', 'rlike', $this->parentState->search); + return match ($this->parentState->typeFilter) { + 'user' => $recipes->whereRelation('author', 'is_consultant', false), + 'consultant' => $recipes->whereRelation('author', 'is_consultant', true), + default => $recipes, + }; } } diff --git a/app/Services/Strategy/Criteried/AuthorCriteriaStrategy.php b/app/Services/Strategy/Criteried/AuthorCriteriaStrategy.php new file mode 100644 index 0000000..eb9c579 --- /dev/null +++ b/app/Services/Strategy/Criteried/AuthorCriteriaStrategy.php @@ -0,0 +1,30 @@ +author); + + return $user ? $user->author_of_blog_post()->distinct() : []; + } + + public function getRecipes(): Builder|Recipe|MorphToMany|array + { + $user = User::find($this->author); + + return $user ? $user->author_of_recipe()->distinct() : []; + } +} diff --git a/app/Services/Strategy/Criteried/CriteriaStrategy.php b/app/Services/Strategy/Criteried/CriteriaStrategy.php new file mode 100644 index 0000000..f8fba72 --- /dev/null +++ b/app/Services/Strategy/Criteried/CriteriaStrategy.php @@ -0,0 +1,15 @@ +search); + } + + public function getRecipes(): Builder|Recipe|MorphToMany|array + { + return Recipe::where('title', 'rlike', $this->search); + } +} diff --git a/app/Services/Strategy/Criteried/TagCriteriaStrategy.php b/app/Services/Strategy/Criteried/TagCriteriaStrategy.php new file mode 100644 index 0000000..cc2871f --- /dev/null +++ b/app/Services/Strategy/Criteried/TagCriteriaStrategy.php @@ -0,0 +1,29 @@ +tag)->split('/-/')->first(); + return Tag::find($tagId)->blogPosts(); + } + + public function getRecipes(): Builder|Recipe|MorphToMany|array + { + $tagId = Str::of($this->tag)->split('/-/')->first(); + return Tag::find($tagId)->recipes(); + } +}