Add search bar for events in /mon-compte using Meilisearch per-account index

- Search form with query parameter ?q= on events tab
- Uses event_{accountId} Meilisearch index for search
- Falls back to database query if Meilisearch unavailable

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-20 17:23:01 +01:00
parent e6213ca66f
commit abd2fef638
2 changed files with 29 additions and 6 deletions

View File

@@ -4,8 +4,10 @@ namespace App\Controller;
use App\Entity\Payout;
use App\Entity\User;
use App\Entity\Event;
use App\Service\EventIndexService;
use App\Service\MailerService;
use App\Service\MeilisearchService;
use App\Service\PayoutPdfService;
use App\Service\StripeService;
use Doctrine\ORM\EntityManagerInterface;
@@ -24,7 +26,7 @@ class AccountController extends AbstractController
private const BREADCRUMB_ACCOUNT = ['name' => 'Mon compte', 'url' => '/mon-compte'];
#[Route('/mon-compte', name: 'app_account')]
public function index(Request $request, StripeService $stripeService, EntityManagerInterface $em, PaginatorInterface $paginator): Response
public function index(Request $request, StripeService $stripeService, EntityManagerInterface $em, PaginatorInterface $paginator, MeilisearchService $meilisearch): Response
{
/** @var User $user */
$user = $this->getUser();
@@ -55,10 +57,26 @@ class AccountController extends AbstractController
['parentOrganizer' => $user],
['createdAt' => 'DESC'],
);
$eventsQuery = $em->getRepository(\App\Entity\Event::class)->findBy(
['account' => $user],
['startAt' => 'ASC'],
);
$searchQuery = $request->query->getString('q', '');
if ('' !== $searchQuery) {
try {
$searchResults = $meilisearch->search('event_'.$user->getId(), $searchQuery);
$eventIds = array_map(fn (array $hit) => $hit['id'], $searchResults['hits'] ?? []);
$eventsQuery = $eventIds
? $em->getRepository(Event::class)->findBy(['id' => $eventIds])
: [];
} catch (\Throwable) {
$eventsQuery = $em->getRepository(Event::class)->findBy(
['account' => $user],
['startAt' => 'ASC'],
);
}
} else {
$eventsQuery = $em->getRepository(Event::class)->findBy(
['account' => $user],
['startAt' => 'ASC'],
);
}
$events = $paginator->paginate($eventsQuery, $request->query->getInt('page', 1), 10);
}

View File

@@ -120,10 +120,15 @@
</div>
{% elseif tab == 'events' %}
<div class="mb-6">
<div class="flex flex-wrap items-center justify-between gap-4 mb-6">
<a href="{{ path('app_account_create_event') }}" class="btn-brutal font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
+ Creer un evenement
</a>
<form method="get" action="{{ path('app_account') }}" class="flex gap-2">
<input type="hidden" name="tab" value="events">
<input type="text" name="q" value="{{ app.request.query.get('q', '') }}" class="form-input max-w-[300px]" placeholder="Rechercher un evenement...">
<button type="submit" class="px-4 py-2 border-2 border-gray-900 bg-[#fabf04] font-black uppercase text-xs tracking-widest cursor-pointer hover:bg-indigo-600 hover:text-white transition-all">Rechercher</button>
</form>
</div>
{% if isOrganizer and (not app.user.stripeChargesEnabled or not app.user.stripePayoutsEnabled) %}