File: /home/eslinced-103/brise-edu.or.kr/app/Models/Central/Tenant.php
<?php
namespace App\Models\Central;
use App\Exceptions\NoPrimaryDomainException;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Laravel\Cashier\Billable;
use Stancl\Tenancy\Contracts\TenantWithDatabase;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;
use Stancl\Tenancy\Database\Models\Tenant as BaseTenant;
/**
* @property-read string $plan_name The tenant's subscription plan name
* @property-read bool $on_active_subscription Is the tenant actively subscribed (not on grace period)
* @property-read bool $can_use_app Can the tenant use the application (is on trial or subscription)
* @property-read Domain[]|Collection $domains
*/
class Tenant extends BaseTenant implements TenantWithDatabase
{
use HasFactory;
use HasDatabase, HasDomains, Billable;
protected $casts = [
'trial_ends_at' => 'datetime',
];
public static function getCustomColumns(): array
{
return [
'id',
'email',
'stripe_id',
'pm_type',
'pm_last_four',
'trial_ends_at',
'user_id',
'theme'
];
}
// public function user(): BelongsTo
// {
// return $this->belongsTo(User::class,'user_id','id','users');
// }
// public function theme(): string{
// return $this->attributes['theme'];
// }
public function primary_domain(): HasOne
{
return $this->hasOne(Domain::class)->where('is_primary', true);
}
public function fallback_domain(): HasOne
{
return $this->hasOne(Domain::class)->where('is_fallback', true);
}
public function route($route, $parameters = [], $absolute = true): array|string
{
if (! $this->primary_domain) {
throw new NoPrimaryDomainException;
}
$domain = $this->primary_domain->domain;
$parts = explode('.', $domain);
if (count($parts) === 1) { // If subdomain
$domain = Domain::domainFromSubdomain($domain);
}
return tenant_route($domain, $route, $parameters, $absolute);
}
public function impersonationUrl($user_id): string
{
$token = tenancy()->impersonate($this, $user_id, $this->route('tenant.home'), 'web')->token;
return $this->route('tenant.impersonate', ['token' => $token]);
}
/**
* Get the tenant's subscription plan name.
*/
public function getPlanNameAttribute(): string
{
return config('saas.plans')[$this->subscription('default')->stripe_price];
}
/**
* Is the tenant actively subscribed (not on grace period).
*/
public function getOnActiveSubscriptionAttribute(): bool
{
return $this->subscribed('default') && ! $this->subscription('default')->canceled();
}
/**
* Can the tenant use the application (is on trial or subscription).
*/
public function getCanUseAppAttribute(): bool
{
return $this->onTrial() || $this->subscribed('default');
}
public static function boot() {
parent::boot();
static::created(function($model) {
$domain = $model->getKey();
$model->createDomain([
'domain' => $domain,
])->makePrimary()->makeFallback();
});
}
}