Compare commits

..

91 Commits

Author SHA1 Message Date
github-actions[bot]
ff568653c8 Merge pull request #11940 from firefly-iii/release-1773385883
🤖 Automatically merge the PR into the develop branch.
2026-03-13 08:11:30 +01:00
JC5
21447a9b2f 🤖 Auto commit for release 'develop' on 2026-03-13 2026-03-13 08:11:23 +01:00
James Cole
238bfc819e Catch a null pointer. 2026-03-13 08:05:04 +01:00
James Cole
3fab4668fc Move copyright. 2026-03-13 04:14:46 +01:00
James Cole
190050d6cf Rate limit mail message. 2026-03-13 04:12:32 +01:00
James Cole
45d623e0c1 Fix some linting issues 2026-03-13 04:05:38 +01:00
github-actions[bot]
93fe8dbf42 Merge pull request #11938 from firefly-iii/release-1773370546
🤖 Automatically merge the PR into the develop branch.
2026-03-13 03:55:56 +01:00
JC5
63c49f740f 🤖 Auto commit for release 'develop' on 2026-03-13 2026-03-13 03:55:47 +01:00
James Cole
bc23bc0173 Fix reference to IP. 2026-03-13 03:50:02 +01:00
James Cole
1611cb3819 Add link to Firefly III in emails 2026-03-13 03:40:07 +01:00
Sander Dorigo
c520e79b85 Expand changelog 2026-03-12 08:42:26 +01:00
Sander Dorigo
51e005f305 Finally fix often reported enum issue in rule engine 2026-03-12 08:41:15 +01:00
James Cole
133449640d Fix phpstan issues by adding properties. 2026-03-09 20:56:09 +01:00
James Cole
c5a126eb61 Merge branch 'main' into develop 2026-03-09 20:39:56 +01:00
James Cole
4222d8ffdd Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
# Conflicts:
#	app/Http/Controllers/Transaction/MassController.php
2026-03-09 20:39:35 +01:00
James Cole
28ff0a8423 Fix a bunch of phpstan issues. 2026-03-09 20:38:58 +01:00
James Cole
4c0e599b01 Merge pull request #11920 from firefly-iii/dependabot/github_actions/crazy-max/ghaction-import-gpg-7 2026-03-09 06:39:06 +01:00
dependabot[bot]
10d2137723 Bump crazy-max/ghaction-import-gpg from 6 to 7
Bumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 6 to 7.
- [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases)
- [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v6...v7)

---
updated-dependencies:
- dependency-name: crazy-max/ghaction-import-gpg
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 03:53:55 +00:00
github-actions[bot]
f9b7149fc7 Merge pull request #11919 from firefly-iii/release-1773028359
🤖 Automatically merge the PR into the develop branch.
2026-03-09 04:52:46 +01:00
JC5
7c3fb7a95a 🤖 Auto commit for release 'develop' on 2026-03-09 2026-03-09 04:52:39 +01:00
James Cole
91b7ee06d8 Fix moar phpstan issues. 2026-03-08 17:44:19 +01:00
James Cole
84ea19d14c Fix a bunch of phpstan errors. 2026-03-08 17:08:51 +01:00
James Cole
9950f79a6b Merge branch 'main' into develop 2026-03-08 11:57:21 +01:00
James Cole
e3df7675d3 Fix https://github.com/firefly-iii/firefly-iii/issues/11916 2026-03-08 11:56:53 +01:00
James Cole
15094097bc Update various templates. 2026-03-07 13:42:11 +01:00
github-actions[bot]
a07dc4dbc8 Merge pull request #11904 from firefly-iii/release-1772875617
🤖 Automatically merge the PR into the develop branch.
2026-03-07 10:27:06 +01:00
JC5
c86562554b 🤖 Auto commit for release 'develop' on 2026-03-07 2026-03-07 10:26:58 +01:00
James Cole
19b548a417 Fix null type issues. 2026-03-07 10:20:06 +01:00
James Cole
71698b36e2 Fix various phpstan issues. 2026-03-07 10:17:07 +01:00
github-actions[bot]
f65ee4d419 Merge pull request #11901 from firefly-iii/release-1772861474
🤖 Automatically merge the PR into the develop branch.
2026-03-07 06:31:23 +01:00
JC5
535fd9777a 🤖 Auto commit for release 'develop' on 2026-03-07 2026-03-07 06:31:14 +01:00
James Cole
5d1fde9cf7 Clean up more errors. 2026-03-07 06:26:08 +01:00
James Cole
922f1e7c1a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-07 06:25:45 +01:00
github-actions[bot]
ef5c35c04d Merge pull request #11900 from firefly-iii/release-1772860900
🤖 Automatically merge the PR into the develop branch.
2026-03-07 06:21:47 +01:00
JC5
4dfbdc644c 🤖 Auto commit for release 'develop' on 2026-03-07 2026-03-07 06:21:40 +01:00
James Cole
4a3f45e125 Add empty array 2026-03-07 06:15:55 +01:00
github-actions[bot]
a08f776ffa Merge pull request #11897 from firefly-iii/release-1772828319
🤖 Automatically merge the PR into the develop branch.
2026-03-06 21:18:48 +01:00
JC5
e246c1f4b7 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 21:18:39 +01:00
github-actions[bot]
f2d1e8e184 Merge pull request #11896 from firefly-iii/release-1772825547
🤖 Automatically merge the PR into the develop branch.
2026-03-06 20:32:37 +01:00
JC5
19d8f46f24 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 20:32:27 +01:00
James Cole
9ac991edd7 Fix phpstan issues. 2026-03-06 20:25:07 +01:00
github-actions[bot]
e85f06792b Merge pull request #11889 from firefly-iii/release-1772807505
🤖 Automatically merge the PR into the develop branch.
2026-03-06 15:31:55 +01:00
JC5
b66f95f1dc 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 15:31:45 +01:00
James Cole
4d63146524 Fix more phpstan issues. 2026-03-06 15:24:35 +01:00
James Cole
695f990236 Correct phpstan errors. 2026-03-06 15:18:49 +01:00
James Cole
e882530a69 Clean up various phpstan issues. 2026-03-06 13:52:11 +01:00
James Cole
993a2491e9 Clean up some phpstan issues. 2026-03-06 11:46:04 +01:00
James Cole
f6ea517b5d Fix https://github.com/orgs/firefly-iii/discussions/11879 2026-03-06 11:41:18 +01:00
github-actions[bot]
6f4143bb79 Merge pull request #11888 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-03-06 10:07:42 +01:00
github-actions[bot]
4a2c77c6b7 Merge pull request #11887 from firefly-iii/release-1772788047
🤖 Automatically merge the PR into the develop branch.
2026-03-06 10:07:36 +01:00
JC5
0e62f980b0 🤖 Auto commit for release 'v6.5.4' on 2026-03-06 2026-03-06 10:07:27 +01:00
James Cole
41533fd922 Clean up changelog. 2026-03-06 10:01:32 +01:00
James Cole
d6b5fbe341 Expand changelog. 2026-03-06 08:02:30 +01:00
github-actions[bot]
1047e3290b Merge pull request #11886 from firefly-iii/release-1772780441
🤖 Automatically merge the PR into the develop branch.
2026-03-06 08:00:49 +01:00
JC5
8ac4c535b4 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 08:00:41 +01:00
James Cole
2c997d8d95 Removed last phpstan errors 2026-03-06 07:55:04 +01:00
James Cole
419382f9e0 Remove broken code. 2026-03-06 07:45:28 +01:00
James Cole
12f19c6c34 Remove all "@phpstan-ignore-line" entries. 2026-03-06 07:39:12 +01:00
github-actions[bot]
705138aa27 Merge pull request #11885 from firefly-iii/release-1772775428
🤖 Automatically merge the PR into the develop branch.
2026-03-06 06:37:15 +01:00
JC5
36d20137b2 🤖 Auto commit for release 'develop' on 2026-03-06 2026-03-06 06:37:08 +01:00
James Cole
7f08a3f594 Use safe function. 2026-03-06 06:21:36 +01:00
James Cole
a897229958 Add changelog for v6.5.4 2026-03-06 06:12:15 +01:00
James Cole
1fa4632be5 Fix transaction search. 2026-03-06 06:03:12 +01:00
James Cole
221a00a23b Add debug info to track available budget creation. 2026-03-06 05:36:05 +01:00
James Cole
09c3318408 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-05 20:50:32 +01:00
Sander Dorigo
25ba87babb Better validation for webhook URLs 2026-03-05 10:11:09 +01:00
James Cole
d7e9a42f58 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2026-03-04 20:24:25 +01:00
James Cole
8fd6d99c11 Fix date issues in piggy banks for #11873 2026-03-04 20:21:12 +01:00
github-actions[bot]
463ae00ec2 Merge pull request #11876 from firefly-iii/release-1772642273
🤖 Automatically merge the PR into the develop branch.
2026-03-04 17:38:02 +01:00
JC5
969460d271 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 17:37:53 +01:00
James Cole
8ecfa4b619 Fix #11873 2026-03-04 17:31:42 +01:00
James Cole
55ae86ad62 Merge branch 'main' into develop 2026-03-04 17:28:57 +01:00
github-actions[bot]
5e68d948f3 Merge pull request #11874 from firefly-iii/release-1772634907
🤖 Automatically merge the PR into the develop branch.
2026-03-04 15:35:20 +01:00
JC5
77cae13b95 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 15:35:07 +01:00
Sander Dorigo
49d8a3c32e Catch not numeric numbers 2026-03-04 15:25:32 +01:00
github-actions[bot]
0ad4db8a71 Merge pull request #11872 from firefly-iii/release-1772618461
🤖 Automatically merge the PR into the develop branch.
2026-03-04 11:01:10 +01:00
JC5
ed9754c8d4 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 11:01:01 +01:00
James Cole
7315825475 Update CI workflow to manage environment file
Copy .env.example to .env before running CI and remove .env afterward.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:55:56 +01:00
James Cole
eea23ed756 Update composer update command in CI workflow
Removed the '--no-plugins' option from composer update command.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:42:51 +01:00
James Cole
04875728b4 Remove staticMethod.notFound from ignoreErrors
Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:42:22 +01:00
James Cole
1fa51a92c6 Ignore staticMethod.notFound error in PHPStan
Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 10:24:47 +01:00
Sander Dorigo
f8687d4fc1 New config 2026-03-04 10:01:24 +01:00
James Cole
9b5cf09cc0 Update release.yml to enforce error handling
Removed '|| true' from Mago format, PHPCS, and lint commands to ensure they fail the workflow if errors occur.

Signed-off-by: James Cole <james@firefly-iii.org>
2026-03-04 09:26:08 +01:00
github-actions[bot]
268377ad3a Merge pull request #11870 from firefly-iii/develop
🤖 Automatically merge the PR into the main branch.
2026-03-04 07:52:49 +01:00
github-actions[bot]
93500b8156 Merge pull request #11869 from firefly-iii/release-1772607152
🤖 Automatically merge the PR into the develop branch.
2026-03-04 07:52:42 +01:00
JC5
8a3fb50607 🤖 Auto commit for release 'v6.5.3' on 2026-03-04 2026-03-04 07:52:32 +01:00
github-actions[bot]
8a8567c3e4 Merge pull request #11868 from firefly-iii/release-1772605365
🤖 Automatically merge the PR into the develop branch.
2026-03-04 07:22:52 +01:00
JC5
7922671463 🤖 Auto commit for release 'develop' on 2026-03-04 2026-03-04 07:22:45 +01:00
James Cole
3baa1ccd78 Update changelog. 2026-03-04 07:17:36 +01:00
James Cole
4beef8be86 Merge branch 'main' into develop 2026-03-04 07:14:11 +01:00
James Cole
912a9f1ea7 Fix workflow for now. 2026-03-04 06:53:52 +01:00
489 changed files with 2348 additions and 1770 deletions

View File

@@ -1264,16 +1264,16 @@
},
{
"name": "symfony/console",
"version": "v8.0.6",
"version": "v8.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "488285876e807a4777f074041d8bb508623419fa"
"reference": "15ed9008a4ebe2d6a78e4937f74e0c13ef2e618a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/488285876e807a4777f074041d8bb508623419fa",
"reference": "488285876e807a4777f074041d8bb508623419fa",
"url": "https://api.github.com/repos/symfony/console/zipball/15ed9008a4ebe2d6a78e4937f74e0c13ef2e618a",
"reference": "15ed9008a4ebe2d6a78e4937f74e0c13ef2e618a",
"shasum": ""
},
"require": {
@@ -1330,7 +1330,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v8.0.6"
"source": "https://github.com/symfony/console/tree/v8.0.7"
},
"funding": [
{
@@ -1350,7 +1350,7 @@
"type": "tidelift"
}
],
"time": "2026-02-25T16:59:43+00:00"
"time": "2026-03-06T14:06:22+00:00"
},
{
"name": "symfony/deprecation-contracts",

View File

@@ -1,70 +1,61 @@
parameters:
ergebnis:
noExtends:
enabled: false
final:
enabled: false
noParameterWithNullDefaultValue:
enabled: false
noParameterWithNullableTypeDeclaration:
enabled: false
noCompact:
enabled: false
noSwitch:
enabled: false
noNullableReturnTypeDeclaration:
enabled: false
finalInAbstractClass:
enabled: false
noConstructorParameterWithDefaultValue:
enabled: false
noNamedArgument:
enabled: false
noParameterWithContainerTypeDeclaration:
enabled: false
paths:
- ../app
- ../database
- ../routes
- ../config
- ../bootstrap/app.php
- ../bootstrap/providers.php
universalObjectCratesClasses:
- Illuminate\Database\Eloquent\Model
reportUnmatchedIgnoredErrors: true
ignoreErrors:
# these are actually interesting but not right now:
- identifier: notIdentical.alwaysTrue
- identifier: method.notFound
- identifier: nullsafe.neverNull
- identifier: identical.alwaysFalse
- identifier: if.condNotBoolean
# - identifier: booleanNot.exprNotBoolean
- identifier: method.nonObject
- identifier: function.impossibleType
- identifier: booleanNot.exprNotBoolean
- identifier: ternary.condNotBoolean
- identifier: booleanNot.alwaysFalse
- identifier: booleanAnd.alwaysFalse
- identifier: greater.alwaysTrue
- identifier: function.alreadyNarrowedType
- identifier: booleanNot.alwaysTrue
- identifier: property.phpDocType
- identifier: nullCoalesce.offset
- identifier: nullCoalesce.variable
- identifier: larastan.noUnnecessaryCollectionCall
- identifier: varTag.differentVariable
- identifier: identical.alwaysTrue
- identifier: clone.nonObject
- identifier: assign.propertyReadOnly
- identifier: property.nonObject
- identifier: varTag.nativeType
- identifier: booleanAnd.leftAlwaysFalse
- identifier: property.onlyWritten
- identifier: parameter.phpDocType
- identifier: property.dynamicName
- identifier: property.unusedType
- identifier: staticMethod.deprecated
- identifier: greater.invalid
- identifier: instanceof.alwaysTrue
# ignore everything but things that BREAK
- identifier: property.deprecated
- identifier: method.deprecated
- identifier: cast.useless
- identifier: parameter.deprecatedClass
- identifier: method.deprecatedClass
- identifier: argument.type
- identifier: return.type
- identifier: assign.propertyType
- identifier: return.unusedType
- identifier: return.phpDocType
# all errors below I will never fix.
# all errors below I will (probably) never fix.
- identifier: property.unusedType # one false positive
- identifier: varTag.nativeType # dont even know what im supposed to fix.
- identifier: method.notFound # way too many false positives
- identifier: catch.neverThrown # plenty of errors that are thrown undocumented
- identifier: staticMethod.dynamicName # dont care
- identifier: arguments.count # one false positive
- identifier: property.notFound # false positives
- identifier: method.dynamicName # i dont care
- identifier: staticMethod.dynamicCall # many false positives.
- identifier: argument.templateType # no clue how to fix single occurrence.
# - '#expects view-string\|null, string given#'
# - '#expects view-string, string given#'
# - "#Parameter \\#[1-2] \\$num[1-2] of function bc[a-z]+ expects numeric-string, [a-z\\-|&]+ given#"
- identifier: missingType.generics # not interesting enough to fix.
-
identifier: larastan.noEnvCallsOutsideOfConfig
path: ../app/Console/Commands/System/CreatesDatabase.php
- identifier: missingType.iterableValue # not interesting enough to fix.
- identifier: varTag.type # needs a custom extension for every repository, not gonna happen.
- '#Dynamic call to static method Illuminate#'
# - '#Dynamic call to static method Illuminate#'
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::before#' # is custom scope
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::after#' # is custom scope
# - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\HasMany::withTrashed#' # is to allow soft delete

View File

@@ -33,7 +33,7 @@ jobs:
with:
fetch-depth: 0
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PASSPHRASE }}
@@ -174,18 +174,24 @@ jobs:
uses: nhedger/setup-mago@v1
- name: Run CI
run: |
cp .env.example .env
# install all packages etc.
rm -rf vendor composer.lock
composer update --no-scripts --no-plugins -q
composer update --no-scripts -q
# format code.
mago format || true
echo "Will now run Mago Format"
mago format
sudo chown -R runner:docker resources/lang
.ci/phpcs.sh || true
echo "Will now run PHPCS"
.ci/phpcs.sh
# lint and check
echo "Will now run Mago Lint"
mago lint
echo "Will now run PHPstan"
.ci/phpstan.sh
rm .env
- name: Calculate variables
run: |

View File

@@ -80,16 +80,16 @@ final class AccountController extends Controller
public function accounts(AutocompleteApiRequest $request): JsonResponse
{
// Log::debug('Before All.');
['types' => $types, 'query' => $query, 'date' => $date, 'limit' => $limit] = $request->attributes->all();
['types' => $types, 'query' => $query, 'date' => $date, 'limit' => $limit] = $request->attributes->all();
$date ??= today(config('app.timezone'));
// set date to end-of-day for account balance. so it is at $date 23:59:59
$date->endOfDay();
$return = [];
$result = $this->repository->searchAccount((string) $query, $types, $limit);
$allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary);
$return = [];
$result = $this->repository->searchAccount((string) $query, $types, $limit);
$allBalances = Steam::accountsBalancesOptimized($result, $date, $this->primaryCurrency, $this->convertToPrimary);
/** @var Account $account */
foreach ($result as $account) {

View File

@@ -63,7 +63,7 @@ final class BillController extends Controller
public function bills(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchBill($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(static fn (Bill $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
$filtered = $result->map(static fn (Bill $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
return response()->api($filtered->toArray());
}

View File

@@ -63,7 +63,7 @@ final class BudgetController extends Controller
public function budgets(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchBudget($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(static fn (Budget $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
$filtered = $result->map(static fn (Budget $item): array => ['id' => (string) $item->id, 'name' => $item->name, 'active' => $item->active]);
return response()->api($filtered->toArray());
}

View File

@@ -63,7 +63,7 @@ final class CategoryController extends Controller
public function categories(AutocompleteApiRequest $request): JsonResponse
{
$result = $this->repository->searchCategory($request->attributes->get('query'), $request->attributes->get('limit'));
$filtered = $result->map(static fn (Category $item): array => ['id' => (string) $item->id, 'name' => $item->name]);
$filtered = $result->map(static fn (Category $item): array => ['id' => (string) $item->id, 'name' => $item->name]);
return response()->api($filtered->toArray());
}

View File

@@ -67,7 +67,7 @@ final class ObjectGroupController extends Controller
/** @var ObjectGroup $objectGroup */
foreach ($result as $objectGroup) {
$return[] = ['id' => (string) $objectGroup->id, 'name' => $objectGroup->title, 'title' => $objectGroup->title];
$return[] = ['id' => (string) $objectGroup->id, 'name' => $objectGroup->title, 'title' => $objectGroup->title];
}
return response()->api($return);

View File

@@ -63,7 +63,7 @@ final class TagController extends Controller
/** @var Tag $tag */
foreach ($result as $tag) {
$array[] = ['id' => (string) $tag->id, 'name' => $tag->tag, 'tag' => $tag->tag];
$array[] = ['id' => (string) $tag->id, 'name' => $tag->tag, 'tag' => $tag->tag];
}
return response()->api($array);

View File

@@ -62,7 +62,7 @@ final class TransactionTypeController extends Controller
/** @var TransactionType $type */
foreach ($types as $type) {
// different key for consistency.
$array[] = ['id' => (string) $type->id, 'name' => $type->type, 'type' => $type->type];
$array[] = ['id' => (string) $type->id, 'name' => $type->type, 'type' => $type->type];
}
return response()->api($array);

View File

@@ -220,7 +220,7 @@ final class BudgetController extends Controller
'end_date' => $row['end'],
'yAxisID' => 0,
'type' => 'bar',
'entries' => ['budgeted' => $row['budgeted'], 'spent' => $row['spent'], 'left' => $row['left'], 'overspent' => $row['overspent']],
'entries' => ['budgeted' => $row['budgeted'], 'spent' => $row['spent'], 'left' => $row['left'], 'overspent' => $row['overspent']],
'pc_entries' => [
'budgeted' => $row['pc_budgeted'],
'spent' => $row['pc_spent'],

View File

@@ -153,8 +153,8 @@ final class CategoryController extends Controller
'end_date' => $end->toAtomString(),
'yAxisID' => 0,
'type' => 'bar',
'entries' => ['spent' => '0', 'earned' => '0'],
'pc_entries' => ['spent' => '0', 'earned' => '0'],
'entries' => ['spent' => '0', 'earned' => '0'],
'pc_entries' => ['spent' => '0', 'earned' => '0'],
];
// add monies

View File

@@ -63,6 +63,8 @@ abstract class Controller extends BaseController
use ValidatesRequests;
use ValidatesUserGroupTrait;
protected array $acceptedRoles = [];
protected const string CONTENT_TYPE = 'application/vnd.api+json';
protected const string JSON_CONTENT_TYPE = 'application/json';
@@ -169,6 +171,9 @@ abstract class Controller extends BaseController
return $manager->createData($resource)->toArray();
}
/**
* @deprecated
*/
#[Deprecated(message: <<<'TXT'
use Request classes
Method to grab all parameters from the URL
@@ -222,11 +227,8 @@ abstract class Controller extends BaseController
$value = min(max(1, $value), 2 ** 16);
$bag->set($integer, $value);
}
if (
null === $value
&& 'limit' === $integer // @phpstan-ignore-line
&& auth()->check()
) {
// && 'limit' === $integer
if (null === $value && auth()->check()) {
// set default for user:
/** @var User $user */
$user = auth()->user();

View File

@@ -70,21 +70,21 @@ final class ListController extends Controller
public function attachments(PaginationRequest $request, Account $account): JsonResponse
{
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$collection = $this->repository->getAttachments($account);
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$collection = $this->repository->getAttachments($account);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -93,31 +93,31 @@ final class ListController extends Controller
public function piggyBanks(PaginationRequest $request, Account $account): JsonResponse
{
// create some objects:
$manager = $this->getManager();
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
// get list of piggy banks. Count it and split it.
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice($offset, $limit);
$collection = $this->repository->getPiggyBanks($account);
$count = $collection->count();
$piggyBanks = $collection->slice($offset, $limit);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new PiggyBankEnrichment();
$admin = auth()->user();
$enrichment = new PiggyBankEnrichment();
$enrichment->setUser($admin);
$piggyBanks = $enrichment->enrich($piggyBanks);
$piggyBanks = $enrichment->enrich($piggyBanks);
// make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator = new LengthAwarePaginator($piggyBanks, $count, $limit, $page);
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
/** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class);
$transformer = app(PiggyBankTransformer::class);
// $transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy-banks');
$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);
@@ -128,16 +128,16 @@ final class ListController extends Controller
*/
public function transactions(PaginationDateRangeRequest $request, Account $account): JsonResponse
{
['limit' => $limit, 'page' => $page, 'start' => $start, 'end' => $end, 'type' => $type] = $request->attributes->all();
$types = $this->mapTransactionTypes($type ?? 'default');
$manager = $this->getManager();
['limit' => $limit, 'page' => $page, 'start' => $start, 'end' => $end, 'type' => $type] = $request->attributes->all();
$types = $this->mapTransactionTypes($type ?? 'default');
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector = app(GroupCollectorInterface::class);
$collector->setUser($admin)->setAccounts(new Collection()->push($account))->withAPIInformation()->setLimit($limit)->setPage($page)->setTypes($types);
if (null !== $start) {
$collector->setStart($start);
@@ -146,18 +146,18 @@ final class ListController extends Controller
$collector->setEnd($end);
}
$paginator = $collector->getPaginatedGroups();
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.accounts.transactions', [$account->id]).$this->buildParams());
// enrich
$enrichment = new TransactionGroupEnrichment();
$enrichment = new TransactionGroupEnrichment();
$enrichment->setUser($admin);
$transactions = $enrichment->enrich($paginator->getCollection());
$transactions = $enrichment->enrich($paginator->getCollection());
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer = app(TransactionGroupTransformer::class);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -124,22 +124,22 @@ final class ShowController extends Controller
// get list of accounts. Count it and split it.
$this->repository->resetAccountOrder();
$account->refresh();
$manager = $this->getManager();
['start' => $start, 'end' => $end, 'date' => $date] = $request->attributes->all();
$manager = $this->getManager();
['start' => $start, 'end' => $end, 'date' => $date] = $request->attributes->all();
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new AccountEnrichment();
$admin = auth()->user();
$enrichment = new AccountEnrichment();
$enrichment->setDate($date);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$enrichment->setUser($admin);
$account = $enrichment->enrichSingle($account);
$account = $enrichment->enrichSingle($account);
/** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
$transformer = app(AccountTransformer::class);
$resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}

View File

@@ -121,7 +121,7 @@ final class ShowController extends Controller
*/
public function index(PaginationRequest $request): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
@@ -129,21 +129,21 @@ final class ShowController extends Controller
throw new NotFoundHttpException();
}
$manager = $this->getManager();
$manager = $this->getManager();
// get list of attachments. Count it and split it.
$collection = $this->repository->get();
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$collection = $this->repository->get();
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.attachments.index').$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -68,29 +68,29 @@ final class ShowController extends Controller
*/
public function index(PaginationDateRangeRequest $request): JsonResponse
{
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page, 'start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
['limit' => $limit, 'offset' => $offset, 'page' => $page, 'start' => $start, 'end' => $end] = $request->attributes->all();
// get list of available budgets. Count it and split it.
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice($offset, $limit);
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
$count = $collection->count();
$availableBudgets = $collection->slice($offset, $limit);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment();
$admin = auth()->user();
$enrichment = new AvailableBudgetEnrichment();
$enrichment->setUser($admin);
$availableBudgets = $enrichment->enrich($availableBudgets);
$availableBudgets = $enrichment->enrich($availableBudgets);
// make paginator:
$paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator = new LengthAwarePaginator($availableBudgets, $count, $limit, $page);
$paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer = app(AvailableBudgetTransformer::class);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -72,21 +72,21 @@ final class ListController extends Controller
*/
public function attachments(PaginationRequest $request, Bill $bill): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getAttachments($bill);
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getAttachments($bill);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
$count = $collection->count();
$attachments = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator = new LengthAwarePaginator($attachments, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class);
$transformer = app(AttachmentTransformer::class);
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -100,20 +100,20 @@ final class ListController extends Controller
*/
public function rules(PaginationRequest $request, Bill $bill): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'page' => $page] = $request->attributes->all();
$manager = $this->getManager();
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice($offset, $limit);
$manager = $this->getManager();
$collection = $this->repository->getRulesForBill($bill);
$count = $collection->count();
$rules = $collection->slice($offset, $limit);
// make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator = new LengthAwarePaginator($rules, $count, $limit, $page);
$paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams());
/** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class);
$resource = new FractalCollection($rules, $transformer, 'rules');
$transformer = app(RuleTransformer::class);
$resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -127,16 +127,16 @@ final class ListController extends Controller
*/
public function transactions(PaginationDateRangeRequest $request, Bill $bill): JsonResponse
{
['limit' => $limit, 'page' => $page, 'types' => $types, 'start' => $start, 'end' => $end] = $request->attributes->all();
['limit' => $limit, 'page' => $page, 'types' => $types, 'start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// include source + destination account name and type.
@@ -159,18 +159,18 @@ final class ListController extends Controller
}
// get paginator.
$paginator = $collector->getPaginatedGroups();
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams());
// enrich
$enrichment = new TransactionGroupEnrichment();
$enrichment = new TransactionGroupEnrichment();
$enrichment->setUser($admin);
$transactions = $enrichment->enrich($paginator->getCollection());
$transactions = $enrichment->enrich($paginator->getCollection());
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer = app(TransactionGroupTransformer::class);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -67,28 +67,28 @@ final class ShowController extends Controller
*/
public function index(PaginationDateRangeRequest $request): JsonResponse
{
['limit' => $limit, 'offset' => $offset, 'start' => $start, 'end' => $end, 'page' => $page] = $request->attributes->all();
['limit' => $limit, 'offset' => $offset, 'start' => $start, 'end' => $end, 'page' => $page] = $request->attributes->all();
$this->repository->correctOrder();
$bills = $this->repository->getBills();
$manager = $this->getManager();
$count = $bills->count();
$bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
$bills = $this->repository->getBills();
$manager = $this->getManager();
$count = $bills->count();
$bills = $bills->slice($offset, $limit);
$paginator = new LengthAwarePaginator($bills, $count, $limit, $page);
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$bills = $enrichment->enrich($bills);
$bills = $enrichment->enrich($bills);
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer = app(BillTransformer::class);
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -102,23 +102,23 @@ final class ShowController extends Controller
*/
public function show(DateRangeRequest $request, Bill $bill): JsonResponse
{
['start' => $start, 'end' => $end] = $request->attributes->all();
['start' => $start, 'end' => $end] = $request->attributes->all();
$manager = $this->getManager();
$manager = $this->getManager();
// enrich
/** @var User $admin */
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$admin = auth()->user();
$enrichment = new SubscriptionEnrichment();
$enrichment->setUser($admin);
$enrichment->setStart($start);
$enrichment->setEnd($end);
$bill = $enrichment->enrichSingle($bill);
$bill = $enrichment->enrichSingle($bill);
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer = app(BillTransformer::class);
$resource = new Item($bill, $transformer, 'bills');
$resource = new Item($bill, $transformer, 'bills');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}

View File

@@ -83,7 +83,6 @@ final class StoreController extends Controller
/** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($bill, $transformer, 'bills');

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\SameDateRequest;
use FireflyIII\Api\V1\Requests\DateRangeRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit;
@@ -118,12 +118,12 @@ final class ShowController extends Controller
*
* @SuppressWarnings("PHPMD.UnusedFormalParameter")
*/
public function indexAll(SameDateRequest $request): JsonResponse
public function indexAll(DateRangeRequest $request): JsonResponse
{
$manager = $this->getManager();
$manager->parseIncludes('budget');
$pageSize = $this->parameters->get('limit');
$collection = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
$collection = $this->blRepository->getAllBudgetLimits($request->attributes->get('start'), $request->attributes->get('end'));
$count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));

View File

@@ -1,10 +1,8 @@
<?php
declare(strict_types=1);
/*
* TriggerController.php
* Copyright (c) 2025 james@firefly-iii.org
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
@@ -22,10 +20,12 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Recurrence;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Generic\SingleDateRequest;
use FireflyIII\Api\V1\Requests\DateRequest;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Jobs\CreateRecurringTransactions;
use FireflyIII\Models\Recurrence;
@@ -59,12 +59,12 @@ final class TriggerController extends Controller
});
}
public function trigger(SingleDateRequest $request, Recurrence $recurrence): JsonResponse
public function trigger(DateRequest $request, Recurrence $recurrence): JsonResponse
{
// find recurrence occurrence for this date and trigger it.
// grab the date from the last time the recurrence fired:
$backupDate = $recurrence->latest_date;
$date = $request->getDate();
$date = $request->attributes->get('date');
// fire the recurring cron job on the given date, then post-date the created transaction.
Log::info(sprintf('Trigger: will now fire recurring cron job task for date "%s".', $date->format('Y-m-d H:i:s')));

View File

@@ -78,15 +78,15 @@ final class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && '' !== $parameters['accounts']) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// file the rule(s)
@@ -98,7 +98,7 @@ final class TriggerController extends Controller
$enrichment->setUser($rule->user);
$transactions = $enrichment->enrich($transactions);
$paginator = new LengthAwarePaginator($transactions, $count, 31337, $this->parameters->get('page'));
$paginator = new LengthAwarePaginator($transactions, $count, 31_337, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rules.test', [$rule->id]).$this->buildParams());
// resulting list is presented as JSON thing.
@@ -132,15 +132,15 @@ final class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && is_array($parameters['accounts']) && count($parameters['accounts']) > 0) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// fire the rule(s)

View File

@@ -85,15 +85,15 @@ final class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && '' !== $parameters['accounts']) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// file the rule(s)
@@ -105,7 +105,7 @@ final class TriggerController extends Controller
$enrichment->setUser($group->user);
$transactions = $enrichment->enrich($transactions);
$paginator = new LengthAwarePaginator($transactions, $count, 31337, $this->parameters->get('page'));
$paginator = new LengthAwarePaginator($transactions, $count, 31_337, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rule-groups.test', [$group->id]).$this->buildParams());
// resulting list is presented as JSON thing.
@@ -146,15 +146,15 @@ final class TriggerController extends Controller
// overrule the rule(s) if necessary.
if (array_key_exists('start', $parameters) && null !== $parameters['start']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_after', 'value' => $parameters['start']->format('Y-m-d')]);
}
if (array_key_exists('end', $parameters) && null !== $parameters['end']) {
// add a range:
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
$ruleEngine->addOperator(['type' => 'date_before', 'value' => $parameters['end']->format('Y-m-d')]);
}
if (array_key_exists('accounts', $parameters) && is_array($parameters['accounts']) && count($parameters['accounts']) > 0) {
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
$ruleEngine->addOperator(['type' => 'account_id', 'value' => implode(',', $parameters['accounts'])]);
}
// file the rule(s)

View File

@@ -48,6 +48,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
final class UpdateController extends Controller
{
private TransactionGroupRepositoryInterface $groupRepository;
protected array $acceptedRoles = [];
/**
* TransactionController constructor.

View File

@@ -256,7 +256,7 @@ final class ListController extends Controller
$unfiltered = $recurringRepos->get();
// filter selection
$collection = $unfiltered->filter(static function (Recurrence $recurrence) use ($currency): null|Recurrence { // @phpstan-ignore-line
$collection = $unfiltered->filter(static function (Recurrence $recurrence) use ($currency): null|Recurrence {
if (array_any(
$recurrence->recurrenceTransactions,
static fn ($transaction): bool => $transaction->transaction_currency_id === $currency->id || $transaction->foreign_currency_id === $currency->id
@@ -306,7 +306,7 @@ final class ListController extends Controller
$ruleRepos = app(RuleRepositoryInterface::class);
$unfiltered = $ruleRepos->getAll();
$collection = $unfiltered->filter(static function (Rule $rule) use ($currency): null|Rule { // @phpstan-ignore-line
$collection = $unfiltered->filter(static function (Rule $rule) use ($currency): null|Rule {
if (array_any(
$rule->ruleTriggers,
static fn ($trigger): bool => 'currency_is' === $trigger->trigger_type && $currency->name === $trigger->trigger_value

View File

@@ -52,12 +52,12 @@ final class IndexController extends Controller
public function index(PaginationRequest $request): JsonResponse
{
$administrations = $this->repository->get();
['page' => $page, 'limit' => $limit, 'offset' => $offset] = $request->attributes->all();
$count = $administrations->count();
$administrations = $administrations->slice($offset, $limit);
$paginator = new LengthAwarePaginator($administrations, $count, $limit, $page);
$transformer = new UserGroupTransformer();
$administrations = $this->repository->get();
['page' => $page, 'limit' => $limit, 'offset' => $offset] = $request->attributes->all();
$count = $administrations->count();
$administrations = $administrations->slice($offset, $limit);
$paginator = new LengthAwarePaginator($administrations, $count, $limit, $page);
$transformer = new UserGroupTransformer();
return response()->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))->header('Content-Type', self::CONTENT_TYPE);
}

View File

@@ -68,7 +68,7 @@ final class TransactionController extends Controller
$description = (string) $request->attributes->get('description');
Log::debug(sprintf('Include deleted? %s', var_export($includeDeleted, true)));
if ('' !== $externalId) {
$count += $this->repository->countByMeta('external_identifier', $externalId, $includeDeleted);
$count += $this->repository->countByMeta('external_id', $externalId, $includeDeleted);
Log::debug(sprintf('Search for transactions with external_identifier "%s", count is now %d', $externalId, $count));
}
if ('' !== $internalRef) {

View File

@@ -89,20 +89,20 @@ final class BasicController extends Controller
public function basic(BasicRequest $request): JsonResponse
{
// parameters for boxes:
['start' => $start, 'end' => $end, 'code' => $code] = $request->attributes->all();
['start' => $start, 'end' => $end, 'code' => $code] = $request->attributes->all();
// balance information:
$balanceData = $this->getBalanceInformation($start, $end);
$billData = $this->getSubscriptionInformation($start, $end);
$spentData = $this->getLeftToSpendInfo($start, $end);
$netWorthData = $this->getNetWorthInfo($end);
$balanceData = $this->getBalanceInformation($start, $end);
$billData = $this->getSubscriptionInformation($start, $end);
$spentData = $this->getLeftToSpendInfo($start, $end);
$netWorthData = $this->getNetWorthInfo($end);
// $balanceData = [];
// $billData = [];
// $spentData = [];
// $netWorthData = [];
$total = array_merge($balanceData, $billData, $spentData, $netWorthData);
$total = array_merge($balanceData, $billData, $spentData, $netWorthData);
// give new keys
$return = [];
$return = [];
foreach ($total as $entry) {
if ('' === $code || $code === $entry['currency_code']) {
$return[$entry['key']] = $entry;
@@ -112,19 +112,6 @@ final class BasicController extends Controller
return response()->json($return);
}
/**
* Check if date is outside session range.
*/
protected function notInDateRange(Carbon $date, Carbon $start, Carbon $end): bool
{ // Validate a preference
if ($start->greaterThanOrEqualTo($date) && $end->greaterThanOrEqualTo($date)) {
return true;
}
// start and end in the past? use $end
return $start->lessThanOrEqualTo($date) && $end->lessThanOrEqualTo($date);
}
private function getBalanceInformation(Carbon $start, Carbon $end): array
{
Log::debug('getBalanceInformation');

View File

@@ -1,7 +1,5 @@
<?php
declare(strict_types=1);
/*
* BatchController.php
* Copyright (c) 2026 james@firefly-iii.org
@@ -22,6 +20,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\System;
use FireflyIII\Api\V1\Controllers\Controller;
@@ -62,7 +62,7 @@ final class BatchController extends Controller
}
Log::debug(sprintf('Counted %d journals.', count($journals)));
/** @var TransactionJournal $first */
/** @var null|TransactionJournal $first */
$first = $journals->first();
$group = $first?->transactionGroup;
if (null === $group) {

View File

@@ -32,9 +32,11 @@ use RuntimeException;
abstract class AggregateFormRequest extends ApiRequest
{
/**
* @var ApiRequest[]
* @var Request[]
*/
protected array $requests = [];
protected array $requests = [];
protected array $acceptedRoles = [];
#[Override]
public function initialize(

View File

@@ -32,7 +32,9 @@ class ApiRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected string $required = '';
protected array $acceptedRoles = [];
protected string $required = '';
public function handleConfig(array $config): void
{

View File

@@ -1,10 +1,8 @@
<?php
declare(strict_types=1);
/*
* AutocompleteApiRequest.php
* Copyright (c) 2025 james@firefly-iii.org
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
@@ -22,6 +20,8 @@ declare(strict_types=1);
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Autocomplete;
use FireflyIII\Api\V1\Requests\AggregateFormRequest;

View File

@@ -39,6 +39,8 @@ class AutocompleteRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getData(): array
{
$types = $this->convertString('types');
@@ -52,7 +54,7 @@ class AutocompleteRequest extends FormRequest
$date = $this->getCarbonDate('date') ?? today(config('app.timezone'));
return ['types' => $array, 'query' => $this->convertString('query'), 'date' => $date->endOfDay()];
return ['types' => $array, 'query' => $this->convertString('query'), 'date' => $date->endOfDay()];
}
public function rules(): array

View File

@@ -39,9 +39,11 @@ class MoveTransactionsRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getAll(): array
{
return ['original_account' => $this->convertInteger('original_account'), 'destination_account' => $this->convertInteger('destination_account')];
return ['original_account' => $this->convertInteger('original_account'), 'destination_account' => $this->convertInteger('destination_account')];
}
/**

View File

@@ -45,6 +45,8 @@ class TransactionRequest extends FormRequest
use ConvertsDataTypes;
use ValidatesBulkTransactionQuery;
protected array $acceptedRoles = [];
public function getAll(): array
{
$data = [];

View File

@@ -36,6 +36,8 @@ class DestroyRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
@@ -54,6 +56,6 @@ class DestroyRequest extends FormRequest
.',accounts,asset_accounts,expense_accounts,revenue_accounts,liabilities,transactions,withdrawals,deposits,transfers'
.',not_assets_liabilities';
return ['objects' => sprintf('required|max:255|min:1|string|in:%s', $valid), 'unused' => 'in:true,false'];
return ['objects' => sprintf('required|max:255|min:1|string|in:%s', $valid), 'unused' => 'in:true,false'];
}
}

View File

@@ -39,6 +39,8 @@ class ExportRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getAll(): array
{
$result = [
@@ -70,6 +72,6 @@ class ExportRequest extends FormRequest
*/
public function rules(): array
{
return ['type' => 'in:csv', 'accounts' => 'min:1|max:32768', 'start' => 'date|before:end', 'end' => 'date|after:start'];
return ['type' => 'in:csv', 'accounts' => 'min:1|max:32768', 'start' => 'date|before:end', 'end' => 'date|after:start'];
}
}

View File

@@ -40,12 +40,14 @@ class SameDateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
return ['start' => $this->getCarbonDate('start'), 'end' => $this->getCarbonDate('end')];
return ['start' => $this->getCarbonDate('start'), 'end' => $this->getCarbonDate('end')];
}
/**
@@ -53,6 +55,6 @@ class SameDateRequest extends FormRequest
*/
public function rules(): array
{
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
}
}

View File

@@ -38,7 +38,7 @@ class DateRangeRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$start = $this->getCarbonDate('start')?->startOfDay();

View File

@@ -36,7 +36,7 @@ class DateRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$date = $this->getCarbonDate('date')?->endOfDay();

View File

@@ -50,7 +50,7 @@ class ObjectTypeApiRequest extends ApiRequest
$this->objectType = $config['object_type'] ?? null;
if (!$this->objectType) {
if (null === $this->objectType) {
throw new RuntimeException('ObjectTypeApiRequest requires a object_type config');
}
}
@@ -75,7 +75,7 @@ class ObjectTypeApiRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$type = $this->convertString('types', 'all');

View File

@@ -42,7 +42,7 @@ class QueryRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$query = $this->convertString('query');

View File

@@ -41,6 +41,8 @@ class SingleDateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -45,6 +45,8 @@ class GenericRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
private Collection $accounts;
private Collection $bills;
private Collection $budgets;
@@ -56,7 +58,7 @@ class GenericRequest extends FormRequest
*/
public function getAll(): array
{
return ['start' => $this->getCarbonDate('start'), 'end' => $this->getCarbonDate('end')];
return ['start' => $this->getCarbonDate('start'), 'end' => $this->getCarbonDate('end')];
}
public function getAssetAccounts(): Collection
@@ -167,7 +169,7 @@ class GenericRequest extends FormRequest
$this->bills = new Collection();
$this->tags = new Collection();
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
return ['start' => 'required|date', 'end' => 'required|date|after_or_equal:start'];
}
private function parseAccounts(): void

View File

@@ -40,12 +40,12 @@ class AccountTypeApiRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$type = $this->convertString('type', 'all');
$this->attributes->add(['type' => $type, 'types' => $this->mapAccountTypes($type)]);
$this->attributes->add(['type' => $type, 'types' => $this->mapAccountTypes($type)]);
});
}
}

View File

@@ -42,7 +42,7 @@ class AccountTypesApiRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$types = explode(',', $this->convertString('types', 'all'));

View File

@@ -43,6 +43,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getAllAccountData(): array
{
$active = true;

View File

@@ -46,6 +46,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getUpdateData(): array
{
$fields = [

View File

@@ -37,6 +37,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -37,6 +37,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -40,6 +40,8 @@ class Request extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -42,6 +42,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -41,6 +41,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -42,6 +42,8 @@ class StoreRequest extends FormRequest
use ConvertsDataTypes;
use ValidatesAutoBudgetRequest;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -43,6 +43,8 @@ class UpdateRequest extends FormRequest
use ConvertsDataTypes;
use ValidatesAutoBudgetRequest;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
@@ -65,7 +67,7 @@ class UpdateRequest extends FormRequest
];
$allData = $this->getAllData($fields);
if (array_key_exists('auto_budget_type', $allData)) {
$types = ['none' => 0, 'reset' => 1, 'rollover' => 2, 'adjusted' => 3];
$types = ['none' => 0, 'reset' => 1, 'rollover' => 2, 'adjusted' => 3];
$allData['auto_budget_type'] = $types[$allData['auto_budget_type']] ?? 0;
}

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests\Models\BudgetLimit;
use Carbon\Carbon;
use FireflyIII\Factory\TransactionCurrencyFactory;
use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\IsValidPositiveAmount;
@@ -44,6 +45,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
@@ -85,6 +88,7 @@ class StoreRequest extends FormRequest
*/
public function withValidator(Validator $validator): void
{
/** @var Budget $budget */
$budget = $this->route()->parameter('budget');
$validator->after(static function (Validator $validator) use ($budget): void {
if (0 !== count($validator->failed())) {

View File

@@ -41,6 +41,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -36,12 +36,14 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
return ['name' => $this->convertString('name'), 'notes' => $this->stringWithNewlines('notes')];
return ['name' => $this->convertString('name'), 'notes' => $this->stringWithNewlines('notes')];
}
/**

View File

@@ -37,12 +37,14 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
$fields = ['name' => ['name', 'convertString'], 'notes' => ['notes', 'stringWithNewlines']];
$fields = ['name' => ['name', 'convertString'], 'notes' => ['notes', 'stringWithNewlines']];
return $this->getAllData($fields);
}

View File

@@ -34,6 +34,8 @@ class DestroyRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getDate(): ?Carbon
{
return $this->getCarbonDate('date');

View File

@@ -36,6 +36,8 @@ class StoreByCurrenciesRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getAll(): array
{
return $this->all();

View File

@@ -37,12 +37,14 @@ class StoreByDateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* @return array<string, mixed>
*/
public function getAll(): array
{
return ['from' => $this->get('from'), 'rates' => $this->get('rates', [])];
return ['from' => $this->get('from'), 'rates' => $this->get('rates', [])];
}
public function getFromCurrency(): TransactionCurrency
@@ -57,7 +59,7 @@ class StoreByDateRequest extends FormRequest
*/
public function rules(): array
{
return ['from' => 'required|exists:transaction_currencies,code', 'rates' => 'required|array', 'rates.*' => 'required|numeric|min:0.0000000001'];
return ['from' => 'required|exists:transaction_currencies,code', 'rates' => 'required|array', 'rates.*' => 'required|numeric|min:0.0000000001'];
}
public function withValidator(Validator $validator): void

View File

@@ -36,6 +36,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getDate(): ?Carbon
{
return $this->getCarbonDate('date');

View File

@@ -34,6 +34,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getDate(): ?Carbon
{
return $this->getCarbonDate('date');

View File

@@ -37,6 +37,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getUpdateData(): array
{
$fields = ['title' => ['title', 'convertString'], 'order' => ['order', 'convertInteger']];

View File

@@ -42,6 +42,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -40,6 +40,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -49,6 +49,8 @@ class StoreRequest extends FormRequest
use RecurrenceValidation;
use TransactionValidation;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
@@ -67,7 +69,7 @@ class StoreRequest extends FormRequest
];
$recurrence = $this->getAllData($fields);
return ['recurrence' => $recurrence, 'transactions' => $this->getTransactionData(), 'repetitions' => $this->getRepetitionData()];
return ['recurrence' => $recurrence, 'transactions' => $this->getTransactionData(), 'repetitions' => $this->getRepetitionData()];
}
/**

View File

@@ -50,6 +50,8 @@ class UpdateRequest extends FormRequest
use RecurrenceValidation;
use TransactionValidation;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -42,6 +42,8 @@ class StoreRequest extends FormRequest
use ConvertsDataTypes;
use GetRuleConfiguration;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -37,9 +37,11 @@ class TestRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getTestParameters(): array
{
return ['page' => $this->getPage(), 'start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
return ['page' => $this->getPage(), 'start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
}
public function rules(): array

View File

@@ -37,9 +37,11 @@ class TriggerRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getTriggerParameters(): array
{
return ['start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
return ['start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
}
public function rules(): array

View File

@@ -43,6 +43,8 @@ class UpdateRequest extends FormRequest
use ConvertsDataTypes;
use GetRuleConfiguration;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -35,6 +35,8 @@ class ValidateExpressionRequest extends FormRequest
{
use ChecksLogin;
protected array $acceptedRoles = [];
public function rules(): array
{
return ['expression' => ['required', new IsValidActionExpression()]];

View File

@@ -37,13 +37,15 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
$active = true;
$order = 31337;
$order = 31_337;
if (null !== $this->get('active')) {
$active = $this->boolean('active');
}

View File

@@ -37,9 +37,11 @@ class TestRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getTestParameters(): array
{
return ['start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
return ['start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
}
public function rules(): array

View File

@@ -37,14 +37,16 @@ class TriggerRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getTriggerParameters(): array
{
return ['start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
return ['start' => $this->getDate('start'), 'end' => $this->getDate('end'), 'accounts' => $this->getAccounts()];
}
public function rules(): array
{
return ['start' => 'date|after:1970-01-02|before:2038-01-17', 'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17'];
return ['start' => 'date|after:1970-01-02|before:2038-01-17', 'end' => 'date|after_or_equal:start|after:1970-01-02|before:2038-01-17'];
}
private function getAccounts(): array

View File

@@ -38,6 +38,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -39,6 +39,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -40,13 +40,15 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
// This is the way.
$fields = ['tag' => ['tag', 'convertString'], 'date' => ['date', 'date'], 'description' => ['description', 'convertString']];
$fields = ['tag' => ['tag', 'convertString'], 'date' => ['date', 'date'], 'description' => ['description', 'convertString']];
$data = $this->getAllData($fields);
return $this->appendLocationData($data, null);

View File

@@ -54,6 +54,8 @@ class StoreRequest extends FormRequest
use GroupValidation;
use TransactionValidation;
protected array $acceptedRoles = [];
/**
* Get all data. Is pretty complex because of all the ??-statements.
*/

View File

@@ -50,6 +50,8 @@ class UpdateRequest extends FormRequest
use GroupValidation;
use TransactionValidation;
protected array $acceptedRoles = [];
private array $arrayFields;
private array $booleanFields;
private array $dateFields;

View File

@@ -37,6 +37,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -38,6 +38,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
@@ -61,7 +63,7 @@ class UpdateRequest extends FormRequest
*/
public function rules(): array
{
/** @var TransactionCurrency $currency */
/** @var string|TransactionCurrency $currency */
$currency = $this->route()->parameter('currency_code');
if (is_string($currency)) {
$currency = TransactionCurrency::whereCode($currency)->first();

View File

@@ -41,6 +41,8 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -41,6 +41,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/

View File

@@ -36,12 +36,14 @@ class StoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
return ['name' => $this->convertString('name'), 'outward' => $this->convertString('outward'), 'inward' => $this->convertString('inward')];
return ['name' => $this->convertString('name'), 'outward' => $this->convertString('outward'), 'inward' => $this->convertString('inward')];
}
/**

View File

@@ -38,12 +38,14 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Get all data from the request.
*/
public function getAll(): array
{
return ['name' => $this->convertString('name'), 'outward' => $this->convertString('outward'), 'inward' => $this->convertString('inward')];
return ['name' => $this->convertString('name'), 'outward' => $this->convertString('outward'), 'inward' => $this->convertString('inward')];
}
/**

View File

@@ -36,6 +36,8 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getData(): array
{
$fields = [

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Requests\Models\Webhook;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Webhook;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\Webhook\IsValidWebhookUrl;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
@@ -42,9 +43,11 @@ class CreateRequest extends FormRequest
use ConvertsDataTypes;
use ValidatesWebhooks;
protected array $acceptedRoles = [];
public function getData(): array
{
$fields = ['title' => ['title', 'convertString'], 'active' => ['active', 'boolean'], 'url' => ['url', 'convertString']];
$fields = ['title' => ['title', 'convertString'], 'active' => ['active', 'boolean'], 'url' => ['url', 'convertString']];
$triggers = $this->get('triggers', []);
$responses = $this->get('responses', []);
$deliveries = $this->get('deliveries', []);
@@ -83,7 +86,7 @@ class CreateRequest extends FormRequest
'delivery' => 'prohibited',
'deliveries' => 'required|array|min:1|max:1',
'deliveries.*' => sprintf('required|in:%s', $deliveries),
'url' => ['required', sprintf('url:%s', $validProtocols)],
'url' => ['required', sprintf('url:%s', $validProtocols), new IsValidWebhookUrl()],
];
}
}

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Requests\Models\Webhook;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Webhook;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Rules\Webhook\IsValidWebhookUrl;
use FireflyIII\Support\Facades\FireflyConfig;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
@@ -42,9 +43,11 @@ class UpdateRequest extends FormRequest
use ConvertsDataTypes;
use ValidatesWebhooks;
protected array $acceptedRoles = [];
public function getData(): array
{
$fields = ['title' => ['title', 'convertString'], 'active' => ['active', 'boolean'], 'url' => ['url', 'convertString']];
$fields = ['title' => ['title', 'convertString'], 'active' => ['active', 'boolean'], 'url' => ['url', 'convertString']];
$triggers = $this->get('triggers', []);
$responses = $this->get('responses', []);
@@ -87,7 +90,7 @@ class UpdateRequest extends FormRequest
'delivery' => 'prohibited',
'deliveries' => 'required|array|min:1|max:1',
'deliveries.*' => sprintf('required|in:%s', $deliveries),
'url' => [sprintf('url:%s', $validProtocols), sprintf('uniqueExistingWebhook:%d', $webhook->id)],
'url' => [sprintf('url:%s', $validProtocols), sprintf('uniqueExistingWebhook:%d', $webhook->id), new IsValidWebhookUrl()],
];
}
}

View File

@@ -41,7 +41,7 @@ class PaginationRequest extends ApiRequest
$this->sortClass = $config['sort_class'] ?? null;
if (!$this->sortClass) {
if (null === $this->sortClass) {
throw new RuntimeException('PaginationRequest requires a sort_class config');
}
}
@@ -58,7 +58,7 @@ class PaginationRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
@@ -72,7 +72,7 @@ class PaginationRequest extends ApiRequest
$page = $this->convertInteger('page');
$page = min(max(1, $page), 2 ** 16);
$offset = ($page - 1) * $limit;
$sort = $this->sortClass ? $this->convertSortParameters('sort', $this->sortClass) : $this->get('sort');
$sort = null !== $this->sortClass ? $this->convertSortParameters('sort', $this->sortClass) : $this->get('sort');
$this->attributes->set('limit', $limit);
$this->attributes->set('sort', $sort);
$this->attributes->set('page', $page);

View File

@@ -45,7 +45,7 @@ class CountRequest extends AggregateFormRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$this->attributes->set('include_deleted', $this->convertBoolean($this->input('include_deleted', 'false')));

View File

@@ -37,7 +37,7 @@ class SearchQueryRequest extends ApiRequest
public function withValidator(Validator $validator): void
{
$validator->after(function (Validator $validator): void {
if ($validator->failed()) {
if (count($validator->failed()) > 0) {
return;
}
$query = $this->convertString('query');

View File

@@ -48,7 +48,7 @@ class CronRequest extends FormRequest
*/
public function getAll(): array
{
$data = ['force' => false, 'date' => today(config('app.timezone'))];
$data = ['force' => false, 'date' => today(config('app.timezone'))];
if ($this->has('force')) {
$data['force'] = $this->boolean('force');
}
@@ -68,6 +68,6 @@ class CronRequest extends FormRequest
*/
public function rules(): array
{
return ['force' => 'in:true,false', 'date' => 'nullable|date|after:1970-01-02|before:2038-01-17'];
return ['force' => 'in:true,false', 'date' => 'nullable|date|after:1970-01-02|before:2038-01-17'];
}
}

View File

@@ -37,7 +37,9 @@ class UpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
private array $booleans = [
protected array $acceptedRoles = [];
private array $booleans = [
'configuration.is_demo_site',
'configuration.single_user_mode',
'configuration.enable_exchange_rates',
@@ -46,7 +48,7 @@ class UpdateRequest extends FormRequest
'configuration.enable_external_rates',
'configuration.allow_webhooks',
];
private array $integers = ['configuration.permission_update_check', 'configuration.last_update_check'];
private array $integers = ['configuration.permission_update_check', 'configuration.last_update_check'];
/**
* Get all data from the request.

View File

@@ -37,6 +37,8 @@ class UserStoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Logged in + owner
*/

View File

@@ -40,6 +40,8 @@ class UserUpdateRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
/**
* Logged in + owner
*/

View File

@@ -36,6 +36,8 @@ class PreferenceStoreRequest extends FormRequest
use ChecksLogin;
use ConvertsDataTypes;
protected array $acceptedRoles = [];
public function getAll(): array
{
$array = ['name' => $this->convertString('name'), 'data' => $this->get('data')];

Some files were not shown because too many files have changed in this diff Show More