Various API changes for v2

This commit is contained in:
James Cole
2024-07-26 12:52:54 +02:00
parent ad3b0bb320
commit 077f3e095b
18 changed files with 264 additions and 99 deletions

View File

@@ -2,10 +2,10 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Api\V3\Controllers; namespace FireflyIII\Http\Controllers\Api\V2\Controllers;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\JsonApi\V3\AccountBalances\AccountBalanceSchema; use FireflyIII\JsonApi\V2\AccountBalances\AccountBalanceSchema;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use Illuminate\Contracts\Support\Responsable; use Illuminate\Contracts\Support\Responsable;
use LaravelJsonApi\Core\Facades\JsonApi; use LaravelJsonApi\Core\Facades\JsonApi;
@@ -26,18 +26,18 @@ class AccountController extends Controller
use Actions\Update; use Actions\Update;
use Actions\UpdateRelationship; use Actions\UpdateRelationship;
public function readAccountBalances(AnonymousQuery $query, AccountBalanceSchema $schema, Account $account): Responsable // public function readAccountBalances(AnonymousQuery $query, AccountBalanceSchema $schema, Account $account): Responsable
{ // {
$schema = JsonApi::server()->schemas()->schemaFor('account-balances'); // $schema = JsonApi::server()->schemas()->schemaFor('account-balances');
//
$models = $schema // $models = $schema
->repository() // ->repository()
->queryAll() // ->queryAll()
->withRequest($query) // ->withRequest($query)
->withAccount($account) // ->withAccount($account)
->get() // ->get()
; // ;
//
return DataResponse::make($models); // return DataResponse::make($models);
} // }
} }

View File

@@ -21,7 +21,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\AccountBalances; namespace FireflyIII\JsonApi\V2\AccountBalances;
use FireflyIII\Entities\AccountBalance; use FireflyIII\Entities\AccountBalance;
use LaravelJsonApi\Contracts\Store\QueriesAll; use LaravelJsonApi\Contracts\Store\QueriesAll;

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\AccountBalances; namespace FireflyIII\JsonApi\V2\AccountBalances;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use LaravelJsonApi\Core\Resources\JsonApiResource; use LaravelJsonApi\Core\Resources\JsonApiResource;

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\AccountBalances; namespace FireflyIII\JsonApi\V2\AccountBalances;
use FireflyIII\Entities\AccountBalance; use FireflyIII\Entities\AccountBalance;
use LaravelJsonApi\Core\Schema\Schema; use LaravelJsonApi\Core\Schema\Schema;

View File

@@ -21,7 +21,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\AccountBalances\Capabilities; namespace FireflyIII\JsonApi\V2\AccountBalances\Capabilities;
use FireflyIII\Entities\AccountBalance; use FireflyIII\Entities\AccountBalance;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;

View File

@@ -21,7 +21,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\Accounts; namespace FireflyIII\JsonApi\V2\Accounts;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Support\JsonApi\Concerns\UsergroupAware; use FireflyIII\Support\JsonApi\Concerns\UsergroupAware;

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\Accounts; namespace FireflyIII\JsonApi\V2\Accounts;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -123,7 +123,8 @@ class AccountResource extends JsonApiResource
{ {
return [ return [
$this->relation('user')->withData($this->resource->user), $this->relation('user')->withData($this->resource->user),
$this->relation('account_balances')->withData($this->resource->balances), $this->relation('currency')->withData($this->resource->transactionCurrency),
//$this->relation('account_balances')->withData($this->resource->balances),
]; ];
} }
} }

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\Accounts; namespace FireflyIII\JsonApi\V2\Accounts;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use LaravelJsonApi\Eloquent\Contracts\Paginator; use LaravelJsonApi\Eloquent\Contracts\Paginator;

View File

@@ -21,7 +21,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\Accounts\Capabilities; namespace FireflyIII\JsonApi\V2\Accounts\Capabilities;
use FireflyIII\Support\JsonApi\Concerns\UsergroupAware; use FireflyIII\Support\JsonApi\Concerns\UsergroupAware;
use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment; use FireflyIII\Support\JsonApi\Enrichments\AccountEnrichment;

View File

@@ -2,11 +2,11 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3; namespace FireflyIII\JsonApi\V2;
use FireflyIII\JsonApi\V3\Accounts\AccountSchema; use FireflyIII\JsonApi\V2\Accounts\AccountSchema;
use FireflyIII\JsonApi\V3\AccountBalances\AccountBalanceSchema; use FireflyIII\JsonApi\V2\AccountBalances\AccountBalanceSchema;
use FireflyIII\JsonApi\V3\Users\UserSchema; use FireflyIII\JsonApi\V2\Users\UserSchema;
use LaravelJsonApi\Core\Server\Server as BaseServer; use LaravelJsonApi\Core\Server\Server as BaseServer;
class Server extends BaseServer class Server extends BaseServer

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\Users; namespace FireflyIII\JsonApi\V2\Users;
use FireflyIII\Models\User; use FireflyIII\Models\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\JsonApi\V3\Users; namespace FireflyIII\JsonApi\V2\Users;
use FireflyIII\User; use FireflyIII\User;
use LaravelJsonApi\Eloquent\Contracts\Paginator; use LaravelJsonApi\Eloquent\Contracts\Paginator;

View File

@@ -28,6 +28,7 @@ use Eloquent;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait; use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait; use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
use FireflyIII\User; use FireflyIII\User;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Collection;
@@ -120,6 +121,7 @@ class Account extends Model
use ReturnsIntegerIdTrait; use ReturnsIntegerIdTrait;
use ReturnsIntegerUserIdTrait; use ReturnsIntegerUserIdTrait;
use SoftDeletes; use SoftDeletes;
use Cachable;
protected $casts protected $casts
= [ = [
@@ -182,8 +184,7 @@ class Account extends Model
/** @var null|AccountMeta $metaValue */ /** @var null|AccountMeta $metaValue */
$metaValue = $this->accountMeta() $metaValue = $this->accountMeta()
->where('name', 'account_number') ->where('name', 'account_number')
->first() ->first();
;
return null !== $metaValue ? $metaValue->data : ''; return null !== $metaValue ? $metaValue->data : '';
} }

View File

@@ -84,6 +84,7 @@
"bacon/bacon-qr-code": "2.*", "bacon/bacon-qr-code": "2.*",
"diglactic/laravel-breadcrumbs": "^9", "diglactic/laravel-breadcrumbs": "^9",
"gdbots/query-parser": "^3.0", "gdbots/query-parser": "^3.0",
"genealabs/laravel-model-caching": "^11.0",
"guzzlehttp/guzzle": "^7.8", "guzzlehttp/guzzle": "^7.8",
"jc5/google2fa-laravel": "^2.0", "jc5/google2fa-laravel": "^2.0",
"jc5/recovery": "^2", "jc5/recovery": "^2",

126
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "a3648ab093343dd83bf7e728034ab46c", "content-hash": "9d828d17b38cf563cd5cfc14c906c08f",
"packages": [ "packages": [
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@@ -1045,6 +1045,130 @@
}, },
"time": "2021-12-05T19:44:35+00:00" "time": "2021-12-05T19:44:35+00:00"
}, },
{
"name": "genealabs/laravel-model-caching",
"version": "11.0.1",
"source": {
"type": "git",
"url": "https://github.com/mikebronner/laravel-model-caching.git",
"reference": "2a38f0f1ed3554cf2da272d66c4d08a7885f196b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mikebronner/laravel-model-caching/zipball/2a38f0f1ed3554cf2da272d66c4d08a7885f196b",
"reference": "2a38f0f1ed3554cf2da272d66c4d08a7885f196b",
"shasum": ""
},
"require": {
"genealabs/laravel-pivot-events": "^10.0|^11.0",
"illuminate/cache": "^10.0|^11.0",
"illuminate/config": "^10.0|^11.0",
"illuminate/console": "^10.0|^11.0",
"illuminate/container": "^10.0|^11.0",
"illuminate/database": "^10.0|^11.0",
"illuminate/http": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0",
"php": ">=8.1"
},
"require-dev": {
"doctrine/dbal": "^3.3",
"fakerphp/faker": "^1.11",
"laravel/legacy-factories": "^1.3",
"laravel/nova": "^4.0",
"orchestra/testbench": "^8.0|^9.0",
"orchestra/testbench-browser-kit": "^8.0",
"php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^10.0",
"slevomat/coding-standard": "^7.0|^8.14",
"squizlabs/php_codesniffer": "^3.6",
"symfony/thanks": "^1.2"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"GeneaLabs\\LaravelModelCaching\\Providers\\Service"
]
}
},
"autoload": {
"psr-4": {
"GeneaLabs\\LaravelModelCaching\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike Bronner",
"email": "hello@genealabs.com"
}
],
"description": "Automatic caching for Eloquent models.",
"support": {
"issues": "https://github.com/mikebronner/laravel-model-caching/issues",
"source": "https://github.com/mikebronner/laravel-model-caching/tree/11.0.1"
},
"time": "2024-03-14T23:34:57+00:00"
},
{
"name": "genealabs/laravel-pivot-events",
"version": "11.0.0",
"source": {
"type": "git",
"url": "https://github.com/mikebronner/laravel-pivot-events.git",
"reference": "16e974d80160774641f4323f5ffb757b79f300d3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mikebronner/laravel-pivot-events/zipball/16e974d80160774641f4323f5ffb757b79f300d3",
"reference": "16e974d80160774641f4323f5ffb757b79f300d3",
"shasum": ""
},
"require": {
"illuminate/database": "^8.0|^9.0|^10.0|^11.0",
"illuminate/support": "^8.0|^9.0|^10.0|^11.0"
},
"require-dev": {
"orchestra/testbench": "^9.0",
"phpunit/phpunit": "^10.5",
"symfony/thanks": "^1.0"
},
"type": "library",
"autoload": {
"psr-4": {
"GeneaLabs\\LaravelPivotEvents\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike Bronner",
"email": "hello@genealabs.com",
"homepage": "https://genealabs.com",
"role": "Developer"
}
],
"description": "This package introduces new eloquent events for sync(), attach(), detach() or updateExistingPivot() methods on BelongsToMany relation.",
"homepage": "https://github.com/mikebronner/laravel-pivot-events",
"keywords": [
"eloquent events",
"eloquent extra events",
"laravel BelongsToMany events",
"laravel pivot events",
"laravel sync events"
],
"support": {
"issues": "https://github.com/mikebronner/laravel-pivot-events/issues",
"source": "https://github.com/mikebronner/laravel-pivot-events"
},
"time": "2024-03-14T23:24:54+00:00"
},
{ {
"name": "graham-campbell/result-type", "name": "graham-campbell/result-type",
"version": "v1.1.3", "version": "v1.1.3",

View File

@@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
use FireflyIII\JsonApi\V3\Server; use FireflyIII\JsonApi\V2\Server;
return [ return [
/* /*
@@ -30,6 +30,6 @@ return [
| class name of the server class. | class name of the server class.
*/ */
'servers' => [ 'servers' => [
'v3' => Server::class, 'v2' => Server::class,
], ],
]; ];

View File

@@ -0,0 +1,11 @@
<?php
return [
'cache-prefix' => '',
'enabled' => env('MODEL_CACHE_ENABLED', true),
'use-database-keying' => env('MODEL_CACHE_USE_DATABASE_KEYING', true),
'store' => env('MODEL_CACHE_STORE'),
];

View File

@@ -22,14 +22,27 @@
declare(strict_types=1); declare(strict_types=1);
use FireflyIII\Http\Controllers\Api\V3\Controllers\AccountController; use FireflyIII\Http\Controllers\Api\V2\Controllers\AccountController;
use LaravelJsonApi\Laravel\Facades\JsonApiRoute; use LaravelJsonApi\Laravel\Facades\JsonApiRoute;
use LaravelJsonApi\Laravel\Http\Controllers\JsonApiController; use LaravelJsonApi\Laravel\Http\Controllers\JsonApiController;
use LaravelJsonApi\Laravel\Routing\ActionRegistrar;
use LaravelJsonApi\Laravel\Routing\Relationships; use LaravelJsonApi\Laravel\Routing\Relationships;
use LaravelJsonApi\Laravel\Routing\ResourceRegistrar; use LaravelJsonApi\Laravel\Routing\ResourceRegistrar;
// V2 auto complete controller(s) /*
*
* ____ ____ ___ .______ ______ __ __ .___________. _______ _______.
* \ \ / / |__ \ | _ \ / __ \ | | | | | || ____| / |
* \ \/ / ) | | |_) | | | | | | | | | `---| |----`| |__ | (----`
* \ / / / | / | | | | | | | | | | | __| \ \
* \ / / /_ | |\ \----.| `--' | | `--' | | | | |____.----) |
* \__/ |____| | _| `._____| \______/ \______/ |__| |_______|_______/
*/
/**
* AUTOCOMPLETE ROUTES
*/
Route::group( Route::group(
[ [
'namespace' => 'FireflyIII\Api\V2\Controllers\Autocomplete', 'namespace' => 'FireflyIII\Api\V2\Controllers\Autocomplete',
@@ -37,7 +50,6 @@ Route::group(
'as' => 'api.v2.autocomplete.', 'as' => 'api.v2.autocomplete.',
], ],
static function (): void { static function (): void {
// Auto complete routes
Route::get('accounts', ['uses' => 'AccountController@accounts', 'as' => 'accounts']); Route::get('accounts', ['uses' => 'AccountController@accounts', 'as' => 'accounts']);
Route::get('categories', ['uses' => 'CategoryController@categories', 'as' => 'categories']); Route::get('categories', ['uses' => 'CategoryController@categories', 'as' => 'categories']);
Route::get('tags', ['uses' => 'TagController@tags', 'as' => 'tags']); Route::get('tags', ['uses' => 'TagController@tags', 'as' => 'tags']);
@@ -45,7 +57,9 @@ Route::group(
} }
); );
// V2 API routes for charts /**
* CHART ROUTES
*/
Route::group( Route::group(
[ [
'namespace' => 'FireflyIII\Api\V2\Controllers\Chart', 'namespace' => 'FireflyIII\Api\V2\Controllers\Chart',
@@ -54,27 +68,13 @@ Route::group(
], ],
static function (): void { static function (): void {
Route::get('account/dashboard', ['uses' => 'AccountController@dashboard', 'as' => 'account.dashboard']); Route::get('account/dashboard', ['uses' => 'AccountController@dashboard', 'as' => 'account.dashboard']);
// Route::get('budget/dashboard', ['uses' => 'BudgetController@dashboard', 'as' => 'budget.dashboard']); Route::get('budget/dashboard', ['uses' => 'BudgetController@dashboard', 'as' => 'budget.dashboard']);
// Route::get('category/dashboard', ['uses' => 'CategoryController@dashboard', 'as' => 'category.dashboard']); Route::get('category/dashboard', ['uses' => 'CategoryController@dashboard', 'as' => 'category.dashboard']);
Route::get('balance/balance', ['uses' => 'BalanceController@balance', 'as' => 'balance.balance']); Route::get('balance/balance', ['uses' => 'BalanceController@balance', 'as' => 'balance.balance']);
} }
); );
// JsonApiRoute::server('v3')
// ->prefix('v3')
// ->resources(function (ResourceRegistrar $server) {
// $server->resource('accounts', AccountController::class)->readOnly()->relationships(function (Relationships $relations) {
// $relations->hasOne('user')->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('account-balances', JsonApiController::class);
// });
// V2 API route for Summary boxes // V2 API route for Summary boxes
// BASIC // BASIC
@@ -121,19 +121,19 @@ Route::group(
} }
); );
// V2 API route for accounts. //// V2 API route for accounts.
Route::group( //Route::group(
[ // [
'namespace' => 'FireflyIII\Api\V2\Controllers\Model\Account', // 'namespace' => 'FireflyIII\Api\V2\Controllers\Model\Account',
'prefix' => 'v2/accounts', // 'prefix' => 'v2/accounts',
'as' => 'api.v2.accounts.', // 'as' => 'api.v2.accounts.',
], // ],
static function (): void { // static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']); // Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
Route::get('{account}', ['uses' => 'ShowController@show', 'as' => 'show']); // Route::get('{account}', ['uses' => 'ShowController@show', 'as' => 'show']);
Route::put('{account}', ['uses' => 'UpdateController@update', 'as' => 'update']); // Route::put('{account}', ['uses' => 'UpdateController@update', 'as' => 'update']);
} // }
); //);
// V2 API route for subscriptions. // V2 API route for subscriptions.
Route::group( Route::group(
@@ -247,7 +247,34 @@ Route::group(
} }
); );
// down here is v1 /**
* V2 JSON API ROUTES
*/
JsonApiRoute::server('v2')->prefix('v2')
->resources(function (ResourceRegistrar $server) {
/**
* ACCOUNTS
*/
$server->resource('accounts', AccountController::class)->readOnly()->relationships(function (Relationships $relations) {
$relations->hasOne('user')->readOnly();
});
/**
* USERS
*/
$server->resource('users', JsonApiController::class)->readOnly()->relationships(function (Relationships $relations) {
$relations->hasMany('accounts')->readOnly();
});
});
/*
* ____ ____ __ .______ ______ __ __ .___________. _______ _______.
* \ \ / / /_ | | _ \ / __ \ | | | | | || ____| / |
* \ \/ / | | | |_) | | | | | | | | | `---| |----`| |__ | (----`
* \ / | | | / | | | | | | | | | | | __| \ \
* \ / | | | |\ \----.| `--' | | `--' | | | | |____.----) |
* \__/ |_| | _| `._____| \______/ \______/ |__| |_______|_______/
*/
// Autocomplete controllers // Autocomplete controllers
Route::group( Route::group(
@@ -278,7 +305,7 @@ Route::group(
); );
// CHART ROUTES. // CHART ROUTES.
// Accounts // Chart accounts
Route::group( Route::group(
[ [
'namespace' => 'FireflyIII\Api\V1\Controllers\Chart', 'namespace' => 'FireflyIII\Api\V1\Controllers\Chart',