Files
ploi-core/app/Models/Site.php
Dennis 0f63b8153a wip
2022-10-17 10:40:20 +02:00

206 lines
5.2 KiB
PHP

<?php
namespace App\Models;
use DateTimeInterface;
use App\Casts\SiteAlias;
use Illuminate\Support\Str;
use App\Jobs\Cronjobs\DeleteCronjob;
use App\Jobs\Databases\DeleteDatabase;
use App\Jobs\Redirects\DeleteRedirect;
use Illuminate\Database\Eloquent\Model;
use App\Jobs\Certificates\DeleteCertificate;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
class Site extends Model
{
use HasFactory;
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',
'php_version'
];
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 user(): HasOneThrough
{
return $this->hasOneThrough(User::class, UserService::class, 'service_id', 'id', 'id', 'user_id');
}
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([
'user_name' => Str::of($site->domain)->remove(['.', '-'])->limit(8, '')->lower()->append('-' . $site->id),
]);
});
static::deleting(function (self $site) {
$site
->databases()
->get()
->each(function (Database $database) {
if ($server = $database->server) {
dispatch(new DeleteDatabase($server->ploi_id, $database->ploi_id));
}
$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();
}
}
// MOETEN HIER OOK JOBS VOOR WORDEN GEDISPATCHET?
$site
->redirects()
->get()
->each(function (Redirect $redirect) {
dispatch(new DeleteRedirect($redirect->server->ploi_id, $redirect->site->ploi_id, $redirect->ploi_id));
$redirect->delete();
});
$site
->cronjobs()
->get()
->each(function (Cronjob $cronJob) {
dispatch(new DeleteCronjob($cronJob->server->ploi_id, $cronJob->ploi_id));
$cronJob->delete();
});
$site
->certificates()
->get()
->each(function (Certificate $certificate) {
dispatch(new DeleteCertificate($certificate->server->ploi_id, $certificate->site->ploi_id, $certificate->ploi_id));
$certificate->delete();
});
$site->logs()->delete();
$site->users()->detach();
});
}
}