Add tests for featured thumbnail generation; apply Pint formatting and related edits

This commit is contained in:
2026-05-06 18:55:40 +02:00
parent 7a8bc8e22a
commit 82f2b1f660
65 changed files with 11325 additions and 49545 deletions

View File

@@ -19,8 +19,7 @@ final class AcademyLessonController extends Controller
public function __construct(
private readonly AcademyAccessService $access,
private readonly AcademyCacheService $cache,
) {
}
) {}
public function index(Request $request): Response
{
@@ -40,8 +39,8 @@ final class AcademyLessonController extends Controller
if (filled($filters['q'] ?? null)) {
$query->where(function ($builder) use ($filters): void {
$builder->where('title', 'like', '%' . $filters['q'] . '%')
->orWhere('excerpt', 'like', '%' . $filters['q'] . '%');
$builder->where('title', 'like', '%'.$filters['q'].'%')
->orWhere('excerpt', 'like', '%'.$filters['q'].'%');
});
}
@@ -81,17 +80,31 @@ final class AcademyLessonController extends Controller
abort_unless((bool) config('academy.enabled', true), 404);
$lesson = AcademyLesson::query()
->with('category')
->with(['category', 'activeBlocks.activeComparisonResults'])
->active()
->published()
->where('slug', $slug)
->firstOrFail();
$payload = $this->access->lessonPayload($lesson, $request->user(), true);
$relatedLessons = $lesson->category_id !== null
? AcademyLesson::query()
->with('category')
->active()
->published()
->where('category_id', $lesson->category_id)
->where('id', '!=', $lesson->id)
->orderByDesc('published_at')
->limit(6)
->get()
->map(fn (AcademyLesson $relatedLesson): array => $this->access->lessonPayload($relatedLesson, $request->user()))
->values()
->all()
: [];
$canonical = route('academy.lessons.show', ['slug' => $lesson->slug]);
$description = Str::limit(trim((string) ($lesson->seo_description ?? $lesson->excerpt ?? 'Skinbase Academy lesson.')), 160, '...');
$seo = app(SeoFactory::class)->collectionPage(
(string) ($lesson->seo_title ?? ($lesson->title . ' — Skinbase Academy')),
(string) ($lesson->seo_title ?? ($lesson->title.' — Skinbase Academy')),
$description,
$canonical,
$lesson->cover_image,
@@ -100,10 +113,11 @@ final class AcademyLessonController extends Controller
return Inertia::render('Academy/Show', [
'pageType' => 'lesson',
'item' => $payload,
'relatedLessons' => $relatedLessons,
'seo' => $seo,
'pricingUrl' => route('academy.pricing'),
'completeUrl' => $request->user() ? route('academy.lessons.complete', ['lesson' => $lesson->id]) : null,
'completed' => $request->user()?->academyLessonProgress()->where('lesson_id', $lesson->id)->whereNotNull('completed_at')->exists() ?? false,
])->rootView('collections');
}
}
}

View File

@@ -100,7 +100,7 @@ final class AcademyPromptController extends Controller
(string) ($prompt->seo_title ?? ($prompt->title . ' — Skinbase Academy')),
$description,
$canonical,
$prompt->preview_image,
$payload['preview_image'] ?? null,
)->toArray();
return Inertia::render('Academy/Show', [