<?php
namespace Common\Workspaces;
use App\Models\User;
use Auth;
use Common\Workspaces\Workspace;
use Common\Workspaces\WorkspaceMember;
class ActiveWorkspace
{
protected Workspace|null $cachedWorkspace = null;
public array $memberCache = [];
public int $id = 0;
/**
* Whether selected workspace was explicitly specified via request query params or defaulted to personal.
*/
public bool $explicitlySelected = false;
public function __construct()
{
$this->explicitlySelected = request()->has('workspaceId');
$this->id = (int) request()->get('workspaceId', 0);
}
public function workspace(): ?Workspace
{
if (
is_null($this->cachedWorkspace) ||
$this->cachedWorkspace->id !== $this->id
) {
$this->cachedWorkspace = $this->isPersonal()
? null
: Workspace::find($this->id);
}
return $this->cachedWorkspace ?: null;
}
public function isPersonal(): bool
{
return !$this->id;
}
public function owner(): User
{
return $this->workspace()->owner_id === Auth::id()
? Auth::user()
: $this->workspace()->owner;
}
public function currentUserIsOwner(): bool
{
if ($this->isPersonal()) {
return true;
}
return $this->workspace() &&
$this->workspace()->owner_id === Auth::id();
}
public function member(int $userId): ?WorkspaceMember
{
if (!$this->workspace()) {
return null;
}
if (!isset($this->memberCache[$userId])) {
$this->memberCache[$userId] = app(WorkspaceMember::class)
->where([
'user_id' => $userId,
'workspace_id' => $this->workspace()->id,
])
->first();
}
return $this->memberCache[$userId];
}
}