Files
firefly-iii/app/Api/V1/Controllers/Models/CurrencyExchangeRate/StoreController.php

150 lines
5.8 KiB
PHP
Raw Normal View History

2024-12-22 13:19:23 +01:00
<?php
2024-12-22 13:19:23 +01:00
/*
2025-01-26 07:44:41 +01:00
* StoreController.php
* Copyright (c) 2025 james@firefly-iii.org.
2024-12-22 13:19:23 +01:00
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
declare(strict_types=1);
2025-01-26 07:44:41 +01:00
namespace FireflyIII\Api\V1\Controllers\Models\CurrencyExchangeRate;
2024-12-22 13:19:23 +01:00
2025-08-15 11:28:23 +02:00
use Carbon\Carbon;
2025-08-15 11:35:16 +02:00
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreByCurrenciesRequest;
2025-08-15 11:28:23 +02:00
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreByDateRequest;
2025-08-15 11:35:16 +02:00
use FireflyIII\Api\V1\Requests\Models\CurrencyExchangeRate\StoreRequest;
2025-08-07 06:01:14 +02:00
use FireflyIII\Enums\UserRoleEnum;
2025-05-24 16:39:20 +02:00
use FireflyIII\Models\CurrencyExchangeRate;
2025-08-15 11:28:23 +02:00
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\ExchangeRate\ExchangeRateRepositoryInterface;
2024-12-22 13:19:23 +01:00
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
2025-03-14 19:18:17 +01:00
use FireflyIII\Transformers\ExchangeRateTransformer;
2024-12-22 13:19:23 +01:00
use Illuminate\Http\JsonResponse;
2025-08-15 11:28:23 +02:00
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
2024-12-22 13:19:23 +01:00
class StoreController extends Controller
{
use ValidatesUserGroupTrait;
public const string RESOURCE_KEY = 'exchange-rates';
2025-08-15 11:35:16 +02:00
protected array $acceptedRoles = [UserRoleEnum::OWNER];
2024-12-22 13:19:23 +01:00
private ExchangeRateRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(ExchangeRateRepositoryInterface::class);
$this->repository->setUserGroup($this->validateUserGroup($request));
return $next($request);
}
);
}
2025-08-15 11:35:16 +02:00
public function storeByCurrencies(StoreByCurrenciesRequest $request, TransactionCurrency $from, TransactionCurrency $to): JsonResponse
{
2025-08-15 11:28:23 +02:00
2025-08-15 11:35:16 +02:00
$data = $request->getAll();
$collection = new Collection();
foreach ($data as $date => $rate) {
$date = Carbon::createFromFormat('Y-m-d', $date);
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
if (null !== $existing) {
// update existing rate.
$existing = $this->repository->updateExchangeRate($existing, $rate);
$collection->push($existing);
continue;
}
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
$collection->push($new);
}
$count = $collection->count();
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE);
}
public function storeByDate(StoreByDateRequest $request, Carbon $date): JsonResponse
{
$data = $request->getAll();
$from = $request->getFromCurrency();
2025-08-15 11:28:23 +02:00
$collection = new Collection();
2025-08-15 11:35:16 +02:00
foreach ($data['rates'] as $key => $rate) {
2025-08-15 11:28:23 +02:00
$to = TransactionCurrency::where('code', $key)->first();
2025-08-15 11:35:16 +02:00
if (null === $to) {
2025-08-15 11:28:23 +02:00
continue; // should not happen.
}
$existing = $this->repository->getSpecificRateOnDate($from, $to, $date);
2025-08-15 11:35:16 +02:00
if (null !== $existing) {
2025-08-15 11:28:23 +02:00
// update existing rate.
2025-08-15 11:35:16 +02:00
$existing = $this->repository->updateExchangeRate($existing, $rate);
2025-08-15 11:28:23 +02:00
$collection->push($existing);
continue;
}
2025-08-15 11:35:16 +02:00
$new = $this->repository->storeExchangeRate($from, $to, $rate, $date);
$collection->push($new);
2025-08-15 11:28:23 +02:00
}
$count = $collection->count();
$paginator = new LengthAwarePaginator($collection, $count, $count, 1);
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
2025-08-15 11:35:16 +02:00
->header('Content-Type', self::CONTENT_TYPE);
2025-08-15 11:28:23 +02:00
}
2024-12-22 13:19:23 +01:00
public function store(StoreRequest $request): JsonResponse
{
2025-08-15 11:35:16 +02:00
$date = $request->getDate();
$rate = $request->getRate();
$from = $request->getFromCurrency();
$to = $request->getToCurrency();
2024-12-22 13:19:23 +01:00
// already has rate?
2025-08-15 11:35:16 +02:00
$object = $this->repository->getSpecificRateOnDate($from, $to, $date);
2025-05-24 16:39:20 +02:00
if ($object instanceof CurrencyExchangeRate) {
2024-12-22 13:19:23 +01:00
// just update it, no matter.
$rate = $this->repository->updateExchangeRate($object, $rate, $date);
}
2025-05-24 16:39:20 +02:00
if (!$object instanceof CurrencyExchangeRate) {
2024-12-22 13:19:23 +01:00
// store new
$rate = $this->repository->storeExchangeRate($from, $to, $rate, $date);
}
$transformer = new ExchangeRateTransformer();
$transformer->setParameters($this->parameters);
return response()
->api($this->jsonApiObject(self::RESOURCE_KEY, $rate, $transformer))
2025-08-15 11:35:16 +02:00
->header('Content-Type', self::CONTENT_TYPE);
2024-12-22 13:19:23 +01:00
}
}