Files
ploi-core/app/Models/Site.php
Dennis f074dee990 wip
2022-04-05 14:59:27 +02:00

158 lines
3.5 KiB
PHP

<?php
namespace App\Models;
use App\Casts\SiteAlias;
use DateTimeInterface;
use Illuminate\Database\Eloquent\Model;
/**
* @property mixed|string domain
*/
class Site extends Model
{
const STATUS_BUSY = 'busy';
const STATUS_ACTIVE = 'active';
const PROJECT_WORDPRESS = 'wordpress';
const PROJECT_NEXTCLOUD = 'nextcloud';
const PROJECT_OCTOBERCMS = 'october-cms';
public $fillable = [
'ploi_id',
'domain',
'dns_id',
'project',
'aliases'
];
public $casts = [
'aliases' => SiteAlias::class,
];
public function setDnsIdAttribute($value)
{
if (!$value) {
return;
}
$this->attributes['dns_id'] = encrypt($value);
}
public function server()
{
return $this->belongsTo(Server::class);
}
public function databases()
{
return $this->hasMany(Database::class);
}
public function cronjobs()
{
return $this->hasMany(Cronjob::class);
}
public function redirects()
{
return $this->hasMany(Redirect::class);
}
public function certificates()
{
return $this->hasMany(Certificate::class);
}
public function users()
{
return $this->morphToMany(User::class, 'service', 'user_service')
->using(UserService::class)
->withTimestamps();
}
public function logs()
{
return $this->morphMany(SystemLog::class, 'model');
}
public function systemUsers()
{
return $this->belongsToMany(SiteSystemUser::class, 'site_system_user_attached');
}
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
public function isActive()
{
return $this->status === self::STATUS_ACTIVE;
}
public function getSystemUser($withPassword = true)
{
if (setting('isolate_per_site_per_user') && $this->systemUsers()->first()) {
$user = $this->systemUsers()->first();
} else {
$user = $this->users()->first();
}
return [
'user_name' => $user->user_name,
] + ($withPassword ? ['ftp_password' => $user->ftp_password] : []);
}
public function addAlias($alias)
{
$aliases = $this->aliases;
$aliases[] = $alias;
$this->aliases = $aliases;
$this->save();
}
public function removeAlias($alias)
{
$this->aliases = array_diff($this->aliases, [$alias]);
$this->save();
}
public static function booted()
{
static::creating(function (self $site) {
$site->domain = strtolower($site->domain);
});
static::created(function (self $site) {
$site->systemUsers()->create();
});
static::deleting(function (self $site) {
foreach ($site->databases as $database) {
$database->delete();
}
$ids = $site->systemUsers->pluck('id');
// Detach all db users
$site->systemUsers()->detach();
// Loop through ids an remove old users.
foreach ($ids as $id) {
$record = SiteSystemUser::find($id);
if ($record) {
$record->delete();
}
}
$site->redirects()->delete();
$site->cronjobs()->delete();
$site->certificates()->delete();
$site->logs()->delete();
$site->users()->detach();
});
}
}