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.
This commit is contained in:
Yury Pikhtarev 2025-07-02 17:23:51 +04:00
commit e424120c24
No known key found for this signature in database
6 changed files with 79 additions and 21 deletions

View file

@ -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();

View file

@ -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);
}

View file

@ -0,0 +1,29 @@
<?php
namespace App\Http\Requests\Emoji;
use Illuminate\Foundation\Http\FormRequest;
class SearchEmojiAliasRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'q' => 'required|string|min:1',
'limit' => 'integer|min:1|max:100',
];
}
}

View file

@ -0,0 +1,29 @@
<?php
namespace App\Http\Requests\Emoji;
use Illuminate\Foundation\Http\FormRequest;
class SearchEmojiRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'q' => 'required|string|min:1',
'limit' => 'integer|min:1|max:100',
];
}
}

View file

@ -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++;

View file

@ -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]);