plan; if (! $plan || is_null($plan->bio_pages_limit)) { return true; } $count = \App\Domains\Bio\Models\BioPage::where('workspace_id', $workspace->id)->count(); return $count < $plan->bio_pages_limit; } public function canCreateLink(Workspace $workspace): bool { /** @var Plan|null $plan */ $plan = $workspace->plan; if (! $plan || is_null($plan->link_limit)) { return true; } $count = $workspace->links()->count(); return $count < $plan->link_limit; } public function monthlyClicksUsed(Workspace $workspace): int { $key = "clicks:{$workspace->id}:monthly:".now()->format('Ym'); return (int) Redis::get($key); } public function isClickLimitApproaching(Workspace $workspace): bool { /** @var Plan|null $plan */ $plan = $workspace->plan; if (! $plan || is_null($plan->click_limit_monthly)) { return false; } $used = $this->monthlyClicksUsed($workspace); return $used >= ($plan->click_limit_monthly * 0.9); } public function isClickLimitExceeded(Workspace $workspace): bool { /** @var Plan|null $plan */ $plan = $workspace->plan; if (! $plan || is_null($plan->click_limit_monthly)) { return false; } return $this->monthlyClicksUsed($workspace) >= $plan->click_limit_monthly; } }