Merge remote-tracking branch 'upstream/main' into feat/expression-engine

This commit is contained in:
Michael Thomas
2024-03-06 21:38:40 -05:00
2225 changed files with 111169 additions and 148980 deletions

27
.ci/all.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
#
# all.sh
# Copyright (c) 2024 james@firefly-iii.org
#
# 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/>.
#
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
$SCRIPT_DIR/phpcs.sh
$SCRIPT_DIR/phpstan.sh
$SCRIPT_DIR/phpmd.sh

View File

@@ -35,10 +35,39 @@ $finder = PhpCsFixer\Finder::create()
$config = new PhpCsFixer\Config(); $config = new PhpCsFixer\Config();
return $config->setRules([ return $config->setRules(
'@PSR12' => true, [
'declare_strict_types' => true, // rule sets
'strict_param' => true, '@PHP83Migration' => true,
'array_syntax' => ['syntax' => 'short'], '@PhpCsFixer' => true,
]) '@PhpCsFixer:risky' => true,
'@PSR12' => true,
'@PSR12:risky' => true,
'declare_strict_types' => true,
'strict_param' => true,
'no_unused_imports' => true,
'single_space_around_construct' => true,
'statement_indentation' => true,
'void_return' => true,
// disabled rules
'native_function_invocation' => false, // annoying
'php_unit_data_provider_name' => false, // bloody annoying long test names
'static_lambda' => false, // breaks the Response macro for API's.
'phpdoc_summary' => false, // annoying.
'comment_to_phpdoc' => false, // breaks phpstan lines in combination with PHPStorm.
'type_declaration_spaces' => false,
'cast_spaces' => false,
// complex rules
'array_syntax' => ['syntax' => 'short'],
'binary_operator_spaces' => [
'default' => 'at_least_single_space',
'operators' => [
'=>' => 'align_single_space_by_scope',
'=' => 'align_single_space_minimal_by_scope',
'??=' => 'align_single_space_minimal_by_scope',
],
],
])
->setFinder($finder); ->setFinder($finder);

View File

@@ -226,50 +226,49 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.35.1", "version": "v3.51.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "ec1ccc264994b6764882669973ca435cf05bab08" "reference": "127fa74f010da99053e3f5b62672615b72dd6efd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ec1ccc264994b6764882669973ca435cf05bab08", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd",
"reference": "ec1ccc264994b6764882669973ca435cf05bab08", "reference": "127fa74f010da99053e3f5b62672615b72dd6efd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer/semver": "^3.3", "composer/semver": "^3.4",
"composer/xdebug-handler": "^3.0.3", "composer/xdebug-handler": "^3.0.3",
"ext-filter": "*",
"ext-json": "*", "ext-json": "*",
"ext-tokenizer": "*", "ext-tokenizer": "*",
"php": "^7.4 || ^8.0", "php": "^7.4 || ^8.0",
"sebastian/diff": "^4.0 || ^5.0", "sebastian/diff": "^4.0 || ^5.0 || ^6.0",
"symfony/console": "^5.4 || ^6.0", "symfony/console": "^5.4 || ^6.0 || ^7.0",
"symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
"symfony/filesystem": "^5.4 || ^6.0", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
"symfony/finder": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0 || ^7.0",
"symfony/options-resolver": "^5.4 || ^6.0", "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0",
"symfony/polyfill-mbstring": "^1.27", "symfony/polyfill-mbstring": "^1.28",
"symfony/polyfill-php80": "^1.27", "symfony/polyfill-php80": "^1.28",
"symfony/polyfill-php81": "^1.27", "symfony/polyfill-php81": "^1.28",
"symfony/process": "^5.4 || ^6.0", "symfony/process": "^5.4 || ^6.0 || ^7.0",
"symfony/stopwatch": "^5.4 || ^6.0" "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
}, },
"require-dev": { "require-dev": {
"facile-it/paraunit": "^1.3 || ^2.0", "facile-it/paraunit": "^1.3 || ^2.0",
"justinrainbow/json-schema": "^5.2", "justinrainbow/json-schema": "^5.2",
"keradus/cli-executor": "^2.0", "keradus/cli-executor": "^2.1",
"mikey179/vfsstream": "^1.6.11", "mikey179/vfsstream": "^1.6.11",
"php-coveralls/php-coveralls": "^2.5.3", "php-coveralls/php-coveralls": "^2.7",
"php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/accessible-object": "^1.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
"phpspec/prophecy": "^1.16", "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2",
"phpspec/prophecy-phpunit": "^2.0", "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0",
"phpunit/phpunit": "^9.5", "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
"symfony/phpunit-bridge": "^6.2.3",
"symfony/yaml": "^5.4 || ^6.0"
}, },
"suggest": { "suggest": {
"ext-dom": "For handling output formats in XML", "ext-dom": "For handling output formats in XML",
@@ -307,7 +306,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.35.1" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0"
}, },
"funding": [ "funding": [
{ {
@@ -315,7 +314,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-10-12T13:47:26+00:00" "time": "2024-02-28T19:50:06+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@@ -472,29 +471,29 @@
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
"version": "5.0.3", "version": "6.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/diff.git", "url": "https://github.com/sebastianbergmann/diff.git",
"reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" "reference": "ab83243ecc233de5655b76f577711de9f842e712"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ab83243ecc233de5655b76f577711de9f842e712",
"reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", "reference": "ab83243ecc233de5655b76f577711de9f842e712",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0", "phpunit/phpunit": "^11.0",
"symfony/process": "^4.2 || ^5" "symfony/process": "^4.2 || ^5"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.0-dev" "dev-main": "6.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -527,7 +526,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/diff/issues", "issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy", "security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" "source": "https://github.com/sebastianbergmann/diff/tree/6.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -535,47 +534,50 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-05-01T07:48:21+00:00" "time": "2024-03-02T07:30:33+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.3.4", "version": "v7.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" "reference": "6b099f3306f7c9c2d2786ed736d0026b2903205f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", "url": "https://api.github.com/repos/symfony/console/zipball/6b099f3306f7c9c2d2786ed736d0026b2903205f",
"reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "reference": "6b099f3306f7c9c2d2786ed736d0026b2903205f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3",
"symfony/string": "^5.4|^6.0" "symfony/string": "^6.4|^7.0"
}, },
"conflict": { "conflict": {
"symfony/dependency-injection": "<5.4", "symfony/dependency-injection": "<6.4",
"symfony/dotenv": "<5.4", "symfony/dotenv": "<6.4",
"symfony/event-dispatcher": "<5.4", "symfony/event-dispatcher": "<6.4",
"symfony/lock": "<5.4", "symfony/lock": "<6.4",
"symfony/process": "<5.4" "symfony/process": "<6.4"
}, },
"provide": { "provide": {
"psr/log-implementation": "1.0|2.0|3.0" "psr/log-implementation": "1.0|2.0|3.0"
}, },
"require-dev": { "require-dev": {
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0", "symfony/config": "^6.4|^7.0",
"symfony/dependency-injection": "^5.4|^6.0", "symfony/dependency-injection": "^6.4|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0", "symfony/event-dispatcher": "^6.4|^7.0",
"symfony/lock": "^5.4|^6.0", "symfony/http-foundation": "^6.4|^7.0",
"symfony/process": "^5.4|^6.0", "symfony/http-kernel": "^6.4|^7.0",
"symfony/var-dumper": "^5.4|^6.0" "symfony/lock": "^6.4|^7.0",
"symfony/messenger": "^6.4|^7.0",
"symfony/process": "^6.4|^7.0",
"symfony/stopwatch": "^6.4|^7.0",
"symfony/var-dumper": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -609,7 +611,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v6.3.4" "source": "https://github.com/symfony/console/tree/v7.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -625,11 +627,11 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-16T10:10:12+00:00" "time": "2024-02-22T20:27:20+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.3.0", "version": "v3.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
@@ -676,7 +678,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
}, },
"funding": [ "funding": [
{ {
@@ -696,24 +698,24 @@
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v6.3.2", "version": "v7.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e",
"reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/event-dispatcher-contracts": "^2.5|^3" "symfony/event-dispatcher-contracts": "^2.5|^3"
}, },
"conflict": { "conflict": {
"symfony/dependency-injection": "<5.4", "symfony/dependency-injection": "<6.4",
"symfony/service-contracts": "<2.5" "symfony/service-contracts": "<2.5"
}, },
"provide": { "provide": {
@@ -722,13 +724,13 @@
}, },
"require-dev": { "require-dev": {
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0", "symfony/config": "^6.4|^7.0",
"symfony/dependency-injection": "^5.4|^6.0", "symfony/dependency-injection": "^6.4|^7.0",
"symfony/error-handler": "^5.4|^6.0", "symfony/error-handler": "^6.4|^7.0",
"symfony/expression-language": "^5.4|^6.0", "symfony/expression-language": "^6.4|^7.0",
"symfony/http-foundation": "^5.4|^6.0", "symfony/http-foundation": "^6.4|^7.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3",
"symfony/stopwatch": "^5.4|^6.0" "symfony/stopwatch": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -756,7 +758,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -772,11 +774,11 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-06T06:56:43+00:00" "time": "2024-01-23T15:02:46+00:00"
}, },
{ {
"name": "symfony/event-dispatcher-contracts", "name": "symfony/event-dispatcher-contracts",
"version": "v3.3.0", "version": "v3.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git", "url": "https://github.com/symfony/event-dispatcher-contracts.git",
@@ -832,7 +834,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0"
}, },
"funding": [ "funding": [
{ {
@@ -852,20 +854,20 @@
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v6.3.1", "version": "v7.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "url": "https://api.github.com/repos/symfony/filesystem/zipball/2890e3a825bc0c0558526c04499c13f83e1b6b12",
"reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8" "symfony/polyfill-mbstring": "~1.8"
}, },
@@ -895,7 +897,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v6.3.1" "source": "https://github.com/symfony/filesystem/tree/v7.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -911,27 +913,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-06-01T08:30:39+00:00" "time": "2024-01-23T15:02:46+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v6.3.5", "version": "v7.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", "url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56",
"reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"symfony/filesystem": "^6.0" "symfony/filesystem": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -959,7 +961,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v6.3.5" "source": "https://github.com/symfony/finder/tree/v7.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -975,24 +977,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-26T12:56:25+00:00" "time": "2023-10-31T17:59:56+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
"version": "v6.3.0", "version": "v7.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/options-resolver.git", "url": "https://github.com/symfony/options-resolver.git",
"reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" "reference": "700ff4096e346f54cb628ea650767c8130f1001f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f",
"reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", "reference": "700ff4096e346f54cb628ea650767c8130f1001f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3" "symfony/deprecation-contracts": "^2.5|^3"
}, },
"type": "library", "type": "library",
@@ -1026,7 +1028,7 @@
"options" "options"
], ],
"support": { "support": {
"source": "https://github.com/symfony/options-resolver/tree/v6.3.0" "source": "https://github.com/symfony/options-resolver/tree/v7.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -1042,20 +1044,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-12T14:21:09+00:00" "time": "2023-08-08T10:20:21+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
"version": "v1.28.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git", "url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
"reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1069,9 +1071,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -1108,7 +1107,7 @@
"portable" "portable"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -1124,20 +1123,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-grapheme", "name": "symfony/polyfill-intl-grapheme",
"version": "v1.28.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "875e90aeea2777b6f135677f618529449334a612" "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f",
"reference": "875e90aeea2777b6f135677f618529449334a612", "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1148,9 +1147,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -1189,7 +1185,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -1205,20 +1201,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.28.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" "reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1229,9 +1225,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -1273,7 +1266,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -1289,20 +1282,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.28.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "42292d99c55abe617799667f454222c54c60e229" "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
"reference": "42292d99c55abe617799667f454222c54c60e229", "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1316,9 +1309,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -1356,7 +1346,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -1372,20 +1362,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-28T09:04:16+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/polyfill-php80", "name": "symfony/polyfill-php80",
"version": "v1.28.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php80.git", "url": "https://github.com/symfony/polyfill-php80.git",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1393,9 +1383,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -1439,7 +1426,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -1455,20 +1442,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/polyfill-php81", "name": "symfony/polyfill-php81",
"version": "v1.28.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php81.git", "url": "https://github.com/symfony/polyfill-php81.git",
"reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d",
"reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1476,9 +1463,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -1518,7 +1502,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -1534,24 +1518,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v6.3.4", "version": "v7.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/process.git",
"reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", "url": "https://api.github.com/repos/symfony/process/zipball/0e7727191c3b71ebec6d529fa0e50a01ca5679e9",
"reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1579,7 +1563,7 @@
"description": "Executes commands in sub-processes", "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/process/tree/v6.3.4" "source": "https://github.com/symfony/process/tree/v7.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -1595,25 +1579,25 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-07T10:39:22+00:00" "time": "2024-02-22T20:27:20+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v3.3.0", "version": "v3.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/service-contracts.git", "url": "https://github.com/symfony/service-contracts.git",
"reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0",
"reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.1",
"psr/container": "^2.0" "psr/container": "^1.1|^2.0"
}, },
"conflict": { "conflict": {
"ext-psr": "<1.1|>=2" "ext-psr": "<1.1|>=2"
@@ -1661,7 +1645,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.3.0" "source": "https://github.com/symfony/service-contracts/tree/v3.4.1"
}, },
"funding": [ "funding": [
{ {
@@ -1677,24 +1661,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-23T14:45:45+00:00" "time": "2023-12-26T14:02:43+00:00"
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v6.3.0", "version": "v7.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112",
"reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/service-contracts": "^2.5|^3" "symfony/service-contracts": "^2.5|^3"
}, },
"type": "library", "type": "library",
@@ -1723,7 +1707,7 @@
"description": "Provides a way to profile code", "description": "Provides a way to profile code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/stopwatch/tree/v6.3.0" "source": "https://github.com/symfony/stopwatch/tree/v7.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -1739,24 +1723,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-02-16T10:14:28+00:00" "time": "2024-01-23T15:02:46+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v6.3.5", "version": "v7.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b",
"reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0",
@@ -1766,11 +1750,11 @@
"symfony/translation-contracts": "<2.5" "symfony/translation-contracts": "<2.5"
}, },
"require-dev": { "require-dev": {
"symfony/error-handler": "^5.4|^6.0", "symfony/error-handler": "^6.4|^7.0",
"symfony/http-client": "^5.4|^6.0", "symfony/http-client": "^6.4|^7.0",
"symfony/intl": "^6.2", "symfony/intl": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3.0", "symfony/translation-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^5.4|^6.0" "symfony/var-exporter": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1809,7 +1793,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v6.3.5" "source": "https://github.com/symfony/string/tree/v7.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -1825,7 +1809,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-18T10:38:32+00:00" "time": "2024-02-01T13:17:36+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],
@@ -1836,5 +1820,5 @@
"prefer-lowest": false, "prefer-lowest": false,
"platform": [], "platform": [],
"platform-dev": [], "platform-dev": [],
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }

View File

@@ -28,11 +28,29 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# enable test .env file. # enable test .env file.
# cp .ci/.env.ci .env # cp .ci/.env.ci .env
OUTPUT_FORMAT=txt
EXTRA_PARAMS=""
if [[ $GITHUB_ACTIONS = "true" ]]
then
OUTPUT_FORMAT=txt
EXTRA_PARAMS=""
fi
# clean up php code # clean up php code
cd $SCRIPT_DIR/php-cs-fixer cd $SCRIPT_DIR/php-cs-fixer
composer update --quiet composer update --quiet
rm -f .php-cs-fixer.cache rm -f .php-cs-fixer.cache
PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php --allow-risky=yes PHP_CS_FIXER_IGNORE_ENV=true
./vendor/bin/php-cs-fixer fix \
--config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \
--format=$OUTPUT_FORMAT \
--allow-risky=yes $EXTRA_PARAMS
EXIT_CODE=$?
echo "Exit code for CS fixer is $EXIT_CODE."
cd $SCRIPT_DIR/.. cd $SCRIPT_DIR/..
exit 0 exit $EXIT_CODE

19
.ci/phpmd.sh Normal file → Executable file
View File

@@ -22,16 +22,29 @@
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
OUTPUT_FORMAT=text
if [[ $GITHUB_ACTIONS = "true" ]]
then
OUTPUT_FORMAT=github
fi
cd $SCRIPT_DIR/phpmd cd $SCRIPT_DIR/phpmd
composer update --quiet composer update --quiet
./vendor/bin/phpmd \ ./vendor/bin/phpmd \
$SCRIPT_DIR/../app text phpmd.xml \ $SCRIPT_DIR/../app,$SCRIPT_DIR/../database,$SCRIPT_DIR/../routes,$SCRIPT_DIR/../config \
$OUTPUT_FORMAT phpmd.xml \
--exclude $SCRIPT_DIR/../app/resources/** \ --exclude $SCRIPT_DIR/../app/resources/** \
--exclude $SCRIPT_DIR/../app/frontend/** \ --exclude $SCRIPT_DIR/../app/frontend/** \
--exclude $SCRIPT_DIR/../app/public/** \ --exclude $SCRIPT_DIR/../app/public/** \
--exclude $SCRIPT_DIR/../app/vendor/** \ --exclude $SCRIPT_DIR/../app/vendor/**
EXIT_CODE=$?
cd $SCRIPT_DIR/.. cd $SCRIPT_DIR/..
exit 0 echo "Exit code is $EXIT_CODE."
# for the time being, exit 0
exit $EXIT_CODE

187
.ci/phpmd/composer.lock generated
View File

@@ -9,16 +9,16 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "composer/pcre", "name": "composer/pcre",
"version": "3.1.0", "version": "3.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/pcre.git", "url": "https://github.com/composer/pcre.git",
"reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9",
"reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -60,7 +60,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/composer/pcre/issues", "issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.1.0" "source": "https://github.com/composer/pcre/tree/3.1.1"
}, },
"funding": [ "funding": [
{ {
@@ -76,7 +76,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-11-17T09:50:14+00:00" "time": "2023-10-11T07:11:09+00:00"
}, },
{ {
"name": "composer/xdebug-handler", "name": "composer/xdebug-handler",
@@ -146,28 +146,28 @@
}, },
{ {
"name": "pdepend/pdepend", "name": "pdepend/pdepend",
"version": "2.14.0", "version": "2.16.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pdepend/pdepend.git", "url": "https://github.com/pdepend/pdepend.git",
"reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1" "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1", "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58",
"reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1", "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3.7", "php": ">=5.3.7",
"symfony/config": "^2.3.0|^3|^4|^5|^6.0", "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/polyfill-mbstring": "^1.19"
}, },
"require-dev": { "require-dev": {
"easy-doc/easy-doc": "0.0.0|^1.2.3", "easy-doc/easy-doc": "0.0.0|^1.2.3",
"gregwar/rst": "^1.0", "gregwar/rst": "^1.0",
"phpunit/phpunit": "^4.8.36|^5.7.27",
"squizlabs/php_codesniffer": "^2.0.0" "squizlabs/php_codesniffer": "^2.0.0"
}, },
"bin": [ "bin": [
@@ -197,7 +197,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/pdepend/pdepend/issues", "issues": "https://github.com/pdepend/pdepend/issues",
"source": "https://github.com/pdepend/pdepend/tree/2.14.0" "source": "https://github.com/pdepend/pdepend/tree/2.16.2"
}, },
"funding": [ "funding": [
{ {
@@ -205,26 +205,26 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-26T13:15:18+00:00" "time": "2023-12-17T18:09:59+00:00"
}, },
{ {
"name": "phpmd/phpmd", "name": "phpmd/phpmd",
"version": "2.13.0", "version": "2.15.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpmd/phpmd.git", "url": "https://github.com/phpmd/phpmd.git",
"reference": "dad0228156856b3ad959992f9748514fa943f3e3" "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0",
"reference": "dad0228156856b3ad959992f9748514fa943f3e3", "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0",
"ext-xml": "*", "ext-xml": "*",
"pdepend/pdepend": "^2.12.1", "pdepend/pdepend": "^2.16.1",
"php": ">=5.3.9" "php": ">=5.3.9"
}, },
"require-dev": { "require-dev": {
@@ -233,8 +233,7 @@
"ext-simplexml": "*", "ext-simplexml": "*",
"gregwar/rst": "^1.0", "gregwar/rst": "^1.0",
"mikey179/vfsstream": "^1.6.8", "mikey179/vfsstream": "^1.6.8",
"phpunit/phpunit": "^4.8.36 || ^5.7.27", "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2"
"squizlabs/php_codesniffer": "^2.0"
}, },
"bin": [ "bin": [
"src/bin/phpmd" "src/bin/phpmd"
@@ -271,6 +270,7 @@
"description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
"homepage": "https://phpmd.org/", "homepage": "https://phpmd.org/",
"keywords": [ "keywords": [
"dev",
"mess detection", "mess detection",
"mess detector", "mess detector",
"pdepend", "pdepend",
@@ -280,7 +280,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/phpmd", "irc": "irc://irc.freenode.org/phpmd",
"issues": "https://github.com/phpmd/phpmd/issues", "issues": "https://github.com/phpmd/phpmd/issues",
"source": "https://github.com/phpmd/phpmd/tree/2.13.0" "source": "https://github.com/phpmd/phpmd/tree/2.15.0"
}, },
"funding": [ "funding": [
{ {
@@ -288,7 +288,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-10T08:44:15+00:00" "time": "2023-12-11T08:22:20+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@@ -395,34 +395,34 @@
}, },
{ {
"name": "symfony/config", "name": "symfony/config",
"version": "v6.3.0", "version": "v7.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/config.git", "url": "https://github.com/symfony/config.git",
"reference": "a5e00dec161b08c946a2c16eed02adbeedf827ae" "reference": "44deeba7233f08f383185ffa37dace3b3bc87364"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/a5e00dec161b08c946a2c16eed02adbeedf827ae", "url": "https://api.github.com/repos/symfony/config/zipball/44deeba7233f08f383185ffa37dace3b3bc87364",
"reference": "a5e00dec161b08c946a2c16eed02adbeedf827ae", "reference": "44deeba7233f08f383185ffa37dace3b3bc87364",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3", "symfony/deprecation-contracts": "^2.5|^3",
"symfony/filesystem": "^5.4|^6.0", "symfony/filesystem": "^6.4|^7.0",
"symfony/polyfill-ctype": "~1.8" "symfony/polyfill-ctype": "~1.8"
}, },
"conflict": { "conflict": {
"symfony/finder": "<5.4", "symfony/finder": "<6.4",
"symfony/service-contracts": "<2.5" "symfony/service-contracts": "<2.5"
}, },
"require-dev": { "require-dev": {
"symfony/event-dispatcher": "^5.4|^6.0", "symfony/event-dispatcher": "^6.4|^7.0",
"symfony/finder": "^5.4|^6.0", "symfony/finder": "^6.4|^7.0",
"symfony/messenger": "^5.4|^6.0", "symfony/messenger": "^6.4|^7.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3",
"symfony/yaml": "^5.4|^6.0" "symfony/yaml": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -450,7 +450,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/config/tree/v6.3.0" "source": "https://github.com/symfony/config/tree/v7.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -466,44 +466,43 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-25T10:46:17+00:00" "time": "2024-02-26T07:52:39+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
"version": "v6.3.1", "version": "v7.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dependency-injection.git", "url": "https://github.com/symfony/dependency-injection.git",
"reference": "7abf242af21f196b65f20ab00ff251fdf3889b8d" "reference": "47f37af245df8457ea63409fc242b3cc825ce5eb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/7abf242af21f196b65f20ab00ff251fdf3889b8d", "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/47f37af245df8457ea63409fc242b3cc825ce5eb",
"reference": "7abf242af21f196b65f20ab00ff251fdf3889b8d", "reference": "47f37af245df8457ea63409fc242b3cc825ce5eb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"psr/container": "^1.1|^2.0", "psr/container": "^1.1|^2.0",
"symfony/deprecation-contracts": "^2.5|^3", "symfony/deprecation-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3.0", "symfony/service-contracts": "^3.3",
"symfony/var-exporter": "^6.2.10" "symfony/var-exporter": "^6.4|^7.0"
}, },
"conflict": { "conflict": {
"ext-psr": "<1.1|>=2", "ext-psr": "<1.1|>=2",
"symfony/config": "<6.1", "symfony/config": "<6.4",
"symfony/finder": "<5.4", "symfony/finder": "<6.4",
"symfony/proxy-manager-bridge": "<6.3", "symfony/yaml": "<6.4"
"symfony/yaml": "<5.4"
}, },
"provide": { "provide": {
"psr/container-implementation": "1.1|2.0", "psr/container-implementation": "1.1|2.0",
"symfony/service-implementation": "1.1|2.0|3.0" "symfony/service-implementation": "1.1|2.0|3.0"
}, },
"require-dev": { "require-dev": {
"symfony/config": "^6.1", "symfony/config": "^6.4|^7.0",
"symfony/expression-language": "^5.4|^6.0", "symfony/expression-language": "^6.4|^7.0",
"symfony/yaml": "^5.4|^6.0" "symfony/yaml": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -531,7 +530,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application", "description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/dependency-injection/tree/v6.3.1" "source": "https://github.com/symfony/dependency-injection/tree/v7.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -547,11 +546,11 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-06-24T11:51:27+00:00" "time": "2024-02-22T20:27:20+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.3.0", "version": "v3.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
@@ -598,7 +597,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
}, },
"funding": [ "funding": [
{ {
@@ -618,20 +617,20 @@
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v6.3.1", "version": "v7.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "url": "https://api.github.com/repos/symfony/filesystem/zipball/2890e3a825bc0c0558526c04499c13f83e1b6b12",
"reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8" "symfony/polyfill-mbstring": "~1.8"
}, },
@@ -661,7 +660,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v6.3.1" "source": "https://github.com/symfony/filesystem/tree/v7.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -677,20 +676,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-06-01T08:30:39+00:00" "time": "2024-01-23T15:02:46+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
"version": "v1.27.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git", "url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a" "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -704,9 +703,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -743,7 +739,7 @@
"portable" "portable"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -759,20 +755,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-11-03T14:55:06+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.27.0", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -786,9 +782,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -826,7 +819,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
}, },
"funding": [ "funding": [
{ {
@@ -842,25 +835,25 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-11-03T14:55:06+00:00" "time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v3.3.0", "version": "v3.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/service-contracts.git", "url": "https://github.com/symfony/service-contracts.git",
"reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0",
"reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.1",
"psr/container": "^2.0" "psr/container": "^1.1|^2.0"
}, },
"conflict": { "conflict": {
"ext-psr": "<1.1|>=2" "ext-psr": "<1.1|>=2"
@@ -908,7 +901,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.3.0" "source": "https://github.com/symfony/service-contracts/tree/v3.4.1"
}, },
"funding": [ "funding": [
{ {
@@ -924,27 +917,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-23T14:45:45+00:00" "time": "2023-12-26T14:02:43+00:00"
}, },
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
"version": "v6.3.0", "version": "v7.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-exporter.git", "url": "https://github.com/symfony/var-exporter.git",
"reference": "db5416d04269f2827d8c54331ba4cfa42620d350" "reference": "dfb0acb6803eb714f05d97dd4c5abe6d5fa9fe41"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/db5416d04269f2827d8c54331ba4cfa42620d350", "url": "https://api.github.com/repos/symfony/var-exporter/zipball/dfb0acb6803eb714f05d97dd4c5abe6d5fa9fe41",
"reference": "db5416d04269f2827d8c54331ba4cfa42620d350", "reference": "dfb0acb6803eb714f05d97dd4c5abe6d5fa9fe41",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"symfony/var-dumper": "^5.4|^6.0" "symfony/var-dumper": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -982,7 +975,7 @@
"serialize" "serialize"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-exporter/tree/v6.3.0" "source": "https://github.com/symfony/var-exporter/tree/v7.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -998,7 +991,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-21T08:48:44+00:00" "time": "2024-02-26T10:35:24+00:00"
} }
], ],
"aliases": [], "aliases": [],
@@ -1008,5 +1001,5 @@
"prefer-lowest": false, "prefer-lowest": false,
"platform": [], "platform": [],
"platform-dev": [], "platform-dev": [],
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }

View File

@@ -20,53 +20,75 @@
--> -->
<ruleset name="pcsg-generated-ruleset" <ruleset name="pcsg-generated-ruleset"
xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns="http://pmd.sf.net/ruleset/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
<description>Bla bla</description> <description>Firefly III ruleset.</description>
<!-- Import the entire controversial code rule set -->
<rule ref="rulesets/controversial.xml">
<exclude name="CamelCasePropertyName"/>
</rule>
<!-- <!-- clean code -->
Commando vanuit firefly directory: <!-- <rule ref="rulesets/codesize.xml" /> -->
phpmd database,app,tests html /gdrive-all/development/phpmd/phpmd.xml > public/report.html <rule ref="rulesets/unusedcode.xml"/>
-->
<!-- Import the entire controversial code rule set -->
<rule ref="rulesets/controversial.xml">
<exclude name="CamelCasePropertyName" />
</rule>
<!-- clean code --> <rule ref="rulesets/design.xml/NumberOfChildren">
<rule ref="rulesets/codesize.xml" /> <properties>
<rule ref="rulesets/design.xml" /> <!-- This is now at 32, which excludes the controllers but should prevent more monoliths. -->
<rule ref="rulesets/naming.xml" /> <property name="minimum" value="32"/>
<rule ref="rulesets/unusedcode.xml" /> </properties>
</rule>
<rule ref="rulesets/design.xml/CouplingBetweenObjects">
<properties>
<!-- Leaving this at 28 excuses most current code but it can't get worse than that. -->
<property name="maximum" value="28"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/CyclomaticComplexity">
<properties>
<property name="reportLevel" value="5"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/NPathComplexity">
<properties>
<property name="minimum" value="128"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/ExcessiveMethodLength">
<properties>
<property name="minimum" value="40"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/ExcessiveParameterList">
<properties>
<property name="minimum" value="5"/>
</properties>
</rule>
<!-- include clean code manually --> <rule ref="rulesets/naming.xml/ShortMethodName">
<rule ref="rulesets/cleancode.xml/BooleanArgumentFlag" /> <properties>
<rule ref="rulesets/cleancode.xml/ElseExpression" /> <property name="minimum" value="3"/>
</properties>
</rule>
<!-- no this one --> <!-- code size -->
<!--<rule ref="rulesets/cleancode.xml/StaticAccess" />--> <rule ref="rulesets/codesize.xml/CyclomaticComplexity">
<properties>
<!-- Leave at 20. This means methods will be pretty complex before the system starts complaining. -->
<property name="reportLevel" value="20"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/NPathComplexity">
<properties>
<!-- 2000 results in some pretty complex methods, but it's OK. -->
<!-- They should not be much more complex than that though -->
<property name="minimum" value="2000"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/ExcessiveMethodLength">
<properties>
<!-- 75 seems like a nice number. Shorter isn't always feasible and there are a few exceptions already -->
<property name="minimum" value="75"/>
<property name="ignore-whitespace" value="true"/>
</properties>
</rule>
<rule ref="rulesets/codesize.xml/ExcessiveParameterList">
<properties>
<!-- 5 is fine. 6 is excessive, but I have just one of those. At the end of the day, I still need all params. -->
<property name="minimum" value="5"/>
</properties>
</rule>
<!-- include clean code manually -->
<rule ref="rulesets/cleancode.xml/BooleanArgumentFlag"/>
<rule ref="rulesets/cleancode.xml/ElseExpression"/>
<rule ref="rulesets/cleancode.xml/MissingImport"/>
<rule ref="rulesets/cleancode.xml/UndefinedVariable"/>
<rule ref="rulesets/cleancode.xml/IfStatementAssignment"/>
<rule ref="rulesets/cleancode.xml/DuplicatedArrayKey"/>
<rule ref="rulesets/cleancode.xml/ErrorControlOperator"/>
</ruleset> </ruleset>

View File

@@ -1,42 +1,33 @@
includes:
- ../vendor/nunomaduro/larastan/extension.neon
- ../vendor/ergebnis/phpstan-rules/rules.neon
- ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
- ../vendor/thecodingmachine/phpstan-strict-rules/phpstan-strict-rules.neon
parameters: parameters:
universalObjectCratesClasses:
- Illuminate\Database\Eloquent\Model
# TODO: slowly remove these parameters and fix the issues found.
reportUnmatchedIgnoredErrors: false
checkGenericClassInNonGenericObjectType: false # remove this rule when all other issues are solved.
ignoreErrors: ignoreErrors:
# TODO: slowly remove these exceptions and fix the issues found.
- '#Dynamic call to static method#' # all the Laravel ORM things depend on this.
- '#Control structures using switch should not be used.#' # switch is fine in some cases.
- '#with no value type specified in iterable type array#' # remove this rule when all other issues are solved.
- '#has no value type specified in iterable type array#' # remove this rule when all other issues are solved.
- '#is not allowed to extend#' - '#is not allowed to extend#'
- '#switch is forbidden to use#'
- '#is neither abstract nor final#' - '#is neither abstract nor final#'
- '#has a nullable return type declaration#' - '#on left side of \?\?\= always exists and is not nullable#'
- '#with a nullable type declaration#' - '#has a nullable return type declaration#' # perhaps throw errors instead?
- '#with a nullable type declaration#' # decide what action should be if param is null.
- '#with null as default value#' - '#with null as default value#'
- '#is not covariant with PHPDoc type array#' -
message: '#Constructor in [a-zA-Z0-9\\_]+ has parameter \$[a-zA-Z0-9\\_]+ with default value#'
paths:
- ../app/Exceptions/IntervalException.php
- ../app/Support/Navigation.php
- -
message: '#but containers should not be injected#' message: '#but containers should not be injected#'
paths: paths:
- ../app/Support/Authentication/RemoteUserGuard.php - ../app/Support/Authentication/RemoteUserGuard.php
- -
message: '#Control structures using switch should not be used.#' message: '#Function compact\(\) should not be used#' # too useful in template rendering.
paths:
- ../app/Api/V1/Controllers/Data/DestroyController.php
- ../app/Console/Commands/Correction/FixAccountTypes.php
- ../app/Console/Commands/Upgrade/OtherCurrenciesCorrections.php
- ../app/Exceptions/GracefulNotFoundHandler.php
- ../app/Generator/Webhook/StandardMessageGenerator.php
- ../app/Support/Amount.php
- ../app/Support/Navigation.php
- ../app/Support/ParseDateString.php
- ../app/Support/Search/AccountSearch.php
- ../app/Support/Search/OperatorQuerySearch.php
- ../app/Support/Twig/General.php
- ../app/Transformers/RecurrenceTransformer.php
- ../app/Validation/AccountValidator.php
- ../app/Validation/RecurrenceValidation.php
- ../app/Validation/TransactionValidation.php
-
message: '#Function compact\(\) should not be used#'
paths: paths:
- ../app/Generator/Report/Account/MonthReportGenerator.php - ../app/Generator/Report/Account/MonthReportGenerator.php
- ../app/Generator/Report/Audit/MonthReportGenerator.php - ../app/Generator/Report/Audit/MonthReportGenerator.php
@@ -57,7 +48,6 @@ parameters:
message: '#Either catch a more specific exception#' message: '#Either catch a more specific exception#'
paths: paths:
- ../app/Support/Form/FormSupport.php - ../app/Support/Form/FormSupport.php
paths: paths:
- ../app - ../app
- ../database - ../database
@@ -66,5 +56,6 @@ parameters:
- ../bootstrap/app.php - ../bootstrap/app.php
# The level 8 is the highest level. original was 5 # The level 8 is the highest level. original was 5
level: 4 # 7 is more than enough, higher just leaves NULL things.
level: 7

View File

@@ -29,7 +29,20 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# cp .ci/.env.ci .env # cp .ci/.env.ci .env
# Do static code analysis. # Do static code analysis.
# ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress if [[ $GITHUB_ACTIONS = "" ]]
./vendor/bin/phpstan analyse -c .ci/phpstan.neon --xdebug --error-format=table > phpstan-report.txt then
./vendor/bin/phpstan analyse -c .ci/phpstan.neon --error-format=table > phpstan-report.txt
EXIT_CODE=$?
echo "The PHPstan report can be found in phpstan-report.txt. Exit code is $EXIT_CODE."
fi
echo 'The PHPstan report can be found in phpstan-report.txt' if [[ $GITHUB_ACTIONS = "true" ]]
then
./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress --error-format=github
EXIT_CODE=$?
# temporary exit code 0
# EXIT_CODE=0
fi
exit $EXIT_CODE

View File

@@ -1,63 +0,0 @@
#!/usr/bin/env bash
#
# phpunit.sh
# Copyright (c) 2021 james@firefly-iii.org
#
# 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/>.
#
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# enable test .env file.
cp $SCRIPT_DIR/../.env $SCRIPT_DIR/../.env.backup
cp $SCRIPT_DIR/.env.ci $SCRIPT_DIR/../.env
COVERAGE=false
RESET=false
FILE=storage/database/database.sqlite
while getopts "cr" o; do
case "${o}" in
c) COVERAGE=true;;
r) RESET=true;;
esac
done
# reset if necessary.
if [ $RESET = "true" ] ; then
rm -f $FILE
fi
# download test database
if [ -f "$FILE" ]; then
echo 'DB exists, will use it'
else
echo 'Download new DB'
wget --quiet https://github.com/firefly-iii/test-fixtures/raw/main/test-database.sqlite -O $FILE
fi
# run phpunit
if [ $COVERAGE = "true" ] ; then
echo 'Run with coverage'
XDEBUG_MODE=coverage ./vendor/bin/phpunit --configuration phpunit.xml --coverage-html $SCRIPT_DIR/coverage
else
echo 'Run without coverage'
./vendor/bin/phpunit --configuration phpunit.xml
fi
# restore .env file
mv $SCRIPT_DIR/../.env.backup $SCRIPT_DIR/../.env
cd $SCRIPT_DIR/..

View File

@@ -1,6 +1,6 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation. # You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing". # Never set it to "testing".
APP_ENV=local APP_ENV=production
# Set to true if you want to see debug information in error screens. # Set to true if you want to see debug information in error screens.
APP_DEBUG=false APP_DEBUG=false
@@ -78,7 +78,7 @@ PAPERTRAIL_HOST=
PAPERTRAIL_PORT= PAPERTRAIL_PORT=
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
# For other database types, please see the FAQ: https://docs.firefly-iii.org/firefly-iii/faq/self-hosted/#i-want-to-use-sqlite # For other database types, please see the FAQ: https://docs.firefly-iii.org/references/faq/install/#i-want-to-use-sqlite
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE # If you use Docker or similar, you can set these variables from a file by appending them with _FILE
# Use "pgsql" for PostgreSQL # Use "pgsql" for PostgreSQL
# Use "mysql" for MySQL and MariaDB. # Use "mysql" for MySQL and MariaDB.
@@ -122,7 +122,7 @@ SESSION_DRIVER=file
# If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or # If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or
# REDIS_PORT_FILE to set the value from a file instead of from an environment variable # REDIS_PORT_FILE to set the value from a file instead of from an environment variable
# can be tcp, unix or http # can be tcp or unix. http is not supported
REDIS_SCHEME=tcp REDIS_SCHEME=tcp
# use only when using 'unix' for REDIS_SCHEME. Leave empty otherwise. # use only when using 'unix' for REDIS_SCHEME. Leave empty otherwise.
@@ -150,7 +150,7 @@ COOKIE_SECURE=false
COOKIE_SAMESITE=lax COOKIE_SAMESITE=lax
# If you want Firefly III to email you, update these settings # If you want Firefly III to email you, update these settings
# For instructions, see: https://docs.firefly-iii.org/firefly-iii/advanced-installation/email/#email # For instructions, see: https://docs.firefly-iii.org/how-to/firefly-iii/advanced/notifications/#email
# If you use Docker or similar, you can set these variables from a file by appending them with _FILE # If you use Docker or similar, you can set these variables from a file by appending them with _FILE
MAIL_MAILER=log MAIL_MAILER=log
MAIL_HOST=null MAIL_HOST=null
@@ -195,6 +195,16 @@ MAP_DEFAULT_LAT=51.983333
MAP_DEFAULT_LONG=5.916667 MAP_DEFAULT_LONG=5.916667
MAP_DEFAULT_ZOOM=6 MAP_DEFAULT_ZOOM=6
#
# Some objects have room for an URL, like transactions and webhooks.
# By default, the following protocols are allowed:
# http, https, ftp, ftps, mailto
#
# To change this, set your preferred comma separated set below.
# Be sure to include http, https and other default ones if you need to.
#
VALID_URL_PROTOCOLS=
# #
# Firefly III authentication settings # Firefly III authentication settings
# #
@@ -204,7 +214,7 @@ MAP_DEFAULT_ZOOM=6
# - 'web' (default, uses built in DB) # - 'web' (default, uses built in DB)
# - 'remote_user_guard' for Authelia etc # - 'remote_user_guard' for Authelia etc
# Read more about these settings in the documentation. # Read more about these settings in the documentation.
# https://docs.firefly-iii.org/firefly-iii/advanced-installation/authentication # https://docs.firefly-iii.org/how-to/firefly-iii/advanced/authentication/
# #
# LDAP is no longer supported :( # LDAP is no longer supported :(
# #
@@ -259,7 +269,7 @@ ALLOW_WEBHOOKS=false
# 1. Set this token to any 32-character value (this is important!). # 1. Set this token to any 32-character value (this is important!).
# 2. Use this token in the cron URL instead of a user's command line token that you can find in /profile # 2. Use this token in the cron URL instead of a user's command line token that you can find in /profile
# #
# For more info: https://docs.firefly-iii.org/firefly-iii/advanced-installation/cron/ # For more info: https://docs.firefly-iii.org/how-to/firefly-iii/advanced/cron/
# #
# You can set this variable from a file by appending it with _FILE # You can set this variable from a file by appending it with _FILE
# #
@@ -314,18 +324,15 @@ PUSHER_SECRET=
PUSHER_ID= PUSHER_ID=
DEMO_USERNAME= DEMO_USERNAME=
DEMO_PASSWORD= DEMO_PASSWORD=
#
# The v2 layout is very experimental. If it breaks you get to keep both parts.
# Be wary of data loss.
#
FIREFLY_III_LAYOUT=v1 FIREFLY_III_LAYOUT=v1
# #
# If you have trouble configuring your Firefly III installation, DON'T BOTHER setting this variable. # Please make sure this URL matches the external URL of your Firefly III installation.
# It won't work. It doesn't do ANYTHING. Don't believe the lies you read online. I'm not joking. # It is used to validate specific requests and to generate URLs in emails.
# This configuration value WILL NOT HELP.
#
# Notable exception to this rule is Synology, which, according to some users, will use APP_URL to rewrite stuff.
#
# This variable is ONLY used in some of the emails Firefly III sends around. Nowhere else.
# So when configuring anything WEB related this variable doesn't do anything. Nothing
#
# If you're stuck I understand you get desperate but look SOMEWHERE ELSE.
# #
APP_URL=http://localhost APP_URL=http://localhost

26
.env.testing Normal file
View File

@@ -0,0 +1,26 @@
APP_ENV=testing
APP_DEBUG=true
SITE_OWNER=mail@example.com
APP_KEY=TestTestTestTestTestTestTestTest
DEFAULT_LANGUAGE=en_US
DEFAULT_LOCALE=equal
TZ=Europe/Amsterdam
LOG_CHANNEL=stdout
APP_LOG_LEVEL=debug
AUDIT_LOG_LEVEL=info
AUDIT_LOG_CHANNEL=audit_stdout
DB_CONNECTION=sqlite
CACHE_DRIVER=array
SESSION_DRIVER=array
MAIL_MAILER=log
SEND_ERROR_MESSAGE=true
ENABLE_EXTERNAL_MAP=false
ENABLE_EXTERNAL_RATES=true
AUTHENTICATION_GUARD=web
ALLOW_WEBHOOKS=true
APP_NAME=FireflyIII
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
CACHE_PREFIX=firefly
FIREFLY_III_LAYOUT=v1
APP_URL=http://localhost

View File

@@ -8,7 +8,7 @@ body:
options: options:
- label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md) - label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
required: true required: true
- label: My request is not listed as [a very good idea, but unfortunately...](https://docs.firefly-iii.org/firefly-iii/more-information/what-its-not/) - label: My request is not listed as [a very good idea, but unfortunately...](https://docs.firefly-iii.org/explanation/more-information/what-its-not/)
required: true required: true
- label: I've used [the search](https://github.com/firefly-iii/firefly-iii/issues?q=is%3Aissue) and this has not been requested before. - label: I've used [the search](https://github.com/firefly-iii/firefly-iii/issues?q=is%3Aissue) and this has not been requested before.
required: true required: true

View File

@@ -1,3 +1,3 @@
# [Contributing guidelines](https://docs.firefly-iii.org/firefly-iii/support/#contributing-code) # [Contributing guidelines](https://docs.firefly-iii.org/explanation/support/#contributing-code)
[Contributing guidelines](https://docs.firefly-iii.org/firefly-iii/support/#contributing-code) [Contributing guidelines](https://docs.firefly-iii.org/explanation/support/#contributing-code)

View File

@@ -1,11 +1,16 @@
version: 2 version: 2
updates: updates:
# Check for updates to GitHub Actions every week
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
# composer updates # composer updates
- package-ecosystem: "composer" - package-ecosystem: "composer"
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
target-branch: develop target-branch: develop
labels: [ "bug" ]
versioning-strategy: increase versioning-strategy: increase
schedule: schedule:
interval: "weekly" interval: "weekly"
@@ -14,15 +19,6 @@ updates:
- package-ecosystem: "npm" - package-ecosystem: "npm"
directory: "/" directory: "/"
target-branch: develop target-branch: develop
labels: [ "bug" ]
versioning-strategy: increase
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
target-branch: develop
labels: [ "bug" ]
versioning-strategy: increase versioning-strategy: increase
schedule: schedule:
interval: "weekly" interval: "weekly"

111
.github/label-actions.yml vendored Normal file
View File

@@ -0,0 +1,111 @@
# Configuration for Label Actions - https://github.com/dessant/label-actions
# The `feature` label is added to issues
feature:
issues:
# Post a comment, `{issue-author}` is an optional placeholder
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
This issue has been marked as a feature request. The requested (new) feature will become a part of Firefly III or the data importer in due course.
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
Thank you for your contributions.
epic:
issues:
# Post a comment, `{issue-author}` is an optional placeholder
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
This issue has been marked as an epic. In epics, large amounts of works are collected that will be part of a major new feature. If you have more ideas that could be a part of this epic, feel free to reply.
*However*, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted.
If you are merely interested in this epic's progress, you can subscribe to this issue to get updates.
Thank you for your contributions.
enhancement:
issues:
# Post a comment, `{issue-author}` is an optional placeholder
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
This issue has been marked as an enhancement. The requested enhancement to an existing feature will become a part of Firefly III or the data importer in due course.
If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates.
Thank you for your contributions.
triage:
issues:
# Post a comment, `{issue-author}` is an optional placeholder
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
This issue has been marked as being in triage. The root cause is not known yet, or the issue needs more investigation. You can help by sharing debug information (from `/debug`) if you also have this issue or when you haven't already done so.
Thank you for your contributions.
needs-moar-debug:
issues:
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
To learn more about this issue, please make sure you share at least:
1. The table you can find on the `/debug` page
2. Firefly III version
2. Docker, self-hosted, or hosted by a third party?
3. Operating system and browser
Thank you for your contributions.
unlabel: needs-moar-debug
needs-moar-logs:
issues:
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
To learn more about this issue, please share the relevant log files from your Firefly III or data importer installation.
The relevant instructions can be found in the documentation: [How to debug Firefly III?](https://docs.firefly-iii.org/how-to/general/debug/) Once debug mode is activated per these instructions, you can repeat your action and find the logs, depending on your method of installation. All is explained on the page.
Please share the relevant log lines in your issue, either inline or as an attachment. If you feel the logs contain sensitive information, you may also send them to [james@firefly-iii.org](mailto:james@firefly-iii.org). Without these logs, it may not be possible to properly investigate this issue.
Thank you for your contributions.
unlabel: needs-moar-logs
v2-layout-issue:
issues:
comment: |
Hi there!
This is an automatic reply. `Share and enjoy`
It seems your issue is about the new v2-layout that is currently in development for Firefly III.
These issues are collected in [a GitHub discussion](https://github.com/firefly-iii/firefly-iii/issues/8361).
Please note that the v2 layout is still very much in development.
Thank you for your contributions.
close: true
close-reason: completed
lock: false
unlabel: v2-layout-issue

2
.github/support.md vendored
View File

@@ -27,7 +27,7 @@ Only then [create a new issue](https://github.com/firefly-iii/firefly-iii/issues
- Issues can be converted into discussions if it's not a bug or feature request. - Issues can be converted into discussions if it's not a bug or feature request.
- Features that won't be implemented will be labelled " - Features that won't be implemented will be labelled "
wontfix". [This isn't personal](https://docs.firefly-iii.org/firefly-iii/about-firefly-iii/what-its-not/). wontfix". [This isn't personal](https://docs.firefly-iii.org/explanation/more-information/what-its-not/).
- Issues can be closed if they're duplicates of other issues. - Issues can be closed if they're duplicates of other issues.
- Issues can be closed if the answer is in the FAQ. - Issues can be closed if the answer is in the FAQ.
- Issues will be closed automatically after 14 days. - Issues will be closed automatically after 14 days.

View File

@@ -1,6 +1,9 @@
# This workflow prunes old workflow runs for an entire repository. # This workflow prunes old workflow runs for an entire repository.
name: Prune old builds name: "Chore - Prune old builds"
permissions:
actions: write
on: on:
schedule: schedule:
@@ -12,9 +15,9 @@ jobs:
timeout-minutes: 10 timeout-minutes: 10
steps: steps:
- name: Prune cancelled/skipped runs - name: Prune cancelled/skipped runs
uses: actions/github-script@v6 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |
const cancelled = await github.rest.actions.listWorkflowRunsForRepo({ const cancelled = await github.rest.actions.listWorkflowRunsForRepo({
owner: context.repo.owner, owner: context.repo.owner,
@@ -22,14 +25,14 @@ jobs:
repo: context.repo.repo, repo: context.repo.repo,
status: 'cancelled', status: 'cancelled',
}); });
const skipped = await github.rest.actions.listWorkflowRunsForRepo({ const skipped = await github.rest.actions.listWorkflowRunsForRepo({
owner: context.repo.owner, owner: context.repo.owner,
per_page: 100, per_page: 100,
repo: context.repo.repo, repo: context.repo.repo,
status: 'skipped', status: 'skipped',
}); });
for (const response of [cancelled, skipped]) { for (const response of [cancelled, skipped]) {
for (const run of response.data.workflow_runs) { for (const run of response.data.workflow_runs) {
console.log(`Run id ${run.id} of '${run.name}' is a cancelled/skipped run. Deleting...`); console.log(`Run id ${run.id} of '${run.name}' is a cancelled/skipped run. Deleting...`);
@@ -42,31 +45,33 @@ jobs:
} }
- name: Prune runs older than 3 days - name: Prune runs older than 3 days
uses: actions/github-script@v6 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |
const days_to_expiration = 3; const days_to_expiration = 3;
const ms_in_day = 86400000; const ms_in_day = 86400000;
const now = Date.now(); const now = Date.now();
const pages = 5; const pages = 5;
// we don't want to prune old runs from test.yml // we don't want to prune old runs from test.yml
// because we track the duration of runs over time // because we track the duration of runs over time
const workflows = [ const workflows = [
'cleanup.yml', 'cleanup.yml',
'close-duplicates.yml',
'closed-issues.yml', 'closed-issues.yml',
'depsreview.yaml', 'debug-info-actions.yml',
'laravel.yml', 'depsreview.yml',
'label-actions.yml',
'lock.yml', 'lock.yml',
'qodana.yml', 'release.yml',
'sonarcloud.yml', 'sonarcloud.yml',
'stale.yml' 'stale.yml'
] ]
let runs_to_delete = []; let runs_to_delete = [];
for (const workflow of workflows) { for (const workflow of workflows) {
for (let page = 0; page < pages; page += 1) { for (let page = 0; page < pages; page += 1) {
let response = await github.rest.actions.listWorkflowRuns({ let response = await github.rest.actions.listWorkflowRuns({
@@ -76,7 +81,7 @@ jobs:
repo: context.repo.repo, repo: context.repo.repo,
workflow_id: workflow workflow_id: workflow
}); });
if (response.data.workflow_runs.length > 0) { if (response.data.workflow_runs.length > 0) {
for (const run of response.data.workflow_runs) { for (const run of response.data.workflow_runs) {
if (now - Date.parse(run.created_at) > ms_in_day * days_to_expiration) { if (now - Date.parse(run.created_at) > ms_in_day * days_to_expiration) {
@@ -86,7 +91,7 @@ jobs:
} }
} }
} }
for (const run of runs_to_delete) { for (const run of runs_to_delete) {
console.log(`Run id ${run[0]} of '${run[1]}' is older than ${days_to_expiration} days. Deleting...`); console.log(`Run id ${run[0]} of '${run[1]}' is older than ${days_to_expiration} days. Deleting...`);
try { try {

39
.github/workflows/close-duplicates.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
name: "Issues - Command to close duplicate issues"
# the workflow to execute on is comments that are newly created
on:
issue_comment:
types: [created]
permissions:
issues: write
checks: read
jobs:
close_duplicates:
runs-on: ubuntu-latest
steps:
- uses: github/command@v1.1.0
id: command
with:
allowed_contexts: "issue"
command: ".duplicate"
- name: reply
if: ${{ steps.command.outputs.continue == 'true' }}
run: |
ISSUE_TITLE=$(gh issue view ${{ steps.command.outputs.params }} --json title --jq '.title')
gh issue comment "$NUMBER" --body "Hi there!
This is an automatic reply. \`Share and enjoy\`.
Your issue is probably a duplicate of issue <span>#</span>${{ steps.command.outputs.params }}: [$ISSUE_TITLE](https://github.com/firefly-iii/firefly-iii/issues/${{ steps.command.outputs.params }}). Please refer to issue #${{ steps.command.outputs.params }} for support.
You can close this issue now. If you believe this is not in fact a duplicate, please reply and let us know. Otherwise, this issue will be automatically closed in a few days time.
Thank you for your contributions."
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
NUMBER: ${{ github.event.issue.number }}

View File

@@ -1,10 +1,11 @@
name: "Reply to closed issue" ---
name: Issues - Reply to closed issue
on: on:
issues: issues:
types: types:
- closed - closed
jobs: jobs:
auto_comment: command_and_close:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: aws-actions/closed-issue-message@v1 - uses: aws-actions/closed-issue-message@v1
@@ -21,4 +22,4 @@ jobs:
If there is more to discuss, please open [a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose) or [discussion](https://github.com/firefly-iii/firefly-iii/discussions/). If there is more to discuss, please open [a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose) or [discussion](https://github.com/firefly-iii/firefly-iii/discussions/).
Thank you for your contributions. Thank you for your contributions.
repo-token: "${{ secrets.GITHUB_TOKEN }}" repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -0,0 +1,32 @@
name: 'Issues - Respond to hidden commands'
# the workflow to execute on is comments that are newly created
on:
issues:
types: [opened, edited]
issue_comment:
types: [created]
# permissions needed for reacting to IssueOps commands on issues and PRs
permissions:
contents: read
pull-requests: write
issues: write
checks: read
jobs:
respond:
runs-on: ubuntu-latest
steps:
- run: |
ISSUE_BODY=$(gh issue view $NUMBER --json body)
if [[ $ISSUE_BODY == *".eOxNZAmyGz6CXMyf"* ]]; then
gh issue comment "$NUMBER" --body "$V2_ISSUE_REPLY_BODY"
gh issue close "$NUMBER" --reason completed
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
NUMBER: ${{ github.event.issue.number }}
V2_ISSUE_REPLY_BODY: ${{ secrets.V2_ISSUE_REPLY_BODY }}
LABELS: v2-layout-issue

View File

@@ -1,14 +0,0 @@
name: 'Dependency Review'
on: [ pull_request ]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
uses: actions/checkout@v3
- name: 'Dependency Review'
uses: actions/dependency-review-action@v3

16
.github/workflows/depsreview.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: 'Code - Dependency review'
on: [ pull_request ]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- name: 'Checkout repository'
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 'Dependency review'
uses: actions/dependency-review-action@v4

21
.github/workflows/label-actions.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: 'Issues - Reply to specific labels'
on:
issues:
types: [labeled, unlabeled]
pull_request_target:
types: [labeled, unlabeled]
discussion:
types: [labeled, unlabeled]
permissions:
contents: read
issues: write
pull-requests: write
discussions: write
jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/label-actions@v4

View File

@@ -1,146 +0,0 @@
name: Firefly III
on:
push:
branches-ignore:
- '**'
jobs:
prepare:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Copy .env
run: test -f .env || cp .ci/.env.ci .env
- name: Prepare dependencies
run: |
set -euxo pipefail
export PATH=$PATH:$HOME/.composer/vendor/bin/
composer global require hirak/prestissimo --no-plugins --no-scripts
composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest
touch ./storage/database/database.sqlite
- name: Prepare Firefly III
run: |
chmod -R 777 storage bootstrap/cache
php artisan migrate --seed
php artisan firefly-iii:upgrade-database
- name: Upload database
uses: actions/upload-artifact@v2
with:
name: database
path: storage/database/database.sqlite
- name: Upload cache
uses: actions/upload-artifact@v2
with:
name: cache
path: bootstrap/cache/
- name: Upload composer cache
uses: actions/upload-artifact@v2
with:
name: composer
path: ~/.composer
laravel-tests:
runs-on: ubuntu-latest
needs:
- prepare
steps:
- uses: actions/checkout@v3
- name: Copy .env
run: test -f .env || cp .ci/.env.ci .env
- name: Download database
uses: actions/download-artifact@v2
with:
name: database
path: storage/database/database.sqlite
- name: Download cache
uses: actions/download-artifact@v2
with:
name: cache
path: bootstrap/cache/
- name: Download vendor
uses: actions/download-artifact@v2
with:
name: composer
path: ~/.composer
- name: Install composer
run: composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest
- name: PHPUnit tests
uses: php-actions/phpunit@v1
with:
config: phpunit.xml
memory: 512M
coding-standards:
runs-on: ubuntu-latest
needs:
- prepare
steps:
- uses: actions/checkout@v3
- name: Copy .env
run: test -f .env || cp .ci/.env.ci .env
- name: Download database
uses: actions/download-artifact@v2
with:
name: database
path: storage/database/database.sqlite
- name: Download cache
uses: actions/download-artifact@v2
with:
name: cache
path: bootstrap/cache/
- name: Download vendor
uses: actions/download-artifact@v2
with:
name: composer
path: ~/.composer
- name: install depenencies
run: |
composer global require nette/coding-standard
composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest
- name: Execute code standard
run: /home/runner/.composer/vendor/bin/ecs check app tests --config ./.ci/firefly-iii-standard.yml
phpstan:
runs-on: ubuntu-latest
needs:
- prepare
steps:
- uses: actions/checkout@v3
- name: Copy .env
run: test -f .env || cp .ci/.env.ci .env
- name: Download database
uses: actions/download-artifact@v2
with:
name: database
path: storage/database/database.sqlite
- name: Download cache
uses: actions/download-artifact@v2
with:
name: cache
path: bootstrap/cache/
- name: Download vendor
uses: actions/download-artifact@v2
with:
name: composer
path: ~/.composer
- name: Install depenencies
run: |
composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest
- name: Execute PHPStan
run: vendor/bin/phpstan analyse -c .ci/phpstan.neon

View File

@@ -1,4 +1,4 @@
name: Lock old issues name: 'Issues - Lock old issues'
on: on:
workflow_dispatch: workflow_dispatch:
@@ -15,5 +15,5 @@ jobs:
- uses: JC5/lock-threads@main - uses: JC5/lock-threads@main
with: with:
github-token: ${{ github.token }} github-token: ${{ github.token }}
issue-inactive-days: 90 issue-inactive-days: 7
pr-inactive-days: 90 pr-inactive-days: 7

View File

@@ -1,35 +0,0 @@
name: Qodana
on:
workflow_dispatch:
push:
branches:
- main
- develop
jobs:
qodana:
runs-on: ubuntu-latest
name: 'Qodana Scan'
steps:
- name: Setup PHP with no coverage driver
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
coverage: none
extensions: bcmath, intl
env:
update: true
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Install dependencies
run: |
composer install --no-scripts
cp .env.example .env
php artisan key:generate
php artisan clear-compiled
php artisan ide-helper:generate;
- name: 'Qodana Scan'
uses: JetBrains/qodana-action@main
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}

173
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,173 @@
name: 'Code - Create new release'
on:
workflow_dispatch:
inputs:
version:
description: 'Version to release'
required: true
default: 'develop'
schedule:
- cron: '15 0 * * MON,THU'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Switch branch
run: |
if [[ "develop" == "$version" ]]; then
git checkout --track origin/develop
git pull
else
git config user.name github-actions
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git checkout --track origin/develop
git pull
git checkout main
git merge develop
fi
env:
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, intl, zip, bcmath
- name: crowdin action
uses: crowdin/github-action@v1
with:
upload_sources: true
download_translations: true
push_translations: false
push_sources: false
env:
GITHUB_TOKEN: ${{ github.token }}
CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }}
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
- name: Cleanup translations
id: cleanup-transactions
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:crowdin-warning'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Cleanup changelog
id: cleanup-changelog
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:changelog'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }}
- name: Extract changelog
id: extract-changelog
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:extract-changelog'
output: 'output'
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ""
- name: Replace version
id: replace-version
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:version'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ""
FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
- name: Generate JSON v1
id: json-v1
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:json-translations v1'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Generate JSON v2
id: json-v2
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:json-translations v2'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Code cleanup
id: code-cleanup
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:code'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Build new JS
run: |
npm upgrade
npm run build
- name: Build old JS
id: old-js
uses: JC5/firefly-iii-dev@v34
with:
action: 'ff3:old-js'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Run CI
run: |
rm -rf vendor composer.lock
composer validate --strict
composer update --no-dev --no-scripts --no-plugins -q
sudo chown -R runner:docker resources/lang
.ci/phpcs.sh
- name: Release
run: |
sudo timedatectl set-timezone Europe/Amsterdam
git config user.name github-actions
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git config advice.addIgnoredFile false
if [[ "develop" == "$version" ]]; then
[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
fi
git add -A
if test -f "output.txt"; then
git reset output.txt
fi
git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
git push
if [[ "develop" == "$version" ]]; then
echo "Create nightly release."
git tag -a $version-$(date +'%Y%m%d') -m "Nightly development release '$version' on $(date +'%Y-%m-%d')"
git push origin $version-$(date +'%Y%m%d')
gh release create $version-$(date +'%Y%m%d') -p --verify-tag \
-t "Development release for $(date +'%Y-%m-%d')" \
-n "Bi-weekly development release of Firefly III with the latest fixes, translations and features. This release was created on **$(date +'%Y-%m-%d')** and may contain bugs. Use at your own risk. Docker users can find this release under the \`develop\` tag."
else
echo "Create default release."
git tag -a $version -m "Here be changelog"
git push origin $version
gh release create $version -F output.txt -t "$version" --verify-tag
rm output.txt
git checkout develop
git merge main
git push
fi
env:
GH_TOKEN: ${{ github.token }}
version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}

View File

@@ -1,38 +1,67 @@
name: Sonarcloud name: 'Code - Run Sonarcloud'
on: on:
pull_request: pull_request:
workflow_dispatch:
push: push:
branches: branches:
- main - main
- develop - develop
env:
DB_CONNECTION: sqlite
APP_KEY: UfpBqqeXx7zpNodsC6yjYQcRfDdm4Bxh
jobs: jobs:
sonarcloud: sonarcloud:
name: SonarCloud name: SonarCloud
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup PHP with Xdebug - name: Setup PHP with Xdebug
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '8.2' php-version: '8.3'
coverage: xdebug coverage: xdebug
extensions: >-
bcmath
curl
fileinfo
iconv
intl
json
sqlite3
mbstring
openssl
pdo
session
simplexml
sodium
tokenizer
xml
xmlwriter
- name: Copy standard configuration
run: cp .env.testing .env
- name: Install Composer dependencies - name: Install Composer dependencies
run: composer install --prefer-dist --no-interaction --no-progress --no-scripts run: composer install --prefer-dist --no-interaction --no-progress --no-scripts
- name: Copy environment file - name: PHPStan
run: cp .env.example .env run: .ci/phpstan.sh
- name: Generate app key - name: PHPMD
run: php artisan key:generate run: .ci/phpmd.sh
- name: PHP CS Fixer
run: .ci/phpcs.sh
- name: "Create database file"
run: touch storage/database/database.sqlite
- name: "Upgrades the database to the latest version"
run: php artisan firefly-iii:upgrade-database
- name: "Integrity Database Report"
run: php artisan firefly-iii:report-integrity
- name: "Run tests with coverage" - name: "Run tests with coverage"
run: composer coverage run: composer coverage

View File

@@ -1,4 +1,4 @@
name: "Close stale issues" name: "Issues - Mark and close stale issues"
on: on:
schedule: schedule:
- cron: "30 1 * * *" - cron: "30 1 * * *"
@@ -14,21 +14,25 @@ jobs:
pull-requests: write # for actions/stale to close stale PRs pull-requests: write # for actions/stale to close stale PRs
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v6 - uses: actions/stale@v9
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: > stale-issue-message: >
Hi there! This is an automatic reply. `Share and enjoy` Hi there!
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.
This is an automatic reply. `Share and enjoy`
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.
Thank you for your contributions. Thank you for your contributions.
stale-pr-message: > stale-pr-message: >
Hi there! This is an automatic reply. `Share and enjoy` Hi there!
This is an automatic reply. `Share and enjoy`
This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.
Thank you for your contributions. Thank you for your contributions.
days-before-stale: 14 days-before-stale: 14
days-before-close: 7 days-before-close: 7
exempt-issue-labels: 'enhancement,feature,bug,announcement,epic' exempt-issue-labels: 'enhancement,feature,bug,announcement,epic,triage'

3
.gitignore vendored
View File

@@ -1,8 +1,7 @@
/node_modules /node_modules
/frontend/node_modules
/storage/*.key /storage/*.key
/vendor /vendor
/.vagrant public/hot
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
.env .env

View File

@@ -32,7 +32,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\Support\Http\Api\AccountFilter;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use JsonException;
/** /**
* Class AccountController * Class AccountController
@@ -41,6 +40,7 @@ class AccountController extends Controller
{ {
use AccountFilter; use AccountFilter;
/** @var array<int, string> */
private array $balanceTypes; private array $balanceTypes;
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
@@ -60,30 +60,25 @@ class AccountController extends Controller
return $next($request); return $next($request);
} }
); );
$this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE,]; $this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE];
} }
/** /**
* Documentation for this endpoint: * Documentation for this endpoint:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getAccountsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getAccountsAC
* *
* @param AutocompleteRequest $request
*
* @return JsonResponse
* @throws JsonException
* @throws FireflyException * @throws FireflyException
* @throws FireflyException * @throws FireflyException
*/ */
public function accounts(AutocompleteRequest $request): JsonResponse public function accounts(AutocompleteRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
$types = $data['types']; $types = $data['types'];
$query = $data['query']; $query = $data['query'];
$date = $data['date'] ?? today(config('app.timezone')); $date = $data['date'] ?? today(config('app.timezone'));
$return = [];
$result = $this->repository->searchAccount((string)$query, $types, $this->parameters->get('limit'));
$return = [];
$result = $this->repository->searchAccount((string)$query, $types, $this->parameters->get('limit'));
// TODO this code is duplicated in the V2 Autocomplete controller, which means this code is due to be deprecated. // TODO this code is duplicated in the V2 Autocomplete controller, which means this code is due to be deprecated.
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
@@ -101,7 +96,7 @@ class AccountController extends Controller
); );
} }
$return[] = [ $return[] = [
'id' => (string)$account->id, 'id' => (string)$account->id,
'name' => $account->name, 'name' => $account->name,
'name_with_balance' => $nameWithBalance, 'name_with_balance' => $nameWithBalance,
@@ -117,10 +112,10 @@ class AccountController extends Controller
// custom order. // custom order.
usort( usort(
$return, $return,
function ($a, $b) { static function (array $left, array $right) {
$order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE]; $order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE];
$posA = array_search($a['type'], $order, true); $posA = (int)array_search($left['type'], $order, true);
$posB = array_search($b['type'], $order, true); $posB = (int)array_search($right['type'], $order, true);
return $posA - $posB; return $posA - $posB;
} }

View File

@@ -58,10 +58,6 @@ class BillController extends Controller
/** /**
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function bills(AutocompleteRequest $request): JsonResponse public function bills(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -58,10 +58,6 @@ class BudgetController extends Controller
/** /**
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBudgetsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBudgetsAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function budgets(AutocompleteRequest $request): JsonResponse public function budgets(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -58,10 +58,6 @@ class CategoryController extends Controller
/** /**
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCategoriesAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCategoriesAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function categories(AutocompleteRequest $request): JsonResponse public function categories(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -58,10 +58,6 @@ class CurrencyController extends Controller
/** /**
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function currencies(AutocompleteRequest $request): JsonResponse public function currencies(AutocompleteRequest $request): JsonResponse
{ {
@@ -87,9 +83,6 @@ class CurrencyController extends Controller
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
* *
* @param AutocompleteRequest $request
*
* @return JsonResponse
* @deprecated * @deprecated
*/ */
public function currenciesWithCode(AutocompleteRequest $request): JsonResponse public function currenciesWithCode(AutocompleteRequest $request): JsonResponse

View File

@@ -58,10 +58,6 @@ class ObjectGroupController extends Controller
/** /**
* Documentation for this endpoint is at: * Documentation for this endpoint is at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function objectGroups(AutocompleteRequest $request): JsonResponse public function objectGroups(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -62,10 +62,6 @@ class PiggyBankController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function piggyBanks(AutocompleteRequest $request): JsonResponse public function piggyBanks(AutocompleteRequest $request): JsonResponse
{ {
@@ -97,10 +93,6 @@ class PiggyBankController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesBalanceAC * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesBalanceAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse
{ {
@@ -108,6 +100,7 @@ class PiggyBankController extends Controller
$piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit')); $piggies = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit'));
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
$response = []; $response = [];
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */
foreach ($piggies as $piggy) { foreach ($piggies as $piggy) {
$currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; $currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency;

View File

@@ -56,10 +56,6 @@ class RecurrenceController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRecurringAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRecurringAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function recurring(AutocompleteRequest $request): JsonResponse public function recurring(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -55,10 +55,6 @@ class RuleController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRulesAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRulesAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function rules(AutocompleteRequest $request): JsonResponse public function rules(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -55,10 +55,6 @@ class RuleGroupController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRuleGroupsAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRuleGroupsAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function ruleGroups(AutocompleteRequest $request): JsonResponse public function ruleGroups(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -58,17 +58,13 @@ class TagController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTagAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTagAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function tags(AutocompleteRequest $request): JsonResponse public function tags(AutocompleteRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
$result = $this->repository->searchTags($data['query'], $this->parameters->get('limit')); $result = $this->repository->searchTags($data['query'], $this->parameters->get('limit'));
$array = []; $array = [];
/** @var Tag $tag */ /** @var Tag $tag */
foreach ($result as $tag) { foreach ($result as $tag) {
$array[] = [ $array[] = [

View File

@@ -63,15 +63,11 @@ class TransactionController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function transactions(AutocompleteRequest $request): JsonResponse public function transactions(AutocompleteRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
$result = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit')); $result = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit'));
// limit and unique // limit and unique
$filtered = $result->unique('description'); $filtered = $result->unique('description');
@@ -93,10 +89,6 @@ class TransactionController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsIDAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsIDAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function transactionsWithID(AutocompleteRequest $request): JsonResponse public function transactionsWithID(AutocompleteRequest $request): JsonResponse
{ {
@@ -117,7 +109,7 @@ class TransactionController extends Controller
} }
// limit and unique // limit and unique
$array = []; $array = [];
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($result as $journal) { foreach ($result as $journal) {

View File

@@ -54,10 +54,6 @@ class TransactionTypeController extends Controller
/** /**
* This endpoint is documented at * This endpoint is documented at
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionTypesAC * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionTypesAC
*
* @param AutocompleteRequest $request
*
* @return JsonResponse
*/ */
public function transactionTypes(AutocompleteRequest $request): JsonResponse public function transactionTypes(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -30,14 +30,11 @@ use FireflyIII\Api\V1\Requests\Data\DateRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Preference;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Api\ApiSupport; use FireflyIII\Support\Http\Api\ApiSupport;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use JsonException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/** /**
* Class AccountController * Class AccountController
@@ -46,13 +43,10 @@ class AccountController extends Controller
{ {
use ApiSupport; use ApiSupport;
private CurrencyRepositoryInterface $currencyRepository; private AccountRepositoryInterface $repository;
private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -64,9 +58,6 @@ class AccountController extends Controller
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user); $this->repository->setUser($user);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->currencyRepository->setUser($user);
return $next($request); return $next($request);
} }
); );
@@ -76,25 +67,23 @@ class AccountController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
* *
* @param DateRequest $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
* @throws JsonException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/ */
public function overview(DateRequest $request): JsonResponse public function overview(DateRequest $request): JsonResponse
{ {
// parameters for chart: // parameters for chart:
$dates = $request->getAll(); $dates = $request->getAll();
/** @var Carbon $start */ /** @var Carbon $start */
$start = $dates['start']; $start = $dates['start'];
/** @var Carbon $end */ /** @var Carbon $end */
$end = $dates['end']; $end = $dates['end'];
// user's preferences // user's preferences
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray(); $defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray();
/** @var Preference $frontPage */
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet); $frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getDefaultCurrency();
@@ -103,17 +92,17 @@ class AccountController extends Controller
$frontPage->save(); $frontPage->save();
} }
// get accounts: // get accounts:
$accounts = $this->repository->getAccountsById($frontPage->data); $accounts = $this->repository->getAccountsById($frontPage->data);
$chartData = []; $chartData = [];
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
$currency = $this->repository->getAccountCurrency($account); $currency = $this->repository->getAccountCurrency($account);
if (null === $currency) { if (null === $currency) {
$currency = $default; $currency = $default;
} }
$currentSet = [ $currentSet = [
'label' => $account->name, 'label' => $account->name,
'currency_id' => (string)$currency->id, 'currency_id' => (string)$currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
@@ -129,16 +118,16 @@ class AccountController extends Controller
$currentStart = clone $start; $currentStart = clone $start;
$range = app('steam')->balanceInRange($account, $start, clone $end); $range = app('steam')->balanceInRange($account, $start, clone $end);
// 2022-10-11 this method no longer converts to float. // 2022-10-11 this method no longer converts to float.
$previous = array_values($range)[0]; $previous = array_values($range)[0];
while ($currentStart <= $end) { while ($currentStart <= $end) {
$format = $currentStart->format('Y-m-d'); $format = $currentStart->format('Y-m-d');
$label = $currentStart->toAtomString(); $label = $currentStart->toAtomString();
$balance = array_key_exists($format, $range) ? $range[$format] : $previous; $balance = array_key_exists($format, $range) ? $range[$format] : $previous;
$previous = $balance; $previous = $balance;
$currentStart->addDay(); $currentStart->addDay();
$currentSet['entries'][$label] = $balance; $currentSet['entries'][$label] = $balance;
} }
$chartData[] = $currentSet; $chartData[] = $currentSet;
} }
return response()->json($chartData); return response()->json($chartData);

View File

@@ -27,22 +27,22 @@ namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon; use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException; use Carbon\Exceptions\InvalidDateException;
use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\Models\Preference;
use FireflyIII\User;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController; use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Log;
use League\Fractal\Manager; use League\Fractal\Manager;
use League\Fractal\Serializer\JsonApiSerializer; use League\Fractal\Serializer\JsonApiSerializer;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class Controller. * Class Controller.
* *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.NumberOfChildren)
*/ */
abstract class Controller extends BaseController abstract class Controller extends BaseController
{ {
@@ -50,7 +50,9 @@ abstract class Controller extends BaseController
use DispatchesJobs; use DispatchesJobs;
use ValidatesRequests; use ValidatesRequests;
protected const CONTENT_TYPE = 'application/vnd.api+json'; protected const string CONTENT_TYPE = 'application/vnd.api+json';
/** @var array<int, string> */
protected array $allowedSort; protected array $allowedSort;
protected ParameterBag $parameters; protected ParameterBag $parameters;
@@ -76,45 +78,42 @@ abstract class Controller extends BaseController
/** /**
* Method to grab all parameters from the URL. * Method to grab all parameters from the URL.
*
* @return ParameterBag
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/ */
private function getParameters(): ParameterBag private function getParameters(): ParameterBag
{ {
$bag = new ParameterBag(); $bag = new ParameterBag();
$page = (int)request()->get('page'); $page = (int)request()->get('page');
if ($page < 1) { if ($page < 1) {
$page = 1; $page = 1;
} }
if ($page > pow(2, 16)) { if ($page > 2 ** 16) {
$page = pow(2, 16); $page = 2 ** 16;
} }
$bag->set('page', $page); $bag->set('page', $page);
// some date fields: // some date fields:
$dates = ['start', 'end', 'date']; $dates = ['start', 'end', 'date'];
foreach ($dates as $field) { foreach ($dates as $field) {
$date = null; $date = null;
try { try {
$date = request()->query->get($field); $date = request()->query->get($field);
} catch (BadRequestException $e) { } catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field)); app('log')->error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
Log::error($e->getMessage()); app('log')->error($e->getMessage());
Log::error($e->getTraceAsString()); app('log')->error($e->getTraceAsString());
$value = null; $value = null;
} }
$obj = null; $obj = null;
if (null !== $date) { if (null !== $date) {
try { try {
$obj = Carbon::parse($date); $obj = Carbon::parse((string)$date);
} catch (InvalidDateException | InvalidFormatException $e) { } catch (InvalidDateException|InvalidFormatException $e) {
// don't care // don't care
app('log')->warning( app('log')->warning(
sprintf( sprintf(
'Ignored invalid date "%s" in API controller parameter check: %s', 'Ignored invalid date "%s" in API controller parameter check: %s',
substr($date, 0, 20), substr((string)$date, 0, 20),
$e->getMessage() $e->getMessage()
) )
); );
@@ -129,17 +128,23 @@ abstract class Controller extends BaseController
try { try {
$value = request()->query->get($integer); $value = request()->query->get($integer);
} catch (BadRequestException $e) { } catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer)); app('log')->error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer));
Log::error($e->getMessage()); app('log')->error($e->getMessage());
Log::error($e->getTraceAsString()); app('log')->error($e->getTraceAsString());
$value = null; $value = null;
} }
if (null !== $value) { if (null !== $value) {
$bag->set($integer, (int)$value); $bag->set($integer, (int)$value);
} }
if (null === $value && 'limit' === $integer && auth()->check()) { if (null === $value
&& 'limit' === $integer // @phpstan-ignore-line
&& auth()->check()) {
// set default for user: // set default for user:
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; /** @var User $user */
$user = auth()->user();
/** @var Preference $pageSize */
$pageSize = (int)app('preferences')->getForUser($user, 'listPageSize', 50)->data;
$bag->set($integer, $pageSize); $bag->set($integer, $pageSize);
} }
} }
@@ -148,26 +153,22 @@ abstract class Controller extends BaseController
return $this->getSortParameters($bag); return $this->getSortParameters($bag);
} }
/**
* @param ParameterBag $bag
*
* @return ParameterBag
*/
private function getSortParameters(ParameterBag $bag): ParameterBag private function getSortParameters(ParameterBag $bag): ParameterBag
{ {
$sortParameters = []; $sortParameters = [];
try { try {
$param = (string)request()->query->get('sort'); $param = (string)request()->query->get('sort');
} catch (BadRequestException $e) { } catch (BadRequestException $e) {
Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.'); app('log')->error('Request field "sort" contains a non-scalar value. Value set to NULL.');
Log::error($e->getMessage()); app('log')->error($e->getMessage());
Log::error($e->getTraceAsString()); app('log')->error($e->getTraceAsString());
$param = ''; $param = '';
} }
if ('' === $param) { if ('' === $param) {
return $bag; return $bag;
} }
$parts = explode(',', $param); $parts = explode(',', $param);
foreach ($parts as $part) { foreach ($parts as $part) {
$part = trim($part); $part = trim($part);
$direction = 'asc'; $direction = 'asc';
@@ -186,8 +187,6 @@ abstract class Controller extends BaseController
/** /**
* Method to help build URL's. * Method to help build URL's.
*
* @return string
*/ */
final protected function buildParams(): string final protected function buildParams(): string
{ {
@@ -199,22 +198,20 @@ abstract class Controller extends BaseController
} }
if ($value instanceof Carbon) { if ($value instanceof Carbon) {
$params[$key] = $value->format('Y-m-d'); $params[$key] = $value->format('Y-m-d');
continue; continue;
} }
$params[$key] = $value; $params[$key] = $value;
} }
return $return . http_build_query($params); return $return.http_build_query($params);
} }
/**
* @return Manager
*/
final protected function getManager(): Manager final protected function getManager(): Manager
{ {
// create some objects: // create some objects:
$manager = new Manager(); $manager = new Manager();
$baseUrl = request()->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = request()->getSchemeAndHttpHost().'/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
return $manager; return $manager;

View File

@@ -44,9 +44,6 @@ class TransactionController extends Controller
{ {
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/**
*
*/
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
@@ -63,10 +60,6 @@ class TransactionController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/bulkUpdateTransactions * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/bulkUpdateTransactions
*
* @param TransactionRequest $request
*
* @return JsonResponse
*/ */
public function update(TransactionRequest $request): JsonResponse public function update(TransactionRequest $request): JsonResponse
{ {
@@ -76,12 +69,12 @@ class TransactionController extends Controller
// this deserves better code, but for now a loop of basic if-statements // this deserves better code, but for now a loop of basic if-statements
// to respond to what is in the $query. // to respond to what is in the $query.
// this is OK because only one thing can be in the query at the moment. // this is OK because only one thing can be in the query at the moment.
if ($this->updatesTransactionAccount($params)) { if ($this->isUpdateTransactionAccount($params)) {
$original = $this->repository->find((int)$params['where']['account_id']); $original = $this->repository->find((int)$params['where']['account_id']);
$destination = $this->repository->find((int)$params['update']['account_id']); $destination = $this->repository->find((int)$params['update']['account_id']);
/** @var AccountDestroyService $service */ /** @var AccountDestroyService $service */
$service = app(AccountDestroyService::class); $service = app(AccountDestroyService::class);
$service->moveTransactions($original, $destination); $service->moveTransactions($original, $destination);
} }
@@ -89,11 +82,9 @@ class TransactionController extends Controller
} }
/** /**
* @param array $params * @param array<string, array<string, string>> $params
*
* @return bool
*/ */
private function updatesTransactionAccount(array $params): bool private function isUpdateTransactionAccount(array $params): bool
{ {
return array_key_exists('account_id', $params['where']) && array_key_exists('account_id', $params['update']); return array_key_exists('account_id', $params['where']) && array_key_exists('account_id', $params['update']);
} }

View File

@@ -58,160 +58,53 @@ class DestroyController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/destroyData * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/destroyData
* *
* @param DestroyRequest $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function destroy(DestroyRequest $request): JsonResponse public function destroy(DestroyRequest $request): JsonResponse
{ {
$objects = $request->getObjects(); $objects = $request->getObjects();
$this->unused = $request->boolean('unused', false); $this->unused = $request->boolean('unused', false);
switch ($objects) {
default: $allExceptAssets = [AccountType::BENEFICIARY, AccountType::CASH, AccountType::CREDITCARD, AccountType::DEFAULT, AccountType::EXPENSE, AccountType::IMPORT, AccountType::INITIAL_BALANCE, AccountType::LIABILITY_CREDIT, AccountType::RECONCILIATION, AccountType::REVENUE];
throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)); $all = [AccountType::ASSET, AccountType::BENEFICIARY, AccountType::CASH, AccountType::CREDITCARD, AccountType::DEBT, AccountType::DEFAULT, AccountType::EXPENSE, AccountType::IMPORT, AccountType::INITIAL_BALANCE, AccountType::LIABILITY_CREDIT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::RECONCILIATION];
case 'budgets': $liabilities = [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD];
$this->destroyBudgets(); $transactions = [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER, TransactionType::RECONCILIATION];
break;
case 'bills': match ($objects) {
$this->destroyBills(); 'budgets' => $this->destroyBudgets(),
break; 'bills' => $this->destroyBills(),
case 'piggy_banks': 'piggy_banks' => $this->destroyPiggyBanks(),
$this->destroyPiggyBanks(); 'rules' => $this->destroyRules(),
break; 'recurring' => $this->destroyRecurringTransactions(),
case 'rules': 'categories' => $this->destroyCategories(),
$this->destroyRules(); 'tags' => $this->destroyTags(),
break; 'object_groups' => $this->destroyObjectGroups(),
case 'recurring': 'not_assets_liabilities' => $this->destroyAccounts($allExceptAssets),
$this->destroyRecurringTransactions(); 'accounts' => $this->destroyAccounts($all),
break; 'asset_accounts' => $this->destroyAccounts([AccountType::ASSET, AccountType::DEFAULT]),
case 'categories': 'expense_accounts' => $this->destroyAccounts([AccountType::BENEFICIARY, AccountType::EXPENSE]),
$this->destroyCategories(); 'revenue_accounts' => $this->destroyAccounts([AccountType::REVENUE]),
break; 'liabilities' => $this->destroyAccounts($liabilities),
case 'tags': 'transactions' => $this->destroyTransactions($transactions),
$this->destroyTags(); 'withdrawals' => $this->destroyTransactions([TransactionType::WITHDRAWAL]),
break; 'deposits' => $this->destroyTransactions([TransactionType::DEPOSIT]),
case 'object_groups': 'transfers' => $this->destroyTransactions([TransactionType::TRANSFER]),
$this->destroyObjectGroups(); default => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)),
break; };
case 'not_assets_liabilities':
$this->destroyAccounts(
[
AccountType::BENEFICIARY,
AccountType::CASH,
AccountType::CREDITCARD,
AccountType::DEFAULT,
AccountType::EXPENSE,
AccountType::IMPORT,
AccountType::INITIAL_BALANCE,
AccountType::LIABILITY_CREDIT,
AccountType::RECONCILIATION,
AccountType::REVENUE,
]
);
break;
case 'accounts':
$this->destroyAccounts(
[
AccountType::ASSET,
AccountType::BENEFICIARY,
AccountType::CASH,
AccountType::CREDITCARD,
AccountType::DEBT,
AccountType::DEFAULT,
AccountType::EXPENSE,
AccountType::IMPORT,
AccountType::INITIAL_BALANCE,
AccountType::LIABILITY_CREDIT,
AccountType::LOAN,
AccountType::MORTGAGE,
AccountType::RECONCILIATION,
AccountType::REVENUE,
]
);
break;
case 'asset_accounts':
$this->destroyAccounts(
[
AccountType::ASSET,
AccountType::DEFAULT,
]
);
break;
case 'expense_accounts':
$this->destroyAccounts(
[
AccountType::BENEFICIARY,
AccountType::EXPENSE,
]
);
break;
case 'revenue_accounts':
$this->destroyAccounts(
[
AccountType::REVENUE,
]
);
break;
case 'liabilities':
$this->destroyAccounts(
[
AccountType::DEBT,
AccountType::LOAN,
AccountType::MORTGAGE,
AccountType::CREDITCARD,
]
);
break;
case 'transactions':
$this->destroyTransactions(
[
TransactionType::WITHDRAWAL,
TransactionType::DEPOSIT,
TransactionType::TRANSFER,
TransactionType::RECONCILIATION,
TransactionType::OPENING_BALANCE,
]
);
break;
case 'withdrawals':
$this->destroyTransactions(
[
TransactionType::WITHDRAWAL,
]
);
break;
case 'deposits':
$this->destroyTransactions(
[
TransactionType::DEPOSIT,
]
);
break;
case 'transfers':
$this->destroyTransactions(
[
TransactionType::TRANSFER,
]
);
break;
}
app('preferences')->mark(); app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }
/**
*
*/
private function destroyBudgets(): void private function destroyBudgets(): void
{ {
/** @var AvailableBudgetRepositoryInterface $abRepository */ /** @var AvailableBudgetRepositoryInterface $abRepository */
$abRepository = app(AvailableBudgetRepositoryInterface::class); $abRepository = app(AvailableBudgetRepositoryInterface::class);
$abRepository->destroyAll(); $abRepository->destroyAll();
/** @var BudgetLimitRepositoryInterface $blRepository */ /** @var BudgetLimitRepositoryInterface $blRepository */
$blRepository = app(BudgetLimitRepositoryInterface::class); $blRepository = app(BudgetLimitRepositoryInterface::class);
$blRepository->destroyAll(); $blRepository->destroyAll();
/** @var BudgetRepositoryInterface $budgetRepository */ /** @var BudgetRepositoryInterface $budgetRepository */
@@ -219,9 +112,6 @@ class DestroyController extends Controller
$budgetRepository->destroyAll(); $budgetRepository->destroyAll();
} }
/**
*
*/
private function destroyBills(): void private function destroyBills(): void
{ {
/** @var BillRepositoryInterface $repository */ /** @var BillRepositoryInterface $repository */
@@ -229,9 +119,6 @@ class DestroyController extends Controller
$repository->destroyAll(); $repository->destroyAll();
} }
/**
*
*/
private function destroyPiggyBanks(): void private function destroyPiggyBanks(): void
{ {
/** @var PiggyBankRepositoryInterface $repository */ /** @var PiggyBankRepositoryInterface $repository */
@@ -239,9 +126,6 @@ class DestroyController extends Controller
$repository->destroyAll(); $repository->destroyAll();
} }
/**
*
*/
private function destroyRules(): void private function destroyRules(): void
{ {
/** @var RuleGroupRepositoryInterface $repository */ /** @var RuleGroupRepositoryInterface $repository */
@@ -249,9 +133,6 @@ class DestroyController extends Controller
$repository->destroyAll(); $repository->destroyAll();
} }
/**
*
*/
private function destroyRecurringTransactions(): void private function destroyRecurringTransactions(): void
{ {
/** @var RecurringRepositoryInterface $repository */ /** @var RecurringRepositoryInterface $repository */
@@ -259,9 +140,6 @@ class DestroyController extends Controller
$repository->destroyAll(); $repository->destroyAll();
} }
/**
*
*/
private function destroyCategories(): void private function destroyCategories(): void
{ {
/** @var CategoryRepositoryInterface $categoryRepos */ /** @var CategoryRepositoryInterface $categoryRepos */
@@ -269,9 +147,6 @@ class DestroyController extends Controller
$categoryRepos->destroyAll(); $categoryRepos->destroyAll();
} }
/**
*
*/
private function destroyTags(): void private function destroyTags(): void
{ {
/** @var TagRepositoryInterface $tagRepository */ /** @var TagRepositoryInterface $tagRepository */
@@ -279,9 +154,6 @@ class DestroyController extends Controller
$tagRepository->destroyAll(); $tagRepository->destroyAll();
} }
/**
* @return void
*/
private function destroyObjectGroups(): void private function destroyObjectGroups(): void
{ {
/** @var ObjectGroupRepositoryInterface $repository */ /** @var ObjectGroupRepositoryInterface $repository */
@@ -290,7 +162,7 @@ class DestroyController extends Controller
} }
/** /**
* @param array $types * @param array<int, string> $types
*/ */
private function destroyAccounts(array $types): void private function destroyAccounts(array $types): void
{ {
@@ -303,19 +175,22 @@ class DestroyController extends Controller
foreach ($collection as $account) { foreach ($collection as $account) {
$count = $account->transactions()->count(); $count = $account->transactions()->count();
if (true === $this->unused && 0 === $count) { if (true === $this->unused && 0 === $count) {
Log::info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); app('log')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
Log::channel('audit')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
$service->destroy($account, null); $service->destroy($account, null);
continue; continue;
} }
if (false === $this->unused) { if (false === $this->unused) {
Log::info(sprintf('Deleting account #%d "%s"', $account->id, $account->name)); app('log')->info(sprintf('Deleting account #%d "%s"', $account->id, $account->name));
Log::channel('audit')->warning(sprintf('Deleted account #%d "%s"', $account->id, $account->name));
$service->destroy($account, null); $service->destroy($account, null);
} }
} }
} }
/** /**
* @param array $types * @param array<int, string> $types
*/ */
private function destroyTransactions(array $types): void private function destroyTransactions(array $types): void
{ {
@@ -323,6 +198,7 @@ class DestroyController extends Controller
$repository = app(JournalRepositoryInterface::class); $repository = app(JournalRepositoryInterface::class);
$journals = $repository->findByType($types); $journals = $repository->findByType($types);
$service = app(JournalDestroyService::class); $service = app(JournalDestroyService::class);
/** @var TransactionJournal $journal */ /** @var TransactionJournal $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
$service->destroy($journal); $service->destroy($journal);

View File

@@ -29,8 +29,6 @@ use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Support\Export\ExportDataGenerator; use FireflyIII\Support\Export\ExportDataGenerator;
use Illuminate\Http\Response as LaravelResponse; use Illuminate\Http\Response as LaravelResponse;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/** /**
* Class ExportController * Class ExportController
@@ -59,10 +57,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportAccounts * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportAccounts
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function accounts(ExportRequest $request): LaravelResponse public function accounts(ExportRequest $request): LaravelResponse
{ {
@@ -72,12 +69,7 @@ class ExportController extends Controller
} }
/** /**
* @param string $key
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/ */
private function returnExport(string $key): LaravelResponse private function returnExport(string $key): LaravelResponse
{ {
@@ -90,13 +82,14 @@ class ExportController extends Controller
$response $response
->header('Content-Description', 'File Transfer') ->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream') ->header('Content-Type', 'application/octet-stream')
->header('Content-Disposition', 'attachment; filename=' . $fileName) ->header('Content-Disposition', 'attachment; filename='.$fileName)
->header('Content-Transfer-Encoding', 'binary') ->header('Content-Transfer-Encoding', 'binary')
->header('Connection', 'Keep-Alive') ->header('Connection', 'Keep-Alive')
->header('Expires', '0') ->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public') ->header('Pragma', 'public')
->header('Content-Length', (string)strlen($data[$key])); ->header('Content-Length', (string)strlen($data[$key]))
;
return $response; return $response;
} }
@@ -105,10 +98,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBills * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBills
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function bills(ExportRequest $request): LaravelResponse public function bills(ExportRequest $request): LaravelResponse
{ {
@@ -121,10 +113,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBudgets * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBudgets
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function budgets(ExportRequest $request): LaravelResponse public function budgets(ExportRequest $request): LaravelResponse
{ {
@@ -137,10 +128,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportCategories * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportCategories
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function categories(ExportRequest $request): LaravelResponse public function categories(ExportRequest $request): LaravelResponse
{ {
@@ -153,10 +143,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportPiggies * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportPiggies
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function piggyBanks(ExportRequest $request): LaravelResponse public function piggyBanks(ExportRequest $request): LaravelResponse
{ {
@@ -169,10 +158,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRecurring * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRecurring
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function recurring(ExportRequest $request): LaravelResponse public function recurring(ExportRequest $request): LaravelResponse
{ {
@@ -185,10 +173,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRules * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRules
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function rules(ExportRequest $request): LaravelResponse public function rules(ExportRequest $request): LaravelResponse
{ {
@@ -201,10 +188,9 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTags * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTags
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function tags(ExportRequest $request): LaravelResponse public function tags(ExportRequest $request): LaravelResponse
{ {
@@ -217,9 +203,6 @@ class ExportController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTransactions * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTransactions
* *
* @param ExportRequest $request
*
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(ExportRequest $request): LaravelResponse public function transactions(ExportRequest $request): LaravelResponse

View File

@@ -35,6 +35,7 @@ use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -46,11 +47,10 @@ class PurgeController extends Controller
* TODO cleanup and use repositories. * TODO cleanup and use repositories.
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData
*
* @return JsonResponse
*/ */
public function purge(): JsonResponse public function purge(): JsonResponse
{ {
/** @var User $user */
$user = auth()->user(); $user = auth()->user();
// some manual code, too lazy to call all repositories. // some manual code, too lazy to call all repositories.
@@ -62,8 +62,10 @@ class PurgeController extends Controller
Bill::whereUserId($user->id)->onlyTrashed()->forceDelete(); Bill::whereUserId($user->id)->onlyTrashed()->forceDelete();
// piggies // piggies
$set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id') $set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id')
->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*']); ->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*'])
;
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */
foreach ($set as $piggy) { foreach ($set as $piggy) {
$piggy->forceDelete(); $piggy->forceDelete();
@@ -84,7 +86,6 @@ class PurgeController extends Controller
// tags // tags
Tag::whereUserId($user->id)->onlyTrashed()->forceDelete(); Tag::whereUserId($user->id)->onlyTrashed()->forceDelete();
// accounts // accounts
Account::whereUserId($user->id)->onlyTrashed()->forceDelete(); Account::whereUserId($user->id)->onlyTrashed()->forceDelete();

View File

@@ -28,12 +28,10 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Insight\GenericRequest; use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Account\OperationsRepositoryInterface; use FireflyIII\Repositories\Account\OperationsRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Api\ApiSupport; use FireflyIII\Support\Http\Api\ApiSupport;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
*
* Class AccountController * Class AccountController
* *
* Shows expense information grouped or limited by date. * Shows expense information grouped or limited by date.
@@ -43,27 +41,21 @@ class AccountController extends Controller
{ {
use ApiSupport; use ApiSupport;
private CurrencyRepositoryInterface $currencyRepository;
private OperationsRepositoryInterface $opsRepository; private OperationsRepositoryInterface $opsRepository;
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
$user = auth()->user(); $user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user); $this->repository->setUser($user);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->currencyRepository->setUser($user);
$this->opsRepository = app(OperationsRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user); $this->opsRepository->setUser($user);
@@ -75,10 +67,6 @@ class AccountController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseAsset * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseAsset
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function asset(GenericRequest $request): JsonResponse public function asset(GenericRequest $request): JsonResponse
{ {
@@ -106,10 +94,6 @@ class AccountController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseExpense * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseExpense
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function expense(GenericRequest $request): JsonResponse public function expense(GenericRequest $request): JsonResponse
{ {

View File

@@ -60,18 +60,14 @@ class BillController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBill * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBill
* *
* Expenses per bill, possibly filtered by bill and account. * Expenses per bill, possibly filtered by bill and account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function bill(GenericRequest $request): JsonResponse public function bill(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$bills = $request->getBills(); $bills = $request->getBills();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// get all bills: // get all bills:
if (0 === $bills->count()) { if (0 === $bills->count()) {
@@ -79,7 +75,7 @@ class BillController extends Controller
} }
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
$collector->setBills($bills); $collector->setBills($bills);
@@ -92,7 +88,7 @@ class BillController extends Controller
$foreignKey = sprintf('%d-%d', $billId, $foreignCurrencyId); $foreignKey = sprintf('%d-%d', $billId, $foreignCurrencyId);
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] ??= [
'id' => (string)$billId, 'id' => (string)$billId,
'name' => $journal['bill_name'], 'name' => $journal['bill_name'],
'difference' => '0', 'difference' => '0',
@@ -104,7 +100,7 @@ class BillController extends Controller
$response[$key]['difference_float'] = (float)$response[$key]['difference']; // intentional float $response[$key]['difference_float'] = (float)$response[$key]['difference']; // intentional float
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignKey] = $response[$foreignKey] ?? [ $response[$foreignKey] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
@@ -123,20 +119,16 @@ class BillController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBill * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBill
* *
* Expenses for no bill filtered by account. * Expenses for no bill filtered by account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noBill(GenericRequest $request): JsonResponse public function noBill(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
$collector->withoutBill(); $collector->withoutBill();
@@ -147,7 +139,7 @@ class BillController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -157,7 +149,7 @@ class BillController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,

View File

@@ -43,8 +43,6 @@ class BudgetController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -67,10 +65,6 @@ class BudgetController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBudget
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function budget(GenericRequest $request): JsonResponse public function budget(GenericRequest $request): JsonResponse
{ {
@@ -82,9 +76,11 @@ class BudgetController extends Controller
if (0 === $budgets->count()) { if (0 === $budgets->count()) {
$budgets = $this->repository->getActiveBudgets(); $budgets = $this->repository->getActiveBudgets();
} }
/** @var Budget $budget */ /** @var Budget $budget */
foreach ($budgets as $budget) { foreach ($budgets as $budget) {
$expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$budget])); $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$budget]));
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
@@ -104,10 +100,6 @@ class BudgetController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBudget
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noBudget(GenericRequest $request): JsonResponse public function noBudget(GenericRequest $request): JsonResponse
{ {
@@ -116,6 +108,7 @@ class BudgetController extends Controller
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$result = []; $result = [];
$expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts); $expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts);
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [

View File

@@ -44,8 +44,6 @@ class CategoryController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -68,10 +66,6 @@ class CategoryController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function category(GenericRequest $request): JsonResponse public function category(GenericRequest $request): JsonResponse
{ {
@@ -83,9 +77,11 @@ class CategoryController extends Controller
if (0 === $categories->count()) { if (0 === $categories->count()) {
$categories = $this->repository->getCategories(); $categories = $this->repository->getCategories();
} }
/** @var Category $category */ /** @var Category $category */
foreach ($categories as $category) { foreach ($categories as $category) {
$expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$category])); $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$category]));
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
@@ -105,10 +101,6 @@ class CategoryController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noCategory(GenericRequest $request): JsonResponse public function noCategory(GenericRequest $request): JsonResponse
{ {
@@ -117,6 +109,7 @@ class CategoryController extends Controller
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$result = []; $result = [];
$expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts); $expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts);
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [

View File

@@ -37,20 +37,16 @@ class PeriodController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTotal * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTotal
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function total(GenericRequest $request): JsonResponse public function total(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) // collect all expenses in this period (regardless of type)
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
@@ -58,7 +54,7 @@ class PeriodController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -68,7 +64,7 @@ class PeriodController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,

View File

@@ -59,20 +59,16 @@ class TagController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoTag * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoTag
* *
* Expenses for no tag filtered by account. * Expenses for no tag filtered by account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noTag(GenericRequest $request): JsonResponse public function noTag(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
$collector->withoutTags(); $collector->withoutTags();
@@ -83,7 +79,7 @@ class TagController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -93,7 +89,7 @@ class TagController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose. $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose.
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
@@ -112,18 +108,14 @@ class TagController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTag * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTag
* *
* Expenses per tag, possibly filtered by tag and account. * Expenses per tag, possibly filtered by tag and account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function tag(GenericRequest $request): JsonResponse public function tag(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$tags = $request->getTags(); $tags = $request->getTags();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// get all tags: // get all tags:
if (0 === $tags->count()) { if (0 === $tags->count()) {
@@ -131,10 +123,11 @@ class TagController extends Controller
} }
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts);
$collector->setTags($tags); $collector->setTags($tags);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
/** @var array $journal */ /** @var array $journal */
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
$currencyId = (int)$journal['currency_id']; $currencyId = (int)$journal['currency_id'];
@@ -148,7 +141,7 @@ class TagController extends Controller
// on currency ID // on currency ID
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] ??= [
'id' => (string)$tagId, 'id' => (string)$tagId,
'name' => $tag['name'], 'name' => $tag['name'],
'difference' => '0', 'difference' => '0',

View File

@@ -28,12 +28,10 @@ use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Insight\GenericRequest; use FireflyIII\Api\V1\Requests\Insight\GenericRequest;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Account\OperationsRepositoryInterface; use FireflyIII\Repositories\Account\OperationsRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Api\ApiSupport; use FireflyIII\Support\Http\Api\ApiSupport;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
*
* Class AccountController * Class AccountController
* *
* Shows income information grouped or limited by date. * Shows income information grouped or limited by date.
@@ -43,27 +41,21 @@ class AccountController extends Controller
{ {
use ApiSupport; use ApiSupport;
private CurrencyRepositoryInterface $currencyRepository;
private OperationsRepositoryInterface $opsRepository; private OperationsRepositoryInterface $opsRepository;
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
$user = auth()->user(); $user = auth()->user();
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser($user); $this->repository->setUser($user);
$this->currencyRepository = app(CurrencyRepositoryInterface::class);
$this->currencyRepository->setUser($user);
$this->opsRepository = app(OperationsRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class);
$this->opsRepository->setUser($user); $this->opsRepository->setUser($user);
@@ -75,10 +67,6 @@ class AccountController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeAsset * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeAsset
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function asset(GenericRequest $request): JsonResponse public function asset(GenericRequest $request): JsonResponse
{ {
@@ -87,6 +75,7 @@ class AccountController extends Controller
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$income = $this->opsRepository->sumIncomeByDestination($start, $end, $assetAccounts); $income = $this->opsRepository->sumIncomeByDestination($start, $end, $assetAccounts);
$result = []; $result = [];
/** @var array $entry */ /** @var array $entry */
foreach ($income as $entry) { foreach ($income as $entry) {
$result[] = [ $result[] = [
@@ -105,10 +94,6 @@ class AccountController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeRevenue * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeRevenue
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function revenue(GenericRequest $request): JsonResponse public function revenue(GenericRequest $request): JsonResponse
{ {

View File

@@ -44,8 +44,6 @@ class CategoryController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -68,10 +66,6 @@ class CategoryController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeCategory
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function category(GenericRequest $request): JsonResponse public function category(GenericRequest $request): JsonResponse
{ {
@@ -83,9 +77,11 @@ class CategoryController extends Controller
if (0 === $categories->count()) { if (0 === $categories->count()) {
$categories = $this->repository->getCategories(); $categories = $this->repository->getCategories();
} }
/** @var Category $category */ /** @var Category $category */
foreach ($categories as $category) { foreach ($categories as $category) {
$expenses = $this->opsRepository->sumIncome($start, $end, $assetAccounts, new Collection([$category])); $expenses = $this->opsRepository->sumIncome($start, $end, $assetAccounts, new Collection([$category]));
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
@@ -105,10 +101,6 @@ class CategoryController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoCategory
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noCategory(GenericRequest $request): JsonResponse public function noCategory(GenericRequest $request): JsonResponse
{ {
@@ -117,6 +109,7 @@ class CategoryController extends Controller
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$result = []; $result = [];
$expenses = $this->noRepository->sumIncome($start, $end, $assetAccounts); $expenses = $this->noRepository->sumIncome($start, $end, $assetAccounts);
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [

View File

@@ -37,20 +37,16 @@ class PeriodController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTotal * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTotal
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function total(GenericRequest $request): JsonResponse public function total(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) // collect all expenses in this period (regardless of type)
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
@@ -58,7 +54,7 @@ class PeriodController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -68,7 +64,7 @@ class PeriodController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose. $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose.
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,

View File

@@ -60,20 +60,16 @@ class TagController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTag * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTag
* *
* Expenses for no tag filtered by account. * Expenses for no tag filtered by account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noTag(GenericRequest $request): JsonResponse public function noTag(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts);
$collector->withoutTags(); $collector->withoutTags();
@@ -84,7 +80,7 @@ class TagController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -94,7 +90,7 @@ class TagController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
@@ -116,18 +112,14 @@ class TagController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoTag * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoTag
* *
* Expenses per tag, possibly filtered by tag and account. * Expenses per tag, possibly filtered by tag and account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function tag(GenericRequest $request): JsonResponse public function tag(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$tags = $request->getTags(); $tags = $request->getTags();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// get all tags: // get all tags:
if (0 === $tags->count()) { if (0 === $tags->count()) {
@@ -135,10 +127,11 @@ class TagController extends Controller
} }
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts);
$collector->setTags($tags); $collector->setTags($tags);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
/** @var array $journal */ /** @var array $journal */
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
$currencyId = (int)$journal['currency_id']; $currencyId = (int)$journal['currency_id'];
@@ -152,7 +145,7 @@ class TagController extends Controller
// on currency ID // on currency ID
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] ??= [
'id' => (string)$tagId, 'id' => (string)$tagId,
'name' => $tag['name'], 'name' => $tag['name'],
'difference' => '0', 'difference' => '0',

View File

@@ -40,8 +40,6 @@ class AccountController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -60,10 +58,6 @@ class AccountController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransfers * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransfers
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function asset(GenericRequest $request): JsonResponse public function asset(GenericRequest $request): JsonResponse
{ {

View File

@@ -43,8 +43,6 @@ class CategoryController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -67,10 +65,6 @@ class CategoryController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function category(GenericRequest $request): JsonResponse public function category(GenericRequest $request): JsonResponse
{ {
@@ -82,9 +76,11 @@ class CategoryController extends Controller
if (0 === $categories->count()) { if (0 === $categories->count()) {
$categories = $this->repository->getCategories(); $categories = $this->repository->getCategories();
} }
/** @var Category $category */ /** @var Category $category */
foreach ($categories as $category) { foreach ($categories as $category) {
$expenses = $this->opsRepository->sumTransfers($start, $end, $assetAccounts, new Collection([$category])); $expenses = $this->opsRepository->sumTransfers($start, $end, $assetAccounts, new Collection([$category]));
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
@@ -104,10 +100,6 @@ class CategoryController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noCategory(GenericRequest $request): JsonResponse public function noCategory(GenericRequest $request): JsonResponse
{ {
@@ -116,6 +108,7 @@ class CategoryController extends Controller
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$result = []; $result = [];
$expenses = $this->noRepository->sumTransfers($start, $end, $assetAccounts); $expenses = $this->noRepository->sumTransfers($start, $end, $assetAccounts);
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [

View File

@@ -37,20 +37,16 @@ class PeriodController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTotal * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTotal
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function total(GenericRequest $request): JsonResponse public function total(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) // collect all expenses in this period (regardless of type)
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
@@ -58,7 +54,7 @@ class PeriodController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -68,7 +64,7 @@ class PeriodController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,

View File

@@ -57,20 +57,16 @@ class TagController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoTag * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoTag
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function noTag(GenericRequest $request): JsonResponse public function noTag(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts);
$collector->withoutTags(); $collector->withoutTags();
@@ -81,7 +77,7 @@ class TagController extends Controller
$foreignCurrencyId = (int)$journal['foreign_currency_id']; $foreignCurrencyId = (int)$journal['foreign_currency_id'];
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$currencyId] = $response[$currencyId] ?? [ $response[$currencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
@@ -91,7 +87,7 @@ class TagController extends Controller
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] ??= [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
@@ -113,18 +109,14 @@ class TagController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTag * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTag
* *
* Transfers per tag, possibly filtered by tag and account. * Transfers per tag, possibly filtered by tag and account.
*
* @param GenericRequest $request
*
* @return JsonResponse
*/ */
public function tag(GenericRequest $request): JsonResponse public function tag(GenericRequest $request): JsonResponse
{ {
$accounts = $request->getAssetAccounts(); $accounts = $request->getAssetAccounts();
$tags = $request->getTags(); $tags = $request->getTags();
$start = $request->getStart(); $start = $request->getStart();
$end = $request->getEnd(); $end = $request->getEnd();
$response = []; $response = [];
// get all tags: // get all tags:
if (0 === $tags->count()) { if (0 === $tags->count()) {
@@ -132,10 +124,11 @@ class TagController extends Controller
} }
// collect all expenses in this period (regardless of type) by the given bills and accounts. // collect all expenses in this period (regardless of type) by the given bills and accounts.
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts);
$collector->setTags($tags); $collector->setTags($tags);
$genericSet = $collector->getExtractedJournals(); $genericSet = $collector->getExtractedJournals();
/** @var array $journal */ /** @var array $journal */
foreach ($genericSet as $journal) { foreach ($genericSet as $journal) {
$currencyId = (int)$journal['currency_id']; $currencyId = (int)$journal['currency_id'];
@@ -149,7 +142,7 @@ class TagController extends Controller
// on currency ID // on currency ID
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] ??= [
'id' => (string)$tagId, 'id' => (string)$tagId,
'name' => $tag['name'], 'name' => $tag['name'],
'difference' => '0', 'difference' => '0',

View File

@@ -33,14 +33,12 @@ use Illuminate\Http\JsonResponse;
*/ */
class DestroyController extends Controller class DestroyController extends Controller
{ {
public const RESOURCE_KEY = 'accounts'; public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -60,10 +58,6 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/deleteAccount * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/deleteAccount
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
*
* @param Account $account
*
* @return JsonResponse
*/ */
public function destroy(Account $account): JsonResponse public function destroy(Account $account): JsonResponse
{ {

View File

@@ -47,14 +47,12 @@ class ListController extends Controller
{ {
use TransactionFilter; use TransactionFilter;
public const RESOURCE_KEY = 'accounts'; public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -73,29 +71,26 @@ class ListController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAttachmentByAccount * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAttachmentByAccount
* *
* @param Account $account
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function attachments(Account $account): JsonResponse public function attachments(Account $account): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->repository->getAttachments($account); $collection = $this->repository->getAttachments($account);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.accounts.attachments', [$account->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -105,33 +100,30 @@ class ListController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listPiggyBankByAccount * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listPiggyBankByAccount
* *
* @param Account $account
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function piggyBanks(Account $account): JsonResponse public function piggyBanks(Account $account): JsonResponse
{ {
// create some objects: // create some objects:
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of budgets. Count it and split it. // get list of budgets. Count it and split it.
$collection = $this->repository->getPiggyBanks($account); $collection = $this->repository->getPiggyBanks($account);
$count = $collection->count(); $count = $collection->count();
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams());
/** @var PiggyBankTransformer $transformer */ /** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class); $transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -143,28 +135,25 @@ class ListController extends Controller
* *
* Show all transaction groups related to the account. * Show all transaction groups related to the account.
* *
*
* @param Request $request
* @param Account $account
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(Request $request, Account $account): JsonResponse public function transactions(Request $request, Account $account): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$type = $request->get('type') ?? 'default'; $type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type')); $types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setUser($admin)->setAccounts(new Collection([$account])) $collector->setUser($admin)->setAccounts(new Collection([$account]))
->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types); ->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types)
;
if (null !== $this->parameters->get('start')) { if (null !== $this->parameters->get('start')) {
$collector->setStart($this->parameters->get('start')); $collector->setStart($this->parameters->get('start'));
@@ -173,15 +162,15 @@ class ListController extends Controller
$collector->setEnd($this->parameters->get('end')); $collector->setEnd($this->parameters->get('end'));
} }
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.accounts.transactions', [$account->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.accounts.transactions', [$account->id]).$this->buildParams());
$groups = $paginator->getCollection(); $groups = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($groups, $transformer, 'transactions'); $resource = new FractalCollection($groups, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -43,14 +43,12 @@ class ShowController extends Controller
{ {
use AccountFilter; use AccountFilter;
public const RESOURCE_KEY = 'accounts'; public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -71,40 +69,36 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function index(Request $request): JsonResponse public function index(Request $request): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$type = $request->get('type') ?? 'all'; $type = $request->get('type') ?? 'all';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
// types to get, page size: // types to get, page size:
$types = $this->mapAccountTypes($this->parameters->get('type')); $types = $this->mapAccountTypes($this->parameters->get('type'));
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of accounts. Count it and split it. // get list of accounts. Count it and split it.
$this->repository->resetAccountOrder(); $this->repository->resetAccountOrder();
$collection = $this->repository->getAccountsByType($types, $this->parameters->get('sort') ?? []); $collection = $this->repository->getAccountsByType($types, $this->parameters->get('sort') ?? []);
$count = $collection->count(); $count = $collection->count();
// continue sort: // continue sort:
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.accounts.index') . $this->buildParams()); $paginator->setPath(route('api.v1.accounts.index').$this->buildParams());
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); $resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY);
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -115,22 +109,18 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/getAccount * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/getAccount
* *
* Show single instance. * Show single instance.
*
* @param Account $account
*
* @return JsonResponse
*/ */
public function show(Account $account): JsonResponse public function show(Account $account): JsonResponse
{ {
// get list of accounts. Count it and split it. // get list of accounts. Count it and split it.
$this->repository->resetAccountOrder(); $this->repository->resetAccountOrder();
$account->refresh(); $account->refresh();
$manager = $this->getManager(); $manager = $this->getManager();
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, self::RESOURCE_KEY); $resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -35,14 +35,12 @@ use League\Fractal\Resource\Item;
*/ */
class StoreController extends Controller class StoreController extends Controller
{ {
public const RESOURCE_KEY = 'accounts'; public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -62,23 +60,19 @@ class StoreController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/storeAccount * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/storeAccount
* *
* Store a new instance. * Store a new instance.
*
* @param StoreRequest $request
*
* @return JsonResponse
*/ */
public function store(StoreRequest $request): JsonResponse public function store(StoreRequest $request): JsonResponse
{ {
$data = $request->getAllAccountData(); $data = $request->getAllAccountData();
$this->repository->resetAccountOrder(); $this->repository->resetAccountOrder();
$account = $this->repository->store($data); $account = $this->repository->store($data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, self::RESOURCE_KEY); $resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -29,23 +29,19 @@ use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Transformers\AccountTransformer; use FireflyIII\Transformers\AccountTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Preferences;
/** /**
* Class UpdateController * Class UpdateController
*/ */
class UpdateController extends Controller class UpdateController extends Controller
{ {
public const RESOURCE_KEY = 'accounts'; public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository; private AccountRepositoryInterface $repository;
/** /**
* AccountController constructor. * AccountController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -65,26 +61,21 @@ class UpdateController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/updateAccount * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/updateAccount
* *
* Update account. * Update account.
*
* @param UpdateRequest $request
* @param Account $account
*
* @return JsonResponse
*/ */
public function update(UpdateRequest $request, Account $account): JsonResponse public function update(UpdateRequest $request, Account $account): JsonResponse
{ {
Log::debug(sprintf('Now in %s', __METHOD__)); app('log')->debug(sprintf('Now in %s', __METHOD__));
$data = $request->getUpdateData(); $data = $request->getUpdateData();
$data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type); $data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type);
$account = $this->repository->update($account, $data); $account = $this->repository->update($account, $data);
$manager = $this->getManager(); $manager = $this->getManager();
$account->refresh(); $account->refresh();
Preferences::mark(); app('preferences')->mark();
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($account, $transformer, self::RESOURCE_KEY); $resource = new Item($account, $transformer, self::RESOURCE_KEY);
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -29,6 +29,8 @@ use FireflyIII\Models\Attachment;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/** /**
* Class DestroyController * Class DestroyController
@@ -39,8 +41,6 @@ class DestroyController extends Controller
/** /**
* DestroyController constructor. * DestroyController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -63,14 +63,15 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/deleteAttachment * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/deleteAttachment
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
*
*
* @param Attachment $attachment
*
* @return JsonResponse
*/ */
public function destroy(Attachment $attachment): JsonResponse public function destroy(Attachment $attachment): JsonResponse
{ {
if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
throw new NotFoundHttpException();
}
$this->repository->destroy($attachment); $this->repository->destroy($attachment);
app('preferences')->mark(); app('preferences')->mark();

View File

@@ -33,9 +33,11 @@ use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response as LaravelResponse; use Illuminate\Http\Response as LaravelResponse;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Log;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/** /**
* Class ShowController * Class ShowController
@@ -46,8 +48,6 @@ class ShowController extends Controller
/** /**
* ShowController constructor. * ShowController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -71,13 +71,15 @@ class ShowController extends Controller
* *
* Download an attachment. * Download an attachment.
* *
* @param Attachment $attachment * @throws FireflyException
*
* @return LaravelResponse
* @throws FireflyException
*/ */
public function download(Attachment $attachment): LaravelResponse public function download(Attachment $attachment): LaravelResponse
{ {
if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
throw new NotFoundHttpException();
}
if (false === $attachment->uploaded) { if (false === $attachment->uploaded) {
throw new FireflyException('200000: File has not been uploaded (yet).'); throw new FireflyException('200000: File has not been uploaded (yet).');
} }
@@ -85,27 +87,29 @@ class ShowController extends Controller
throw new FireflyException('200000: File has not been uploaded (yet).'); throw new FireflyException('200000: File has not been uploaded (yet).');
} }
if ($this->repository->exists($attachment)) { if ($this->repository->exists($attachment)) {
$content = $this->repository->getContent($attachment); $content = $this->repository->getContent($attachment);
if ('' === $content) { if ('' === $content) {
throw new FireflyException('200002: File is empty (zero bytes).'); throw new FireflyException('200002: File is empty (zero bytes).');
} }
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
/** @var LaravelResponse $response */ /** @var LaravelResponse $response */
$response = response($content); $response = response($content);
$response $response
->header('Content-Description', 'File Transfer') ->header('Content-Description', 'File Transfer')
->header('Content-Type', 'application/octet-stream') ->header('Content-Type', 'application/octet-stream')
->header('Content-Disposition', 'attachment; filename=' . $quoted) ->header('Content-Disposition', 'attachment; filename='.$quoted)
->header('Content-Transfer-Encoding', 'binary') ->header('Content-Transfer-Encoding', 'binary')
->header('Connection', 'Keep-Alive') ->header('Connection', 'Keep-Alive')
->header('Expires', '0') ->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public') ->header('Pragma', 'public')
->header('Content-Length', (string)strlen($content)); ->header('Content-Length', (string)strlen($content))
;
return $response; return $response;
} }
throw new FireflyException('200003: File does not exist.'); throw new FireflyException('200003: File does not exist.');
} }
@@ -115,15 +119,20 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
$manager = $this->getManager(); if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
throw new NotFoundHttpException();
}
$manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of attachments. Count it and split it. // get list of attachments. Count it and split it.
$collection = $this->repository->get(); $collection = $this->repository->get();
@@ -131,14 +140,14 @@ class ShowController extends Controller
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.attachments.index') . $this->buildParams()); $paginator->setPath(route('api.v1.attachments.index').$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -149,19 +158,21 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/getAttachment * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/getAttachment
* *
* Display the specified resource. * Display the specified resource.
*
* @param Attachment $attachment
*
* @return JsonResponse
*/ */
public function show(Attachment $attachment): JsonResponse public function show(Attachment $attachment): JsonResponse
{ {
$manager = $this->getManager(); if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
throw new NotFoundHttpException();
}
$manager = $this->getManager();
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments'); $resource = new Item($attachment, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -36,6 +36,7 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/** /**
* Class StoreController * Class StoreController
@@ -46,8 +47,6 @@ class StoreController extends Controller
/** /**
* StoreController constructor. * StoreController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -71,43 +70,45 @@ class StoreController extends Controller
* *
* Store a newly created resource in storage. * Store a newly created resource in storage.
* *
* @param StoreRequest $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function store(StoreRequest $request): JsonResponse public function store(StoreRequest $request): JsonResponse
{ {
Log::debug(sprintf('Now in %s', __METHOD__)); if (true === auth()->user()->hasRole('demo')) {
$data = $request->getAll(); Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
$attachment = $this->repository->store($data);
$manager = $this->getManager(); throw new NotFoundHttpException();
}
app('log')->debug(sprintf('Now in %s', __METHOD__));
$data = $request->getAll();
$attachment = $this->repository->store($data);
$manager = $this->getManager();
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments'); $resource = new Item($attachment, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }
/** /**
* Upload an attachment. * Upload an attachment.
*
*
* @param Request $request
* @param Attachment $attachment
*
* @return JsonResponse
*/ */
public function upload(Request $request, Attachment $attachment): JsonResponse public function upload(Request $request, Attachment $attachment): JsonResponse
{ {
if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
throw new NotFoundHttpException();
}
/** @var AttachmentHelperInterface $helper */ /** @var AttachmentHelperInterface $helper */
$helper = app(AttachmentHelperInterface::class); $helper = app(AttachmentHelperInterface::class);
$body = $request->getContent(); $body = $request->getContent();
if ('' === $body) { if ('' === $body) {
Log::error('Body of attachment is empty.'); app('log')->error('Body of attachment is empty.');
return response()->json([], 422); return response()->json([], 422);
} }

View File

@@ -31,7 +31,9 @@ use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer; use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/** /**
* Class UpdateController * Class UpdateController
@@ -42,8 +44,6 @@ class UpdateController extends Controller
/** /**
* UpdateController constructor. * UpdateController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -66,23 +66,23 @@ class UpdateController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/updateAttachment * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/updateAttachment
* *
* Update the specified resource in storage. * Update the specified resource in storage.
*
* @param UpdateRequest $request
* @param Attachment $attachment
*
* @return JsonResponse
*/ */
public function update(UpdateRequest $request, Attachment $attachment): JsonResponse public function update(UpdateRequest $request, Attachment $attachment): JsonResponse
{ {
$data = $request->getAll(); if (true === auth()->user()->hasRole('demo')) {
Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__));
throw new NotFoundHttpException();
}
$data = $request->getAll();
$this->repository->update($attachment, $data); $this->repository->update($attachment, $data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($attachment, $transformer, 'attachments'); $resource = new Item($attachment, $transformer, 'attachments');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -44,8 +44,6 @@ class ShowController extends Controller
/** /**
* AvailableBudgetController constructor. * AvailableBudgetController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -68,18 +66,17 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$start = $this->parameters->get('start'); $start = $this->parameters->get('start');
$end = $this->parameters->get('end'); $end = $this->parameters->get('end');
// get list of available budgets. Count it and split it. // get list of available budgets. Count it and split it.
$collection = $this->abRepository->getAvailableBudgetsByDate($start, $end); $collection = $this->abRepository->getAvailableBudgetsByDate($start, $end);
@@ -87,14 +84,14 @@ class ShowController extends Controller
$availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.available-budgets.index') . $this->buildParams()); $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams());
/** @var AvailableBudgetTransformer $transformer */ /** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class); $transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets'); $resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -105,20 +102,16 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/available_budgets/getAvailableBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/available_budgets/getAvailableBudget
* *
* Display the specified resource. * Display the specified resource.
*
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/ */
public function show(AvailableBudget $availableBudget): JsonResponse public function show(AvailableBudget $availableBudget): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
/** @var AvailableBudgetTransformer $transformer */ /** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class); $transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($availableBudget, $transformer, 'available_budgets'); $resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -37,8 +37,6 @@ class DestroyController extends Controller
/** /**
* BillController constructor. * BillController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -58,10 +56,6 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/deleteBill * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/deleteBill
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
*
* @param Bill $bill
*
* @return JsonResponse
*/ */
public function destroy(Bill $bill): JsonResponse public function destroy(Bill $bill): JsonResponse
{ {

View File

@@ -50,8 +50,6 @@ class ListController extends Controller
/** /**
* BillController constructor. * BillController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -72,29 +70,26 @@ class ListController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Bill $bill
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function attachments(Bill $bill): JsonResponse public function attachments(Bill $bill): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->repository->getAttachments($bill); $collection = $this->repository->getAttachments($bill);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.bills.attachments', [$bill->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -106,31 +101,28 @@ class ListController extends Controller
* *
* List all of them. * List all of them.
* *
* @param Bill $bill
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function rules(Bill $bill): JsonResponse public function rules(Bill $bill): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of budgets. Count it and split it. // get list of budgets. Count it and split it.
$collection = $this->repository->getRulesForBill($bill); $collection = $this->repository->getRulesForBill($bill);
$count = $collection->count(); $count = $collection->count();
$rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.bills.rules', [$bill->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams());
/** @var RuleTransformer $transformer */ /** @var RuleTransformer $transformer */
$transformer = app(RuleTransformer::class); $transformer = app(RuleTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($rules, $transformer, 'rules'); $resource = new FractalCollection($rules, $transformer, 'rules');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -142,28 +134,23 @@ class ListController extends Controller
* *
* Show all transactions. * Show all transactions.
* *
* @param Request $request
*
* @param Bill $bill
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(Request $request, Bill $bill): JsonResponse public function transactions(Request $request, Bill $bill): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$type = $request->get('type') ?? 'default'; $type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type')); $types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector $collector
->setUser($admin) ->setUser($admin)
// include source + destination account name and type. // include source + destination account name and type.
@@ -175,7 +162,8 @@ class ListController extends Controller
// set page to retrieve // set page to retrieve
->setPage($this->parameters->get('page')) ->setPage($this->parameters->get('page'))
// set types of transactions to return. // set types of transactions to return.
->setTypes($types); ->setTypes($types)
;
if (null !== $this->parameters->get('start')) { if (null !== $this->parameters->get('start')) {
$collector->setStart($this->parameters->get('start')); $collector->setStart($this->parameters->get('start'));
@@ -185,15 +173,15 @@ class ListController extends Controller
} }
// get paginator. // get paginator.
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.bills.transactions', [$bill->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams());
$transactions = $paginator->getCollection(); $transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -43,8 +43,6 @@ class ShowController extends Controller
/** /**
* BillController constructor. * BillController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -65,24 +63,23 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
$this->repository->correctOrder(); $this->repository->correctOrder();
$bills = $this->repository->getBills(); $bills = $this->repository->getBills();
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$count = $bills->count(); $count = $bills->count();
$bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($bills, $transformer, 'bills'); $resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -93,19 +90,16 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/getBill * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/getBill
* *
* Show the specified bill. * Show the specified bill.
*
* @param Bill $bill
*
* @return JsonResponse
*/ */
public function show(Bill $bill): JsonResponse public function show(Bill $bill): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$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); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -43,8 +43,6 @@ class StoreController extends Controller
/** /**
* BillController constructor. * BillController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -65,22 +63,19 @@ class StoreController extends Controller
* *
* Store a bill. * Store a bill.
* *
* @param StoreRequest $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function store(StoreRequest $request): JsonResponse public function store(StoreRequest $request): JsonResponse
{ {
$data = $request->getAll(); $data = $request->getAll();
$bill = $this->repository->store($data); $bill = $this->repository->store($data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$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); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -40,8 +40,6 @@ class UpdateController extends Controller
/** /**
* BillController constructor. * BillController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -61,23 +59,18 @@ class UpdateController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/updateBill * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/updateBill
* *
* Update a bill. * Update a bill.
*
* @param UpdateRequest $request
* @param Bill $bill
*
* @return JsonResponse
*/ */
public function update(UpdateRequest $request, Bill $bill): JsonResponse public function update(UpdateRequest $request, Bill $bill): JsonResponse
{ {
$data = $request->getAll(); $data = $request->getAll();
$bill = $this->repository->update($bill, $data); $bill = $this->repository->update($bill, $data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$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); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -37,8 +37,6 @@ class DestroyController extends Controller
/** /**
* DestroyController constructor. * DestroyController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -58,10 +56,6 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/deleteBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/deleteBudget
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
*
* @param Budget $budget
*
* @return JsonResponse
*/ */
public function destroy(Budget $budget): JsonResponse public function destroy(Budget $budget): JsonResponse
{ {

View File

@@ -40,9 +40,7 @@ use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
/*** // Class ListController
* Class ListController
*/
class ListController extends Controller class ListController extends Controller
{ {
use TransactionFilter; use TransactionFilter;
@@ -52,8 +50,6 @@ class ListController extends Controller
/** /**
* ListController constructor. * ListController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -74,29 +70,26 @@ class ListController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listAttachmentByBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listAttachmentByBudget
* *
* @param Budget $budget
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function attachments(Budget $budget): JsonResponse public function attachments(Budget $budget): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->repository->getAttachments($budget); $collection = $this->repository->getAttachments($budget);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.attachments', [$budget->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.attachments', [$budget->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -108,26 +101,23 @@ class ListController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Budget $budget
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function budgetLimits(Budget $budget): JsonResponse public function budgetLimits(Budget $budget): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$this->parameters->set('budget_id', $budget->id); $this->parameters->set('budget_id', $budget->id);
$collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); $collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
$count = $collection->count(); $count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams());
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -139,29 +129,24 @@ class ListController extends Controller
* *
* Show all transactions. * Show all transactions.
* *
* @param Request $request
*
* @param Budget $budget
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(Request $request, Budget $budget): JsonResponse public function transactions(Request $request, Budget $budget): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$type = $request->get('type') ?? 'default'; $type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type')); $types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector $collector
->setUser($admin) ->setUser($admin)
// filter on budget. // filter on budget.
@@ -173,7 +158,8 @@ class ListController extends Controller
// set page to retrieve // set page to retrieve
->setPage($this->parameters->get('page')) ->setPage($this->parameters->get('page'))
// set types of transactions to return. // set types of transactions to return.
->setTypes($types); ->setTypes($types)
;
if (null !== $this->parameters->get('start')) { if (null !== $this->parameters->get('start')) {
$collector->setStart($this->parameters->get('start')); $collector->setStart($this->parameters->get('start'));
@@ -182,14 +168,14 @@ class ListController extends Controller
$collector->setEnd($this->parameters->get('end')); $collector->setEnd($this->parameters->get('end'));
} }
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]).$this->buildParams());
$transactions = $paginator->getCollection(); $transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -201,27 +187,24 @@ class ListController extends Controller
* *
* Show all transactions. * Show all transactions.
* *
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function withoutBudget(Request $request): JsonResponse public function withoutBudget(Request $request): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$type = $request->get('type') ?? 'default'; $type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type')); $types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector $collector
->setUser($admin) ->setUser($admin)
// filter on budget. // filter on budget.
@@ -233,7 +216,8 @@ class ListController extends Controller
// set page to retrieve // set page to retrieve
->setPage($this->parameters->get('page')) ->setPage($this->parameters->get('page'))
// set types of transactions to return. // set types of transactions to return.
->setTypes($types); ->setTypes($types)
;
if (null !== $this->parameters->get('start')) { if (null !== $this->parameters->get('start')) {
$collector->setStart($this->parameters->get('start')); $collector->setStart($this->parameters->get('start'));
@@ -242,14 +226,14 @@ class ListController extends Controller
$collector->setEnd($this->parameters->get('end')); $collector->setEnd($this->parameters->get('end'));
} }
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.budgets.without-budget') . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.without-budget').$this->buildParams());
$transactions = $paginator->getCollection(); $transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -45,8 +45,6 @@ class ShowController extends Controller
/** /**
* ListController constructor. * ListController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -69,30 +67,29 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of budgets. Count it and split it. // get list of budgets. Count it and split it.
$collection = $this->repository->getBudgets(); $collection = $this->repository->getBudgets();
$count = $collection->count(); $count = $collection->count();
$budgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $budgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.index') . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.index').$this->buildParams());
/** @var BudgetTransformer $transformer */ /** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class); $transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgets, $transformer, 'budgets'); $resource = new FractalCollection($budgets, $transformer, 'budgets');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -100,20 +97,16 @@ class ShowController extends Controller
/** /**
* Show a budget. * Show a budget.
*
* @param Budget $budget
*
* @return JsonResponse
*/ */
public function show(Budget $budget): JsonResponse public function show(Budget $budget): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BudgetTransformer $transformer */ /** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class); $transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budget, $transformer, 'budgets'); $resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -40,8 +40,6 @@ class StoreController extends Controller
/** /**
* StoreController constructor. * StoreController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -62,23 +60,19 @@ class StoreController extends Controller
* *
* Store a budget. * Store a budget.
* *
* @param StoreRequest $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*
*/ */
public function store(StoreRequest $request): JsonResponse public function store(StoreRequest $request): JsonResponse
{ {
$budget = $this->repository->store($request->getAll()); $budget = $this->repository->store($request->getAll());
$budget->refresh(); $budget->refresh();
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BudgetTransformer $transformer */ /** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class); $transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budget, $transformer, 'budgets'); $resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -40,8 +40,6 @@ class UpdateController extends Controller
/** /**
* UpdateController constructor. * UpdateController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -61,23 +59,18 @@ class UpdateController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudget
* *
* Update a budget. * Update a budget.
*
* @param UpdateRequest $request
* @param Budget $budget
*
* @return JsonResponse
*/ */
public function update(UpdateRequest $request, Budget $budget): JsonResponse public function update(UpdateRequest $request, Budget $budget): JsonResponse
{ {
$data = $request->getAll(); $data = $request->getAll();
$budget = $this->repository->update($budget, $data); $budget = $this->repository->update($budget, $data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BudgetTransformer $transformer */ /** @var BudgetTransformer $transformer */
$transformer = app(BudgetTransformer::class); $transformer = app(BudgetTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budget, $transformer, 'budgets'); $resource = new Item($budget, $transformer, 'budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -40,8 +40,6 @@ class DestroyController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -64,10 +62,6 @@ class DestroyController extends Controller
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
* *
* @param Budget $budget
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function destroy(Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function destroy(Budget $budget, BudgetLimit $budgetLimit): JsonResponse

View File

@@ -28,7 +28,6 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User; use FireflyIII\User;
@@ -44,55 +43,28 @@ class ListController extends Controller
{ {
use TransactionFilter; use TransactionFilter;
private BudgetLimitRepositoryInterface $blRepository;
/**
* BudgetLimitController constructor.
*
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->blRepository = app(BudgetLimitRepositoryInterface::class);
$this->blRepository->setUser($user);
return $next($request);
}
);
}
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionByBudgetLimit * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionByBudgetLimit
* Show all transactions. * Show all transactions.
* *
* @param Request $request
* @param Budget $budget
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$type = $request->get('type') ?? 'default'; $type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type')); $types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector $collector
->setUser($admin) ->setUser($admin)
// filter on budget. // filter on budget.
@@ -104,19 +76,20 @@ class ListController extends Controller
// set page to retrieve // set page to retrieve
->setPage($this->parameters->get('page')) ->setPage($this->parameters->get('page'))
// set types of transactions to return. // set types of transactions to return.
->setTypes($types); ->setTypes($types)
;
$collector->setRange($budgetLimit->start_date, $budgetLimit->end_date); $collector->setRange($budgetLimit->start_date, $budgetLimit->end_date);
$collector->setTypes($types); $collector->setTypes($types);
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]).$this->buildParams());
$transactions = $paginator->getCollection(); $transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -33,7 +33,6 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Transformers\BudgetLimitTransformer; use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
@@ -49,8 +48,6 @@ class ShowController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -74,29 +71,23 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudgetLimitByBudget * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudgetLimitByBudget
* *
* Display a listing of the budget limits for this budget. * Display a listing of the budget limits for this budget.
*
* @param Request $request
* @param Budget $budget
*
* @return JsonResponse
* @throws FireflyException
*/ */
public function index(Request $request, Budget $budget): JsonResponse public function index(Budget $budget): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$manager->parseIncludes('budget'); $manager->parseIncludes('budget');
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); $collection = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
$count = $collection->count(); $count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams());
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -108,27 +99,24 @@ class ShowController extends Controller
* *
* Display a listing of the budget limits for this budget. * Display a listing of the budget limits for this budget.
* *
* @param SameDateRequest $request * @SuppressWarnings(PHPMD.UnusedFormalParameter)
*
* @return JsonResponse
* @throws FireflyException
*/ */
public function indexAll(SameDateRequest $request): JsonResponse public function indexAll(SameDateRequest $request): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$manager->parseIncludes('budget'); $manager->parseIncludes('budget');
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end')); $collection = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
$count = $collection->count(); $count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.budget-limits.index') . $this->buildParams()); $paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams());
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -138,26 +126,21 @@ class ShowController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/getBudgetLimit * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/getBudgetLimit
* *
* @param Request $request
* @param Budget $budget
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function show(Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
if ((int)$budget->id !== (int)$budgetLimit->budget_id) { if ($budget->id !== $budgetLimit->budget_id) {
throw new FireflyException('20028: The budget limit does not belong to the budget.'); throw new FireflyException('20028: The budget limit does not belong to the budget.');
} }
// continue! // continue!
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits'); $resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -41,8 +41,6 @@ class StoreController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -64,11 +62,6 @@ class StoreController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/storeBudgetLimit * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/storeBudgetLimit
* *
* Store a newly created resource in storage. * Store a newly created resource in storage.
*
* @param StoreRequest $request
* @param Budget $budget
*
* @return JsonResponse
*/ */
public function store(StoreRequest $request, Budget $budget): JsonResponse public function store(StoreRequest $request, Budget $budget): JsonResponse
{ {
@@ -77,13 +70,14 @@ class StoreController extends Controller
$data['end_date'] = $data['end']; $data['end_date'] = $data['end'];
$data['budget_id'] = $budget->id; $data['budget_id'] = $budget->id;
$budgetLimit = $this->blRepository->store($data); $budgetLimit = $this->blRepository->store($data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits'); $resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -46,8 +46,6 @@ class UpdateController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit
* *
* BudgetLimitController constructor. * BudgetLimitController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -69,16 +67,11 @@ class UpdateController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit
* *
* @param UpdateRequest $request
* @param Budget $budget
* @param BudgetLimit $budgetLimit
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function update(UpdateRequest $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function update(UpdateRequest $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
if ((int)$budget->id !== (int)$budgetLimit->budget_id) { if ($budget->id !== $budgetLimit->budget_id) {
throw new FireflyException('20028: The budget limit does not belong to the budget.'); throw new FireflyException('20028: The budget limit does not belong to the budget.');
} }
$data = $request->getAll(); $data = $request->getAll();
@@ -87,10 +80,10 @@ class UpdateController extends Controller
$manager = $this->getManager(); $manager = $this->getManager();
/** @var BudgetLimitTransformer $transformer */ /** @var BudgetLimitTransformer $transformer */
$transformer = app(BudgetLimitTransformer::class); $transformer = app(BudgetLimitTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($budgetLimit, $transformer, 'budget_limits'); $resource = new Item($budgetLimit, $transformer, 'budget_limits');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -37,8 +37,6 @@ class DestroyController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -58,10 +56,6 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/deleteCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/deleteCategory
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
*
* @param Category $category
*
* @return JsonResponse
*/ */
public function destroy(Category $category): JsonResponse public function destroy(Category $category): JsonResponse
{ {

View File

@@ -49,8 +49,6 @@ class ListController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -69,29 +67,26 @@ class ListController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/listAttachmentByCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/listAttachmentByCategory
* *
* @param Category $category
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function attachments(Category $category): JsonResponse public function attachments(Category $category): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->repository->getAttachments($category); $collection = $this->repository->getAttachments($category);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.categories.attachments', [$category->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.categories.attachments', [$category->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -103,28 +98,23 @@ class ListController extends Controller
* *
* Show all transactions. * Show all transactions.
* *
* @param Request $request
*
* @param Category $category
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function transactions(Request $request, Category $category): JsonResponse public function transactions(Request $request, Category $category): JsonResponse
{ {
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$type = $request->get('type') ?? 'default'; $type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type); $this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type')); $types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager(); $manager = $this->getManager();
/** @var User $admin */ /** @var User $admin */
$admin = auth()->user(); $admin = auth()->user();
// use new group collector: // use new group collector:
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector $collector
->setUser($admin) ->setUser($admin)
// filter on category. // filter on category.
@@ -136,7 +126,8 @@ class ListController extends Controller
// set page to retrieve // set page to retrieve
->setPage($this->parameters->get('page')) ->setPage($this->parameters->get('page'))
// set types of transactions to return. // set types of transactions to return.
->setTypes($types); ->setTypes($types)
;
if (null !== $this->parameters->get('start')) { if (null !== $this->parameters->get('start')) {
$collector->setStart($this->parameters->get('start')); $collector->setStart($this->parameters->get('start'));
@@ -145,15 +136,15 @@ class ListController extends Controller
$collector->setEnd($this->parameters->get('end')); $collector->setEnd($this->parameters->get('end'));
} }
$paginator = $collector->getPaginatedGroups(); $paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.categories.transactions', [$category->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.categories.transactions', [$category->id]).$this->buildParams());
$transactions = $paginator->getCollection(); $transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */ /** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class); $transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions'); $resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -43,8 +43,6 @@ class ShowController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -65,29 +63,28 @@ class ShowController extends Controller
* *
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of budgets. Count it and split it. // get list of budgets. Count it and split it.
$collection = $this->repository->getCategories(); $collection = $this->repository->getCategories();
$count = $collection->count(); $count = $collection->count();
$categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.categories.index') . $this->buildParams()); $paginator->setPath(route('api.v1.categories.index').$this->buildParams());
/** @var CategoryTransformer $transformer */ /** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class); $transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($categories, $transformer, 'categories'); $resource = new FractalCollection($categories, $transformer, 'categories');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -98,20 +95,16 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/getCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/getCategory
* *
* Show the category. * Show the category.
*
* @param Category $category
*
* @return JsonResponse
*/ */
public function show(Category $category): JsonResponse public function show(Category $category): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
/** @var CategoryTransformer $transformer */ /** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class); $transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($category, $transformer, 'categories'); $resource = new Item($category, $transformer, 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -40,8 +40,6 @@ class StoreController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -62,21 +60,18 @@ class StoreController extends Controller
* *
* Store new category. * Store new category.
* *
* @param StoreRequest $request
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function store(StoreRequest $request): JsonResponse public function store(StoreRequest $request): JsonResponse
{ {
$category = $this->repository->store($request->getAll()); $category = $this->repository->store($request->getAll());
$manager = $this->getManager(); $manager = $this->getManager();
/** @var CategoryTransformer $transformer */ /** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class); $transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($category, $transformer, 'categories'); $resource = new Item($category, $transformer, 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -40,8 +40,6 @@ class UpdateController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -61,23 +59,18 @@ class UpdateController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/updateCategory * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/updateCategory
* *
* Update the category. * Update the category.
*
* @param UpdateRequest $request
* @param Category $category
*
* @return JsonResponse
*/ */
public function update(UpdateRequest $request, Category $category): JsonResponse public function update(UpdateRequest $request, Category $category): JsonResponse
{ {
$data = $request->getAll(); $data = $request->getAll();
$category = $this->repository->update($category, $data); $category = $this->repository->update($category, $data);
$manager = $this->getManager(); $manager = $this->getManager();
/** @var CategoryTransformer $transformer */ /** @var CategoryTransformer $transformer */
$transformer = app(CategoryTransformer::class); $transformer = app(CategoryTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($category, $transformer, 'categories'); $resource = new Item($category, $transformer, 'categories');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -38,8 +38,6 @@ class DestroyController extends Controller
/** /**
* ObjectGroupController constructor. * ObjectGroupController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -61,10 +59,6 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/deleteObjectGroup * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/deleteObjectGroup
* *
* Remove the specified resource from storage. * Remove the specified resource from storage.
*
* @param ObjectGroup $objectGroup
*
* @return JsonResponse
*/ */
public function destroy(ObjectGroup $objectGroup): JsonResponse public function destroy(ObjectGroup $objectGroup): JsonResponse
{ {

View File

@@ -44,8 +44,6 @@ class ListController extends Controller
/** /**
* ObjectGroupController constructor. * ObjectGroupController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -68,30 +66,27 @@ class ListController extends Controller
* *
* List all bills in this object group * List all bills in this object group
* *
* @param ObjectGroup $objectGroup
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function bills(ObjectGroup $objectGroup): JsonResponse public function bills(ObjectGroup $objectGroup): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of piggy banks. Count it and split it. // get list of piggy banks. Count it and split it.
$collection = $this->repository->getBills($objectGroup); $collection = $this->repository->getBills($objectGroup);
$count = $collection->count(); $count = $collection->count();
$bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]).$this->buildParams());
/** @var BillTransformer $transformer */ /** @var BillTransformer $transformer */
$transformer = app(BillTransformer::class); $transformer = app(BillTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($bills, $transformer, 'bills'); $resource = new FractalCollection($bills, $transformer, 'bills');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -103,33 +98,30 @@ class ListController extends Controller
* *
* List all piggies under the object group. * List all piggies under the object group.
* *
* @param ObjectGroup $objectGroup
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function piggyBanks(ObjectGroup $objectGroup): JsonResponse public function piggyBanks(ObjectGroup $objectGroup): JsonResponse
{ {
// create some objects: // create some objects:
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
// get list of piggy banks. Count it and split it. // get list of piggy banks. Count it and split it.
$collection = $this->repository->getPiggyBanks($objectGroup); $collection = $this->repository->getPiggyBanks($objectGroup);
$count = $collection->count(); $count = $collection->count();
$piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.object-groups.piggy-banks', [$objectGroup->id]).$this->buildParams());
/** @var PiggyBankTransformer $transformer */ /** @var PiggyBankTransformer $transformer */
$transformer = app(PiggyBankTransformer::class); $transformer = app(PiggyBankTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

View File

@@ -24,13 +24,11 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup; namespace FireflyIII\Api\V1\Controllers\Models\ObjectGroup;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\ObjectGroup;
use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface;
use FireflyIII\Transformers\ObjectGroupTransformer; use FireflyIII\Transformers\ObjectGroupTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
@@ -45,8 +43,6 @@ class ShowController extends Controller
/** /**
* ObjectGroupController constructor. * ObjectGroupController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -68,18 +64,13 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/listObjectGroups * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/listObjectGroups
* *
* Display a listing of the resource. * Display a listing of the resource.
*
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/ */
public function index(Request $request): JsonResponse public function index(): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$this->repository->resetOrder(); $this->repository->resetOrder();
$collection = $this->repository->get(); $collection = $this->repository->get();
@@ -87,14 +78,14 @@ class ShowController extends Controller
$objectGroups = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $objectGroups = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($objectGroups, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($objectGroups, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.object-groups.index') . $this->buildParams()); $paginator->setPath(route('api.v1.object-groups.index').$this->buildParams());
/** @var ObjectGroupTransformer $transformer */ /** @var ObjectGroupTransformer $transformer */
$transformer = app(ObjectGroupTransformer::class); $transformer = app(ObjectGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($objectGroups, $transformer, 'object_groups'); $resource = new FractalCollection($objectGroups, $transformer, 'object_groups');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -105,21 +96,17 @@ class ShowController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/getObjectGroup * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/getObjectGroup
* *
* Show single instance. * Show single instance.
*
* @param ObjectGroup $objectGroup
*
* @return JsonResponse
*/ */
public function show(ObjectGroup $objectGroup): JsonResponse public function show(ObjectGroup $objectGroup): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$this->repository->resetOrder(); $this->repository->resetOrder();
$objectGroup->refresh(); $objectGroup->refresh();
/** @var ObjectGroupTransformer $transformer */ /** @var ObjectGroupTransformer $transformer */
$transformer = app(ObjectGroupTransformer::class); $transformer = app(ObjectGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($objectGroup, $transformer, 'object_groups'); $resource = new Item($objectGroup, $transformer, 'object_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -41,8 +41,6 @@ class UpdateController extends Controller
/** /**
* ObjectGroupController constructor. * ObjectGroupController constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -62,23 +60,18 @@ class UpdateController extends Controller
/** /**
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/updateObjectGroup * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/object_groups/updateObjectGroup
*
* @param UpdateRequest $request
* @param ObjectGroup $objectGroup
*
* @return JsonResponse
*/ */
public function update(UpdateRequest $request, ObjectGroup $objectGroup): JsonResponse public function update(UpdateRequest $request, ObjectGroup $objectGroup): JsonResponse
{ {
$data = $request->getUpdateData(); $data = $request->getUpdateData();
$this->repository->update($objectGroup, $data); $this->repository->update($objectGroup, $data);
$this->repository->resetOrder(); $this->repository->resetOrder();
$manager = $this->getManager(); $manager = $this->getManager();
/** @var ObjectGroupTransformer $transformer */ /** @var ObjectGroupTransformer $transformer */
$transformer = app(ObjectGroupTransformer::class); $transformer = app(ObjectGroupTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new Item($objectGroup, $transformer, 'object_groups'); $resource = new Item($objectGroup, $transformer, 'object_groups');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
} }

View File

@@ -37,8 +37,6 @@ class DestroyController extends Controller
/** /**
* Constructor. * Constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -58,10 +56,6 @@ class DestroyController extends Controller
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/deletePiggyBank * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/deletePiggyBank
* *
* Delete the resource. * Delete the resource.
*
* @param PiggyBank $piggyBank
*
* @return JsonResponse
*/ */
public function destroy(PiggyBank $piggyBank): JsonResponse public function destroy(PiggyBank $piggyBank): JsonResponse
{ {

View File

@@ -43,8 +43,6 @@ class ListController extends Controller
/** /**
* Constructor. * Constructor.
*
*/ */
public function __construct() public function __construct()
{ {
@@ -63,29 +61,26 @@ class ListController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAttachmentByPiggyBank * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/piggy_banks/listAttachmentByPiggyBank
* *
* @param PiggyBank $piggyBank
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function attachments(PiggyBank $piggyBank): JsonResponse public function attachments(PiggyBank $piggyBank): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$collection = $this->repository->getAttachments($piggyBank); $collection = $this->repository->getAttachments($piggyBank);
$count = $collection->count(); $count = $collection->count();
$attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.piggy-banks.attachments', [$piggyBank->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.piggy-banks.attachments', [$piggyBank->id]).$this->buildParams());
/** @var AttachmentTransformer $transformer */ /** @var AttachmentTransformer $transformer */
$transformer = app(AttachmentTransformer::class); $transformer = app(AttachmentTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($attachments, $transformer, 'attachments'); $resource = new FractalCollection($attachments, $transformer, 'attachments');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
@@ -97,30 +92,27 @@ class ListController extends Controller
* *
* List single resource. * List single resource.
* *
* @param PiggyBank $piggyBank
*
* @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function piggyBankEvents(PiggyBank $piggyBank): JsonResponse public function piggyBankEvents(PiggyBank $piggyBank): JsonResponse
{ {
// types to get, page size: // types to get, page size:
$pageSize = $this->parameters->get('limit'); $pageSize = $this->parameters->get('limit');
$manager = $this->getManager(); $manager = $this->getManager();
$collection = $this->repository->getEvents($piggyBank); $collection = $this->repository->getEvents($piggyBank);
$count = $collection->count(); $count = $collection->count();
$events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator: // make paginator:
$paginator = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($events, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.piggy-banks.events', [$piggyBank->id]).$this->buildParams());
/** @var PiggyBankEventTransformer $transformer */ /** @var PiggyBankEventTransformer $transformer */
$transformer = app(PiggyBankEventTransformer::class); $transformer = app(PiggyBankEventTransformer::class);
$transformer->setParameters($this->parameters); $transformer->setParameters($this->parameters);
$resource = new FractalCollection($events, $transformer, 'piggy_bank_events'); $resource = new FractalCollection($events, $transformer, 'piggy_bank_events');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);

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