Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/websockets provider #175

Merged
merged 3 commits into from Nov 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions composer.json
Expand Up @@ -81,6 +81,7 @@
"LaravelEnso\\Core\\AppServiceProvider",
"LaravelEnso\\Core\\AuthServiceProvider",
"LaravelEnso\\Core\\BroadcastServiceProvider",
"LaravelEnso\\Core\\WebsocketServiceProvider",
"LaravelEnso\\Core\\EventServiceProvider"
]
}
Expand Down
5 changes: 5 additions & 0 deletions src/AppServiceProvider.php
Expand Up @@ -13,13 +13,18 @@
use LaravelEnso\Core\Http\Middleware\VerifyActiveState;
use LaravelEnso\Core\Http\Middleware\XssSanitizer;
use LaravelEnso\Core\Models\User;
use LaravelEnso\Core\Services\Websockets;
use LaravelEnso\Helpers\Services\FactoryResolver;
use LaravelEnso\Impersonate\Http\Middleware\Impersonate;
use LaravelEnso\Localisation\Http\Middleware\SetLanguage;
use LaravelEnso\Permissions\Http\Middleware\VerifyRouteAccess;

class AppServiceProvider extends ServiceProvider
{
public $singletons = [
'websockets' => Websockets::class,
];

public function boot()
{
JsonResource::withoutWrapping();
Expand Down
13 changes: 13 additions & 0 deletions src/Facades/Websockets.php
@@ -0,0 +1,13 @@
<?php

namespace LaravelEnso\Core\Facades;

use Illuminate\Support\Facades\Facade;

class Websockets extends Facade
{
public static function getFacadeAccessor()
{
return 'websockets';
}
}
25 changes: 2 additions & 23 deletions src/Http/Responses/AppState.php
Expand Up @@ -10,6 +10,7 @@
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Session;
use LaravelEnso\Core\Enums\Themes;
use LaravelEnso\Core\Facades\Websockets;
use LaravelEnso\Core\Http\Resources\User;
use LaravelEnso\Core\Services\Inspiring;
use LaravelEnso\Core\Services\LocalState;
Expand All @@ -20,7 +21,6 @@
use LaravelEnso\Menus\Http\Resources\Menu;
use LaravelEnso\Menus\Services\TreeBuilder;
use LaravelEnso\Permissions\Models\Permission;
use LaravelEnso\Roles\Enums\Roles;
use LaravelEnso\Roles\Models\Role;

class AppState implements Responsable
Expand Down Expand Up @@ -53,12 +53,7 @@ protected function response(): array
'key' => Config::get('broadcasting.connections.pusher.key'),
'options' => Config::get('broadcasting.connections.pusher.options'),
],
'channels' => [
'privateChannel' => $this->privateChannel(),
'ioChannel' => $this->ioChannel(),
'appUpdates' => 'app-updates',
'taskChannel' => 'tasks.'.Auth::user()->id,
],
'channels' => Websockets::all(),
],
'meta' => $this->meta(),
'enums' => Enums::all(),
Expand Down Expand Up @@ -123,22 +118,6 @@ protected function route(Permission $permission): ?array
: null;
}

protected function privateChannel(): string
{
return (new Collection(
explode('\\', Config::get('auth.providers.users.model'))
))->push(Auth::user()->id)->implode('.');
}

protected function ioChannel(): string
{
$roles = App::make(Roles::class);

return in_array(Auth::user()->role_id, [$roles::Admin, $roles::Supervisor])
? 'operations'
: 'operations.'.Auth::user()->id;
}

protected function prepare(): void
{
$this->role = Auth::user()->role()
Expand Down
35 changes: 35 additions & 0 deletions src/Services/Websockets.php
@@ -0,0 +1,35 @@
<?php

namespace LaravelEnso\Core\Services;

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;

class Websockets
{
private Collection $channels;

public function __construct()
{
$this->channels = new Collection();
}

public function register($channels)
{
(new Collection($channels))->each(fn ($channel, $key) => $this->channels->put(
$key,
$channel
));
}

public function remove($aliases)
{
(new Collection($aliases))->each(fn ($alias) => $this->channels->forget($alias));
}

public function all()
{
return $this->channels
->map(fn ($channel) => is_string($channel) ? $channel : $channel->call($this, Auth::user()));
}
}
31 changes: 31 additions & 0 deletions src/WebsocketServiceProvider.php
@@ -0,0 +1,31 @@
<?php

namespace LaravelEnso\Core;

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\ServiceProvider;
use LaravelEnso\Core\Facades\Websockets;
use LaravelEnso\Core\Models\User;

class WebsocketServiceProvider extends ServiceProvider
{
protected array $register = [];

public function boot()
{
return static::class === self::class
? $this->coreChannels()
: Websockets::register($this->register);
}

private function coreChannels()
{
Websockets::register([
'appUpdates' => 'app-updates',
'private' => fn (User $user) => (new Collection(
explode('\\', Config::get('auth.providers.users.model'))
))->push($user->id)->implode('.'),
]);
}
}