diff --git a/app/Entities/AccountBalance.php b/app/Entities/AccountBalance.php new file mode 100644 index 0000000000..3d63e600a1 --- /dev/null +++ b/app/Entities/AccountBalance.php @@ -0,0 +1,49 @@ +id = (string) random_int(1, 1000); + $balance->name = (string) random_int(1, 1000); + $balance->amount = (string) random_int(1, 1000); + $balance->currencyId = '1'; + + return $balance; + } + + public function getAccount():Account { + return Account::inRandomOrder()->first(); + } + +} diff --git a/app/Http/Controllers/Api/V3/Controllers/AccountController.php b/app/Http/Controllers/Api/V3/Controllers/AccountController.php new file mode 100644 index 0000000000..fd5df19545 --- /dev/null +++ b/app/Http/Controllers/Api/V3/Controllers/AccountController.php @@ -0,0 +1,41 @@ +schemas()->schemaFor('account-balances'); + + $models = $schema + ->repository() + ->queryAll() + ->withRequest($query) + ->withAccount($account) + ->get(); + + return DataResponse::make($models); + } +} diff --git a/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php b/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php new file mode 100644 index 0000000000..fba9fe46b2 --- /dev/null +++ b/app/JsonApi/V3/AccountBalances/AccountBalanceRepository.php @@ -0,0 +1,51 @@ +withServer($this->server) + ->withSchema($this->schema); + } +} diff --git a/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php b/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php new file mode 100644 index 0000000000..cbb453f544 --- /dev/null +++ b/app/JsonApi/V3/AccountBalances/AccountBalanceResource.php @@ -0,0 +1,49 @@ +resource->id; + } + + /** + * Get the resource's attributes. + * + * @param Request|null $request + * + * @return iterable + */ + public function attributes($request): iterable + { + return [ + 'name' => $this->resource->amount, + 'amount' => $this->resource->amount, + ]; + } + + /** + * Get the resource's relationships. + * + * @param Request|null $request + * + * @return iterable + */ + public function relationships($request): iterable + { + return [ + $this->relation('account')->withData($this->resource->getAccount()), + ]; + } + +} diff --git a/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php b/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php new file mode 100644 index 0000000000..3ae5cbebd3 --- /dev/null +++ b/app/JsonApi/V3/AccountBalances/AccountBalanceSchema.php @@ -0,0 +1,54 @@ +withServer($this->server) + ->withSchema($this); + } +} diff --git a/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php b/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php new file mode 100644 index 0000000000..dd178675ab --- /dev/null +++ b/app/JsonApi/V3/AccountBalances/Capabilities/AccountBalanceQuery.php @@ -0,0 +1,61 @@ +account = $account; + return $this; + } + +} diff --git a/app/JsonApi/V3/Accounts/AccountResource.php b/app/JsonApi/V3/Accounts/AccountResource.php index 51cd94db43..4f00e1d594 100644 --- a/app/JsonApi/V3/Accounts/AccountResource.php +++ b/app/JsonApi/V3/Accounts/AccountResource.php @@ -133,7 +133,7 @@ class AccountResource extends JsonApiResource { return [ $this->relation('user')->withData($this->resource->user), - $this->relation('balances')->withData($this->resource->balances), + $this->relation('account_balances')->withData($this->resource->balances), ]; } diff --git a/app/JsonApi/V3/Accounts/AccountSchema.php b/app/JsonApi/V3/Accounts/AccountSchema.php index 531959d9e4..6a6a1d3fed 100644 --- a/app/JsonApi/V3/Accounts/AccountSchema.php +++ b/app/JsonApi/V3/Accounts/AccountSchema.php @@ -43,6 +43,7 @@ class AccountSchema extends Schema Boolean::make('active'), Number::make('order'), HasOne::make('user'), + HasMany::make('account_balances'), ]; } diff --git a/app/JsonApi/V3/Server.php b/app/JsonApi/V3/Server.php index b94c51d0cd..5eade8d9e0 100644 --- a/app/JsonApi/V3/Server.php +++ b/app/JsonApi/V3/Server.php @@ -3,7 +3,7 @@ namespace FireflyIII\JsonApi\V3; use FireflyIII\JsonApi\V3\Accounts\AccountSchema; -use FireflyIII\JsonApi\V3\Balances\BalanceSchema; +use FireflyIII\JsonApi\V3\AccountBalances\AccountBalanceSchema; use FireflyIII\JsonApi\V3\Users\UserSchema; use LaravelJsonApi\Core\Server\Server as BaseServer; @@ -37,7 +37,7 @@ class Server extends BaseServer return [ AccountSchema::class, UserSchema::class, - BalanceSchema::class, + AccountBalanceSchema::class, ]; } diff --git a/app/JsonApi/V3/Users/UserResource.php b/app/JsonApi/V3/Users/UserResource.php index 0a6d1be766..2293a42803 100644 --- a/app/JsonApi/V3/Users/UserResource.php +++ b/app/JsonApi/V3/Users/UserResource.php @@ -23,6 +23,7 @@ class UserResource extends JsonApiResource return [ 'created_at' => $this->resource->created_at, 'updated_at' => $this->resource->updated_at, + 'email' => $this->resource->email, ]; } diff --git a/app/Policies/AccountBalancePolicy.php b/app/Policies/AccountBalancePolicy.php new file mode 100644 index 0000000000..688b4fd189 --- /dev/null +++ b/app/Policies/AccountBalancePolicy.php @@ -0,0 +1,59 @@ +check() && $user->id === $account->user_id; } + + /** * Everybody can do this, but selection should limit to user. * @@ -64,7 +66,7 @@ class AccountPolicy return $this->view($user, $account); } - public function viewBalances(User $user, Account $account): bool + public function viewAccountBalances(User $user, Account $account): bool { return $this->view($user, $account); } diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 2d043d77c9..58135f6496 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -36,7 +36,7 @@ class UserPolicy * * @return bool */ - public function view(User $user, Account $account): bool + public function view(User $user, User $user1): bool { return true; return auth()->check() && $user->id === $account->user_id; @@ -52,4 +52,9 @@ class UserPolicy return true; return auth()->check(); } + public function viewAccounts(User $user): bool + { + return true; + return auth()->check(); + } } diff --git a/routes/api.php b/routes/api.php index 1cdb0c9f96..f4bbcc9fe4 100644 --- a/routes/api.php +++ b/routes/api.php @@ -22,8 +22,10 @@ declare(strict_types=1); +use FireflyIII\Http\Controllers\Api\V3\Controllers\AccountController; use LaravelJsonApi\Laravel\Facades\JsonApiRoute; use LaravelJsonApi\Laravel\Http\Controllers\JsonApiController; +use LaravelJsonApi\Laravel\Routing\ActionRegistrar; use LaravelJsonApi\Laravel\Routing\Relationships; use LaravelJsonApi\Laravel\Routing\ResourceRegistrar; @@ -31,11 +33,17 @@ use LaravelJsonApi\Laravel\Routing\ResourceRegistrar; JsonApiRoute::server('v3') ->prefix('v3') ->resources(function (ResourceRegistrar $server) { - $server->resource('accounts', JsonApiController::class)->readOnly()->relationships(function (Relationships $relations) { + $server->resource('accounts', AccountController::class)->readOnly()->relationships(function (Relationships $relations) { $relations->hasOne('user')->readOnly(); - $relations->hasMany('balances')->readOnly(); + //$relations->hasMany('account_balances')->readOnly(); + }) + ->actions(function (ActionRegistrar $actions) { + $actions->withId()->get('account-balances', 'readAccountBalances'); // non-eloquent pseudo relation + }); + $server->resource('users', JsonApiController::class)->readOnly()->relationships(function (Relationships $relations) { + $relations->hasMany('accounts')->readOnly(); }); - $server->resource('users', JsonApiController::class); + $server->resource('account-balances', JsonApiController::class); });