65 lines
1.8 KiB
PHP
65 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Subscription\Services;
|
|
|
|
use App\Domains\Subscription\Models\Plan;
|
|
use App\Domains\Workspace\Models\Workspace;
|
|
use Illuminate\Support\Facades\Redis;
|
|
|
|
class PlanLimitsService
|
|
{
|
|
public function canCreateBioPage(Workspace $workspace): bool
|
|
{
|
|
/** @var Plan|null $plan */
|
|
$plan = $workspace->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;
|
|
}
|
|
}
|