Files
ploi-core/app/Actions/Site/CreateSiteAction.php
Dennis 58c91fe7bc wip
2022-08-16 08:15:05 +02:00

77 lines
2.2 KiB
PHP

<?php
namespace App\Actions\Site;
use App\Models\Site;
use App\Models\User;
use App\Models\Server;
use App\Jobs\Sites\CreateSite;
use Illuminate\Support\Facades\Mail;
use App\DataTransferObjects\SiteData;
use Illuminate\Database\Eloquent\Model;
use App\Mail\Admin\Site\AdminSiteCreatedEmail;
class CreateSiteAction
{
public function execute(SiteData $siteData): ?Site
{
$server = $this->determineServer($siteData);
if (! $server) {
return null;
}
$site = $server->sites()->create($siteData->toArray());
$siteData->getUser()->sites()->save($site);
dispatch(new CreateSite($site));
$siteData->getUser()->systemLogs()->create([
'title' => 'New site :site created',
'description' => 'A new site has been created',
])->model()->associate($site)->save();
$this->sendAdminSiteCreatedEmails($server, $site, $siteData->getUser());
return $site;
}
protected function determineServer(SiteData $siteData): ?Server
{
if ($siteData->server_id) {
return $siteData->getUser()->servers()->findOrFail($siteData->server_id);
}
$server = Server::query()
->where('maximum_sites', '>', 0)
->where(function ($query) use ($siteData) {
return $query
->where(fn ($query) => $query->whereHas('users', fn ($query) => $query->where('user_id', $siteData->getUser()->id)))
->orWhere(function ($query) {
return $query->doesntHave('users');
});
})
->withCount('sites')
->inRandomOrder()
->first();
return $server && $server->sites_count < $server->maximum_sites
? $server
: null;
}
protected function sendAdminSiteCreatedEmails(Server $server, Model|Site $site, User $user): void
{
if (! setting('receive_email_on_site_creation')) {
return;
}
$admins = User::where('role', User::ADMIN)->get();
foreach ($admins as $admin) {
Mail::to($admin)->send(new AdminSiteCreatedEmail(user: $user, server: $server, site: $site));
}
}
}