From e424120c24af83f00f5c6d3babde5da3b9df244e Mon Sep 17 00:00:00 2001 From: Yury Pikhtarev Date: Wed, 2 Jul 2025 17:23:51 +0400 Subject: [PATCH] feat(emoji): implement search request validation for emojis and aliases Added new form request classes, SearchEmojiRequest and SearchEmojiAliasRequest, to handle validation for search queries in the Emoji and EmojiAlias controllers. Updated the search methods in both controllers to utilize these new request classes, improving code organization and validation consistency. Additionally, refactored the loading of relationships in the EmojiController for better readability. --- .../Controllers/Api/EmojiAliasController.php | 8 ++--- app/Http/Controllers/Api/EmojiController.php | 18 ++++-------- .../Emoji/SearchEmojiAliasRequest.php | 29 +++++++++++++++++++ .../Requests/Emoji/SearchEmojiRequest.php | 29 +++++++++++++++++++ database/seeders/EmojiSeeder.php | 2 +- tests/Feature/Api/EmojiCategoryTest.php | 14 +++++++-- 6 files changed, 79 insertions(+), 21 deletions(-) create mode 100644 app/Http/Requests/Emoji/SearchEmojiAliasRequest.php create mode 100644 app/Http/Requests/Emoji/SearchEmojiRequest.php diff --git a/app/Http/Controllers/Api/EmojiAliasController.php b/app/Http/Controllers/Api/EmojiAliasController.php index a0b04796d..803f88645 100644 --- a/app/Http/Controllers/Api/EmojiAliasController.php +++ b/app/Http/Controllers/Api/EmojiAliasController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; +use App\Http\Requests\Emoji\SearchEmojiAliasRequest; use App\Http\Requests\Emoji\StoreEmojiAliasRequest; use App\Http\Requests\Emoji\UpdateEmojiAliasRequest; use App\Http\Resources\EmojiAliasResource; @@ -91,13 +92,8 @@ class EmojiAliasController extends Controller /** * Search aliases using Laravel Scout. */ - public function search(Request $request) + public function search(SearchEmojiAliasRequest $request) { - $request->validate([ - 'q' => 'required|string|min:1', - 'limit' => 'integer|min:1|max:100', - ]); - $aliases = EmojiAlias::search($request->get('q')) ->take($request->get('limit', 20)) ->get(); diff --git a/app/Http/Controllers/Api/EmojiController.php b/app/Http/Controllers/Api/EmojiController.php index a5e24c7be..a3c07f3d5 100644 --- a/app/Http/Controllers/Api/EmojiController.php +++ b/app/Http/Controllers/Api/EmojiController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; +use App\Http\Requests\Emoji\SearchEmojiRequest; use App\Http\Requests\Emoji\StoreEmojiRequest; use App\Http\Requests\Emoji\UpdateEmojiRequest; use App\Http\Resources\EmojiResource; @@ -95,24 +96,17 @@ class EmojiController extends Controller /** * Search emojis using Laravel Scout. */ - public function search(Request $request) + public function search(SearchEmojiRequest $request) { - $request->validate([ - 'q' => 'required|string|min:1', - 'limit' => 'integer|min:1|max:100', - ]); - $emojis = Emoji::search($request->get('q')) ->take($request->get('limit', 20)) ->get(); // Load relationships if requested - if ($request->get('with_category')) { - $emojis->load('category'); - } - if ($request->get('with_aliases')) { - $emojis->load('aliases'); - } + $emojis->load(array_filter([ + $request->get('with_category') ? 'category' : null, + $request->get('with_aliases') ? 'aliases' : null, + ])); return EmojiResource::collection($emojis); } diff --git a/app/Http/Requests/Emoji/SearchEmojiAliasRequest.php b/app/Http/Requests/Emoji/SearchEmojiAliasRequest.php new file mode 100644 index 000000000..795561e2a --- /dev/null +++ b/app/Http/Requests/Emoji/SearchEmojiAliasRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'q' => 'required|string|min:1', + 'limit' => 'integer|min:1|max:100', + ]; + } +} diff --git a/app/Http/Requests/Emoji/SearchEmojiRequest.php b/app/Http/Requests/Emoji/SearchEmojiRequest.php new file mode 100644 index 000000000..37fdafc4f --- /dev/null +++ b/app/Http/Requests/Emoji/SearchEmojiRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'q' => 'required|string|min:1', + 'limit' => 'integer|min:1|max:100', + ]; + } +} diff --git a/database/seeders/EmojiSeeder.php b/database/seeders/EmojiSeeder.php index c3e276422..6ae9830d4 100644 --- a/database/seeders/EmojiSeeder.php +++ b/database/seeders/EmojiSeeder.php @@ -93,9 +93,9 @@ class EmojiSeeder extends Seeder ]; // Insert emojis - $displayOrder = 0; foreach ($emojis as $categoryData) { $category = $categoryModels[$categoryData['category']]; + $displayOrder = 0; foreach ($categoryData['emojis'] as $emojiData) { $displayOrder++; diff --git a/tests/Feature/Api/EmojiCategoryTest.php b/tests/Feature/Api/EmojiCategoryTest.php index 09f35b77a..5ce649a63 100644 --- a/tests/Feature/Api/EmojiCategoryTest.php +++ b/tests/Feature/Api/EmojiCategoryTest.php @@ -25,8 +25,18 @@ describe('Emoji Category API Endpoints', function () { }); test('can list categories with emoji counts', function () { - $category1 = EmojiCategory::factory()->create(['title' => 'Category 1']); - $category2 = EmojiCategory::factory()->create(['title' => 'Category 2']); + // Ensure we start with clean slate + EmojiCategory::query()->delete(); + Emoji::query()->delete(); + + $category1 = EmojiCategory::factory()->create([ + 'title' => 'Category 1', + 'display_order' => 1, + ]); + $category2 = EmojiCategory::factory()->create([ + 'title' => 'Category 2', + 'display_order' => 2, + ]); Emoji::factory()->count(5)->create(['emoji_category_id' => $category1->id]); Emoji::factory()->count(3)->create(['emoji_category_id' => $category2->id]);