. */ declare(strict_types=1); namespace FireflyIII\Transformers\V2; use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\GroupMembership; use FireflyIII\Models\UserGroup; use FireflyIII\User; use Illuminate\Support\Collection; /** * Class UserGroupTransformer */ class UserGroupTransformer extends AbstractTransformer { private array $inUse; private array $memberships; private array $membershipsVisible; public function __construct() { $this->memberships = []; $this->membershipsVisible = []; $this->inUse = []; } public function collectMetaData(Collection $objects): Collection { if (auth()->check()) { // collect memberships so they can be listed in the group. /** @var User $user */ $user = auth()->user(); /** @var UserGroup $userGroup */ foreach ($objects as $userGroup) { $userGroupId = $userGroup->id; $this->inUse[$userGroupId] = $user->user_group_id === $userGroupId; $access = $user->hasRoleInGroupOrOwner($userGroup, UserRoleEnum::VIEW_MEMBERSHIPS) || $user->hasRole('owner'); $this->membershipsVisible[$userGroupId] = $access; if ($access) { $groupMemberships = $userGroup->groupMemberships()->get(); /** @var GroupMembership $groupMembership */ foreach ($groupMemberships as $groupMembership) { $this->memberships[$userGroupId][] = [ 'user_id' => (string)$groupMembership->user_id, 'user_email' => $groupMembership->user->email, 'role' => $groupMembership->userRole->title, 'you' => $groupMembership->user_id === $user->id, ]; } } } } return $objects; } /** * Transform the user group. */ public function transform(UserGroup $userGroup): array { return [ 'id' => $userGroup->id, 'created_at' => $userGroup->created_at->toAtomString(), 'updated_at' => $userGroup->updated_at->toAtomString(), 'in_use' => $this->inUse[$userGroup->id] ?? false, 'title' => $userGroup->title, 'can_see_members' => $this->membershipsVisible[$userGroup->id] ?? false, 'members' => $this->memberships[$userGroup->id] ?? [], ]; // if the user has a specific role in this group, then collect the memberships. } }