- Create narrator_texts table migration with context/hero_type indexes
- Add NarratorText model with getRandomText() for variant selection
- Add NarratorTextSeeder with 30+ texts for 11 contexts
- Implement vouvoiement (recruteur) vs tutoiement (client/dev)
- Create NarratorController with GET /api/narrator/{context}
- Add useFetchNarratorText composable for frontend
Contexts: intro, transitions, hints, encouragements, contact_unlocked, welcome_back
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
75 lines
2.0 KiB
PHP
75 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\NarratorText;
|
|
use App\Models\Translation;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class NarratorController extends Controller
|
|
{
|
|
private const VALID_CONTEXTS = [
|
|
'intro',
|
|
'transition_projects',
|
|
'transition_skills',
|
|
'transition_testimonials',
|
|
'transition_journey',
|
|
'hint',
|
|
'encouragement_25',
|
|
'encouragement_50',
|
|
'encouragement_75',
|
|
'contact_unlocked',
|
|
'welcome_back',
|
|
];
|
|
|
|
private const VALID_HERO_TYPES = ['recruteur', 'client', 'dev'];
|
|
|
|
public function getText(Request $request, string $context): JsonResponse
|
|
{
|
|
if (!in_array($context, self::VALID_CONTEXTS)) {
|
|
return response()->json([
|
|
'error' => [
|
|
'code' => 'INVALID_CONTEXT',
|
|
'message' => 'Invalid narrator context',
|
|
'valid_contexts' => self::VALID_CONTEXTS,
|
|
],
|
|
], 404);
|
|
}
|
|
|
|
$lang = app()->getLocale();
|
|
$heroType = $request->query('hero');
|
|
|
|
// Valider hero_type
|
|
if ($heroType && !in_array($heroType, self::VALID_HERO_TYPES)) {
|
|
$heroType = null;
|
|
}
|
|
|
|
$narratorText = NarratorText::getRandomText($context, $heroType);
|
|
|
|
if (!$narratorText) {
|
|
return response()->json([
|
|
'error' => [
|
|
'code' => 'NO_TEXT_FOUND',
|
|
'message' => 'No narrator text found for this context',
|
|
],
|
|
], 404);
|
|
}
|
|
|
|
$text = Translation::getTranslation($narratorText->text_key, $lang);
|
|
|
|
return response()->json([
|
|
'data' => [
|
|
'context' => $context,
|
|
'text' => $text,
|
|
'variant' => $narratorText->variant,
|
|
'hero_type' => $narratorText->hero_type,
|
|
],
|
|
'meta' => [
|
|
'lang' => $lang,
|
|
],
|
|
]);
|
|
}
|
|
}
|