Implement academy analytics, billing, and web stories updates

This commit is contained in:
2026-05-26 07:27:29 +02:00
parent 456c3d6bb0
commit 0b33a1b074
177 changed files with 27360 additions and 2685 deletions

View File

@@ -18,8 +18,13 @@ use App\Models\ConversationParticipant;
use App\Models\AcademyBadge;
use App\Models\AcademyCourseEnrollment;
use App\Models\AcademyChallengeSubmission;
use App\Models\AcademyEvent;
use App\Models\AcademyLike;
use App\Models\AcademyLessonProgress;
use App\Models\AcademySave;
use App\Models\AcademySavedPrompt;
use App\Models\AcademySearchLog;
use App\Models\AcademyUserProgress;
use App\Models\Message;
use App\Models\Notification;
use App\Models\Achievement;
@@ -30,6 +35,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
use Laravel\Cashier\Billable;
use Laravel\Scout\Searchable;
class User extends Authenticatable
@@ -40,7 +46,7 @@ class User extends Authenticatable
];
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable, SoftDeletes;
use Billable, HasFactory, Notifiable, SoftDeletes;
use Searchable {
Searchable::bootSearchable as private bootScoutSearchable;
}
@@ -218,6 +224,31 @@ class User extends Authenticatable
return $this->hasMany(AcademySavedPrompt::class, 'user_id');
}
public function academyEvents(): HasMany
{
return $this->hasMany(AcademyEvent::class, 'user_id');
}
public function academyLikes(): HasMany
{
return $this->hasMany(AcademyLike::class, 'user_id');
}
public function academySaves(): HasMany
{
return $this->hasMany(AcademySave::class, 'user_id');
}
public function academyUserProgress(): HasMany
{
return $this->hasMany(AcademyUserProgress::class, 'user_id');
}
public function academySearchLogs(): HasMany
{
return $this->hasMany(AcademySearchLog::class, 'user_id');
}
public function academyChallengeSubmissions(): HasMany
{
return $this->hasMany(AcademyChallengeSubmission::class, 'user_id');
@@ -448,12 +479,12 @@ class User extends Authenticatable
public function hasAcademyCreatorAccess(): bool
{
return $this->hasAcademyProAccess() || strtolower(trim((string) ($this->role ?? ''))) === 'academy_creator';
return in_array(app(\App\Services\Academy\AcademyAccessService::class)->currentTier($this), ['creator', 'pro', 'admin'], true);
}
public function hasAcademyProAccess(): bool
{
return strtolower(trim((string) ($this->role ?? ''))) === 'academy_pro';
return in_array(app(\App\Services\Academy\AcademyAccessService::class)->currentTier($this), ['pro', 'admin'], true);
}
public function canAccessAcademyContent(object|array $content): bool