From 84263b9ee8a03d7f53cf54e1d9a5d4b35c230d2a Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 6 Mar 2021 14:50:48 +0100 Subject: [PATCH] API routes for object groups. --- .../Models/ObjectGroup/DestroyController.php | 73 ++++++++++++++ .../Models/ObjectGroup/ListController.php | 99 +++++++++++++++++++ .../ObjectGroup/ShowController.php} | 92 ++--------------- .../Models/ObjectGroup/UpdateController.php | 83 ++++++++++++++++ .../ObjectGroup/UpdateRequest.php} | 6 +- routes/api.php | 57 ++++++++--- 6 files changed, 310 insertions(+), 100 deletions(-) create mode 100644 app/Api/V1/Controllers/Models/ObjectGroup/DestroyController.php create mode 100644 app/Api/V1/Controllers/Models/ObjectGroup/ListController.php rename app/Api/V1/Controllers/{todo/ObjectGroupController.php => Models/ObjectGroup/ShowController.php} (54%) create mode 100644 app/Api/V1/Controllers/Models/ObjectGroup/UpdateController.php rename app/Api/V1/Requests/{todo/ObjectGroupUpdateRequest.php => Models/ObjectGroup/UpdateRequest.php} (92%) diff --git a/app/Api/V1/Controllers/Models/ObjectGroup/DestroyController.php b/app/Api/V1/Controllers/Models/ObjectGroup/DestroyController.php new file mode 100644 index 0000000000..180c4127e3 --- /dev/null +++ b/app/Api/V1/Controllers/Models/ObjectGroup/DestroyController.php @@ -0,0 +1,73 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Models\ObjectGroup; +use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; +use FireflyIII\User; +use Illuminate\Http\JsonResponse; + +/** + * Class DestroyController + */ +class DestroyController extends Controller +{ + private ObjectGroupRepositoryInterface $repository; + + + /** + * ObjectGroupController constructor. + * + * @codeCoverageIgnore + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->repository = app(ObjectGroupRepositoryInterface::class); + $this->repository->setUser($user); + + return $next($request); + } + ); + } + + /** + * Remove the specified resource from storage. + * + * @param ObjectGroup $objectGroup + * + * @codeCoverageIgnore + * @return JsonResponse + */ + public function destroy(ObjectGroup $objectGroup): JsonResponse + { + $this->repository->destroy($objectGroup); + + return response()->json([], 204); + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php b/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php new file mode 100644 index 0000000000..41a2352ee2 --- /dev/null +++ b/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php @@ -0,0 +1,99 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Models\ObjectGroup; +use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; +use FireflyIII\Transformers\PiggyBankTransformer; +use FireflyIII\User; +use Illuminate\Http\JsonResponse; +use Illuminate\Pagination\LengthAwarePaginator; +use League\Fractal\Pagination\IlluminatePaginatorAdapter; +use League\Fractal\Resource\Collection as FractalCollection; + +/** + * Class ListController + */ +class ListController extends Controller +{ + private ObjectGroupRepositoryInterface $repository; + + + /** + * ObjectGroupController constructor. + * + * @codeCoverageIgnore + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->repository = app(ObjectGroupRepositoryInterface::class); + $this->repository->setUser($user); + + return $next($request); + } + ); + } + + + /** + * List all piggies under the object group. + * + * @param ObjectGroup $objectGroup + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function piggyBanks(ObjectGroup $objectGroup): JsonResponse + { + // create some objects: + $manager = $this->getManager(); + + // types to get, page size: + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + + // get list of piggy banks. Count it and split it. + $collection = $this->repository->getPiggyBanks($objectGroup); + $count = $collection->count(); + $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + + // make paginator: + $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); + $paginator->setPath(route('api.v1.object-groups.piggy_banks', [$objectGroup->id]) . $this->buildParams()); + + /** @var PiggyBankTransformer $transformer */ + $transformer = app(PiggyBankTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); + $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/todo/ObjectGroupController.php b/app/Api/V1/Controllers/Models/ObjectGroup/ShowController.php similarity index 54% rename from app/Api/V1/Controllers/todo/ObjectGroupController.php rename to app/Api/V1/Controllers/Models/ObjectGroup/ShowController.php index ae6ad31dfc..9048a712f5 100644 --- a/app/Api/V1/Controllers/todo/ObjectGroupController.php +++ b/app/Api/V1/Controllers/Models/ObjectGroup/ShowController.php @@ -1,7 +1,7 @@ . */ -declare(strict_types=1); +namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; -namespace FireflyIII\Api\V1\Controllers; -use FireflyIII\Api\V1\Requests\ObjectGroupUpdateRequest; -use FireflyIII\Models\Account; +use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\ObjectGroup; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Transformers\ObjectGroupTransformer; -use FireflyIII\Transformers\PiggyBankTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -38,9 +35,9 @@ use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Item; /** - * Class GroupController. + * Class ShowController */ -class ObjectGroupController extends Controller +class ShowController extends Controller { private ObjectGroupRepositoryInterface $repository; @@ -65,20 +62,6 @@ class ObjectGroupController extends Controller ); } - /** - * Remove the specified resource from storage. - * - * @param ObjectGroup $objectGroup - * - * @codeCoverageIgnore - * @return JsonResponse - */ - public function delete(ObjectGroup $objectGroup): JsonResponse - { - $this->repository->destroy($objectGroup); - - return response()->json([], 204); - } /** * Display a listing of the resource. @@ -93,7 +76,7 @@ class ObjectGroupController extends Controller $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of accounts. Count it and split it. $collection = $this->repository->get(); @@ -115,42 +98,6 @@ class ObjectGroupController extends Controller } - /** - * List all piggies under the object group. - * - * @param ObjectGroup $objectGroup - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function piggyBanks(ObjectGroup $objectGroup): JsonResponse - { - // create some objects: - $manager = $this->getManager(); - - // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - - // get list of piggy banks. Count it and split it. - $collection = $this->repository->getPiggyBanks($objectGroup); - $count = $collection->count(); - $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); - - // make paginator: - $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); - $paginator->setPath(route('api.v1.object-groups.piggy_banks', [$objectGroup->id]) . $this->buildParams()); - - /** @var PiggyBankTransformer $transformer */ - $transformer = app(PiggyBankTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); - $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - - } - /** * Show single instance. * @@ -170,26 +117,5 @@ class ObjectGroupController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Update object. - * - * @param ObjectGroupUpdateRequest $request - * @param Account $account - * - * @return JsonResponse - */ - public function update(ObjectGroupUpdateRequest $request, ObjectGroup $objectGroup): JsonResponse - { - $data = $request->getUpdateData(); - $this->repository->update($objectGroup, $data); - $this->repository->sort(); - $manager = $this->getManager(); - /** @var ObjectGroupTransformer $transformer */ - $transformer = app(ObjectGroupTransformer::class); - $transformer->setParameters($this->parameters); - $resource = new Item($objectGroup, $transformer, 'object_groups'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } -} +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/ObjectGroup/UpdateController.php b/app/Api/V1/Controllers/Models/ObjectGroup/UpdateController.php new file mode 100644 index 0000000000..4e8ace2b9a --- /dev/null +++ b/app/Api/V1/Controllers/Models/ObjectGroup/UpdateController.php @@ -0,0 +1,83 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Models\ObjectGroup\UpdateRequest; +use FireflyIII\Models\ObjectGroup; +use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; +use FireflyIII\Transformers\ObjectGroupTransformer; +use FireflyIII\User; +use Illuminate\Http\JsonResponse; +use League\Fractal\Resource\Item; + +/** + * Class UpdateController + */ +class UpdateController extends Controller +{ + private ObjectGroupRepositoryInterface $repository; + + + /** + * ObjectGroupController constructor. + * + * @codeCoverageIgnore + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + /** @var User $user */ + $user = auth()->user(); + $this->repository = app(ObjectGroupRepositoryInterface::class); + $this->repository->setUser($user); + + return $next($request); + } + ); + } + + + /** + * @param UpdateRequest $request + * @param ObjectGroup $objectGroup + * + * @return JsonResponse + */ + public function update(UpdateRequest $request, ObjectGroup $objectGroup): JsonResponse + { + $data = $request->getUpdateData(); + $this->repository->update($objectGroup, $data); + $this->repository->sort(); + $manager = $this->getManager(); + + /** @var ObjectGroupTransformer $transformer */ + $transformer = app(ObjectGroupTransformer::class); + $transformer->setParameters($this->parameters); + $resource = new Item($objectGroup, $transformer, 'object_groups'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } +} \ No newline at end of file diff --git a/app/Api/V1/Requests/todo/ObjectGroupUpdateRequest.php b/app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php similarity index 92% rename from app/Api/V1/Requests/todo/ObjectGroupUpdateRequest.php rename to app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php index fd51661414..21dc7e0a6a 100644 --- a/app/Api/V1/Requests/todo/ObjectGroupUpdateRequest.php +++ b/app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php @@ -22,18 +22,18 @@ declare(strict_types=1); -namespace FireflyIII\Api\V1\Requests; +namespace FireflyIII\Api\V1\Requests\Models\ObjectGroup; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Foundation\Http\FormRequest; /** - * Class AccountObjectGroupUpdateRequestUpdateRequest + * Class UpdateRequest * * @codeCoverageIgnore */ -class ObjectGroupUpdateRequest extends FormRequest +class UpdateRequest extends FormRequest { use ConvertsDataTypes, ChecksLogin; diff --git a/routes/api.php b/routes/api.php index cfb1db9087..e705fc8580 100644 --- a/routes/api.php +++ b/routes/api.php @@ -254,6 +254,7 @@ Route::group( } ); + // Category API routes: Route::group( ['namespace' => 'FireflyIII\Api\V1\Controllers\Models\Category', 'prefix' => 'categories', @@ -269,6 +270,47 @@ Route::group( Route::get('{category}/attachments', ['uses' => 'ListController@attachments', 'as' => 'attachments']); } ); + +// Object Group API routes: +Route::group( + ['namespace' => 'FireflyIII\Api\V1\Controllers\Models\ObjectGroup', 'prefix' => 'object_groups', + 'as' => 'api.v1.object-groups.',], + static function () { + + Route::get('', ['uses' => 'ShowController@index', 'as' => 'index']); + Route::get('{objectGroup}', ['uses' => 'ShowController@show', 'as' => 'show']); + Route::put('{objectGroup}', ['uses' => 'UpdateController@update', 'as' => 'update']); + Route::delete('{objectGroup}', ['uses' => 'DestroyController@destroy', 'as' => 'delete']); + + Route::get('{objectGroup}/piggy_banks', ['uses' => 'ListController@piggyBanks', 'as' => 'piggy_banks']); + Route::get('{objectGroup}/bills', ['uses' => 'ListController@bills', 'as' => 'bills']); + } +); + + + + + + + + + + + + + + + + + + + + + + + + + // Piggy Bank API routes: Route::group( @@ -388,20 +430,7 @@ Route::group( //// TODO VERIFY API DOCS -//Route::group( -// ['namespace' => 'FireflyIII\Api\V1\Controllers', 'prefix' => 'groups', -// 'as' => 'api.v1.object-groups.',], -// static function () { -// -// // Accounts API routes: -// Route::get('', ['uses' => 'ObjectGroupController@index', 'as' => 'index']); -// Route::get('{objectGroup}', ['uses' => 'ObjectGroupController@show', 'as' => 'show']); -// Route::put('{objectGroup}', ['uses' => 'ObjectGroupController@update', 'as' => 'update']); -// Route::delete('{objectGroup}', ['uses' => 'ObjectGroupController@delete', 'as' => 'delete']); -// -// Route::get('{objectGroup}/piggy_banks', ['uses' => 'ObjectGroupController@piggyBanks', 'as' => 'piggy_banks']); -// } -//); +