diff --git a/app/Api/V1/Controllers/Autocomplete/AccountController.php b/app/Api/V1/Controllers/Autocomplete/AccountController.php index cb31c41a62..a9971fc61c 100644 --- a/app/Api/V1/Controllers/Autocomplete/AccountController.php +++ b/app/Api/V1/Controllers/Autocomplete/AccountController.php @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Enums\AccountTypeEnum; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -47,6 +48,7 @@ class AccountController extends Controller // this array only exists to test if the constructor will use it properly. protected array $accepts = ['application/json', 'application/vnd.api+json']; + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; /** @var array */ private array $balanceTypes; @@ -60,10 +62,10 @@ class AccountController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(AccountRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/BillController.php b/app/Api/V1/Controllers/Autocomplete/BillController.php index d95e1ee108..6bdb8b7afe 100644 --- a/app/Api/V1/Controllers/Autocomplete/BillController.php +++ b/app/Api/V1/Controllers/Autocomplete/BillController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\User; @@ -37,6 +38,7 @@ use Illuminate\Http\JsonResponse; class BillController extends Controller { private BillRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_SUBSCRIPTIONS]; /** * BillController constructor. @@ -46,10 +48,10 @@ class BillController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(BillRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/BudgetController.php b/app/Api/V1/Controllers/Autocomplete/BudgetController.php index dec3e5961c..ada51c325b 100644 --- a/app/Api/V1/Controllers/Autocomplete/BudgetController.php +++ b/app/Api/V1/Controllers/Autocomplete/BudgetController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Budget; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\User; @@ -37,6 +38,7 @@ use Illuminate\Http\JsonResponse; class BudgetController extends Controller { private BudgetRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_BUDGETS]; /** * BudgetController constructor. @@ -46,10 +48,10 @@ class BudgetController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(BudgetRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/CategoryController.php b/app/Api/V1/Controllers/Autocomplete/CategoryController.php index ea4032bc6f..8211f2dd62 100644 --- a/app/Api/V1/Controllers/Autocomplete/CategoryController.php +++ b/app/Api/V1/Controllers/Autocomplete/CategoryController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Category; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\User; @@ -37,6 +38,7 @@ use Illuminate\Http\JsonResponse; class CategoryController extends Controller { private CategoryRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; /** * CategoryController constructor. @@ -46,10 +48,10 @@ class CategoryController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(CategoryRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/CurrencyController.php b/app/Api/V1/Controllers/Autocomplete/CurrencyController.php index 5b49ed3a06..bbde6f7477 100644 --- a/app/Api/V1/Controllers/Autocomplete/CurrencyController.php +++ b/app/Api/V1/Controllers/Autocomplete/CurrencyController.php @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use Deprecated; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\User; @@ -38,6 +39,7 @@ use Illuminate\Http\JsonResponse; class CurrencyController extends Controller { private CurrencyRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; /** * CurrencyController constructor. @@ -47,10 +49,10 @@ class CurrencyController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(CurrencyRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/ObjectGroupController.php b/app/Api/V1/Controllers/Autocomplete/ObjectGroupController.php index 3b41ebcecf..d50a71aeb3 100644 --- a/app/Api/V1/Controllers/Autocomplete/ObjectGroupController.php +++ b/app/Api/V1/Controllers/Autocomplete/ObjectGroupController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\ObjectGroup; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\User; @@ -37,6 +38,7 @@ use Illuminate\Http\JsonResponse; class ObjectGroupController extends Controller { private ObjectGroupRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; /** * CurrencyController constructor. @@ -46,10 +48,10 @@ class ObjectGroupController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(ObjectGroupRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php b/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php index f077d3df00..70cadd34e6 100644 --- a/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php +++ b/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\PiggyBank; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; @@ -39,6 +40,7 @@ class PiggyBankController extends Controller { private AccountRepositoryInterface $accountRepository; private PiggyBankRepositoryInterface $piggyRepository; + protected array $acceptedRoles = [UserRoleEnum::READ_PIGGY_BANKS]; /** * PiggyBankController constructor. @@ -48,12 +50,13 @@ class PiggyBankController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->piggyRepository = app(PiggyBankRepositoryInterface::class); $this->accountRepository = app(AccountRepositoryInterface::class); - $this->piggyRepository->setUser($user); - $this->accountRepository->setUser($user); + $this->piggyRepository->setUser($this->user); + $this->piggyRepository->setUserGroup($this->userGroup); + $this->accountRepository->setUser($this->user); + $this->accountRepository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php b/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php index 2aca073dd5..aa990154f7 100644 --- a/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php +++ b/app/Api/V1/Controllers/Autocomplete/RecurrenceController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Recurrence; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use Illuminate\Http\JsonResponse; @@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse; class RecurrenceController extends Controller { private RecurringRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_RECURRING]; /** * RecurrenceController constructor. @@ -45,9 +47,10 @@ class RecurrenceController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { + $this->validateUserGroup($request); $this->repository = app(RecurringRepositoryInterface::class); - - $this->repository->setUser(auth()->user()); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/RuleController.php b/app/Api/V1/Controllers/Autocomplete/RuleController.php index bc9996dcfb..cb5f53b213 100644 --- a/app/Api/V1/Controllers/Autocomplete/RuleController.php +++ b/app/Api/V1/Controllers/Autocomplete/RuleController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Rule; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use Illuminate\Http\JsonResponse; @@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse; class RuleController extends Controller { private RuleRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_RULES]; /** * RuleController constructor. @@ -45,8 +47,10 @@ class RuleController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { + $this->validateUserGroup($request); $this->repository = app(RuleRepositoryInterface::class); - $this->repository->setUser(auth()->user()); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php b/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php index 7315de68d8..98067b3f88 100644 --- a/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php +++ b/app/Api/V1/Controllers/Autocomplete/RuleGroupController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\RuleGroup; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use Illuminate\Http\JsonResponse; @@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse; class RuleGroupController extends Controller { private RuleGroupRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_RULES]; /** * RuleGroupController constructor. @@ -45,8 +47,10 @@ class RuleGroupController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { + $this->validateUserGroup($request); $this->repository = app(RuleGroupRepositoryInterface::class); - $this->repository->setUser(auth()->user()); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/TagController.php b/app/Api/V1/Controllers/Autocomplete/TagController.php index dabc0a1c85..437cf94bbd 100644 --- a/app/Api/V1/Controllers/Autocomplete/TagController.php +++ b/app/Api/V1/Controllers/Autocomplete/TagController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\Tag; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\User; @@ -37,6 +38,7 @@ use Illuminate\Http\JsonResponse; class TagController extends Controller { private TagRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; /** * TagController constructor. @@ -46,10 +48,10 @@ class TagController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); + $this->validateUserGroup($request); $this->repository = app(TagRepositoryInterface::class); - $this->repository->setUser($user); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionController.php b/app/Api/V1/Controllers/Autocomplete/TransactionController.php index a6785dbc38..aa28415463 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionController.php @@ -52,14 +52,13 @@ class TransactionController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $user */ - $user = auth()->user(); - $userGroup = $this->validateUserGroup($request); + $this->validateUserGroup($request); $this->repository = app(JournalRepositoryInterface::class); $this->groupRepository = app(TransactionGroupRepositoryInterface::class); - $this->repository->setUser($user); - $this->groupRepository->setUser($user); - $this->groupRepository->setUserGroup($userGroup); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); + $this->groupRepository->setUser($this->user); + $this->groupRepository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php b/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php index abc0e11553..f3f7ea69d2 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; +use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use Illuminate\Http\JsonResponse; @@ -36,6 +37,7 @@ use Illuminate\Http\JsonResponse; class TransactionTypeController extends Controller { private TransactionTypeRepositoryInterface $repository; + protected array $acceptedRoles = [UserRoleEnum::READ_ONLY]; /** * TransactionTypeController constructor. @@ -45,7 +47,10 @@ class TransactionTypeController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { + $this->validateUserGroup($request); $this->repository = app(TransactionTypeRepositoryInterface::class); + $this->repository->setUser($this->user); + $this->repository->setUserGroup($this->userGroup); return $next($request); } diff --git a/app/Api/V1/Controllers/Controller.php b/app/Api/V1/Controllers/Controller.php index ffef4503f4..57a6784a1f 100644 --- a/app/Api/V1/Controllers/Controller.php +++ b/app/Api/V1/Controllers/Controller.php @@ -62,9 +62,9 @@ abstract class Controller extends BaseController use ValidatesRequests; use ValidatesUserGroupTrait; - protected const string CONTENT_TYPE = 'application/vnd.api+json'; - protected const string JSON_CONTENT_TYPE = 'application/json'; - protected array $accepts = ['application/json', 'application/vnd.api+json']; + protected const string CONTENT_TYPE = 'application/vnd.api+json'; + protected const string JSON_CONTENT_TYPE = 'application/json'; + protected array $accepts = ['application/json', 'application/vnd.api+json']; /** @var array */ protected array $allowedSort; @@ -106,8 +106,8 @@ abstract class Controller extends BaseController */ private function getParameters(): ParameterBag { - $bag = new ParameterBag(); - $page = (int) request()->get('page'); + $bag = new ParameterBag(); + $page = (int)request()->get('page'); if ($page < 1) { $page = 1; } @@ -117,7 +117,7 @@ abstract class Controller extends BaseController $bag->set('page', $page); // some date fields: - $dates = ['start', 'end', 'date']; + $dates = ['start', 'end', 'date']; foreach ($dates as $field) { $date = null; @@ -128,16 +128,16 @@ abstract class Controller extends BaseController Log::error($e->getMessage()); Log::error($e->getTraceAsString()); } - $obj = null; + $obj = null; if (null !== $date) { try { - $obj = Carbon::parse((string) $date); + $obj = Carbon::parse((string)$date); } catch (InvalidFormatException $e) { // don't care Log::warning( sprintf( 'Ignored invalid date "%s" in API controller parameter check: %s', - substr((string) $date, 0, 20), + substr((string)$date, 0, 20), $e->getMessage() ) ); @@ -158,7 +158,7 @@ abstract class Controller extends BaseController $value = null; } if (null !== $value) { - $value = (int) $value; + $value = (int)$value; if ($value < 1) { $value = 1; } @@ -173,10 +173,10 @@ abstract class Controller extends BaseController && auth()->check()) { // set default for user: /** @var User $user */ - $user = auth()->user(); + $user = auth()->user(); /** @var Preference $pageSize */ - $pageSize = (int) app('preferences')->getForUser($user, 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser($user, 'listPageSize', 50)->data; $bag->set($integer, $pageSize); } } @@ -190,7 +190,7 @@ abstract class Controller extends BaseController $sortParameters = []; try { - $param = (string) request()->query->get('sort'); + $param = (string)request()->query->get('sort'); } catch (BadRequestException $e) { Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.'); Log::error($e->getMessage()); @@ -200,7 +200,7 @@ abstract class Controller extends BaseController if ('' === $param) { return $bag; } - $parts = explode(',', $param); + $parts = explode(',', $param); foreach ($parts as $part) { $part = trim($part); $direction = 'asc'; @@ -236,14 +236,14 @@ abstract class Controller extends BaseController $params[$key] = $value; } - return $return.http_build_query($params); + return $return . http_build_query($params); } final protected function getManager(): Manager { // create some objects: $manager = new Manager(); - $baseUrl = request()->getSchemeAndHttpHost().'/api/v1'; + $baseUrl = request()->getSchemeAndHttpHost() . '/api/v1'; $manager->setSerializer(new JsonApiSerializer($baseUrl)); return $manager; @@ -251,14 +251,14 @@ abstract class Controller extends BaseController final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array { - $manager = new Manager(); - $baseUrl = sprintf('%s/api/v1/', request()->getSchemeAndHttpHost()); + $manager = new Manager(); + $baseUrl = sprintf('%s/api/v1/', request()->getSchemeAndHttpHost()); // TODO add stuff to path? $manager->setSerializer(new JsonApiSerializer($baseUrl)); - $objects = $paginator->getCollection(); + $objects = $paginator->getCollection(); // the transformer, at this point, needs to collect information that ALL items in the collection // require, like meta-data and stuff like that, and save it for later. @@ -279,8 +279,8 @@ abstract class Controller extends BaseController final protected function jsonApiObject(string $key, array|Model $object, AbstractTransformer $transformer): array { // create some objects: - $manager = new Manager(); - $baseUrl = sprintf('%s/api/v1', request()->getSchemeAndHttpHost()); + $manager = new Manager(); + $baseUrl = sprintf('%s/api/v1', request()->getSchemeAndHttpHost()); $manager->setSerializer(new JsonApiSerializer($baseUrl)); // $transformer->collectMetaData(new Collection([$object])); diff --git a/app/Support/Http/Api/ValidatesUserGroupTrait.php b/app/Support/Http/Api/ValidatesUserGroupTrait.php index 89504139ae..8e34de14af 100644 --- a/app/Support/Http/Api/ValidatesUserGroupTrait.php +++ b/app/Support/Http/Api/ValidatesUserGroupTrait.php @@ -39,6 +39,7 @@ use Illuminate\Support\Facades\Log; trait ValidatesUserGroupTrait { protected ?UserGroup $userGroup = null; + protected ?User $user = null; /** * An "undocumented" filter @@ -101,6 +102,7 @@ trait ValidatesUserGroupTrait if ($user->hasRoleInGroupOrOwner($group, $role)) { Log::debug(sprintf('validateUserGroup: User has role "%s" in group #%d, return the group.', $role->value, $groupId)); $this->userGroup = $group; + $this->user = $user; return $group; } diff --git a/app/Support/Repositories/UserGroup/UserGroupTrait.php b/app/Support/Repositories/UserGroup/UserGroupTrait.php index eb30fa7f53..4bcd345e34 100644 --- a/app/Support/Repositories/UserGroup/UserGroupTrait.php +++ b/app/Support/Repositories/UserGroup/UserGroupTrait.php @@ -72,8 +72,8 @@ trait UserGroupTrait return; } - - throw new FireflyException(sprintf('Object is of class %s, not User.', $user::class)); + $class = null === $user ? 'NULL' : $user::class; + throw new FireflyException(sprintf('Object is %s, not User.', $class)); } public function getUserGroup(): ?UserGroup