From b11e3145c52a401190a5dfa67fea2138e012422c Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 6 Mar 2021 21:39:29 +0100 Subject: [PATCH] Implement currency routes. --- .../TransactionCurrency/DestroyController.php | 75 ++++ .../TransactionCurrency/ListController.php} | 319 +----------------- .../TransactionCurrency/ShowController.php | 125 +++++++ .../TransactionCurrency/StoreController.php | 82 +++++ .../TransactionCurrency/UpdateController.php | 169 ++++++++++ .../TransactionCurrency/StoreRequest.php} | 6 +- .../TransactionCurrency/UpdateRequest.php} | 12 +- .../Internal/Update/CurrencyUpdateService.php | 4 + app/Transformers/AccountTransformer.php | 4 +- .../TransactionGroupTransformer.php | 2 +- routes/api.php | 57 ++-- 11 files changed, 501 insertions(+), 354 deletions(-) create mode 100644 app/Api/V1/Controllers/Models/TransactionCurrency/DestroyController.php rename app/Api/V1/Controllers/{todo/CurrencyController.php => Models/TransactionCurrency/ListController.php} (57%) create mode 100644 app/Api/V1/Controllers/Models/TransactionCurrency/ShowController.php create mode 100644 app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php create mode 100644 app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php rename app/Api/V1/Requests/{todo/CurrencyStoreRequest.php => Models/TransactionCurrency/StoreRequest.php} (95%) rename app/Api/V1/Requests/{todo/CurrencyUpdateRequest.php => Models/TransactionCurrency/UpdateRequest.php} (82%) diff --git a/app/Api/V1/Controllers/Models/TransactionCurrency/DestroyController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/DestroyController.php new file mode 100644 index 0000000000..b668094ee3 --- /dev/null +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/DestroyController.php @@ -0,0 +1,75 @@ +middleware( + function ($request, $next) { + /** @var User $admin */ + $admin = auth()->user(); + + /** @var CurrencyRepositoryInterface repository */ + $this->repository = app(CurrencyRepositoryInterface::class); + $this->userRepository = app(UserRepositoryInterface::class); + $this->repository->setUser($admin); + + return $next($request); + } + ); + } + + /** + * Remove the specified resource from storage. + * + * @param TransactionCurrency $currency + * + * @return JsonResponse + * @throws FireflyException + * @codeCoverageIgnore + */ + public function destroy(TransactionCurrency $currency): JsonResponse + { + /** @var User $admin */ + $admin = auth()->user(); + + if (!$this->userRepository->hasRole($admin, 'owner')) { + // access denied: + throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore + } + if ($this->repository->currencyInUse($currency)) { + throw new FireflyException('200006: Currency in use.'); // @codeCoverageIgnore + } + if ($this->repository->isFallbackCurrency($currency)) { + throw new FireflyException('200026: Currency is fallback.'); // @codeCoverageIgnore + } + + $this->repository->destroy($currency); + + return response()->json([], 204); + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/todo/CurrencyController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php similarity index 57% rename from app/Api/V1/Controllers/todo/CurrencyController.php rename to app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php index c82a14380d..4e99811b26 100644 --- a/app/Api/V1/Controllers/todo/CurrencyController.php +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php @@ -1,31 +1,10 @@ . - */ -declare(strict_types=1); -namespace FireflyIII\Api\V1\Controllers; +namespace FireflyIII\Api\V1\Controllers\Models\TransactionCurrency; -use FireflyIII\Api\V1\Requests\CurrencyUpdateRequest; -use FireflyIII\Api\V1\Requests\CurrencyStoreRequest; -use FireflyIII\Exceptions\FireflyException; + +use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Models\Bill; @@ -48,8 +27,6 @@ use FireflyIII\Transformers\AccountTransformer; use FireflyIII\Transformers\AvailableBudgetTransformer; use FireflyIII\Transformers\BillTransformer; use FireflyIII\Transformers\BudgetLimitTransformer; -use FireflyIII\Transformers\CurrencyExchangeRateTransformer; -use FireflyIII\Transformers\CurrencyTransformer; use FireflyIII\Transformers\RecurrenceTransformer; use FireflyIII\Transformers\RuleTransformer; use FireflyIII\Transformers\TransactionGroupTransformer; @@ -59,19 +36,17 @@ use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Resource\Collection as FractalCollection; -use League\Fractal\Resource\Item; /** - * Class CurrencyController. + * Class ListController */ -class CurrencyController extends Controller +class ListController extends Controller { use AccountFilter, TransactionFilter; private CurrencyRepositoryInterface $repository; private UserRepositoryInterface $userRepository; - /** * CurrencyRepository constructor. * @@ -256,183 +231,6 @@ class CurrencyController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Show a list of known exchange rates - * - * @param TransactionCurrency $currency - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function cer(TransactionCurrency $currency): JsonResponse - { - // create some objects: - $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - $collection = $this->repository->getExchangeRates($currency); - - - $count = $collection->count(); - $exchangeRates = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); - $paginator = new LengthAwarePaginator($exchangeRates, $count, $pageSize, $this->parameters->get('page')); - $paginator->setPath(route('api.v1.currencies.cer', [$currency->code]) . $this->buildParams()); - - /** @var CurrencyExchangeRateTransformer $transformer */ - $transformer = app(CurrencyExchangeRateTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new FractalCollection($exchangeRates, $transformer, 'currency_exchange_rates'); - $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - - /** - * Remove the specified resource from storage. - * - * @param TransactionCurrency $currency - * - * @return JsonResponse - * @throws FireflyException - * @codeCoverageIgnore - */ - public function delete(TransactionCurrency $currency): JsonResponse - { - /** @var User $admin */ - $admin = auth()->user(); - - if (!$this->userRepository->hasRole($admin, 'owner')) { - // access denied: - throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore - } - if ($this->repository->currencyInUse($currency)) { - throw new FireflyException('200006: Currency in use.'); // @codeCoverageIgnore - } - if ($this->repository->isFallbackCurrency($currency)) { - throw new FireflyException('200026: Currency is fallback.'); // @codeCoverageIgnore - } - - $this->repository->destroy($currency); - - return response()->json([], 204); - } - - /** - * Disable a currency. - * - * @param TransactionCurrency $currency - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function disable(TransactionCurrency $currency): JsonResponse - { - // must be unused. - if ($this->repository->currencyInUse($currency)) { - return response()->json([], 409); - } - $this->repository->disable($currency); - $manager = $this->getManager(); - - $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $defaultCurrency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - - } - - /** - * Enable a currency. - * - * @param TransactionCurrency $currency - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function enable(TransactionCurrency $currency): JsonResponse - { - $this->repository->enable($currency); - $manager = $this->getManager(); - - $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $defaultCurrency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - - } - - /** - * Display a listing of the resource. - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function index(): JsonResponse - { - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - $collection = $this->repository->getAll(); - $count = $collection->count(); - // slice them: - $currencies = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); - $paginator = new LengthAwarePaginator($currencies, $count, $pageSize, $this->parameters->get('page')); - $paginator->setPath(route('api.v1.currencies.index') . $this->buildParams()); - - - $manager = $this->getManager(); - $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $defaultCurrency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new FractalCollection($currencies, $transformer, 'currencies'); - $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - - /** - * Make the currency a default currency. - * - * @param TransactionCurrency $currency - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function makeDefault(TransactionCurrency $currency): JsonResponse - { - $this->repository->enable($currency); - - app('preferences')->set('currencyPreference', $currency->code); - app('preferences')->mark(); - - $manager = $this->getManager(); - - $this->parameters->set('defaultCurrency', $currency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - - } - /** * List all recurring transactions. * @@ -534,78 +332,6 @@ class CurrencyController extends Controller } - /** - * Show a currency. - * - * @param TransactionCurrency $currency - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function show(TransactionCurrency $currency): JsonResponse - { - $manager = $this->getManager(); - $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $defaultCurrency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - - /** - * Show a currency. - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function showDefault(): JsonResponse - { - $manager = $this->getManager(); - $currency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $currency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - - /** - * Store new currency. - * - * @param CurrencyStoreRequest $request - * - * @return JsonResponse - * @throws FireflyException - */ - public function store(CurrencyStoreRequest $request): JsonResponse - { - $currency = $this->repository->store($request->getAll()); - if (true === $request->boolean('default')) { - app('preferences')->set('currencyPreference', $currency->code); - app('preferences')->mark(); - } - $manager = $this->getManager(); - $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $defaultCurrency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - /** * Show all transactions. * @@ -661,37 +387,4 @@ class CurrencyController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - - /** - * Update a currency. - * - * @param CurrencyUpdateRequest $request - * @param TransactionCurrency $currency - * - * @return JsonResponse - */ - public function update(CurrencyUpdateRequest $request, TransactionCurrency $currency): JsonResponse - { - $data = $request->getAll(); - $currency = $this->repository->update($currency, $data); - - if (true === $request->boolean('default')) { - app('preferences')->set('currencyPreference', $currency->code); - app('preferences')->mark(); - } - - $manager = $this->getManager(); - - $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); - $this->parameters->set('defaultCurrency', $defaultCurrency); - - /** @var CurrencyTransformer $transformer */ - $transformer = app(CurrencyTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($currency, $transformer, 'currencies'); - - 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/TransactionCurrency/ShowController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/ShowController.php new file mode 100644 index 0000000000..f5cfe2fe3b --- /dev/null +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/ShowController.php @@ -0,0 +1,125 @@ +middleware( + function ($request, $next) { + /** @var User $admin */ + $admin = auth()->user(); + + /** @var CurrencyRepositoryInterface repository */ + $this->repository = app(CurrencyRepositoryInterface::class); + $this->repository->setUser($admin); + + return $next($request); + } + ); + } + + /** + * Display a listing of the resource. + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function index(): JsonResponse + { + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $collection = $this->repository->getAll(); + $count = $collection->count(); + // slice them: + $currencies = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + $paginator = new LengthAwarePaginator($currencies, $count, $pageSize, $this->parameters->get('page')); + $paginator->setPath(route('api.v1.currencies.index') . $this->buildParams()); + + + $manager = $this->getManager(); + $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $defaultCurrency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new FractalCollection($currencies, $transformer, 'currencies'); + $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } + + /** + * Show a currency. + * + * @param TransactionCurrency $currency + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function show(TransactionCurrency $currency): JsonResponse + { + $manager = $this->getManager(); + $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $defaultCurrency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } + + /** + * Show a currency. + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function showDefault(): JsonResponse + { + $manager = $this->getManager(); + $currency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $currency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + 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/TransactionCurrency/StoreController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php new file mode 100644 index 0000000000..6af9f38832 --- /dev/null +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php @@ -0,0 +1,82 @@ +middleware( + function ($request, $next) { + /** @var User $admin */ + $admin = auth()->user(); + + /** @var CurrencyRepositoryInterface repository */ + $this->repository = app(CurrencyRepositoryInterface::class); + $this->userRepository = app(UserRepositoryInterface::class); + $this->repository->setUser($admin); + + return $next($request); + } + ); + } + + + + + /** + * Store new currency. + * + * @param StoreRequest $request + * + * @return JsonResponse + * @throws FireflyException + */ + public function store(StoreRequest $request): JsonResponse + { + $currency = $this->repository->store($request->getAll()); + if (true === $request->boolean('default')) { + app('preferences')->set('currencyPreference', $currency->code); + app('preferences')->mark(); + } + $manager = $this->getManager(); + $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $defaultCurrency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + 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/TransactionCurrency/UpdateController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php new file mode 100644 index 0000000000..c844b88c58 --- /dev/null +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php @@ -0,0 +1,169 @@ +middleware( + function ($request, $next) { + /** @var User $admin */ + $admin = auth()->user(); + + /** @var CurrencyRepositoryInterface repository */ + $this->repository = app(CurrencyRepositoryInterface::class); + $this->userRepository = app(UserRepositoryInterface::class); + $this->repository->setUser($admin); + + return $next($request); + } + ); + } + + /** + * Disable a currency. + * + * @param TransactionCurrency $currency + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function disable(TransactionCurrency $currency): JsonResponse + { + // must be unused. + if ($this->repository->currencyInUse($currency)) { + return response()->json([], 409); + } + $this->repository->disable($currency); + $manager = $this->getManager(); + + $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $defaultCurrency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + + } + + /** + * Enable a currency. + * + * @param TransactionCurrency $currency + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function enable(TransactionCurrency $currency): JsonResponse + { + $this->repository->enable($currency); + $manager = $this->getManager(); + + $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $defaultCurrency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + + } + + /** + * Make the currency a default currency. + * + * @param TransactionCurrency $currency + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function makeDefault(TransactionCurrency $currency): JsonResponse + { + $this->repository->enable($currency); + + app('preferences')->set('currencyPreference', $currency->code); + app('preferences')->mark(); + + $manager = $this->getManager(); + + $this->parameters->set('defaultCurrency', $currency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + + } + + /** + * Update a currency. + * + * @param UpdateRequest $request + * @param TransactionCurrency $currency + * + * @return JsonResponse + */ + public function update(UpdateRequest $request, TransactionCurrency $currency): JsonResponse + { + $data = $request->getAll(); + $currency = $this->repository->update($currency, $data); + + if (true === $request->boolean('default')) { + app('preferences')->set('currencyPreference', $currency->code); + app('preferences')->mark(); + } + + $manager = $this->getManager(); + + $defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user()); + $this->parameters->set('defaultCurrency', $defaultCurrency); + + /** @var CurrencyTransformer $transformer */ + $transformer = app(CurrencyTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($currency, $transformer, 'currencies'); + + 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/CurrencyStoreRequest.php b/app/Api/V1/Requests/Models/TransactionCurrency/StoreRequest.php similarity index 95% rename from app/Api/V1/Requests/todo/CurrencyStoreRequest.php rename to app/Api/V1/Requests/Models/TransactionCurrency/StoreRequest.php index 0d912cff05..2146b685c8 100644 --- a/app/Api/V1/Requests/todo/CurrencyStoreRequest.php +++ b/app/Api/V1/Requests/Models/TransactionCurrency/StoreRequest.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace FireflyIII\Api\V1\Requests; +namespace FireflyIII\Api\V1\Requests\Models\TransactionCurrency; use FireflyIII\Rules\IsBoolean; use FireflyIII\Support\Request\ChecksLogin; @@ -30,11 +30,11 @@ use Illuminate\Foundation\Http\FormRequest; /** - * Class CurrencyStoreRequest + * Class StoreRequest * * @codeCoverageIgnore */ -class CurrencyStoreRequest extends FormRequest +class StoreRequest extends FormRequest { use ConvertsDataTypes, ChecksLogin; diff --git a/app/Api/V1/Requests/todo/CurrencyUpdateRequest.php b/app/Api/V1/Requests/Models/TransactionCurrency/UpdateRequest.php similarity index 82% rename from app/Api/V1/Requests/todo/CurrencyUpdateRequest.php rename to app/Api/V1/Requests/Models/TransactionCurrency/UpdateRequest.php index 57c8a4a321..a0cf19c00f 100644 --- a/app/Api/V1/Requests/todo/CurrencyUpdateRequest.php +++ b/app/Api/V1/Requests/Models/TransactionCurrency/UpdateRequest.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace FireflyIII\Api\V1\Requests; +namespace FireflyIII\Api\V1\Requests\Models\TransactionCurrency; use FireflyIII\Rules\IsBoolean; use FireflyIII\Support\Request\ChecksLogin; @@ -30,11 +30,11 @@ use Illuminate\Foundation\Http\FormRequest; /** - * Class CurrencyUpdateRequest + * Class UpdateRequest * * @codeCoverageIgnore */ -class CurrencyUpdateRequest extends FormRequest +class UpdateRequest extends FormRequest { use ConvertsDataTypes, ChecksLogin; @@ -73,9 +73,9 @@ class CurrencyUpdateRequest extends FormRequest { $currency = $this->route()->parameter('currency_code'); return [ - 'name' => sprintf('required|between:1,255|unique:transaction_currencies,name,%d', $currency->id), - 'code' => sprintf('required|between:3,3|unique:transaction_currencies,code,%d', $currency->id), - 'symbol' => sprintf('required|between:1,8|unique:transaction_currencies,symbol,%d', $currency->id), + 'name' => sprintf('between:1,255|unique:transaction_currencies,name,%d', $currency->id), + 'code' => sprintf('between:3,3|unique:transaction_currencies,code,%d', $currency->id), + 'symbol' => sprintf('between:1,8|unique:transaction_currencies,symbol,%d', $currency->id), 'decimal_places' => 'between:0,20|numeric|min:0|max:20', 'enabled' => [new IsBoolean()], 'default' => [new IsBoolean()], diff --git a/app/Services/Internal/Update/CurrencyUpdateService.php b/app/Services/Internal/Update/CurrencyUpdateService.php index b016dfbd5b..d9981e6e98 100644 --- a/app/Services/Internal/Update/CurrencyUpdateService.php +++ b/app/Services/Internal/Update/CurrencyUpdateService.php @@ -28,6 +28,7 @@ use Log; /** * Class CurrencyUpdateService + * * @codeCoverageIgnore */ class CurrencyUpdateService @@ -50,6 +51,9 @@ class CurrencyUpdateService */ public function update(TransactionCurrency $currency, array $data): TransactionCurrency { + $data['code'] = '' === (string)$data['code'] ? $currency->code : $data['code']; + $data['symbol'] = '' === (string)$data['symbol'] ? $currency->code : $data['symbol']; + $data['name'] = '' === (string)$data['name'] ? $currency->code : $data['name']; $currency->code = $data['code']; $currency->symbol = $data['symbol']; $currency->name = $data['name']; diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index b56a78c179..e27dc8334d 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -93,7 +93,7 @@ class AccountTransformer extends AbstractTransformer $zoomLevel = $location->zoom_level; } return [ - 'id' => (int) $account->id, + 'id' => (string) $account->id, 'created_at' => $account->created_at->toAtomString(), 'updated_at' => $account->updated_at->toAtomString(), 'active' => $account->active, @@ -183,7 +183,7 @@ class AccountTransformer extends AbstractTransformer if (null === $currency) { $currency = app('amount')->getDefaultCurrencyByUser($account->user); } - $currencyId = (int) $currency->id; + $currencyId = (string) $currency->id; $currencyCode = $currency->code; $decimalPlaces = $currency->decimal_places; $currencySymbol = $currency->symbol; diff --git a/app/Transformers/TransactionGroupTransformer.php b/app/Transformers/TransactionGroupTransformer.php index 3fac9a2d2b..cf75d05893 100644 --- a/app/Transformers/TransactionGroupTransformer.php +++ b/app/Transformers/TransactionGroupTransformer.php @@ -78,7 +78,7 @@ class TransactionGroupTransformer extends AbstractTransformer 'id' => (int)$first['transaction_group_id'], 'created_at' => $first['created_at']->toAtomString(), 'updated_at' => $first['updated_at']->toAtomString(), - 'user' => (int)$data['user_id'], + 'user' => (string)$data['user_id'], 'group_title' => $data['title'], 'transactions' => $this->transformTransactions($data), 'links' => [ diff --git a/routes/api.php b/routes/api.php index abbefb2746..75bb44924e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -403,6 +403,33 @@ Route::group( } ); +// Transaction currency API routes: +Route::group( + ['namespace' => 'FireflyIII\Api\V1\Controllers\Models\TransactionCurrency', 'prefix' => 'currencies', + 'as' => 'api.v1.currencies.',], + static function () { + + Route::get('', ['uses' => 'ShowController@index', 'as' => 'index']); + Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']); + Route::get('default', ['uses' => 'ShowController@showDefault', 'as' => 'show.default']); + Route::get('{currency_code}', ['uses' => 'ShowController@show', 'as' => 'show']); + Route::put('{currency_code}', ['uses' => 'UpdateController@update', 'as' => 'update']); + Route::delete('{currency_code}', ['uses' => 'DestroyController@destroy', 'as' => 'delete']); + + Route::post('{currency_code}/enable', ['uses' => 'UpdateController@enable', 'as' => 'enable']); + Route::post('{currency_code}/disable', ['uses' => 'UpdateController@disable', 'as' => 'disable']); + Route::post('{currency_code}/default', ['uses' => 'UpdateController@makeDefault', 'as' => 'default']); + + Route::get('{currency_code}/accounts', ['uses' => 'ListController@accounts', 'as' => 'accounts']); + Route::get('{currency_code}/available_budgets', ['uses' => 'ListController@availableBudgets', 'as' => 'available_budgets']); + Route::get('{currency_code}/bills', ['uses' => 'ListController@bills', 'as' => 'bills']); + Route::get('{currency_code}/budget_limits', ['uses' => 'ListController@budgetLimits', 'as' => 'budget_limits']); + Route::get('{currency_code}/cer', ['uses' => 'ListController@cer', 'as' => 'cer']); + Route::get('{currency_code}/recurrences', ['uses' => 'ListController@recurrences', 'as' => 'recurrences']); + Route::get('{currency_code}/rules', ['uses' => 'ListController@rules', 'as' => 'rules']); + Route::get('{currency_code}/transactions', ['uses' => 'ListController@transactions', 'as' => 'transactions']); + } +); @@ -619,35 +646,7 @@ Route::group( //); // // -//// TODO VERIFY API DOCS -//Route::group( -// ['namespace' => 'FireflyIII\Api\V1\Controllers', 'prefix' => 'currencies', -// 'as' => 'api.v1.currencies.',], -// static function () { -// -// // Transaction currency API routes: -// Route::get('', ['uses' => 'CurrencyController@index', 'as' => 'index']); -// Route::post('', ['uses' => 'CurrencyController@store', 'as' => 'store']); -// Route::get('default', ['uses' => 'CurrencyController@showDefault', 'as' => 'show.default']); -// Route::get('{currency_code}', ['uses' => 'CurrencyController@show', 'as' => 'show']); -// Route::put('{currency_code}', ['uses' => 'CurrencyController@update', 'as' => 'update']); -// Route::delete('{currency_code}', ['uses' => 'CurrencyController@delete', 'as' => 'delete']); -// -// Route::post('{currency_code}/enable', ['uses' => 'CurrencyController@enable', 'as' => 'enable']); -// Route::post('{currency_code}/disable', ['uses' => 'CurrencyController@disable', 'as' => 'disable']); -// Route::post('{currency_code}/default', ['uses' => 'CurrencyController@makeDefault', 'as' => 'default']); -// -// Route::get('{currency_code}/accounts', ['uses' => 'CurrencyController@accounts', 'as' => 'accounts']); -// Route::get('{currency_code}/available_budgets', ['uses' => 'CurrencyController@availableBudgets', 'as' => 'available_budgets']); -// Route::get('{currency_code}/bills', ['uses' => 'CurrencyController@bills', 'as' => 'bills']); -// Route::get('{currency_code}/budget_limits', ['uses' => 'CurrencyController@budgetLimits', 'as' => 'budget_limits']); -// Route::get('{currency_code}/cer', ['uses' => 'CurrencyController@cer', 'as' => 'cer']); -// Route::get('{currency_code}/recurrences', ['uses' => 'CurrencyController@recurrences', 'as' => 'recurrences']); -// Route::get('{currency_code}/rules', ['uses' => 'CurrencyController@rules', 'as' => 'rules']); -// Route::get('{currency_code}/transactions', ['uses' => 'CurrencyController@transactions', 'as' => 'transactions']); -// } -//); -// + // //// TODO VERIFY API DOCS