feat(academy): prepare AI Academy v1 for production enablement

This commit is contained in:
2026-05-03 19:59:27 +02:00
parent 90e93f0d42
commit a3cfc6c17f
131 changed files with 60702 additions and 135850 deletions

View File

@@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace App\Services\Academy;
use App\Models\AcademyBadge;
use App\Models\AcademySavedPrompt;
use App\Models\User;
final class AcademyBadgeService
{
public function syncForUser(User $user): void
{
if (! (bool) config('academy.badges_enabled', true)) {
return;
}
$savedPromptCount = AcademySavedPrompt::query()->where('user_id', $user->id)->count();
$completedLessons = $user->academyLessonProgress()->whereNotNull('completed_at')->count();
foreach (AcademyBadge::query()->active()->get() as $badge) {
$rules = (array) ($badge->rules ?? []);
if (isset($rules['complete_lessons']) && $completedLessons < (int) $rules['complete_lessons']) {
continue;
}
if (isset($rules['save_prompts']) && $savedPromptCount < (int) $rules['save_prompts']) {
continue;
}
$user->academyBadges()->syncWithoutDetaching([
$badge->id => ['awarded_at' => now()],
]);
}
}
}