diff --git a/app/Server/Configuration.php b/app/Server/Configuration.php index 2d1d07e..284e15a 100644 --- a/app/Server/Configuration.php +++ b/app/Server/Configuration.php @@ -2,7 +2,7 @@ namespace App\Server; -class Configuration +class Configuration implements \JsonSerializable { /** @var string */ protected $hostname; @@ -36,4 +36,15 @@ class Configuration { return $this->$key ?? config('expose.admin.'.$key); } + + /** + * @inheritDoc + */ + public function jsonSerialize() + { + return array_merge([ + 'hostname' => $this->hostname(), + 'port' => $this->port(), + ], config('expose.admin')); + } } diff --git a/app/Server/Factory.php b/app/Server/Factory.php index e94f7d5..24eb5c0 100644 --- a/app/Server/Factory.php +++ b/app/Server/Factory.php @@ -9,6 +9,9 @@ use App\Http\Server as HttpServer; use App\Server\Connections\ConnectionManager; use App\Server\Http\Controllers\Admin\DeleteUsersController; use App\Server\Http\Controllers\Admin\DisconnectSiteController; +use App\Server\Http\Controllers\Admin\GetSettingsController; +use App\Server\Http\Controllers\Admin\GetSitesController; +use App\Server\Http\Controllers\Admin\GetUsersController; use App\Server\Http\Controllers\Admin\ListSitesController; use App\Server\Http\Controllers\Admin\ListUsersController; use App\Server\Http\Controllers\Admin\RedirectToUsersController; @@ -117,11 +120,15 @@ class Factory $this->router->get('/', RedirectToUsersController::class, $adminCondition); $this->router->get('/users', ListUsersController::class, $adminCondition); $this->router->get('/settings', ShowSettingsController::class, $adminCondition); - $this->router->post('/settings', SaveSettingsController::class, $adminCondition); - $this->router->post('/users', StoreUsersController::class, $adminCondition); - $this->router->delete('/users/{id}', DeleteUsersController::class, $adminCondition); $this->router->get('/sites', ListSitesController::class, $adminCondition); - $this->router->delete('/sites/{id}', DisconnectSiteController::class, $adminCondition); + + $this->router->get('/api/settings', GetSettingsController::class, $adminCondition); + $this->router->post('/api/settings', SaveSettingsController::class, $adminCondition); + $this->router->get('/api/users', GetUsersController::class, $adminCondition); + $this->router->post('/api/users', StoreUsersController::class, $adminCondition); + $this->router->delete('/api/users/{id}', DeleteUsersController::class, $adminCondition); + $this->router->get('/api/sites', GetSitesController::class, $adminCondition); + $this->router->delete('/api/sites/{id}', DisconnectSiteController::class, $adminCondition); } protected function bindConfiguration() diff --git a/app/Server/Http/Controllers/Admin/GetSettingsController.php b/app/Server/Http/Controllers/Admin/GetSettingsController.php new file mode 100644 index 0000000..44d6247 --- /dev/null +++ b/app/Server/Http/Controllers/Admin/GetSettingsController.php @@ -0,0 +1,32 @@ +configuration = $configuration; + } + + public function handle(Request $request, ConnectionInterface $httpConnection) + { + $httpConnection->send( + respond_json([ + 'configuration' => $this->configuration, + ]) + ); + } +} diff --git a/app/Server/Http/Controllers/Admin/GetSitesController.php b/app/Server/Http/Controllers/Admin/GetSitesController.php new file mode 100644 index 0000000..0296318 --- /dev/null +++ b/app/Server/Http/Controllers/Admin/GetSitesController.php @@ -0,0 +1,35 @@ +connectionManager = $connectionManager; + } + + public function handle(Request $request, ConnectionInterface $httpConnection) + { + $httpConnection->send( + respond_json([ + 'sites' => $this->connectionManager->getConnections() + ]) + ); + } +} diff --git a/app/Server/Http/Controllers/Admin/GetUsersController.php b/app/Server/Http/Controllers/Admin/GetUsersController.php new file mode 100644 index 0000000..39e702d --- /dev/null +++ b/app/Server/Http/Controllers/Admin/GetUsersController.php @@ -0,0 +1,40 @@ +userRepository = $userRepository; + } + + public function handle(Request $request, ConnectionInterface $httpConnection) + { + $this->userRepository + ->getUsers() + ->then(function ($users) use ($httpConnection) { + $httpConnection->send( + respond_json(['users' => $users]) + ); + + $httpConnection->close(); + }); + } +} diff --git a/app/Server/Http/Controllers/Admin/SaveSettingsController.php b/app/Server/Http/Controllers/Admin/SaveSettingsController.php index 9073bb3..7be11fb 100644 --- a/app/Server/Http/Controllers/Admin/SaveSettingsController.php +++ b/app/Server/Http/Controllers/Admin/SaveSettingsController.php @@ -8,6 +8,7 @@ use App\Server\Configuration; use Clue\React\SQLite\Result; use GuzzleHttp\Psr7\Response; use Illuminate\Http\Request; +use Illuminate\Support\Arr; use Ratchet\ConnectionInterface; use Twig\Environment; use Twig\Loader\ArrayLoader; @@ -16,15 +17,11 @@ use function GuzzleHttp\Psr7\stream_for; class SaveSettingsController extends AdminController { - /** @var ConnectionManager */ - protected $connectionManager; - /** @var Configuration */ protected $configuration; - public function __construct(ConnectionManager $connectionManager, Configuration $configuration) + public function __construct(Configuration $configuration) { - $this->connectionManager = $connectionManager; $this->configuration = $configuration; } @@ -32,14 +29,18 @@ class SaveSettingsController extends AdminController { config()->set('expose.admin.validate_auth_tokens', $request->has('validate_auth_tokens')); - config()->set('expose.admin.messages.invalid_auth_token', $request->get('invalid_auth_token')); + $messages = $request->get('messages'); - config()->set('expose.admin.messages.subdomain_taken', $request->get('subdomain_taken')); + config()->set('expose.admin.messages.invalid_auth_token', Arr::get($messages, 'invalid_auth_token')); - config()->set('expose.admin.messages.message_of_the_day', $request->get('motd')); + config()->set('expose.admin.messages.subdomain_taken', Arr::get($messages, 'subdomain_taken')); - $httpConnection->send(str(new Response(301, [ - 'Location' => '/settings' - ]))); + config()->set('expose.admin.messages.message_of_the_day', Arr::get($messages, 'message_of_the_day')); + + $httpConnection->send( + respond_json([ + 'configuration' => $this->configuration, + ]) + ); } } diff --git a/resources/views/server/settings/index.twig b/resources/views/server/settings/index.twig index b81ab61..38c54e2 100644 --- a/resources/views/server/settings/index.twig +++ b/resources/views/server/settings/index.twig @@ -25,7 +25,7 @@ type="checkbox" name="validate_auth_tokens" value="1" - {% if configuration.validate_auth_tokens %} checked="checked" {% endif %} + v-model="configuration.validate_auth_tokens" class="form-checkbox h-4 w-4 text-indigo-600 transition duration-150 ease-in-out"/>
@@ -48,7 +48,8 @@
+ v-model="configuration.messages.message_of_the_day" + class="form-textarea block w-full transition duration-150 ease-in-out sm:text-sm sm:leading-5">

This message will be shown, when a successful connection can be established.

@@ -66,7 +67,8 @@ + v-model="configuration.messages.invalid_auth_token" + class="form-textarea block w-full transition duration-150 ease-in-out sm:text-sm sm:leading-5">

This message will be shown, when a user tries to connect with an invalid authentication token.

@@ -82,7 +84,8 @@
+ v-model="configuration.messages.subdomain_taken" + class="form-textarea block w-full transition duration-150 ease-in-out sm:text-sm sm:leading-5">

This message will be shown, when a user tries to connect with an already registered subdomain. You can use @@ -97,14 +100,9 @@

- - - @@ -115,3 +113,32 @@
{% endblock %} +{% block scripts %} + +{% endblock %} diff --git a/resources/views/server/sites/index.twig b/resources/views/server/sites/index.twig index 1747e77..0ec7943 100644 --- a/resources/views/server/sites/index.twig +++ b/resources/views/server/sites/index.twig @@ -58,7 +58,7 @@ methods: { disconnectSite(id) { - fetch('/sites/' + id, { + fetch('/api/sites/' + id, { method: 'DELETE', }).then((response) => { return response.json(); diff --git a/resources/views/server/users/index.twig b/resources/views/server/users/index.twig index bde4764..5b81b0c 100644 --- a/resources/views/server/users/index.twig +++ b/resources/views/server/users/index.twig @@ -97,7 +97,7 @@ methods: { deleteUser(user) { - fetch('/users/' + user.id, { + fetch('/api/users/' + user.id, { method: 'DELETE', }).then((response) => { return response.json(); @@ -106,7 +106,7 @@ }); }, saveUser() { - fetch('/users', { + fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json'