. */ 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 $memberships; /** * */ public function __construct() { $this->memberships = []; } /** * @inheritDoc */ public function collectMetaData(Collection $objects): void { 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 = (int)$userGroup->id; $access = $user->hasRoleInGroup($userGroup, UserRoleEnum::VIEW_MEMBERSHIPS, true, true); 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, ]; } } } } } /** * Transform the user group. * * @param UserGroup $userGroup * * @return array */ public function transform(UserGroup $userGroup): array { $return = [ 'id' => (int)$userGroup->id, 'created_at' => $userGroup->created_at->toAtomString(), 'updated_at' => $userGroup->updated_at->toAtomString(), 'title' => $userGroup->title, 'members' => $this->memberships[(int)$userGroup->id] ?? [], ]; // if the user has a specific role in this group, then collect the memberships. return $return; } }