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

@@ -15,6 +15,10 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
use App\Models\SocialAccount;
use App\Models\Conversation;
use App\Models\ConversationParticipant;
use App\Models\AcademyBadge;
use App\Models\AcademyChallengeSubmission;
use App\Models\AcademyLessonProgress;
use App\Models\AcademySavedPrompt;
use App\Models\Message;
use App\Models\Notification;
use App\Models\Achievement;
@@ -198,6 +202,28 @@ class User extends Authenticatable
return $this->hasMany(CollectionSavedList::class, 'user_id')->orderBy('title');
}
public function academyLessonProgress(): HasMany
{
return $this->hasMany(AcademyLessonProgress::class, 'user_id');
}
public function academySavedPrompts(): HasMany
{
return $this->hasMany(AcademySavedPrompt::class, 'user_id');
}
public function academyChallengeSubmissions(): HasMany
{
return $this->hasMany(AcademyChallengeSubmission::class, 'user_id');
}
public function academyBadges(): BelongsToMany
{
return $this->belongsToMany(AcademyBadge::class, 'academy_user_badges', 'user_id', 'badge_id')
->withPivot('awarded_at')
->withTimestamps();
}
public function socialAccounts(): HasMany
{
return $this->hasMany(SocialAccount::class);
@@ -414,6 +440,25 @@ class User extends Authenticatable
return $this->hasRole('moderator') || $this->hasLegacyPrivilegeFlag('isModerator');
}
public function hasAcademyCreatorAccess(): bool
{
return $this->hasAcademyProAccess() || strtolower(trim((string) ($this->role ?? ''))) === 'academy_creator';
}
public function hasAcademyProAccess(): bool
{
return strtolower(trim((string) ($this->role ?? ''))) === 'academy_pro';
}
public function canAccessAcademyContent(object|array $content): bool
{
$accessLevel = is_array($content)
? (string) ($content['access_level'] ?? 'free')
: (string) ($content->access_level ?? 'free');
return app(\App\Services\Academy\AcademyAccessService::class)->canAccessContent($this, $accessLevel);
}
public function posts(): HasMany
{
return $this->hasMany(Post::class)->orderByDesc('created_at');