108
common/Workspaces/Controllers/WorkspaceController.php
Executable file
108
common/Workspaces/Controllers/WorkspaceController.php
Executable file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Workspaces\Controllers;
|
||||
|
||||
use Auth;
|
||||
use Common\Core\BaseController;
|
||||
use Common\Database\Datasource\Datasource;
|
||||
use Common\Workspaces\Actions\CrupdateWorkspace;
|
||||
use Common\Workspaces\Actions\DeleteWorkspaces;
|
||||
use Common\Workspaces\Requests\CrupdateWorkspaceRequest;
|
||||
use Common\Workspaces\Workspace;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class WorkspaceController extends BaseController
|
||||
{
|
||||
public function __construct(
|
||||
protected Workspace $workspace,
|
||||
protected Request $request
|
||||
) {
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$userId = $this->request->get('userId');
|
||||
$this->authorize('index', [Workspace::class, $userId]);
|
||||
|
||||
$builder = $this->workspace
|
||||
->newQuery()
|
||||
->withCount(['members'])
|
||||
->with([
|
||||
'members' => function (HasMany $builder) {
|
||||
$builder->with('permissions')->currentUserAndOwnerOnly();
|
||||
},
|
||||
]);
|
||||
if ($userId) {
|
||||
$builder->forUser($userId);
|
||||
}
|
||||
|
||||
$dataSource = new Datasource($builder, $this->request->all());
|
||||
|
||||
$pagination = $dataSource->paginate();
|
||||
|
||||
$pagination->transform(function (Workspace $workspace) {
|
||||
return $workspace->setCurrentUserAndOwner();
|
||||
});
|
||||
|
||||
return $this->success(['pagination' => $pagination]);
|
||||
}
|
||||
|
||||
public function show(Workspace $workspace)
|
||||
{
|
||||
$this->authorize('show', $workspace);
|
||||
|
||||
$workspace->load(['invites', 'members']);
|
||||
|
||||
if (
|
||||
$workspace->currentUser = $workspace->members
|
||||
->where('id', Auth::id())
|
||||
->first()
|
||||
) {
|
||||
$workspace->currentUser->load('permissions');
|
||||
}
|
||||
|
||||
return $this->success(['workspace' => $workspace]);
|
||||
}
|
||||
|
||||
public function store(CrupdateWorkspaceRequest $request)
|
||||
{
|
||||
$this->authorize('store', Workspace::class);
|
||||
|
||||
$workspace = app(CrupdateWorkspace::class)->execute($request->all());
|
||||
$workspace->loadCount('members');
|
||||
$workspace
|
||||
->load([
|
||||
'members' => function (HasMany $builder) {
|
||||
$builder->currentUserAndOwnerOnly();
|
||||
},
|
||||
])
|
||||
->setCurrentUserAndOwner();
|
||||
|
||||
return $this->success(['workspace' => $workspace]);
|
||||
}
|
||||
|
||||
public function update(
|
||||
Workspace $workspace,
|
||||
CrupdateWorkspaceRequest $request
|
||||
) {
|
||||
$this->authorize('update', $workspace);
|
||||
|
||||
$workspace = app(CrupdateWorkspace::class)->execute(
|
||||
$request->all(),
|
||||
$workspace,
|
||||
);
|
||||
|
||||
return $this->success(['workspace' => $workspace]);
|
||||
}
|
||||
|
||||
public function destroy(string $ids)
|
||||
{
|
||||
$workspaceIds = explode(',', $ids);
|
||||
$this->authorize('destroy', [Workspace::class, $workspaceIds]);
|
||||
|
||||
app(DeleteWorkspaces::class)->execute($workspaceIds);
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
212
common/Workspaces/Controllers/WorkspaceInvitesController.php
Executable file
212
common/Workspaces/Controllers/WorkspaceInvitesController.php
Executable file
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Workspaces\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use Arr;
|
||||
use Auth;
|
||||
use Common\Core\BaseController;
|
||||
use Common\Settings\Settings;
|
||||
use Common\Validation\Validators\EmailsAreValid;
|
||||
use Common\Workspaces\Actions\DeleteInviteNotification;
|
||||
use Common\Workspaces\Notifications\WorkspaceInvitation;
|
||||
use Common\Workspaces\Workspace;
|
||||
use Common\Workspaces\WorkspaceInvite;
|
||||
use Common\Workspaces\WorkspaceMember;
|
||||
use Illuminate\Http\Request;
|
||||
use Notification;
|
||||
use Str;
|
||||
|
||||
class WorkspaceInvitesController extends BaseController
|
||||
{
|
||||
/**
|
||||
* @var Request
|
||||
*/
|
||||
private $request;
|
||||
|
||||
/**
|
||||
* @var WorkspaceInvite
|
||||
*/
|
||||
private $workspaceInvite;
|
||||
|
||||
/**
|
||||
* @var User
|
||||
*/
|
||||
private $user;
|
||||
|
||||
/**
|
||||
* @var Settings
|
||||
*/
|
||||
private $settings;
|
||||
|
||||
public function __construct(
|
||||
Request $request,
|
||||
WorkspaceInvite $workspaceInvite,
|
||||
User $user,
|
||||
Settings $settings,
|
||||
) {
|
||||
$this->request = $request;
|
||||
$this->workspaceInvite = $workspaceInvite;
|
||||
$this->user = $user;
|
||||
$this->settings = $settings;
|
||||
}
|
||||
|
||||
public function resend(
|
||||
Workspace $workspace,
|
||||
WorkspaceInvite $workspaceInvite,
|
||||
) {
|
||||
$this->authorize('store', [WorkspaceMember::class, $workspace, false]);
|
||||
|
||||
$notification = new WorkspaceInvitation(
|
||||
$workspace,
|
||||
Auth::user()->display_name,
|
||||
$workspaceInvite['id'],
|
||||
);
|
||||
|
||||
if ($workspaceInvite->user) {
|
||||
Notification::send($workspaceInvite->user, $notification);
|
||||
} else {
|
||||
Notification::route('mail', $workspaceInvite['email'])->notify(
|
||||
$notification,
|
||||
);
|
||||
}
|
||||
$workspaceInvite->touch();
|
||||
|
||||
return $this->success(['invite' => $workspaceInvite]);
|
||||
}
|
||||
|
||||
public function store(Workspace $workspace)
|
||||
{
|
||||
$this->authorize('store', [WorkspaceMember::class, $workspace]);
|
||||
|
||||
$emailsRules = ['required', 'array'];
|
||||
if (settings('registration.disable')) {
|
||||
$emailsRules[] = new EmailsAreValid();
|
||||
}
|
||||
$validatedData = $this->request->validate([
|
||||
'emails' => $emailsRules,
|
||||
'emails.*' => 'required|email',
|
||||
'roleId' => 'required|int',
|
||||
]);
|
||||
|
||||
$invites = app(WorkspaceInvite::class)
|
||||
->where('workspace_id', $workspace->id)
|
||||
->whereIn('email', $validatedData['emails'])
|
||||
->pluck('email');
|
||||
$alreadyInvitedEmails = app(WorkspaceMember::class)
|
||||
->where('workspace_id', $workspace->id)
|
||||
->join('users', 'users.id', 'workspace_user.user_id')
|
||||
->where('users.email', $validatedData['emails'])
|
||||
->pluck('email')
|
||||
->merge($invites)
|
||||
->toArray();
|
||||
|
||||
$validatedData['emails'] = array_diff(
|
||||
$validatedData['emails'],
|
||||
$alreadyInvitedEmails,
|
||||
);
|
||||
|
||||
if (!empty($validatedData['emails'])) {
|
||||
$existingUsers = $this->user
|
||||
->whereIn('email', $validatedData['emails'])
|
||||
->get()
|
||||
->keyBy('email');
|
||||
|
||||
$workspaceInvites = collect($validatedData['emails'])
|
||||
->map(function ($email) use (
|
||||
$existingUsers,
|
||||
$validatedData,
|
||||
$workspace,
|
||||
) {
|
||||
// if registration is disabled, only allow inviting already registered users
|
||||
if (
|
||||
settings('registration.disable') &&
|
||||
!isset($existingUsers[$email])
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
return [
|
||||
'id' => Str::orderedUuid(),
|
||||
'email' => $email,
|
||||
'user_id' => $existingUsers[$email]['id'] ?? null,
|
||||
'workspace_id' => $workspace->id,
|
||||
'avatar' => isset($existingUsers[$email])
|
||||
? $existingUsers[$email]->getRawOriginal(
|
||||
'avatar',
|
||||
) ?? null
|
||||
: null,
|
||||
'role_id' => $validatedData['roleId'],
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
];
|
||||
})
|
||||
->filter();
|
||||
|
||||
$this->workspaceInvite->insert($workspaceInvites->toArray());
|
||||
|
||||
$workspaceInvites->each(function ($invite) use (
|
||||
$workspace,
|
||||
$existingUsers,
|
||||
) {
|
||||
$notification = new WorkspaceInvitation(
|
||||
$workspace,
|
||||
Auth::user()->display_name,
|
||||
$invite['id'],
|
||||
);
|
||||
if ($user = Arr::get($existingUsers, $invite['email'])) {
|
||||
Notification::send($user, $notification);
|
||||
} else {
|
||||
Notification::route('mail', $invite['email'])->notify(
|
||||
$notification,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
$invites = $workspace
|
||||
->invites()
|
||||
->whereIn(
|
||||
'workspace_invites.id',
|
||||
$workspaceInvites->pluck('id'),
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
return $this->success([
|
||||
'invites' => $invites ?? [],
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy(WorkspaceInvite $workspaceInvite)
|
||||
{
|
||||
$workspace = Workspace::findOrFail($workspaceInvite->workspace_id);
|
||||
$this->authorize('destroy', [
|
||||
WorkspaceMember::class,
|
||||
$workspace,
|
||||
$workspaceInvite->user_id,
|
||||
]);
|
||||
|
||||
if ($workspaceInvite->user) {
|
||||
app(DeleteInviteNotification::class)->execute(
|
||||
$workspaceInvite,
|
||||
$workspaceInvite->user,
|
||||
);
|
||||
}
|
||||
|
||||
$workspaceInvite->delete();
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
public function changeRole(Workspace $workspace, string $inviteId)
|
||||
{
|
||||
$this->authorize('update', [WorkspaceMember::class, $workspace]);
|
||||
|
||||
$validatedData = $this->request->validate([
|
||||
'roleId' => 'required|integer',
|
||||
]);
|
||||
|
||||
app(WorkspaceInvite::class)
|
||||
->where('id', $inviteId)
|
||||
->update(['role_id' => $validatedData['roleId']]);
|
||||
}
|
||||
}
|
||||
79
common/Workspaces/Controllers/WorkspaceMembersController.php
Executable file
79
common/Workspaces/Controllers/WorkspaceMembersController.php
Executable file
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Workspaces\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use Auth;
|
||||
use Common\Core\BaseController;
|
||||
use Common\Workspaces\Actions\JoinWorkspace;
|
||||
use Common\Workspaces\Actions\RemoveMemberFromWorkspace;
|
||||
use Common\Workspaces\Workspace;
|
||||
use Common\Workspaces\WorkspaceInvite;
|
||||
use Common\Workspaces\WorkspaceMember;
|
||||
use Illuminate\Http\Request;
|
||||
use Session;
|
||||
use const App\Providers\WORKSPACE_HOME_ROUTE;
|
||||
|
||||
class WorkspaceMembersController extends BaseController
|
||||
{
|
||||
public function __construct(
|
||||
protected Request $request,
|
||||
protected User $user
|
||||
) {
|
||||
}
|
||||
|
||||
public function join(WorkspaceInvite $workspaceInvite)
|
||||
{
|
||||
if ($user = Auth::user()) {
|
||||
app(JoinWorkspace::class)->execute($workspaceInvite, $user);
|
||||
if ($this->request->expectsJson()) {
|
||||
return $this->success([
|
||||
'workspace' => $workspaceInvite->workspace->loadCount(
|
||||
'members',
|
||||
),
|
||||
]);
|
||||
} else {
|
||||
return redirect(WORKSPACE_HOME_ROUTE);
|
||||
}
|
||||
} else {
|
||||
Session::put('workspaceInvite', $workspaceInvite->id);
|
||||
if (User::where('email', $workspaceInvite->email)->exists()) {
|
||||
return redirect(
|
||||
"workspace/join/login?email={$workspaceInvite->email}",
|
||||
);
|
||||
} else {
|
||||
return redirect(
|
||||
"workspace/join/register?email={$workspaceInvite->email}",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy(Workspace $workspace, int $userId)
|
||||
{
|
||||
$this->authorize('destroy', [
|
||||
WorkspaceMember::class,
|
||||
$workspace,
|
||||
$userId,
|
||||
]);
|
||||
|
||||
app(RemoveMemberFromWorkspace::class)->execute($workspace, $userId);
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
public function changeRole(Workspace $workspace, int $memberId)
|
||||
{
|
||||
$this->authorize('update', [WorkspaceMember::class, $workspace]);
|
||||
|
||||
$validatedData = $this->request->validate([
|
||||
'roleId' => 'required|integer',
|
||||
]);
|
||||
|
||||
app(WorkspaceMember::class)
|
||||
->where('id', $memberId)
|
||||
->update(['role_id' => $validatedData['roleId']]);
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user