diff --git a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/DestroyController.php b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/DestroyController.php index ef262dd73c..90d64f2957 100644 --- a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/DestroyController.php +++ b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/DestroyController.php @@ -24,8 +24,11 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; -use FireflyIII\Api\V2\Controllers\Controller; -use FireflyIII\Api\V2\Request\Model\ExchangeRate\DestroyRequest; +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\DestroyRequest; +use FireflyIII\Enums\UserRoleEnum; +use FireflyIII\Exceptions\ValidationException; +use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; @@ -36,6 +39,8 @@ class DestroyController extends Controller { use ValidatesUserGroupTrait; + protected array $acceptedRoles = [UserRoleEnum::OWNER]; + public const string RESOURCE_KEY = 'exchange-rates'; private ExchangeRateRepositoryInterface $repository; @@ -56,6 +61,9 @@ class DestroyController extends Controller public function destroy(DestroyRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse { $date = $request->getDate(); + if(null === $date) { + throw new ValidationException('Date is required'); + } $rate = $this->repository->getSpecificRateOnDate($from, $to, $date); if (null === $rate) { throw new NotFoundHttpException(); @@ -64,4 +72,11 @@ class DestroyController extends Controller return response()->json([], 204); } + + public function destroySingle(CurrencyExchangeRate $exchangeRate): JsonResponse + { + $this->repository->deleteRate($exchangeRate); + + return response()->json([], 204); + } } diff --git a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/IndexController.php b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/IndexController.php index 108d4cae1b..c61138e859 100644 --- a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/IndexController.php +++ b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/IndexController.php @@ -38,7 +38,7 @@ class IndexController extends Controller { use ValidatesUserGroupTrait; - public const string RESOURCE_KEY = 'exchange_rates'; + public const string RESOURCE_KEY = 'currency_exchange_rates'; private ExchangeRateRepositoryInterface $repository; @@ -62,9 +62,6 @@ class IndexController extends Controller $count = $piggies->count(); $piggies = $piggies->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $paginator = new LengthAwarePaginator($piggies, $count, $pageSize, $this->parameters->get('page')); - - var_dump('here we are'); - $transformer = new ExchangeRateTransformer(); $transformer->setParameters($this->parameters); // give params to transformer diff --git a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/ShowController.php b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/ShowController.php index a8e2226385..9c1feafca8 100644 --- a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/ShowController.php +++ b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/ShowController.php @@ -25,6 +25,7 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; use FireflyIII\Api\V2\Controllers\Controller; +use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; @@ -73,4 +74,15 @@ class ShowController extends Controller ->header('Content-Type', self::CONTENT_TYPE) ; } + + public function showSingle(CurrencyExchangeRate $exchangeRate): JsonResponse + { + $transformer = new ExchangeRateTransformer(); + $transformer->setParameters($this->parameters); + + return response() + ->api($this->jsonApiObject(self::RESOURCE_KEY, $exchangeRate, $transformer)) + ->header('Content-Type', self::CONTENT_TYPE) + ; + } } diff --git a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/StoreController.php b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/StoreController.php index df9a44796f..f3e1467e49 100644 --- a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/StoreController.php +++ b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/StoreController.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; +use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest; use FireflyIII\Api\V2\Controllers\Controller; -use FireflyIII\Api\V2\Request\Model\ExchangeRate\StoreRequest; use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; use FireflyIII\Transformers\V2\ExchangeRateTransformer; diff --git a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/UpdateController.php b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/UpdateController.php index a367973430..53fa47be42 100644 --- a/app/Api/V1/Controllers/Models/CurrencyExchangeRate/UpdateController.php +++ b/app/Api/V1/Controllers/Models/CurrencyExchangeRate/UpdateController.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate; +use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\UpdateRequest; use FireflyIII\Api\V2\Controllers\Controller; -use FireflyIII\Api\V2\Request\Model\ExchangeRate\UpdateRequest; use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Repositories\UserGroups\ExchangeRate\ExchangeRateRepositoryInterface; use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait; diff --git a/app/Api/V2/Request/Model/ExchangeRate/DestroyRequest.php b/app/Api/V1/Requests/Models/CurrencyExchangeRate/DestroyRequest.php similarity index 90% rename from app/Api/V2/Request/Model/ExchangeRate/DestroyRequest.php rename to app/Api/V1/Requests/Models/CurrencyExchangeRate/DestroyRequest.php index d7e0ce45f3..eba660ab2b 100644 --- a/app/Api/V2/Request/Model/ExchangeRate/DestroyRequest.php +++ b/app/Api/V1/Requests/Models/CurrencyExchangeRate/DestroyRequest.php @@ -2,7 +2,7 @@ /* * DestroyRequest.php - * Copyright (c) 2024 james@firefly-iii.org. + * Copyright (c) 2025 james@firefly-iii.org. * * This file is part of Firefly III (https://github.com/firefly-iii). * @@ -22,7 +22,7 @@ declare(strict_types=1); -namespace FireflyIII\Api\V2\Request\Model\ExchangeRate; +namespace FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate; use Carbon\Carbon; use FireflyIII\Support\Request\ChecksLogin; @@ -34,7 +34,7 @@ class DestroyRequest extends FormRequest use ChecksLogin; use ConvertsDataTypes; - public function getDate(): Carbon + public function getDate(): ?Carbon { return $this->getCarbonDate('date'); } diff --git a/app/Api/V2/Request/Model/ExchangeRate/StoreRequest.php b/app/Api/V1/Requests/Models/CurrencyExchangeRate/StoreRequest.php similarity index 93% rename from app/Api/V2/Request/Model/ExchangeRate/StoreRequest.php rename to app/Api/V1/Requests/Models/CurrencyExchangeRate/StoreRequest.php index 89f9e8f381..97b777518b 100644 --- a/app/Api/V2/Request/Model/ExchangeRate/StoreRequest.php +++ b/app/Api/V1/Requests/Models/CurrencyExchangeRate/StoreRequest.php @@ -1,8 +1,8 @@ get($field))); try { $result = '' !== (string) $this->get($field) ? new Carbon((string) $this->get($field), config('app.timezone')) : null; } catch (InvalidFormatException $e) { // @ignoreException + Log::debug(sprintf('Exception when parsing date "%s".', $this->get($field))); } if (null === $result) { app('log')->debug(sprintf('Exception when parsing date "%s".', $this->get($field))); diff --git a/routes/api.php b/routes/api.php index 01ffe8ca3f..d091075b01 100644 --- a/routes/api.php +++ b/routes/api.php @@ -312,7 +312,7 @@ Route::group( // exchange rates Route::group( [ - 'namespace' => 'FireflyIII\Api\V1\Controllers\Model\CurrencyExchangeRate', + 'namespace' => 'FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate', 'prefix' => 'v1/exchange-rates', 'as' => 'api.v1.exchange-rates.', ], @@ -321,6 +321,7 @@ Route::group( Route::get('rates/{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'ShowController@show', 'as' => 'show']); Route::get('{userGroupExchangeRate}', ['uses' => 'ShowController@showSingle', 'as' => 'show.single']); Route::delete('rates/{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'DestroyController@destroy', 'as' => 'destroy']); + Route::delete('{userGroupExchangeRate}', ['uses' => 'DestroyController@destroySingle', 'as' => 'destroy.single']); Route::put('{userGroupExchangeRate}', ['uses' => 'UpdateController@update', 'as' => 'update']); Route::post('', ['uses' => 'StoreController@store', 'as' => 'store']); }