mirror of
https://github.com/vitodeploy/vito.git
synced 2025-07-02 14:36:17 +00:00
Plugins base (#613)
* wip * wip * cleanup * notification channels * phpstan * services * remove server types * refactoring * refactoring
This commit is contained in:
@ -3,6 +3,7 @@
|
||||
namespace App\Http\Controllers\API;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Knuckles\Scribe\Attributes\Endpoint;
|
||||
use Knuckles\Scribe\Attributes\Group;
|
||||
use Knuckles\Scribe\Attributes\Unauthenticated;
|
||||
@ -14,7 +15,7 @@ class HealthController extends Controller
|
||||
#[Get('api/health', name: 'api.health')]
|
||||
#[Unauthenticated]
|
||||
#[Endpoint(title: 'health-check')]
|
||||
public function __invoke(): \Illuminate\Http\JsonResponse
|
||||
public function __invoke(): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
|
@ -5,10 +5,6 @@
|
||||
use App\Actions\Server\CreateServer;
|
||||
use App\Actions\Server\RebootServer;
|
||||
use App\Actions\Server\Update;
|
||||
use App\Enums\Database;
|
||||
use App\Enums\PHP;
|
||||
use App\Enums\ServerProvider;
|
||||
use App\Enums\Webserver;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\ServerResource;
|
||||
use App\Models\Project;
|
||||
@ -45,16 +41,16 @@ public function index(Project $project): ResourceCollection
|
||||
#[Post('/', name: 'api.projects.servers.create', middleware: 'ability:write')]
|
||||
#[Endpoint(title: 'create', description: 'Create a new server.')]
|
||||
#[BodyParam(name: 'provider', description: 'The server provider type', required: true)]
|
||||
#[BodyParam(name: 'server_provider', description: 'If the provider is not custom, the ID of the server provider profile', enum: [ServerProvider::CUSTOM, ServerProvider::HETZNER, ServerProvider::DIGITALOCEAN, ServerProvider::LINODE, ServerProvider::VULTR])]
|
||||
#[BodyParam(name: 'server_provider', description: 'If the provider is not custom, the ID of the server provider profile')]
|
||||
#[BodyParam(name: 'region', description: 'Provider region if the provider is not custom')]
|
||||
#[BodyParam(name: 'plan', description: 'Provider plan if the provider is not custom')]
|
||||
#[BodyParam(name: 'ip', description: 'SSH IP address if the provider is custom')]
|
||||
#[BodyParam(name: 'port', description: 'SSH Port if the provider is custom')]
|
||||
#[BodyParam(name: 'name', description: 'The name of the server.', required: true)]
|
||||
#[BodyParam(name: 'os', description: 'The os of the server', required: true)]
|
||||
#[BodyParam(name: 'webserver', description: 'Web server', required: true, enum: [Webserver::NONE, Webserver::NGINX, Webserver::CADDY])]
|
||||
#[BodyParam(name: 'database', description: 'Database', required: true, enum: [Database::NONE, Database::MYSQL57, Database::MYSQL80, Database::MARIADB103, Database::MARIADB104, Database::MARIADB103, Database::POSTGRESQL12, Database::POSTGRESQL13, Database::POSTGRESQL14, Database::POSTGRESQL15, Database::POSTGRESQL16], )]
|
||||
#[BodyParam(name: 'php', description: 'PHP version', required: true, enum: [PHP::V70, PHP::V71, PHP::V72, PHP::V73, PHP::V74, PHP::V80, PHP::V81, PHP::V82, PHP::V83])]
|
||||
#[BodyParam(name: 'webserver', description: 'Web server', required: true)]
|
||||
#[BodyParam(name: 'database', description: 'Database', required: true)]
|
||||
#[BodyParam(name: 'php', description: 'PHP version', required: true)]
|
||||
#[ResponseFromApiResource(ServerResource::class, Server::class)]
|
||||
public function create(Request $request, Project $project): ServerResource
|
||||
{
|
||||
|
@ -9,13 +9,13 @@
|
||||
use App\Actions\Site\UpdateEnv;
|
||||
use App\Actions\Site\UpdateLoadBalancer;
|
||||
use App\Enums\LoadBalancerMethod;
|
||||
use App\Enums\SiteType;
|
||||
use App\Exceptions\DeploymentScriptIsEmptyException;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\SiteResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\Server;
|
||||
use App\Models\Site;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\ResourceCollection;
|
||||
use Knuckles\Scribe\Attributes\BodyParam;
|
||||
@ -49,7 +49,7 @@ public function index(Project $project, Server $server): ResourceCollection
|
||||
|
||||
#[Post('/', name: 'api.projects.servers.sites.create', middleware: 'ability:write')]
|
||||
#[Endpoint(title: 'create', description: 'Create a new site.')]
|
||||
#[BodyParam(name: 'type', required: true, enum: [SiteType::PHP, SiteType::PHP_BLANK, SiteType::PHPMYADMIN, SiteType::LARAVEL, SiteType::WORDPRESS, SiteType::LOAD_BALANCER])]
|
||||
#[BodyParam(name: 'type', required: true)]
|
||||
#[BodyParam(name: 'domain', required: true)]
|
||||
#[BodyParam(name: 'aliases', type: 'array')]
|
||||
#[BodyParam(name: 'php_version', description: 'One of the installed PHP Versions', required: true, example: '7.4')]
|
||||
@ -172,7 +172,7 @@ public function updateDeploymentScript(Request $request, Project $project, Serve
|
||||
#[Get('{site}/deployment-script', name: 'api.projects.servers.sites.deployment-script.show', middleware: 'ability:read')]
|
||||
#[Endpoint(title: 'deployment-script', description: 'Get site deployment script content')]
|
||||
#[Response(status: 200)]
|
||||
public function showDeploymentScript(Project $project, Server $server, Site $site): \Illuminate\Http\JsonResponse
|
||||
public function showDeploymentScript(Project $project, Server $server, Site $site): JsonResponse
|
||||
{
|
||||
$this->authorize('view', [$site, $server]);
|
||||
|
||||
@ -190,7 +190,7 @@ public function showDeploymentScript(Project $project, Server $server, Site $sit
|
||||
'env' => 'APP_NAME=Laravel\nAPP_ENV=production',
|
||||
],
|
||||
], status: 200)]
|
||||
public function showEnv(Project $project, Server $server, Site $site): \Illuminate\Http\JsonResponse
|
||||
public function showEnv(Project $project, Server $server, Site $site): JsonResponse
|
||||
{
|
||||
$this->authorize('view', [$site, $server]);
|
||||
|
||||
|
@ -42,7 +42,7 @@ public function index(Project $project): ResourceCollection
|
||||
|
||||
#[Post('/', name: 'api.projects.source-controls.create', middleware: 'ability:write')]
|
||||
#[Endpoint(title: 'create')]
|
||||
#[BodyParam(name: 'provider', description: 'The provider', required: true, enum: [\App\Enums\SourceControl::GITLAB, \App\Enums\SourceControl::GITHUB, \App\Enums\SourceControl::BITBUCKET])]
|
||||
#[BodyParam(name: 'provider', description: 'The provider', required: true)]
|
||||
#[BodyParam(name: 'name', description: 'The name of the storage provider.', required: true)]
|
||||
#[BodyParam(name: 'token', description: 'The token if provider requires api token')]
|
||||
#[BodyParam(name: 'url', description: 'The URL if the provider is Gitlab and it is self-hosted')]
|
||||
@ -61,7 +61,7 @@ public function create(Request $request, Project $project): SourceControlResourc
|
||||
#[Get('{sourceControl}', name: 'api.projects.source-controls.show', middleware: 'ability:read')]
|
||||
#[Endpoint(title: 'show')]
|
||||
#[ResponseFromApiResource(SourceControlResource::class, SourceControl::class)]
|
||||
public function show(Project $project, SourceControl $sourceControl): \App\Http\Resources\SourceControlResource
|
||||
public function show(Project $project, SourceControl $sourceControl): SourceControlResource
|
||||
{
|
||||
$this->authorize('view', $sourceControl);
|
||||
|
||||
@ -79,7 +79,7 @@ public function show(Project $project, SourceControl $sourceControl): \App\Http\
|
||||
#[BodyParam(name: 'password', description: 'The password if the provider is Bitbucket')]
|
||||
#[BodyParam(name: 'global', description: 'Accessible in all projects', enum: [true, false])]
|
||||
#[ResponseFromApiResource(SourceControlResource::class, SourceControl::class)]
|
||||
public function update(Request $request, Project $project, SourceControl $sourceControl): \App\Http\Resources\SourceControlResource
|
||||
public function update(Request $request, Project $project, SourceControl $sourceControl): SourceControlResource
|
||||
{
|
||||
$this->authorize('update', $sourceControl);
|
||||
|
||||
|
@ -63,7 +63,9 @@ public function enableForceSSL(Server $server, Site $site): RedirectResponse
|
||||
|
||||
$site->force_ssl = true;
|
||||
$site->save();
|
||||
$site->webserver()->updateVHost($site);
|
||||
$site->webserver()->updateVHost($site, regenerate: [
|
||||
'force-ssl',
|
||||
]);
|
||||
|
||||
return back()
|
||||
->with('success', 'Force SSL enabled successfully.');
|
||||
@ -76,7 +78,9 @@ public function disableForceSSL(Server $server, Site $site): RedirectResponse
|
||||
|
||||
$site->force_ssl = false;
|
||||
$site->save();
|
||||
$site->webserver()->updateVHost($site);
|
||||
$site->webserver()->updateVHost($site, regenerate: [
|
||||
'force-ssl',
|
||||
]);
|
||||
|
||||
return back()
|
||||
->with('success', 'Force SSL disabled successfully.');
|
||||
|
45
app/Http/Controllers/SiteFeatureController.php
Normal file
45
app/Http/Controllers/SiteFeatureController.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Server;
|
||||
use App\Models\Site;
|
||||
use App\SiteFeatures\ActionInterface;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
use Spatie\RouteAttributes\Attributes\Get;
|
||||
use Spatie\RouteAttributes\Attributes\Middleware;
|
||||
use Spatie\RouteAttributes\Attributes\Post;
|
||||
use Spatie\RouteAttributes\Attributes\Prefix;
|
||||
|
||||
#[Prefix('/servers/{server}/sites/{site}/features')]
|
||||
#[Middleware(['auth', 'has-project'])]
|
||||
class SiteFeatureController extends Controller
|
||||
{
|
||||
#[Get('/', name: 'site-features')]
|
||||
public function index(Server $server, Site $site): Response
|
||||
{
|
||||
$this->authorize('view', [$site, $server]);
|
||||
|
||||
return Inertia::render('site-features/index', [
|
||||
'features' => $site->features(),
|
||||
]);
|
||||
}
|
||||
|
||||
#[Post('/{feature}/{action}', name: 'site-features.action')]
|
||||
public function action(Request $request, Server $server, Site $site, string $feature, string $action): RedirectResponse
|
||||
{
|
||||
$this->authorize('update', [$site, $server]);
|
||||
|
||||
$handler = config('site.types.'.$site->type.'.features.'.$feature.'.actions.'.$action.'.handler');
|
||||
if ($handler && class_exists($handler)) {
|
||||
/** @var ActionInterface $actionHandler */
|
||||
$actionHandler = new $handler($site);
|
||||
$actionHandler->handle($request);
|
||||
}
|
||||
|
||||
return back();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user