Files
SkinbaseNova/app/Services/Academy/AcademyBadgeService.php

38 lines
1.1 KiB
PHP

<?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()],
]);
}
}
}