Compare commits

..

2 Commits

Author SHA1 Message Date
James Cole
5085a384dc Update changelog. 2021-07-25 19:49:28 +02:00
James Cole
07abfd78e1 Throttle logins. Update changelog. https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3663 2021-07-25 19:48:34 +02:00
2689 changed files with 91139 additions and 231058 deletions

View File

@@ -60,7 +60,7 @@ APP_LOG_LEVEL=info
# Use "pgsql" for PostgreSQL # Use "pgsql" for PostgreSQL
# Use "mysql" for MySQL and MariaDB. # Use "mysql" for MySQL and MariaDB.
# Use "sqlite" for SQLite. # Use "sqlite" for SQLite.
DB_CONNECTION=sqlite DB_CONNECTION=sqlite_test
# MySQL supports SSL. You can configure it here. # MySQL supports SSL. You can configure it here.
# 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
@@ -127,6 +127,7 @@ MAIL_ENCRYPTION=null
MAILGUN_DOMAIN= MAILGUN_DOMAIN=
MAILGUN_SECRET= MAILGUN_SECRET=
# If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net # If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE # If you use Docker or similar, you can set this variable from a file by appending it with _FILE
MAILGUN_ENDPOINT=api.mailgun.net MAILGUN_ENDPOINT=api.mailgun.net
@@ -135,6 +136,7 @@ MAILGUN_ENDPOINT=api.mailgun.net
MANDRILL_SECRET= MANDRILL_SECRET=
SPARKPOST_SECRET= SPARKPOST_SECRET=
# Firefly III can send you the following messages # Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true SEND_ERROR_MESSAGE=true
@@ -186,7 +188,7 @@ AUTHENTICATION_GUARD=web
# Enter a custom URL here that will force a logout (your authentication provider can tell you). # Enter a custom URL here that will force a logout (your authentication provider can tell you).
# Setting this variable only works when AUTHENTICATION_GUARD != web # Setting this variable only works when AUTHENTICATION_GUARD != web
# #
CUSTOM_LOGOUT_URL= CUSTOM_LOGOUT_URI=
# LDAP connection configuration # LDAP connection configuration
# OpenLDAP, FreeIPA or ActiveDirectory # OpenLDAP, FreeIPA or ActiveDirectory
@@ -221,6 +223,7 @@ ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX= ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX= ADLDAP_ACCOUNT_SUFFIX=
# LDAP authentication settings. # LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false ADLDAP_LOGIN_FALLBACK=false
@@ -257,6 +260,12 @@ DISABLE_CSP_HEADER=false
TRACKER_SITE_ID= TRACKER_SITE_ID=
TRACKER_URL= TRACKER_URL=
#
# Firefly III can collect telemetry on how you use Firefly III. This is opt-in.
# In order to allow this, change the following variable to true.
# To read more about this feature, go to this page: https://docs.firefly-iii.org/support/telemetry
SEND_TELEMETRY=false
# You can fine tune the start-up of a Docker container by editing these environment variables. # You can fine tune the start-up of a Docker container by editing these environment variables.
# Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data. # Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data.
# However if you know what you're doing you can significantly speed up container start times. # However if you know what you're doing you can significantly speed up container start times.

View File

@@ -1 +0,0 @@
vendor

View File

@@ -1,44 +0,0 @@
<?php
/*
* .php-cs-fixer.php
* Copyright (c) 2022 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/>.
*/
$current = __DIR__;
$paths = [
$current.'/../../app',
$current.'/../../config',
$current.'/../../database',
$current.'/../../routes',
$current.'/../../tests',
$current.'/../../resources/lang',
];
$finder = PhpCsFixer\Finder::create()
->in($paths);
$config = new PhpCsFixer\Config();
return $config->setRules([
'@PSR12' => true,
'declare_strict_types' => true,
'strict_param' => true,
'array_syntax' => ['syntax' => 'short'],
])
->setFinder($finder);

View File

@@ -1,5 +0,0 @@
{
"require": {
"friendsofphp/php-cs-fixer": "^3.12"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -8,63 +8,26 @@ parameters:
ignoreErrors: ignoreErrors:
- '#is not allowed to extend#' - '#is not allowed to extend#'
- '#is neither abstract nor final#' - '#is neither abstract nor final#'
- '#Control structures using switch should not be used\.#'
- '#has a nullable return type declaration#' - '#has a nullable return type declaration#'
- '#with a nullable type declaration#' - '#with a nullable type declaration#'
- '#with null as default value#' - '#with null as default value#'
- '#is not covariant with PHPDoc type array#' - '#Constructor in [a-zA-Z0-9\\_]+ has parameter \$[a-zA-Z0-9\\_]+ with default value#'
- -
message: '#but containers should not be injected#' message: '#Function compact\(\) should not be used.#'
paths: paths:
- ../app/Support/Authentication/RemoteUserGuard.php - ../app/Http/Controllers
- - ../app/Support/Http/Controllers/RenderPartialViews.php
message: '#Control structures using switch should not be used.#' - ../app/Support/Form/FormSupport.php
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:
- ../app/Generator/Report/Account/MonthReportGenerator.php
- ../app/Generator/Report/Audit/MonthReportGenerator.php
- ../app/Generator/Report/Budget/MonthReportGenerator.php
- ../app/Generator/Report/Category/MonthReportGenerator.php
- ../app/Generator/Report/Standard/MonthReportGenerator.php
- ../app/Generator/Report/Standard/MultiYearReportGenerator.php
- ../app/Generator/Report/Standard/YearReportGenerator.php
- ../app/Generator/Report/Tag/MonthReportGenerator.php
- ../app/Http/Controllers/Account/*.php
- ../app/Http/Controllers/Admin/*.php
- ../app/Http/Controllers/*.php
- ../app/Support/ExpandedForm.php
- ../app/Support/Form/AccountForm.php
- ../app/Support/Form/CurrencyForm.php - ../app/Support/Form/CurrencyForm.php
- ../app/Support/Form/FormSupport.php - ../app/Support/Form/AccountForm.php
- - ../app/Support/ExpandedForm.php
message: '#Either catch a more specific exception#' - ../app/Generator/Report
paths:
- ../app/Support/Form/FormSupport.php
paths: paths:
- ../app - ../app
- ../database - ../database
- ../routes - ../routes
- ../config
- ../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 level: 3

View File

@@ -23,13 +23,11 @@
# Install composer packages # Install composer packages
#composer install --no-scripts --no-ansi #composer install --no-scripts --no-ansi
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
# Do static code analysis. # Do static code analysis.
# ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress # ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress
./vendor/bin/phpstan analyse -c .ci/phpstan.neon --xdebug --error-format=table > phpstan-report.txt ./vendor/bin/phpstan analyse -c .ci/phpstan.neon
echo 'The PHPstan report can be found in phpstan-report.txt' exit 0

View File

@@ -19,43 +19,15 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # 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. # enable test .env file.
cp $SCRIPT_DIR/../.env $SCRIPT_DIR/../.env.backup cp .ci/.env.ci ../.env
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 # download test database
if [ -f "$FILE" ]; then # TODO no longer exists
echo 'DB exists, will use it' wget --quiet https://raw.githubusercontent.com/firefly-iii/test-data/main/test_db.sqlite -o storage/database/test_db.sqlite
else
echo 'Download new DB'
wget --quiet https://github.com/firefly-iii/test-fixtures/raw/main/test-database.sqlite -O $FILE
fi
# run phpunit # run phpunit
if [ $COVERAGE = "true" ] ; then ./vendor/bin/phpunit --configuration phpunit.coverage.xml
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 exit 0
mv $SCRIPT_DIR/../.env.backup $SCRIPT_DIR/../.env

View File

@@ -189,7 +189,7 @@ AUTHENTICATION_GUARD=web
# Enter a custom URL here that will force a logout (your authentication provider can tell you). # Enter a custom URL here that will force a logout (your authentication provider can tell you).
# Setting this variable only works when AUTHENTICATION_GUARD != web # Setting this variable only works when AUTHENTICATION_GUARD != web
# #
CUSTOM_LOGOUT_URL= CUSTOM_LOGOUT_URI=
# LDAP connection configuration # LDAP connection configuration
# OpenLDAP, FreeIPA or ActiveDirectory # OpenLDAP, FreeIPA or ActiveDirectory
@@ -261,6 +261,12 @@ DISABLE_CSP_HEADER=false
TRACKER_SITE_ID= TRACKER_SITE_ID=
TRACKER_URL= TRACKER_URL=
#
# Firefly III can collect telemetry on how you use Firefly III. This is opt-in.
# In order to allow this, change the following variable to true.
# To read more about this feature, go to this page: https://docs.firefly-iii.org/support/telemetry
SEND_TELEMETRY=false
# You can fine tune the start-up of a Docker container by editing these environment variables. # You can fine tune the start-up of a Docker container by editing these environment variables.
# Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data. # Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data.
# However if you know what you're doing you can significantly speed up container start times. # However if you know what you're doing you can significantly speed up container start times.

View File

@@ -1,7 +1,5 @@
bg_BG bg_BG
ca_ES
cs_CZ cs_CZ
da_DK
de_DE de_DE
el_GR el_GR
en_GB en_GB
@@ -10,9 +8,7 @@ es_ES
fi_FI fi_FI
fr_FR fr_FR
hu_HU hu_HU
id_ID
it_IT it_IT
ja_JP
nb_NO nb_NO
nl_NL nl_NL
pl_PL pl_PL
@@ -21,10 +17,7 @@ pt_PT
ro_RO ro_RO
ru_RU ru_RU
sk_SK sk_SK
sl_SI
sv_SE sv_SE
tr_TR
uk_UA
vi_VN vi_VN
zh-hans_CN zh-hans_CN
zh-hant_CN zh-hant_CN

View File

@@ -7,15 +7,11 @@ APP_DEBUG=false
# This should be your email address. # This should be your email address.
# If you use Docker or similar, you can set this variable from a file by using SITE_OWNER_FILE # If you use Docker or similar, you can set this variable from a file by using SITE_OWNER_FILE
# The variable is used in some errors shown to users who aren't admin.
SITE_OWNER=mail@example.com SITE_OWNER=mail@example.com
# The encryption key for your sessions. Keep this very secure. # The encryption key for your sessions. Keep this very secure.
# Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it. # Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it.
# If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE # If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE
#
# Avoid the "#" character in your APP_KEY, it may break things.
#
APP_KEY=SomeRandomStringOf32CharsExactly APP_KEY=SomeRandomStringOf32CharsExactly
# Firefly III will launch using this language (for new users and unauthenticated visitors) # Firefly III will launch using this language (for new users and unauthenticated visitors)
@@ -41,15 +37,14 @@ TRUSTED_PROXIES=
# Several other options exist. You can use 'single' for one big fat error log (not recommended). # Several other options exist. You can use 'single' for one big fat error log (not recommended).
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself. # Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
# A rotating log option is 'daily', creates 5 files that (surprise) rotate. # A rotating log option is 'daily', creates 5 files that (surprise) rotate.
# A cool option is 'papertrail' for cloud logging
# Default setting 'stack' will log to 'daily' and to 'stdout' at the same time. # Default setting 'stack' will log to 'daily' and to 'stdout' at the same time.
LOG_CHANNEL=stack
# # - Docker + versions <= 4.8.1.8 and before: use "stdout"
# Used when logging to papertrail: # - Docker + versions > 4.8.1.8 : use "docker_out"
# # - Docker + versions >= 5.1.1 : use "stack"
PAPERTRAIL_HOST= # - For everything else (als not Docker) : use 'stack'
PAPERTRAIL_PORT=
LOG_CHANNEL=stack
# Log level. You can set this from least severe to most severe: # Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency # debug, info, notice, warning, error, critical, alert, emergency
@@ -58,7 +53,8 @@ PAPERTRAIL_PORT=
APP_LOG_LEVEL=notice APP_LOG_LEVEL=notice
# Audit log level. # Audit log level.
# Set this to "emergency" if you dont want to store audit logs, leave on info otherwise. # set to "emergency" if you dont want to store audit logs.
# leave on info otherwise.
AUDIT_LOG_LEVEL=info AUDIT_LOG_LEVEL=info
# 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
@@ -73,8 +69,6 @@ DB_PORT=3306
DB_DATABASE=firefly DB_DATABASE=firefly
DB_USERNAME=firefly DB_USERNAME=firefly
DB_PASSWORD=secret_firefly_password DB_PASSWORD=secret_firefly_password
# leave empty or omit when not using a socket connection
DB_SOCKET=
# MySQL supports SSL. You can configure it here. # MySQL supports SSL. You can configure it here.
# 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
@@ -95,14 +89,11 @@ PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null PGSQL_SSL_CRL_FILE=null
# more PostgreSQL settings # If you're looking for performance improvements, you could install memcached.
PGSQL_SCHEMA=public
# If you're looking for performance improvements, you could install memcached or redis
CACHE_DRIVER=file CACHE_DRIVER=file
SESSION_DRIVER=file SESSION_DRIVER=file
# If you set either of the options above to 'redis', you might want to update these settings too # If you set either of these to 'redis', you might want to update these settings too
# 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
@@ -116,10 +107,7 @@ REDIS_PATH=
REDIS_HOST=127.0.0.1 REDIS_HOST=127.0.0.1
REDIS_PORT=6379 REDIS_PORT=6379
# Use only with Redis 6+ with proper ACL set. Leave empty otherwise. REDIS_PASSWORD=null
REDIS_USERNAME=
REDIS_PASSWORD=
# always use quotes and make sure redis db "0" and "1" exists. Otherwise change accordingly. # always use quotes and make sure redis db "0" and "1" exists. Otherwise change accordingly.
REDIS_DB="0" REDIS_DB="0"
REDIS_CACHE_DB="1" REDIS_CACHE_DB="1"
@@ -127,13 +115,12 @@ REDIS_CACHE_DB="1"
# Cookie settings. Should not be necessary to change these. # Cookie settings. Should not be necessary to change these.
# If you use Docker or similar, you can set COOKIE_DOMAIN_FILE to set # If you use Docker or similar, you can set COOKIE_DOMAIN_FILE to set
# the value from a file instead of from an environment variable # the value from a file instead of from an environment variable
# Setting samesite to "strict" may give you trouble logging in.
COOKIE_PATH="/" COOKIE_PATH="/"
COOKIE_DOMAIN= COOKIE_DOMAIN=
COOKIE_SECURE=false 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 mail you, update these settings
# For instructions, see: https://docs.firefly-iii.org/advanced-installation/email # For instructions, see: https://docs.firefly-iii.org/advanced-installation/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
@@ -149,6 +136,7 @@ MAIL_ENCRYPTION=null
MAILGUN_DOMAIN= MAILGUN_DOMAIN=
MAILGUN_SECRET= MAILGUN_SECRET=
# If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net # If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE # If you use Docker or similar, you can set this variable from a file by appending it with _FILE
MAILGUN_ENDPOINT=api.mailgun.net MAILGUN_ENDPOINT=api.mailgun.net
@@ -157,62 +145,125 @@ MAILGUN_ENDPOINT=api.mailgun.net
MANDRILL_SECRET= MANDRILL_SECRET=
SPARKPOST_SECRET= SPARKPOST_SECRET=
# Firefly III can send you the following messages. # Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=true SEND_ERROR_MESSAGE=true
SEND_LOGIN_NEW_IP_WARNING=true
# These messages contain (sensitive) transaction information: # These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true SEND_REPORT_JOURNALS=true
# Set this value to true if you want to set the location # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
# Take note: it is no longer necessary to set this value, and it will be removed in future versions.
MAPBOX_API_KEY=
#
# Instead of the mapbox API key, just set this value to true if you want to set the location
# of certain things, like transactions. Since this involves an external service, it's optional # of certain things, like transactions. Since this involves an external service, it's optional
# and disabled by default. # and disabled by default.
#
ENABLE_EXTERNAL_MAP=false ENABLE_EXTERNAL_MAP=false
# Set this value to true if you want Firefly III to download currency exchange rates
# from the internet. These rates are hosted by the creator of Firefly III inside
# an Azure Storage Container.
# Not all currencies may be available. Rates may be wrong.
ENABLE_EXTERNAL_RATES=false
# The map will default to this location: # The map will default to this location:
MAP_DEFAULT_LAT=51.983333 MAP_DEFAULT_LAT=51.983333
MAP_DEFAULT_LONG=5.916667 MAP_DEFAULT_LONG=5.916667
MAP_DEFAULT_ZOOM=6 MAP_DEFAULT_ZOOM=6
# Firefly III has two options for user authentication. "eloquent" is the default,
# and "ldap" for LDAP servers.
# For full instructions on these settings please visit:
# https://docs.firefly-iii.org/advanced-installation/authentication
# If you use Docker or similar, you can set this variable from a file by appending it with _FILE
# #
# Firefly III authentication settings # If you enable 'ldap' AND you run Docker, the Docker image will contact packagist.org
# This is necessary to download the required packages.
# #
LOGIN_PROVIDER=eloquent
# It's also possible to change the way users are authenticated. You could use Authelia for example.
# Authentication via the REMOTE_USER header is supported. Change the value below to "remote_user_guard".
# #
# Firefly III supports a few authentication methods: # This will also allow Windows SSO.
# - 'web' (default, uses built in DB) #
# - 'remote_user_guard' for Authelia etc # If you do this please read the documentation for instructions and warnings:
# Read more about these settings in the documentation.
# https://docs.firefly-iii.org/advanced-installation/authentication # https://docs.firefly-iii.org/advanced-installation/authentication
# #
# LDAP is no longer supported :( # This function is available in Firefly III v5.3.0 and higher.
#
AUTHENTICATION_GUARD=web AUTHENTICATION_GUARD=web
# If the guard is changed, Firefly III uses the 'REMOTE_USER' header as per RFC 3875.
# You can also use another header, like AUTH_USER when using Windows SSO.
# Some systems use X-Auth headers. In that case, use HTTP_X_AUTH_USERNAME or HTTP_X_AUTH_EMAIL
# Depending on your system, REMOTE_USER may need to be changed to HTTP_REMOTE_USER
# #
# Remote user guard settings # If this header is 'unexpectedly empty', check out the documentation.
# https://docs.firefly-iii.org/advanced-installation/authentication
# #
AUTHENTICATION_GUARD_HEADER=REMOTE_USER AUTHENTICATION_GUARD_HEADER=REMOTE_USER
#
# Firefly III uses email addresses as user identifiers. When you're using an external authentication guard
# that doesn't do this, Firefly III is incapable of emailing you. Messages sent to "Bill Gates" always fail.
#
# However, if you set this value, Firefly III will store the value from this header as the user's backup
# email address and use it to communicate. So user "Bill Gates" could still have
# the email address "bill@microsoft.com".
#
# Example value: AUTHENTICATION_GUARD_EMAIL=HTTP_X_AUTH_EMAIL
#
AUTHENTICATION_GUARD_EMAIL= AUTHENTICATION_GUARD_EMAIL=
#
# Firefly III generates a basic keypair for your OAuth tokens.
# If you want, you can overrule the key with your own (secure) value.
# It's also possible to set PASSPORT_PUBLIC_KEY_FILE or PASSPORT_PRIVATE_KEY_FILE
# if you're using Docker secrets or similar solutions for secret management
#
PASSPORT_PRIVATE_KEY=
PASSPORT_PUBLIC_KEY=
# It's impossible to log out users who's authentication is handled by an external system.
# Enter a custom URL here that will force a logout (your authentication provider can tell you).
# Setting this variable only works when AUTHENTICATION_GUARD != web
# #
# Extra authentication settings CUSTOM_LOGOUT_URI=
#
CUSTOM_LOGOUT_URL= # LDAP connection configuration
# OpenLDAP, FreeIPA or ActiveDirectory
# # If you use Docker or similar, you can set this variable from a file by appending it with _FILE
ADLDAP_CONNECTION_SCHEME=OpenLDAP
ADLDAP_AUTO_CONNECT=true
# LDAP connection settings
# You can set the following variables from a file by appending them with _FILE:
# ADLDAP_CONTROLLERS, ADLDAP_PORT, ADLDAP_BASEDN
ADLDAP_CONTROLLERS=
ADLDAP_PORT=389
ADLDAP_TIMEOUT=5
ADLDAP_BASEDN=""
ADLDAP_FOLLOW_REFFERALS=false
# SSL/TLS settings
ADLDAP_USE_SSL=false
ADLDAP_USE_TLS=false
ADLDAP_SSL_CACERTDIR=
ADLDAP_SSL_CACERTFILE=
ADLDAP_SSL_CERTFILE=
ADLDAP_SSL_KEYFILE=
ADLDAP_SSL_CIPHER_SUITE=
ADLDAP_SSL_REQUIRE_CERT=
# You can set the following variables from a file by appending them with _FILE:
ADLDAP_ADMIN_USERNAME=
ADLDAP_ADMIN_PASSWORD=
# You can set the following variables from a file by appending them with _FILE:
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false
ADLDAP_DISCOVER_FIELD=distinguishedname
ADLDAP_AUTH_FIELD=distinguishedname
# field to sync as local username.
# You can set the following variable from a file by appending it with _FILE:
ADLDAP_SYNC_FIELD=userprincipalname
# You can disable the X-Frame-Options header if it interferes with tools like # You can disable the X-Frame-Options header if it interferes with tools like
# Organizr. This is at your own risk. Applications running in frames run the risk # Organizr. This is at your own risk. Applications running in frames run the risk
@@ -233,34 +284,21 @@ DISABLE_CSP_HEADER=false
TRACKER_SITE_ID= TRACKER_SITE_ID=
TRACKER_URL= TRACKER_URL=
# Firefly III can collect telemetry on how you use Firefly III. This is opt-in.
# In order to allow this, change the following variable to true.
# To read more about this feature, go to this page: https://docs.firefly-iii.org/support/telemetry
SEND_TELEMETRY=false
# #
# Firefly III supports webhooks. These are security sensitive and must be enabled manually first. # Firefly III supports webhooks. These are security sensitive and must be enabled manually first.
# #
ALLOW_WEBHOOKS=false ALLOW_WEBHOOKS=false
#
# The static cron job token can be useful when you use Docker and wish to manage cron jobs.
# 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.
#
# For more info: https://docs.firefly-iii.org/firefly-iii/advanced-installation/cron/
#
# You can set this variable from a file by appending it with _FILE
#
STATIC_CRON_TOKEN=
# You can fine tune the start-up of a Docker container by editing these environment variables. # You can fine tune the start-up of a Docker container by editing these environment variables.
# Use this at your own risk. Disabling certain checks and features may result in lots of inconsistent data. # Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data.
# However if you know what you're doing you can significantly speed up container start times. # However if you know what you're doing you can significantly speed up container start times.
# Set each value to true to enable, or false to disable. # Set each value to true to enable, or false to disable.
# Set this to true to build all locales supported by Firefly III.
# This may take quite some time (several minutes) and is generally not recommended.
# If you wish to change or alter the list of locales, start your Docker container with
# `docker run -v locale.gen:/etc/locale.gen -e DKR_BUILD_LOCALE=true`
# and make sure your preferred locales are in your own locale.gen.
DKR_BUILD_LOCALE=false
# Check if the SQLite database exists. Can be skipped if you're not using SQLite. # Check if the SQLite database exists. Can be skipped if you're not using SQLite.
# Won't significantly speed up things. # Won't significantly speed up things.
DKR_CHECK_SQLITE=true DKR_CHECK_SQLITE=true
@@ -289,6 +327,7 @@ DKR_RUN_PASSPORT_INSTALL=true
# Leave the following configuration vars as is. # Leave the following configuration vars as is.
# Unless you like to tinker and know what you're doing. # Unless you like to tinker and know what you're doing.
APP_NAME=FireflyIII APP_NAME=FireflyIII
ADLDAP_CONNECTION=default
BROADCAST_DRIVER=log BROADCAST_DRIVER=log
QUEUE_DRIVER=sync QUEUE_DRIVER=sync
CACHE_PREFIX=firefly CACHE_PREFIX=firefly
@@ -306,8 +345,6 @@ FIREFLY_III_LAYOUT=v1
# It won't work. It doesn't do ANYTHING. Don't believe the lies you read online. I'm not joking. # It won't work. It doesn't do ANYTHING. Don't believe the lies you read online. I'm not joking.
# This configuration value WILL NOT HELP. # 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. # 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 # So when configuring anything WEB related this variable doesn't do anything. Nothing
# #

7
.github/.mergify.yml vendored Normal file
View File

@@ -0,0 +1,7 @@
pull_request_rules:
- name: PR on main is never approved.
conditions:
- base=main
actions:
close:
message: Please reopen this PR on the `develop` branch. Thank you.

33
.github/ISSUE_TEMPLATE/Bug_report.md vendored Normal file
View File

@@ -0,0 +1,33 @@
---
name: Bug report
about: Create a report to help Firefly III improve
title: ''
labels: ''
assignees: ''
---
**Bug description**
I am running Firefly III version x.x.x, and my problem is:
<!-- Replace the version and describe your problem or your issue may be closed. -->
**Steps to reproduce**
<!-- What do you need to do to trigger this bug? -->
**Extra info**
<!-- Please add extra info here, such as OS, browser, and the output from the /debug page of your Firefly III installation (click the version at the bottom).
DO NOT PUT ```BACKTICKS``` AROUND THE OUTPUT OF THE /debug PAGE
-->
**Bonus points**
<!-- Before you submit, verify the following please: -->
- I searched and nobody reported this bug before
- I have added a stack trace from my log files <!-- (see https://bit.ly/FF3-get-debug-info) -->
- I have added a screenshot.
- I was able to replicate it on the demo site https://demo.firefly-iii.org/
<!-- - I donated money (this is a joke ;)-->

27
.github/ISSUE_TEMPLATE/Custom.md vendored Normal file
View File

@@ -0,0 +1,27 @@
---
name: I have a question or a problem
about: Ask away!
---
I am running Firefly III version x.x.x.
**Description**
<!-- (if relevant of course) -->
**Extra info**
<!-- Please add extra info here, such as OS, browser, and the output from the `/debug`-page of your Firefly III installation (click the version at the bottom).
DO NOT PUT ```BACKTICKS``` AROUND THE OUTPUT OF THE /debug PAGE
-->
**Bonus points**
<!-- Complete the following checklist for bonus points -->
- I have read the FAQ at https://bit.ly/FF3-FAQ
- I added a screenshot
- I added log files <!-- (see https://bit.ly/FF3-get-debug-info) -->
- I was able to replicate the issue on the demo site.
<!-- - I donated money (this is a joke :wink:)-->

View File

@@ -0,0 +1,34 @@
---
name: Feature request
about: Suggest an idea or feature for Firefly III
title: ''
labels: ''
assignees: ''
---
**Description**
<!--
Please describe your feature request:
- I would like Firefly III to do ABC.
- What if you would add feature XYZ?
- Firefly III doesn't do DEF.
-->
**Solution**
<!-- Describe what your feature would add to Firefly III. -->
**What are alternatives?**
<!-- Please describe what alternatives currently exist. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->
**Bonus points**
<!-- Earn bonus points by:
- Make a drawing
- Donate money (just kidding ;)
-->

View File

@@ -1,57 +0,0 @@
name: Bug Report
description: Report a bug in Firefly III (or associated tools)
body:
- type: checkboxes
attributes:
label: Support guidelines
description: Please read the support guidelines before proceeding.
options:
- label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
required: true
- type: checkboxes
attributes:
label: I've found a bug and checked that ...
description: Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, explain in detail why.
options:
- label: ... [the documentation](https://docs.firefly-iii.org/) does not mention anything about my problem
- label: ... there are no open or closed issues that are related to my problem
- label: ... it's [definitely a Firefly III issue, not me](https://github.com/firefly-iii/firefly-iii/blob/main/.github/its_you_not_me.md)
- type: textarea
attributes:
label: Description
description: Please provide a brief description of the bug in 1-2 sentences.
validations:
required: true
- type: textarea
attributes:
label: Debug information
description: Please provide the table from the /debug page. Do not add backticks or quotes.
placeholder: The output from the /debug page
validations:
required: true
- type: textarea
attributes:
label: Expected behaviour
description: Please describe precisely what you'd expect to happen. Be specific.
validations:
required: false
- type: textarea
attributes:
label: Steps to reproduce
description: Please describe the steps to reproduce the bug.
placeholder: |
1. ...
2. ...
3. ...
validations:
required: false
- type: textarea
attributes:
label: Additional info
description: Please provide any additional information that seem useful.

View File

@@ -1,42 +0,0 @@
name: Feature Request
description: Request a feature or enhancement in Firefly III (or associated tools)
body:
- type: checkboxes
attributes:
label: Support guidelines
description: Please read the support guidelines before proceeding.
options:
- label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md)
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/)
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.
required: true
- type: textarea
attributes:
label: Description
description: Please describe your feature request
placeholder: |
- I would like Firefly III to do (thing).
- What if you would add feature (feature here)?
- Firefly III doesn't do (thing).
validations:
required: true
- type: textarea
attributes:
label: Solution
description: Describe what your feature would add to Firefly III.
validations:
required: true
- type: textarea
attributes:
label: What are alternatives?
description: Please describe what alternatives currently exist.
- type: textarea
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -6,7 +6,6 @@ updates:
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
target-branch: develop target-branch: develop
labels: ["bug"] labels: ["bug"]
versioning-strategy: increase
schedule: schedule:
interval: "weekly" interval: "weekly"
@@ -15,14 +14,13 @@ updates:
directory: "/" directory: "/"
target-branch: develop target-branch: develop
labels: ["bug"] labels: ["bug"]
versioning-strategy: increase
schedule: schedule:
interval: "weekly" interval: "weekly"
- package-ecosystem: "github-actions" # yarn / JS updates for new frontend
directory: "/" - package-ecosystem: "npm"
directory: "/frontend"
target-branch: develop target-branch: develop
labels: ["bug"] labels: ["bug"]
versioning-strategy: increase
schedule: schedule:
interval: "weekly" interval: "weekly"

View File

@@ -1,16 +0,0 @@
# It's not you, it's me
Sometimes bugs reported to Firefly III are configuration and system problems on the user's side.
If you run into any of the following problems, there's a good chance it's not a Firefly III issue, but a configuration issue.
- ⚠️ Firefly III can't connect to the database when starting or the password is wrong, even though you're sure it's correct.
- ⚠️ Errors about a missing `APP_KEY` or other encryption/hash problems
- ⚠️ You can't login due to `419` errors (page expired)
- ⚠️ Any `500` error when starting Firefly III
- ⚠️ Any white page when starting Firefly III
- ⚠️ Time-out when starting Firefly III for the first time
- ⚠️ Firefly III does not work behind your reverse proxy
- ⚠️ You can't connect to the Data Importer due to 404's or authentication issues.
If you run into an issue like this, please start a [discussion](https://github.com/firefly-iii/firefly-iii/discussions) or chat on [Gitter.im](https://gitter.im/firefly-iii/firefly-iii). There's a good chance it's not a bug but something we can fix rather quickly :+1:

63
.github/mergify.yml vendored
View File

@@ -1,63 +0,0 @@
---
pull_request_rules:
- name: Close all on main
conditions:
- base=main
- -author~=^dependabot(|-preview)\[bot\]$
actions:
close:
message: Please do not open PR's on the `main` branch, but on the `develop`
branch only. Thank you!
- name: No translations
conditions:
- -author~=^dependabot(|-preview)\[bot\]$
- base=develop
- or:
- files~=^resources/lang/bg_BG
- files~=^resources/lang/ca_ES
- files~=^resources/lang/cs_CZ
- files~=^resources/lang/da_DK
- files~=^resources/lang/de_DE
- files~=^resources/lang/el_GR
- files~=^resources/lang/en_GB
- files~=^resources/lang/es_ES
- files~=^resources/lang/et_EE
- files~=^resources/lang/fa_IR
- files~=^resources/lang/fi_FI
- files~=^resources/lang/fr_FR
- files~=^resources/lang/he_IL
- files~=^resources/lang/hu_HU
- files~=^resources/lang/id_ID
- files~=^resources/lang/is_IS
- files~=^resources/lang/it_IT
- files~=^resources/lang/ja_JP
- files~=^resources/lang/ko_KR
- files~=^resources/lang/lt_LT
- files~=^resources/lang/nb_NO
- files~=^resources/lang/nl_NL
- files~=^resources/lang/pl_PL
- files~=^resources/lang/pt_BR
- files~=^resources/lang/pt_PT
- files~=^resources/lang/ro_RO
- files~=^resources/lang/ru_RU
- files~=^resources/lang/si_LK
- files~=^resources/lang/sk_SK
- files~=^resources/lang/sl_SI
- files~=^resources/lang/sr_CS
- files~=^resources/lang/sv_SE
- files~=^resources/lang/th_TH
- files~=^resources/lang/tlh_AA
- files~=^resources/lang/tr_TR
- files~=^resources/lang/uk_UA
- files~=^resources/lang/vi_VN
- files~=^resources/lang/zh_CN
- files~=^resources/lang/zh_TW
actions:
comment:
message: >
Please do not submit translated strings in your PR. If you need new
sentences to be translated, add them to the `en_US` language strings.
New or changed translations for other languages can be submitted at
https://crowdin.com/project/firefly-iii
Thank you!

View File

@@ -2,7 +2,8 @@
Before you create a new PR, please consider: Before you create a new PR, please consider:
1) Pull requests for the MAIN branch will be closed. 1) Pull requests for the MAIN branch will be closed.
2) DO NOT include translations in your PR. Only English US sentences. 2) We cannot accept pull requests to add new currencies.
3) DO NOT include translations in your PR. Only English US sentences.
Thanks. Thanks.
--> -->

94
.github/security.md vendored
View File

@@ -1,101 +1,53 @@
# Security Policy # Security Policy
Firefly III is an application to manage your personal finances. As such, the developer has adopted this security Firefly III is an application to manage your personal finances. As such, the developer has adopted this security disclosure and response policy to ensure that critical issues are responsibly handled.
disclosure and response policy to ensure that critical issues are responsibly handled.
## Supported Versions ## Supported Versions
Only the latest Firefly III release is maintained. Applicable fixes, including security fixes, will not backported to older release branches. Please refer to [releases.md](https://github.com/firefly-iii/firefly-iii/blob/main/releases.md) for details.
Only the latest Firefly III release is maintained. Applicable fixes, including security fixes, will not backported to
older release branches. Please refer to [releases.md](https://github.com/firefly-iii/firefly-iii/blob/main/releases.md)
for details.
## Reporting a Vulnerability - Private Disclosure Process ## Reporting a Vulnerability - Private Disclosure Process
Security is of the highest importance and all security vulnerabilities or suspected security vulnerabilities should be reported to Firefly III privately, to minimize attacks against current users of Firefly III before they are fixed. Vulnerabilities will be investigated and patched on the next patch (or minor) release as soon as possible. This information could be kept entirely internal to the project.
Security is of the highest importance and all security vulnerabilities or suspected security vulnerabilities should be If you know of a publicly disclosed security vulnerability for Firefly III, please **IMMEDIATELY** contact james@firefly-iii.org to inform the Firefly III developer. You can use my [GPG key](https://keybase.io/jc5) for extra security.
reported to Firefly III privately, to minimize attacks against current users of Firefly III before they are fixed.
Vulnerabilities will be investigated and patched on the next patch (or minor) release as soon as possible. This
information could be kept entirely internal to the project.
If you know of a publicly disclosed security vulnerability for Firefly III, please **IMMEDIATELY** contact
james@firefly-iii.org to inform the Firefly III developer. You can use my [GPG key](https://keybase.io/jc5) for extra
security.
**IMPORTANT: Do not file public issues on GitHub for security vulnerabilities** **IMPORTANT: Do not file public issues on GitHub for security vulnerabilities**
To report a vulnerability or a security-related issue, please email the private address james@firefly-iii.org with the To report a vulnerability or a security-related issue, please email the private address james@firefly-iii.org with the details of the vulnerability. The email will be received by the developer of Firefly III. Emails will be addressed within 3 business days, including a detailed plan to investigate the issue and any potential workarounds to perform in the meantime. Do not report non-security-impacting bugs through this channel. Use [GitHub issues](https://github.com/firefly-iii/firefly-iii/issues/new/choose) instead.
details of the vulnerability. The email will be received by the developer of Firefly III. Emails will be addressed
within 3 business days, including a detailed plan to investigate the issue and any potential workarounds to perform in
the meantime. Do not report non-security-impacting bugs through this channel.
Use [GitHub issues](https://github.com/firefly-iii/firefly-iii/issues/new/choose) instead.
### Proposed Email Content ### Proposed Email Content
Provide a descriptive subject line and in the body of the email include the following information: Provide a descriptive subject line and in the body of the email include the following information:
* Basic identity information, such as your name and your affiliation or company. * Basic identity information, such as your name and your affiliation or company.
* Detailed steps to reproduce the vulnerability (POC scripts, screenshots, and compressed packet captures are all * Detailed steps to reproduce the vulnerability (POC scripts, screenshots, and compressed packet captures are all helpful to us).
helpful to us). * Description of the effects of the vulnerability on Firefly III and the related hardware and software configurations, so that the developer can reproduce it.
* Description of the effects of the vulnerability on Firefly III and the related hardware and software configurations,
so that the developer can reproduce it.
* How the vulnerability affects Firefly III usage and an estimation of the attack surface, if there is one. * How the vulnerability affects Firefly III usage and an estimation of the attack surface, if there is one.
* List other projects or dependencies that were used in conjunction with Firefly III to produce the vulnerability. * List other projects or dependencies that were used in conjunction with Firefly III to produce the vulnerability.
## When to report a vulnerability ## When to report a vulnerability
* When you think Firefly III has a potential security vulnerability. * When you think Firefly III has a potential security vulnerability.
* When you suspect a potential vulnerability but you are unsure that it impacts Firefly III. * When you suspect a potential vulnerability but you are unsure that it impacts Firefly III.
* When you know of or suspect a potential vulnerability on another project that is used by Firefly III. For example * When you know of or suspect a potential vulnerability on another project that is used by Firefly III. For example Firefly III has a dependency on Docker, MySQL, etc.
Firefly III has a dependency on Docker, MySQL, etc.
## Patch, Release, and Disclosure ## Patch, Release, and Disclosure
The Firefly III developer will respond to vulnerability reports as follows: The Firefly III developer will respond to vulnerability reports as follows:
1. The developer will investigate the vulnerability and determine its effects and criticality. 1. The developer will investigate the vulnerability and determine its effects and criticality.
2. If the issue is not deemed to be a vulnerability, the developer will follow up with a detailed reason for rejection. 2. If the issue is not deemed to be a vulnerability, the developer will follow up with a detailed reason for rejection.
3. The developer will initiate a conversation with the reporter within 3 business days. 3. The developer will initiate a conversation with the reporter within 3 business days.
4. If a vulnerability is acknowledged and the timeline for a fix is determined, the developer will work on a plan to 4. If a vulnerability is acknowledged and the timeline for a fix is determined, the developer will work on a plan to communicate with the appropriate community, including identifying mitigating steps that affected users can take to protect themselves until the fix is rolled out.
communicate with the appropriate community, including identifying mitigating steps that affected users can take to 5. The developer will also create a [CVSS](https://www.first.org/cvss/specification-document) using the [CVSS Calculator](https://www.first.org/cvss/calculator/3.0). The developer makes the final call on the calculated CVSS; it is better to move quickly than making the CVSS perfect. Issues may also be reported to [Mitre](https://cve.mitre.org/) using this [scoring calculator](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator). The CVE will initially be set to private.
protect themselves until the fix is rolled out. 6. The developer will work on fixing the vulnerability and perform internal testing before preparing to roll out the fix.
5. The developer will also create a [CVSS](https://www.first.org/cvss/specification-document) using 7. A public disclosure date is negotiated by the Firefly III developer and the bug submitter. We prefer to fully disclose the bug as soon as possible once a user mitigation or patch is available. It is reasonable to delay disclosure when the bug or the fix is not yet fully understood, the solution is not well-tested, or for distributor coordination. The timeframe for disclosure is from immediate (especially if its already publicly known) to a few weeks. For a critical vulnerability with a straightforward mitigation, we expect report date to public disclosure date to be on the order of 14 business days. The Firefly III developer holds the final say when setting a public disclosure date.
the [CVSS Calculator](https://www.first.org/cvss/calculator/3.0). The developer makes the final call on the 9. Once the fix is confirmed, the developer will patch the vulnerability in the next patch or minor release. Upon release of the patched version of Firefly III, we will follow the **Public Disclosure Process**.
calculated CVSS; it is better to move quickly than making the CVSS perfect. Issues may also be reported
to [Mitre](https://cve.mitre.org/) using
this [scoring calculator](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator). The CVE will initially be set to
private.
6. The developer will work on fixing the vulnerability and perform internal testing before preparing to roll out the
fix.
7. A public disclosure date is negotiated by the Firefly III developer and the bug submitter. We prefer to fully
disclose the bug as soon as possible once a user mitigation or patch is available. It is reasonable to delay
disclosure when the bug or the fix is not yet fully understood, the solution is not well-tested, or for distributor
coordination. The timeframe for disclosure is from immediate (especially if its already publicly known) to a few
weeks. For a critical vulnerability with a straightforward mitigation, we expect report date to public disclosure
date to be on the order of 14 business days. The Firefly III developer holds the final say when setting a public
disclosure date.
8. Once the fix is confirmed, the developer will patch the vulnerability in the next patch or minor release. Upon
release of the patched version of Firefly III, we will follow the **Public Disclosure Process**.
### Public Disclosure Process ### Public Disclosure Process
The developer publishes a public [advisory](https://github.com/firefly-iii/firefly-iii/security/advisories) to the Firefly III community via GitHub. In most cases, additional communication via Twitter, reddit and other channels will assist in educating Firefly III users and rolling out the patched release to affected users.
The developer publishes a public [advisory](https://github.com/firefly-iii/firefly-iii/security/advisories) to the The develop will also publish any mitigating steps users can take until the fix can be applied to their Firefly III instances.
Firefly III community via GitHub. In most cases, additional communication via Mastodon, Gitter and other channels will
assist in educating Firefly III users and rolling out the patched release to affected users.
The developer will also publish any mitigating steps users can take until the fix can be applied to their Firefly III
instances.
## Confidentiality, integrity and availability ## Confidentiality, integrity and availability
We consider vulnerabilities leading to the compromise of data confidentiality, elevation of privilege, or integrity to be our highest priority concerns. Availability, in particular in areas relating to DoS and resource exhaustion, is also a serious security concern. The Firefly III developer takes all vulnerabilities, potential vulnerabilities, and suspected vulnerabilities seriously and will investigate them in an urgent and expeditious manner.
We consider vulnerabilities leading to the compromise of data confidentiality, elevation of privilege, or integrity to Note that we do not currently consider the default settings for Firefly III to be secure-by-default. It is necessary for operators to explicitly configure settings, role based access control, and other resource related features in Firefly III to provide a hardened Firefly III environment. We will not act on any security disclosure that relates to a lack of safe defaults. Over time, we will work towards improved safe-by-default configuration, taking into account backwards compatibility.
be our highest priority concerns. Availability, in particular in areas relating to DoS and resource exhaustion, is also
a serious security concern. The Firefly III developer takes all vulnerabilities, potential vulnerabilities, and
suspected vulnerabilities seriously and will investigate them in an urgent and expeditious manner.
Note that we do not currently consider the default settings for Firefly III to be secure-by-default. It is necessary for
operators to explicitly configure settings, role based access control, and other resource related features in Firefly
III to provide a hardened Firefly III environment. We will not act on any security disclosure that relates to a lack of
safe defaults. Over time, we will work towards improved safe-by-default configuration, taking into account backwards
compatibility.
## Credits ## Credits

5
.github/stale.yml vendored
View File

@@ -1,11 +1,11 @@
# Configuration for probot-stale - https://github.com/probot/stale # Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale # Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 14 daysUntilStale: 7
# Number of days of inactivity before a stale Issue or Pull Request is closed. # Number of days of inactivity before a stale Issue or Pull Request is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
daysUntilClose: 14 daysUntilClose: 7
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
# - "[Status] Maybe Later" # - "[Status] Maybe Later"
@@ -14,7 +14,6 @@ exemptLabels:
- feature - feature
- bug - bug
- announcement - announcement
- "layout-v3"
# Set to true to ignore issues in a project (defaults to false) # Set to true to ignore issues in a project (defaults to false)
exemptProjects: false exemptProjects: false

32
.github/support.md vendored
View File

@@ -1,32 +1,12 @@
# Support [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/firefly-iii/firefly-iii.svg)](http://isitmaintained.com/project/firefly-iii/firefly-iii "Average time to resolve an issue") # Welcome to Firefly III on Github!
:+1::tada: Thank you for taking the time to contribute something to Firefly III! :+1::tada: Thank you for taking the time to contribute something to Firefly III!
## Reporting an issue ## Bugs
First of all: thank you for reporting a bug instead of ditching the tool altogether. Bugs have a lot of priority! First of all: thank you for reporting a bug instead of ditching the tool altogether. If you find a bug, please take the time and see if the [demo site](https://demo.firefly-iii.org/) is also suffering from this bug. Include as many log files and details as you think are necessary. Bugs have a lot of priority!
1. Open bugs will have open issues, so search for one first. ## Installation problems
2. If your feature request is already there, vote on it with :+1: or :-1: reactions.
3. Do NOT hijack old issues with the bug you found, open your own issue.
4. If relevant, take the time and see if the [demo site](https://demo.firefly-iii.org/) is also suffering from your issue.
5. If relevant, read the [documentation](https://docs.firefly-iii.org/).
Please follow these guidelines when opening new issues: Please take the time to read the [documentation](https://docs.firefly-iii.org/) and make sure you search through closed issues for the problems other people
have had. Your problem may be among them! If not, open an issue and I will help where I can.
## Writing good issues
- File a single issue for a single problem or feature requests. Feel free to open multiple issues.
- Collect as many details as you can.
- Be clear and specific, and state what you're not sure about.
Only then [create a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose)!
## Issue closure and abandonment policy
- Issues can be converted into discussions if it's not a bug or feature request.
- 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/).
- Issues can be closed if they're duplicates of other issues.
- Issues can be closed if the answer is in the FAQ.
- Issues will be closed automatically after 14 days.
- Issues will be locked automatically after 90 days.

View File

@@ -1,98 +0,0 @@
# This workflow prunes old workflow runs for an entire repository.
name: Prune old builds
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
jobs:
prune:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Prune cancelled/skipped runs
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }}
script: |
const cancelled = await github.rest.actions.listWorkflowRunsForRepo({
owner: context.repo.owner,
per_page: 100,
repo: context.repo.repo,
status: 'cancelled',
});
const skipped = await github.rest.actions.listWorkflowRunsForRepo({
owner: context.repo.owner,
per_page: 100,
repo: context.repo.repo,
status: 'skipped',
});
for (const response of [cancelled, skipped]) {
for (const run of response.data.workflow_runs) {
console.log(`Run id ${run.id} of '${run.name}' is a cancelled/skipped run. Deleting...`);
await github.rest.actions.deleteWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: run.id
});
}
}
- name: Prune runs older than 3 days
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }}
script: |
const days_to_expiration = 3;
const ms_in_day = 86400000;
const now = Date.now();
const pages = 5;
// we don't want to prune old runs from test.yml
// because we track the duration of runs over time
const workflows = [
'cleanup.yml',
'depsreview.yaml',
'laravel.yml',
'lock.yml',
'stale.yml'
]
let runs_to_delete = [];
for (const workflow of workflows) {
for (let page = 0; page < pages; page += 1) {
let response = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
page: page,
per_page: 100,
repo: context.repo.repo,
workflow_id: workflow
});
if (response.data.workflow_runs.length > 0) {
for (const run of response.data.workflow_runs) {
if (now - Date.parse(run.created_at) > ms_in_day * days_to_expiration) {
runs_to_delete.push([run.id, run.name]);
}
}
}
}
}
for (const run of runs_to_delete) {
console.log(`Run id ${run[0]} of '${run[1]}' is older than ${days_to_expiration} days. Deleting...`);
try {
await github.rest.actions.deleteWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: run[0]
});
} catch (error) {
// ignore errors
}
}

View File

@@ -1,22 +0,0 @@
name: "Reply to closed issue"
on:
issues:
types:
- closed
jobs:
auto_comment:
runs-on: ubuntu-latest
steps:
-
uses: aws-actions/closed-issue-message@v1
with:
message: |
Hi there! This is an automatic reply. `Share and enjoy`
This issue is now closed. Please be aware that closed issues are not actively monitored. If you reply, you may get no response.
- If the original bug is not actually fixed, please feel free to open a new issue. Please refer to this issue for clarity.
- Follow-up questions can also be posted in a new [discussion](https://github.com/firefly-iii/firefly-iii/discussions/)
Thank you for your consideration.
repo-token: "${{ secrets.GITHUB_TOKEN }}"

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

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Copy .env - name: Copy .env
run: test -f .env || cp .ci/.env.ci .env run: test -f .env || cp .ci/.env.ci .env
- name: Prepare dependencies - name: Prepare dependencies
@@ -51,7 +51,7 @@ jobs:
- prepare - prepare
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Copy .env - name: Copy .env
run: test -f .env || cp .ci/.env.ci .env run: test -f .env || cp .ci/.env.ci .env
- name: Download database - name: Download database
@@ -86,7 +86,7 @@ jobs:
- prepare - prepare
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Copy .env - name: Copy .env
run: test -f .env || cp .ci/.env.ci .env run: test -f .env || cp .ci/.env.ci .env
- name: Download database - name: Download database
@@ -120,7 +120,7 @@ jobs:
- prepare - prepare
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Copy .env - name: Copy .env
run: test -f .env || cp .ci/.env.ci .env run: test -f .env || cp .ci/.env.ci .env
- name: Download database - name: Download database

View File

@@ -5,26 +5,15 @@ on:
schedule: schedule:
- cron: '0 0 * * *' - cron: '0 0 * * *'
permissions:
contents: read
jobs: jobs:
lock: lock:
permissions:
issues: write # for dessant/lock-threads to lock issues
pull-requests: write # for dessant/lock-threads to lock PRs
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: dessant/lock-threads@v4 - uses: dessant/lock-threads@v2
with: with:
github-token: ${{ github.token }} github-token: ${{ github.token }}
issue-lock-inactive-days: '90' issue-lock-inactive-days: '90'
issue-comment: > issue-lock-comment: >
Hi there! This is an automatic reply. `Share and enjoy` This issue has been automatically locked since there
has not been any recent activity after it was closed.
This issue is now `locked` :lock:. Please open a new issue for related bugs.
- If you feel there is more to be said about this specific issue, please feel free to open a new issue. Please refer to this issue for clarity.
- Follow-up questions and comments can also be posted in a new [discussion](https://github.com/firefly-iii/firefly-iii/discussions/)
Thank you for your consideration.

View File

@@ -1,37 +0,0 @@
name: Qodana
on:
workflow_dispatch:
push:
branches:
- main
- develop
pull_request:
types: [ opened, synchronize, reopened ]
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 }}

View File

@@ -2,33 +2,22 @@ name: "Close stale issues"
on: on:
schedule: schedule:
- cron: "30 1 * * *" - cron: "30 1 * * *"
workflow_dispatch:
permissions:
contents: read
jobs: jobs:
stale: stale:
permissions:
issues: write # for actions/stale to close stale issues
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@v3
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` 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
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. for your contributions.
Thank you for your contributions.
stale-pr-message: > stale-pr-message: >
Hi there! 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
This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. 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,layout-v3' exempt-issue-labels: 'enhancement,feature,bug,announcement'

12
.gitignore vendored
View File

@@ -1,10 +1,18 @@
/node_modules /node_modules
/frontend/node_modules /frontend/node_modules
/frontend/fonts
/frontend/images
/public/hot
/public/storage
/storage/*.key /storage/*.key
/vendor /vendor
/.vagrant /.vagrant
Homestead.json
Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
.env .env
/.ci/php-cs-fixer/vendor public/google*.html
/.ci/coverage report.html
composer.phar
app.js.map

58
.scrutinizer.yml Normal file
View File

@@ -0,0 +1,58 @@
---
build:
nodes:
analysis:
project_setup:
override: true
tests:
override:
- php-scrutinizer-run
checks:
javascript: true
php:
align_assignments: true
avoid_fixme_comments: true
avoid_multiple_statements_on_same_line: true
avoid_perl_style_comments: true
avoid_todo_comments: true
duplication: false
encourage_single_quotes: true
newline_at_end_of_file: true
no_goto: true
no_long_variable_names:
maximum: "20"
no_short_method_names:
minimum: "3"
no_short_variable_names:
minimum: "3"
optional_parameters_at_the_end: true
parameter_doc_comments: true
remove_extra_empty_lines: true
return_doc_comment_if_not_inferrable: true
return_doc_comments: true
uppercase_constants: true
use_self_instead_of_fqcn: true
coding_style:
php:
spaces:
around_operators:
concatenation: true
other:
after_type_cast: false
filter:
excluded_paths:
- database/migrations/*
- bootstrap/*
- config/*
- docker/*
- public/js/lib/*
- public/lib/adminlte/js/*
- public/lib/bootstrap/js/*
- resources/*
- routes/*
- storage/*
paths:
- app/*
- public/js/ff/*
tools:
external_code_coverage: false

20
.travis.yml Normal file
View File

@@ -0,0 +1,20 @@
language: php
php:
- '7.4'
dist: xenial
os: linux
cache:
directories:
- "/home/travis/.config"
- "/home/travis/build/firefly-iii/firefly-iii/vendor"
branches:
only:
- develop
before_script:
- phpenv config-rm xdebug.ini || return 0
script:
- "./.ci/phpstan.sh"
- "./.ci/phpunit.sh"

View File

@@ -25,14 +25,12 @@ 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\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; 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
@@ -64,15 +62,9 @@ class AccountController extends Controller
} }
/** /**
* Documentation for this endpoint: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getAccountsAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws JsonException
* @throws FireflyException
* @throws FireflyException
*/ */
public function accounts(AutocompleteRequest $request): JsonResponse public function accounts(AutocompleteRequest $request): JsonResponse
{ {
@@ -111,13 +103,12 @@ class AccountController extends Controller
// custom order. // custom order.
$order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE]; $order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE];
usort( usort(
$return, $return, function ($a, $b) use ($order) {
function ($a, $b) use ($order) { $pos_a = array_search($a['type'], $order);
$pos_a = array_search($a['type'], $order, true); $pos_b = array_search($b['type'], $order);
$pos_b = array_search($b['type'], $order, true);
return $pos_a - $pos_b; return $pos_a - $pos_b;
} }
); );
return response()->json($return); return response()->json($return);

View File

@@ -56,11 +56,7 @@ class BillController extends Controller
} }
/** /**
* Documentation for this endpoint is at: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC
* TODO expand API to add active field.
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -71,13 +67,13 @@ class BillController extends Controller
$filtered = $result->map( $filtered = $result->map(
static function (Bill $item) { static function (Bill $item) {
return [ return [
'id' => (string)$item->id, 'id' => (string)$item->id,
'name' => $item->name, 'name' => $item->name,
'active' => $item->active,
]; ];
} }
); );
return response()->json($filtered->toArray()); return response()->json($filtered->toArray());
} }
} }

View File

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

View File

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

View File

@@ -56,10 +56,7 @@ class CurrencyController extends Controller
} }
/** /**
* Documentation for this endpoint is at: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -84,13 +81,9 @@ class CurrencyController extends Controller
} }
/** /**
* Documentation for this endpoint is at: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @deprecated
*/ */
public function currenciesWithCode(AutocompleteRequest $request): JsonResponse public function currenciesWithCode(AutocompleteRequest $request): JsonResponse
{ {

View File

@@ -56,10 +56,7 @@ class ObjectGroupController extends Controller
} }
/** /**
* Documentation for this endpoint is at: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -80,4 +77,5 @@ class ObjectGroupController extends Controller
return response()->json($return); return response()->json($return);
} }
} }

View File

@@ -36,7 +36,7 @@ use Illuminate\Http\JsonResponse;
*/ */
class PiggyBankController extends Controller class PiggyBankController extends Controller
{ {
private AccountRepositoryInterface $accountRepository; private AccountRepositoryInterface $accountRepository;
private PiggyBankRepositoryInterface $piggyRepository; private PiggyBankRepositoryInterface $piggyRepository;
/** /**
@@ -60,10 +60,7 @@ class PiggyBankController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -76,18 +73,14 @@ class PiggyBankController extends Controller
/** @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;
$objectGroup = $piggy->objectGroups()->first(); $response[] = [
$response[] = [
'id' => (string)$piggy->id, 'id' => (string)$piggy->id,
'name' => $piggy->name, 'name' => $piggy->name,
'currency_id' => (string)$currency->id, 'currency_id' => $currency->id,
'currency_name' => $currency->name, 'currency_name' => $currency->name,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places, 'currency_decimal_places' => $currency->decimal_places,
'object_group_id' => null === $objectGroup ? null : (string)$objectGroup->id,
'object_group_title' => $objectGroup?->title,
]; ];
} }
@@ -95,10 +88,7 @@ class PiggyBankController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesBalanceAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -112,26 +102,21 @@ class PiggyBankController extends Controller
foreach ($piggies as $piggy) { foreach ($piggies as $piggy) {
$currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; $currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency;
$currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0'; $currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0';
$objectGroup = $piggy->objectGroups()->first();
$response[] = [ $response[] = [
'id' => (string)$piggy->id, 'id' => (string)$piggy->id,
'name' => $piggy->name, 'name' => $piggy->name,
'name_with_balance' => sprintf( 'name_with_balance' => sprintf(
'%s (%s / %s)', '%s (%s / %s)', $piggy->name, app('amount')->formatAnything($currency, $currentAmount, false),
$piggy->name,
app('amount')->formatAnything($currency, $currentAmount, false),
app('amount')->formatAnything($currency, $piggy->targetamount, false), app('amount')->formatAnything($currency, $piggy->targetamount, false),
), ),
'currency_id' => (string)$currency->id, 'currency_id' => $currency->id,
'currency_name' => $currency->name, 'currency_name' => $currency->name,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol,
'currency_decimal_places' => $currency->decimal_places, 'currency_decimal_places' => $currency->decimal_places,
'object_group_id' => null === $objectGroup ? null : (string)$objectGroup->id,
'object_group_title' => $objectGroup?->title,
]; ];
} }
return response()->json($response); return response()->json($response);
} }
} }

View File

@@ -25,7 +25,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\Recurrence; use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -45,7 +45,6 @@ class RecurrenceController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
$this->repository = app(RecurringRepositoryInterface::class); $this->repository = app(RecurringRepositoryInterface::class);
$this->repository->setUser(auth()->user()); $this->repository->setUser(auth()->user());
return $next($request); return $next($request);
@@ -54,28 +53,26 @@ class RecurrenceController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRecurringAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function recurring(AutocompleteRequest $request): JsonResponse public function recurring(AutocompleteRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
$recurrences = $this->repository->searchRecurrence($data['query'], $data['limit']); $rules = $this->repository->searchRecurrence($data['query'], $data['limit']);
$response = []; $response = [];
/** @var Recurrence $recurrence */ /** @var Rule $rule */
foreach ($recurrences as $recurrence) { foreach ($rules as $rule) {
$response[] = [ $response[] = [
'id' => (string)$recurrence->id, 'id' => (string)$rule->id,
'name' => $recurrence->title, 'name' => $rule->title,
'description' => $recurrence->description, 'description' => $rule->description,
]; ];
} }
return response()->json($response); return response()->json($response);
} }
} }

View File

@@ -53,10 +53,7 @@ class RuleController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRulesAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -77,4 +74,5 @@ class RuleController extends Controller
return response()->json($response); return response()->json($response);
} }
} }

View File

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

View File

@@ -56,10 +56,7 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTagAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */

View File

@@ -61,10 +61,7 @@ class TransactionController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -91,17 +88,14 @@ class TransactionController extends Controller
} }
/** /**
* This endpoint is documented at: * @param AutocompleteRequest $request
* * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsIDAC
*
* @param AutocompleteRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function transactionsWithID(AutocompleteRequest $request): JsonResponse public function transactionsWithID(AutocompleteRequest $request): JsonResponse
{ {
$data = $request->getData(); $data = $request->getData();
$result = new Collection(); $result = new Collection;
if (is_numeric($data['query'])) { if (is_numeric($data['query'])) {
// search for group, not journal. // search for group, not journal.
$firstResult = $this->groupRepository->find((int)$data['query']); $firstResult = $this->groupRepository->find((int)$data['query']);

View File

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

View File

@@ -27,7 +27,6 @@ namespace FireflyIII\Api\V1\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\DateRequest; use FireflyIII\Api\V1\Requests\Data\DateRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
@@ -35,9 +34,6 @@ 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
@@ -52,7 +48,7 @@ class AccountController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -73,16 +69,9 @@ class AccountController extends Controller
} }
/** /**
* This endpoint is documented at: * @param DateRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
*
* @param DateRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
* @throws JsonException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/ */
public function overview(DateRequest $request): JsonResponse public function overview(DateRequest $request): JsonResponse
{ {
@@ -98,7 +87,7 @@ class AccountController extends Controller
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet); $frontPage = app('preferences')->get('frontPageAccounts', $defaultSet);
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getDefaultCurrency();
if (!(is_array($frontPage->data) && count($frontPage->data) > 0)) { if (0 === count($frontPage->data)) {
$frontPage->data = $defaultSet; $frontPage->data = $defaultSet;
$frontPage->save(); $frontPage->save();
} }
@@ -111,9 +100,9 @@ class AccountController extends Controller
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,
@@ -125,14 +114,14 @@ class AccountController extends Controller
'yAxisID' => 0, // 0, 1, 2 'yAxisID' => 0, // 0, 1, 2
'entries' => [], 'entries' => [],
]; ];
/** @var Carbon $currentStart */
$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. $previous = round((float)array_values($range)[0], 12);
$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) ? round((float)$range[$format], 12) : $previous;
$previous = $balance; $previous = $balance;
$currentStart->addDay(); $currentStart->addDay();
$currentSet['entries'][$label] = $balance; $currentSet['entries'][$label] = $balance;

View File

@@ -26,32 +26,25 @@ namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon; use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException; use Carbon\Exceptions\InvalidDateException;
use Carbon\Exceptions\InvalidFormatException;
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 Log;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class Controller. * Class Controller.
* *
* @codeCoverageIgnore
*/ */
abstract class Controller extends BaseController abstract class Controller extends BaseController
{ {
use AuthorizesRequests; use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
use DispatchesJobs;
use ValidatesRequests;
protected const CONTENT_TYPE = 'application/vnd.api+json'; protected const CONTENT_TYPE = 'application/vnd.api+json';
protected array $allowedSort;
protected ParameterBag $parameters; protected ParameterBag $parameters;
/** /**
@@ -60,8 +53,7 @@ abstract class Controller extends BaseController
public function __construct() public function __construct()
{ {
// get global parameters // get global parameters
$this->allowedSort = config('firefly.allowed_sort_parameters'); $this->parameters = $this->getParameters();
$this->parameters = $this->getParameters();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
if (auth()->check()) { if (auth()->check()) {
@@ -72,46 +64,34 @@ abstract class Controller extends BaseController
return $next($request); return $next($request);
} }
); );
} }
/** /**
* Method to grab all parameters from the URL. * Method to grab all parameters from the URI.
* *
* @return ParameterBag * @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 (0 === $page) {
if ($page < 1) {
$page = 1; $page = 1;
} }
if ($page > (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 = request()->query->get($field);
try { $obj = null;
$date = request()->query->get($field);
} catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field));
Log::error($e->getMessage());
$value = null;
}
$obj = null;
if (null !== $date) { if (null !== $date) {
try { try {
$obj = Carbon::parse($date); $obj = Carbon::parse($date);
} catch (InvalidDateException|InvalidFormatException $e) { } catch (InvalidDateException $e) {
// don't care // don't care
app('log')->warning(sprintf('Ignored invalid date "%s" in API controller parameter check: %s', substr($date, 0, 20), $e->getMessage())); Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage()));
} }
} }
$bag->set($field, $obj); $bag->set($field, $obj);
@@ -120,60 +100,18 @@ abstract class Controller extends BaseController
// integer fields: // integer fields:
$integers = ['limit']; $integers = ['limit'];
foreach ($integers as $integer) { foreach ($integers as $integer) {
try { $value = request()->query->get($integer);
$value = request()->query->get($integer);
} catch (BadRequestException $e) {
Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer));
Log::error($e->getMessage());
$value = null;
}
if (null !== $value) { if (null !== $value) {
$bag->set($integer, (int)$value); $bag->set($integer, (int)$value);
} }
} }
// sort fields:
return $this->getSortParameters($bag);
}
/**
* @param ParameterBag $bag
*
* @return ParameterBag
*/
private function getSortParameters(ParameterBag $bag): ParameterBag
{
$sortParameters = [];
try {
$param = (string)request()->query->get('sort');
} catch (BadRequestException $e) {
Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.');
Log::error($e->getMessage());
$param = '';
}
if ('' === $param) {
return $bag;
}
$parts = explode(',', $param);
foreach ($parts as $part) {
$part = trim($part);
$direction = 'asc';
if ('-' === $part[0]) {
$part = substr($part, 1);
$direction = 'desc';
}
if (in_array($part, $this->allowedSort, true)) {
$sortParameters[] = [$part, $direction];
}
}
$bag->set('sort', $sortParameters);
return $bag; return $bag;
} }
/** /**
* Method to help build URL's. * Method to help build URI's.
* *
* @return string * @return string
*/ */
@@ -192,7 +130,7 @@ abstract class Controller extends BaseController
$params[$key] = $value; $params[$key] = $value;
} }
return $return.http_build_query($params); return $return . http_build_query($params);
} }
/** /**
@@ -201,8 +139,8 @@ abstract class Controller extends BaseController
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

@@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data\Bulk;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\Bulk\MoveTransactionsRequest;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
use Illuminate\Http\JsonResponse;
/**
* Class AccountController
*/
class AccountController extends Controller
{
private AccountRepositoryInterface $repository;
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
}
/**
* @param MoveTransactionsRequest $request
*
* @return JsonResponse
*/
public function moveTransactions(MoveTransactionsRequest $request): JsonResponse
{
$accountIds = $request->getAll();
$original = $this->repository->findNull($accountIds['original_account']);
$destination = $this->repository->findNull($accountIds['destination_account']);
/** @var AccountDestroyService $service */
$service = app(AccountDestroyService::class);
$service->moveTransactions($original, $destination);
return response()->json([], 204);
}
}

View File

@@ -1,100 +0,0 @@
<?php
/*
* TransactionController.php
* 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data\Bulk;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\Bulk\TransactionRequest;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
use Illuminate\Http\JsonResponse;
/**
* Class TransactionController
*
* Endpoint to update transactions by submitting
* (optional) a "where" clause and an "update"
* clause.
*
* Because this is a security nightmare waiting to happen validation
* is pretty strict.
*/
class TransactionController extends Controller
{
private AccountRepositoryInterface $repository;
/**
*
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->repository->setUser(auth()->user());
return $next($request);
}
);
}
/**
* This endpoint is documented at:
* 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
{
$query = $request->getAll();
$params = $query['query'];
// this deserves better code, but for now a loop of basic if-statements
// to respond to what is in the $query.
// this is OK because only one thing can be in the query at the moment.
if ($this->updatesTransactionAccount($params)) {
$original = $this->repository->find((int)$params['where']['account_id']);
$destination = $this->repository->find((int)$params['update']['account_id']);
/** @var AccountDestroyService $service */
$service = app(AccountDestroyService::class);
$service->moveTransactions($original, $destination);
}
return response()->json([], 204);
}
/**
* @param array $params
*
* @return bool
*/
private function updatesTransactionAccount(array $params): bool
{
return array_key_exists('account_id', $params['where']) && array_key_exists('account_id', $params['update']);
}
}

View File

@@ -45,31 +45,25 @@ use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Services\Internal\Destroy\AccountDestroyService; use FireflyIII\Services\Internal\Destroy\AccountDestroyService;
use FireflyIII\Services\Internal\Destroy\JournalDestroyService; use FireflyIII\Services\Internal\Destroy\JournalDestroyService;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
/** /**
* Class DestroyController * Class DestroyController
*/ */
class DestroyController extends Controller class DestroyController extends Controller
{ {
private bool $unused;
/** /**
* This endpoint is documented at: * @param DestroyRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/destroyData
*
* @param DestroyRequest $request
* *
* @return JsonResponse * @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);
switch ($objects) { switch ($objects) {
default: default:
throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)); throw new FireflyException(sprintf('This endpoint can\'t handle object "%s"', $objects));
case 'budgets': case 'budgets':
$this->destroyBudgets(); $this->destroyBudgets();
break; break;
@@ -94,55 +88,27 @@ class DestroyController extends Controller
case 'object_groups': case 'object_groups':
$this->destroyObjectGroups(); $this->destroyObjectGroups();
break; 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': case 'accounts':
$this->destroyAccounts( $this->destroyAccounts(
[ [
AccountType::ASSET, AccountType::ASSET, AccountType::DEFAULT,
AccountType::BENEFICIARY, AccountType::BENEFICIARY, AccountType::EXPENSE,
AccountType::CASH, AccountType::REVENUE, AccountType::INITIAL_BALANCE,
AccountType::CREDITCARD, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, 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; break;
case 'asset_accounts': case 'asset_accounts':
$this->destroyAccounts( $this->destroyAccounts(
[ [
AccountType::ASSET, AccountType::ASSET, AccountType::DEFAULT,
AccountType::DEFAULT,
] ]
); );
break; break;
case 'expense_accounts': case 'expense_accounts':
$this->destroyAccounts( $this->destroyAccounts(
[ [
AccountType::BENEFICIARY, AccountType::BENEFICIARY, AccountType::EXPENSE,
AccountType::EXPENSE,
] ]
); );
break; break;
@@ -156,10 +122,7 @@ class DestroyController extends Controller
case 'liabilities': case 'liabilities':
$this->destroyAccounts( $this->destroyAccounts(
[ [
AccountType::DEBT, AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD,
AccountType::LOAN,
AccountType::MORTGAGE,
AccountType::CREDITCARD,
] ]
); );
break; break;
@@ -196,7 +159,6 @@ class DestroyController extends Controller
); );
break; break;
} }
app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }
@@ -287,7 +249,7 @@ class DestroyController extends Controller
} }
/** /**
* @param array $types * @param array $types
*/ */
private function destroyAccounts(array $types): void private function destroyAccounts(array $types): void
{ {
@@ -295,24 +257,14 @@ class DestroyController extends Controller
$repository = app(AccountRepositoryInterface::class); $repository = app(AccountRepositoryInterface::class);
$collection = $repository->getAccountsByType($types); $collection = $repository->getAccountsByType($types);
$service = app(AccountDestroyService::class); $service = app(AccountDestroyService::class);
/** @var Account $account */ /** @var Account $account */
foreach ($collection as $account) { foreach ($collection as $account) {
$count = $account->transactions()->count(); $service->destroy($account, null);
if (true === $this->unused && 0 === $count) {
Log::info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name));
$service->destroy($account, null);
continue;
}
if (false === $this->unused) {
Log::info(sprintf('Deleting account #%d "%s"', $account->id, $account->name));
$service->destroy($account, null);
}
} }
} }
/** /**
* @param array $types * @param array $types
*/ */
private function destroyTransactions(array $types): void private function destroyTransactions(array $types): void
{ {
@@ -325,4 +277,5 @@ class DestroyController extends Controller
$service->destroy($journal); $service->destroy($journal);
} }
} }
} }

View File

@@ -1,7 +1,7 @@
<?php <?php
declare(strict_types=1);
/* /*
* ExportController.php * AccountController.php
* Copyright (c) 2021 james@firefly-iii.org * Copyright (c) 2021 james@firefly-iii.org
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
@@ -20,15 +20,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data\Export; namespace FireflyIII\Api\V1\Controllers\Data\Export;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest; use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest;
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 League\Csv\CannotInsertRecord;
/** /**
* Class ExportController * Class ExportController
@@ -54,26 +52,24 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportAccounts
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function accounts(ExportRequest $request): LaravelResponse public function accounts(ExportRequest $request): LaravelResponse
{ {
$this->exporter->setExportAccounts(true); $this->exporter->setExportAccounts(true);
return $this->returnExport('accounts'); return $this->returnExport('accounts');
} }
/** /**
* @param string $key * @param string $key
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
private function returnExport(string $key): LaravelResponse private function returnExport(string $key): LaravelResponse
{ {
@@ -86,7 +82,7 @@ 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')
@@ -98,13 +94,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBills
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function bills(ExportRequest $request): LaravelResponse public function bills(ExportRequest $request): LaravelResponse
{ {
@@ -114,13 +107,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBudgets
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function budgets(ExportRequest $request): LaravelResponse public function budgets(ExportRequest $request): LaravelResponse
{ {
@@ -130,13 +120,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportCategories
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function categories(ExportRequest $request): LaravelResponse public function categories(ExportRequest $request): LaravelResponse
{ {
@@ -146,13 +133,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportPiggies
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function piggyBanks(ExportRequest $request): LaravelResponse public function piggyBanks(ExportRequest $request): LaravelResponse
{ {
@@ -162,13 +146,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRecurring
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function recurring(ExportRequest $request): LaravelResponse public function recurring(ExportRequest $request): LaravelResponse
{ {
@@ -178,13 +159,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRules
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function rules(ExportRequest $request): LaravelResponse public function rules(ExportRequest $request): LaravelResponse
{ {
@@ -194,13 +172,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTags
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function tags(ExportRequest $request): LaravelResponse public function tags(ExportRequest $request): LaravelResponse
{ {
@@ -210,13 +185,10 @@ class ExportController extends Controller
} }
/** /**
* This endpoint is documented at: * @param ExportRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTransactions
*
* @param ExportRequest $request
* *
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws CannotInsertRecord
*/ */
public function transactions(ExportRequest $request): LaravelResponse public function transactions(ExportRequest $request): LaravelResponse
{ {
@@ -228,4 +200,5 @@ class ExportController extends Controller
return $this->returnExport('transactions'); return $this->returnExport('transactions');
} }
} }

View File

@@ -1,95 +0,0 @@
<?php
/*
* PurgeController.php
* Copyright (c) 2022 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Data;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Account;
use FireflyIII\Models\Bill;
use FireflyIII\Models\Budget;
use FireflyIII\Models\Category;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\Recurrence;
use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\Tag;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use Illuminate\Http\JsonResponse;
class PurgeController extends Controller
{
/**
* TODO cleanup and use repositories.
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData
* @return JsonResponse
*/
public function purge(): JsonResponse
{
$user = auth()->user();
// some manual code, too lazy to call all repositories.
// budgets:
Budget::whereUserId($user->id)->onlyTrashed()->forceDelete();
// bills
Bill::whereUserId($user->id)->onlyTrashed()->forceDelete();
// piggies
$set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id')
->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*']);
/** @var PiggyBank $piggy */
foreach ($set as $piggy) {
$piggy->forceDelete();
}
// rule group
RuleGroup::whereUserId($user->id)->onlyTrashed()->forceDelete();
// rules
Rule::whereUserId($user->id)->onlyTrashed()->forceDelete();
// recurring transactions
Recurrence::whereUserId($user->id)->onlyTrashed()->forceDelete();
// categories
Category::whereUserId($user->id)->onlyTrashed()->forceDelete();
// tags
Tag::whereUserId($user->id)->onlyTrashed()->forceDelete();
// accounts
Account::whereUserId($user->id)->onlyTrashed()->forceDelete();
// transaction groups
TransactionGroup::whereUserId($user->id)->onlyTrashed()->forceDelete();
// transaction journals
TransactionJournal::whereUserId($user->id)->onlyTrashed()->forceDelete();
return response()->json([], 204);
}
}

View File

@@ -37,7 +37,7 @@ use Illuminate\Http\JsonResponse;
* Class AccountController * Class AccountController
* *
* Shows expense information grouped or limited by date. * Shows expense information grouped or limited by date.
* I.e. all expenses grouped by account + currency. * Ie. all expenses grouped by account + currency.
*/ */
class AccountController extends Controller class AccountController extends Controller
{ {
@@ -50,7 +50,7 @@ class AccountController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -73,10 +73,7 @@ class AccountController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseAsset
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -94,7 +91,7 @@ class AccountController extends Controller
'id' => (string)$expense['id'], 'id' => (string)$expense['id'],
'name' => $expense['name'], 'name' => $expense['name'],
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // intentional float 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@@ -104,10 +101,7 @@ class AccountController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseExpense
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -126,7 +120,7 @@ class AccountController extends Controller
'id' => (string)$expense['id'], 'id' => (string)$expense['id'],
'name' => $expense['name'], 'name' => $expense['name'],
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // intentional float 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@@ -134,4 +128,5 @@ class AccountController extends Controller
return response()->json($result); return response()->json($result);
} }
} }

View File

@@ -1,7 +1,7 @@
<?php <?php
declare(strict_types=1);
/* /*
* BillController.php * PeriodController.php
* Copyright (c) 2021 james@firefly-iii.org * Copyright (c) 2021 james@firefly-iii.org
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
@@ -20,8 +20,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Insight\Expense; namespace FireflyIII\Api\V1\Controllers\Insight\Expense;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
@@ -56,12 +54,9 @@ class BillController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -93,25 +88,25 @@ class BillController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] = $response[$key] ?? [
'id' => (string)$billId, 'id' => (string)$billId,
'name' => $journal['bill_name'], 'name' => $journal['bill_name'],
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']); $response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']);
$response[$key]['difference_float'] = (float)$response[$key]['difference']; // intentional float $response[$key]['difference_float'] = (float)$response[$key]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignKey] = $response[$foreignKey] ?? [ $response[$foreignKey] = $response[$foreignKey] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']); $response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']);
$response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; // intentional float $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference'];
} }
} }
@@ -119,12 +114,9 @@ class BillController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -148,26 +140,27 @@ class BillController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$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,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // intentional float $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
} }
return response()->json(array_values($response)); return response()->json(array_values($response));
} }
} }

View File

@@ -44,7 +44,7 @@ class BudgetController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -65,10 +65,7 @@ class BudgetController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBudget
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -84,14 +81,14 @@ class BudgetController extends Controller
} }
/** @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]), null);
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
'id' => (string)$budget->id, 'id' => (string)$budget->id,
'name' => $budget->name, 'name' => $budget->name,
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // intentional float 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@@ -102,10 +99,7 @@ class BudgetController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBudget
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -115,17 +109,19 @@ class BudgetController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$result = []; $result = [];
$expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts); $expenses = $this->noRepository->sumExpenses($start, $end, $assetAccounts, null);
/** @var array $expense */ /** @var array $expense */
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // intentional float 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
} }
return response()->json($result); return response()->json($result);
} }
} }

View File

@@ -45,7 +45,7 @@ class CategoryController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -66,10 +66,7 @@ class CategoryController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -92,7 +89,7 @@ class CategoryController extends Controller
'id' => (string)$category->id, 'id' => (string)$category->id,
'name' => $category->name, 'name' => $category->name,
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // intentional float 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@@ -103,10 +100,7 @@ class CategoryController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -121,12 +115,13 @@ class CategoryController extends Controller
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // intentional float 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
} }
return response()->json($result); return response()->json($result);
} }
} }

View File

@@ -34,11 +34,9 @@ use Illuminate\Http\JsonResponse;
*/ */
class PeriodController extends Controller class PeriodController extends Controller
{ {
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTotal
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -59,26 +57,27 @@ class PeriodController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$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,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // intentional float $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
} }
return response()->json(array_values($response)); return response()->json(array_values($response));
} }
} }

View File

@@ -1,7 +1,7 @@
<?php <?php
declare(strict_types=1);
/* /*
* TagController.php * PeriodController.php
* Copyright (c) 2021 james@firefly-iii.org * Copyright (c) 2021 james@firefly-iii.org
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
@@ -20,8 +20,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Insight\Expense; namespace FireflyIII\Api\V1\Controllers\Insight\Expense;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
@@ -55,12 +53,9 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -84,23 +79,23 @@ class TagController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose. $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$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,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // float but on purpose. $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
} }
@@ -108,12 +103,9 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -149,31 +141,32 @@ class TagController extends Controller
// on currency ID // on currency ID
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] = $response[$key] ?? [
'id' => (string)$tagId, 'id' => (string)$tagId,
'name' => $tag['name'], 'name' => $tag['name'],
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']); $response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']);
$response[$key]['difference_float'] = (float)$response[$key]['difference']; // float but on purpose. $response[$key]['difference_float'] = (float)$response[$key]['difference'];
} }
// on foreign ID // on foreign ID
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignKey] = $journal[$foreignKey] ?? [ $response[$foreignKey] = $journal[$foreignKey] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']); $response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']);
$response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; // float but on purpose. $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference'];
} }
} }
} }
return response()->json(array_values($response)); return response()->json(array_values($response));
} }
} }

View File

@@ -37,7 +37,8 @@ use Illuminate\Http\JsonResponse;
* Class AccountController * Class AccountController
* *
* Shows income information grouped or limited by date. * Shows income information grouped or limited by date.
* I.e. all income grouped by account + currency. * Ie. all income grouped by account + currency.
* TODO same code as Expense/AccountController.
*/ */
class AccountController extends Controller class AccountController extends Controller
{ {
@@ -50,7 +51,7 @@ class AccountController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -73,10 +74,9 @@ class AccountController extends Controller
} }
/** /**
* This endpoint is documented at: * TODO same code as Expense/AccountController.
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeAsset * TODO does not actually include the name of the expense account.
* * @param GenericRequest $request
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -93,7 +93,7 @@ class AccountController extends Controller
'id' => (string)$entry['id'], 'id' => (string)$entry['id'],
'name' => $entry['name'], 'name' => $entry['name'],
'difference' => $entry['sum'], 'difference' => $entry['sum'],
'difference_float' => (float)$entry['sum'], // float but on purpose. 'difference_float' => (float)$entry['sum'],
'currency_id' => (string)$entry['currency_id'], 'currency_id' => (string)$entry['currency_id'],
'currency_code' => $entry['currency_code'], 'currency_code' => $entry['currency_code'],
]; ];
@@ -103,10 +103,9 @@ class AccountController extends Controller
} }
/** /**
* This endpoint is documented at: * TODO does not actually include the name of the expense account.
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeRevenue
* *
* @param GenericRequest $request * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -125,7 +124,7 @@ class AccountController extends Controller
'id' => (string)$entry['id'], 'id' => (string)$entry['id'],
'name' => $entry['name'], 'name' => $entry['name'],
'difference' => $entry['sum'], 'difference' => $entry['sum'],
'difference_float' => (float)$entry['sum'], // float but on purpose. 'difference_float' => (float)$entry['sum'],
'currency_id' => (string)$entry['currency_id'], 'currency_id' => (string)$entry['currency_id'],
'currency_code' => $entry['currency_code'], 'currency_code' => $entry['currency_code'],
]; ];
@@ -133,4 +132,5 @@ class AccountController extends Controller
return response()->json($result); return response()->json($result);
} }
} }

View File

@@ -35,6 +35,7 @@ use Illuminate\Support\Collection;
/** /**
* Class CategoryController * Class CategoryController
* TODO same as opposing category controller
*/ */
class CategoryController extends Controller class CategoryController extends Controller
{ {
@@ -45,7 +46,7 @@ class CategoryController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -66,10 +67,7 @@ class CategoryController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeCategory
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -92,7 +90,7 @@ class CategoryController extends Controller
'id' => (string)$category->id, 'id' => (string)$category->id,
'name' => $category->name, 'name' => $category->name,
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // float but on purpose. 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@@ -103,10 +101,7 @@ class CategoryController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoCategory
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -121,12 +116,13 @@ class CategoryController extends Controller
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float)$expense['sum'], // float but on purpose. 'difference_float' => (float)$expense['sum'],
'currency_id' => (string)$expense['currency_id'], 'currency_id' => (string)$expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
} }
return response()->json($result); return response()->json($result);
} }
} }

View File

@@ -34,11 +34,9 @@ use Illuminate\Http\JsonResponse;
*/ */
class PeriodController extends Controller class PeriodController extends Controller
{ {
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTotal
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -59,29 +57,29 @@ class PeriodController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
$response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose. $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference'];
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$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,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd( $response[$foreignCurrencyId]['difference'] = bcadd(
$response[$foreignCurrencyId]['difference'], $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])
app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // float but on purpose. $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
} }
return response()->json(array_values($response)); return response()->json(array_values($response));
} }
} }

View File

@@ -1,7 +1,7 @@
<?php <?php
declare(strict_types=1);
/* /*
* TagController.php * PeriodController.php
* Copyright (c) 2021 james@firefly-iii.org * Copyright (c) 2021 james@firefly-iii.org
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
@@ -20,8 +20,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Insight\Income; namespace FireflyIII\Api\V1\Controllers\Insight\Income;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
@@ -56,12 +54,9 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -85,24 +80,23 @@ class TagController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
$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] = $response[$foreignCurrencyId] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd( $response[$foreignCurrencyId]['difference'] = bcadd(
$response[$foreignCurrencyId]['difference'], $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])
app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
@@ -112,12 +106,9 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -153,13 +144,13 @@ class TagController extends Controller
// on currency ID // on currency ID
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] = $response[$key] ?? [
'id' => (string)$tagId, 'id' => (string)$tagId,
'name' => $tag['name'], 'name' => $tag['name'],
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$key]['difference'] = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount'])); $response[$key]['difference'] = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount']));
$response[$key]['difference_float'] = (float)$response[$key]['difference']; $response[$key]['difference_float'] = (float)$response[$key]['difference'];
} }
@@ -167,14 +158,13 @@ class TagController extends Controller
// on foreign ID // on foreign ID
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignKey] = $journal[$foreignKey] ?? [ $response[$foreignKey] = $journal[$foreignKey] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignKey]['difference'] = bcadd( $response[$foreignKey]['difference'] = bcadd(
$response[$foreignKey]['difference'], $response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount'])
app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference'];
} }
@@ -183,4 +173,5 @@ class TagController extends Controller
return response()->json(array_values($response)); return response()->json(array_values($response));
} }
} }

View File

@@ -41,7 +41,7 @@ class AccountController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -58,10 +58,10 @@ class AccountController extends Controller
} }
/** /**
* This endpoint is documented at: * TODO same code as Expense/AccountController.
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransfers * TODO does not actually include the name of the expense account.
* *
* @param GenericRequest $request * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -71,7 +71,6 @@ class AccountController extends Controller
$end = $request->getEnd(); $end = $request->getEnd();
$assetAccounts = $request->getAssetAccounts(); $assetAccounts = $request->getAssetAccounts();
$transfers = $this->opsRepository->sumTransfers($start, $end, $assetAccounts); $transfers = $this->opsRepository->sumTransfers($start, $end, $assetAccounts);
return response()->json($transfers); return response()->json($transfers);
} }
} }

View File

@@ -44,7 +44,7 @@ class CategoryController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -65,10 +65,7 @@ class CategoryController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -102,10 +99,7 @@ class CategoryController extends Controller
} }
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -127,5 +121,6 @@ class CategoryController extends Controller
} }
return response()->json($result); return response()->json($result);
} }
} }

View File

@@ -34,11 +34,9 @@ use Illuminate\Http\JsonResponse;
*/ */
class PeriodController extends Controller class PeriodController extends Controller
{ {
/** /**
* This endpoint is documented at: * @param GenericRequest $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTotal
*
* @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -59,24 +57,23 @@ class PeriodController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
$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] = $response[$foreignCurrencyId] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd( $response[$foreignCurrencyId]['difference'] = bcadd(
$response[$foreignCurrencyId]['difference'], $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])
app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
@@ -84,4 +81,5 @@ class PeriodController extends Controller
return response()->json(array_values($response)); return response()->json(array_values($response));
} }
} }

View File

@@ -39,6 +39,7 @@ class TagController extends Controller
/** /**
* TagController constructor. * TagController constructor.
* TODO lots of copying and pasting here.
*/ */
public function __construct() public function __construct()
{ {
@@ -55,10 +56,9 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at: * Expenses for no tag filtered by account.
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoTag
* *
* @param GenericRequest $request * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -82,24 +82,23 @@ class TagController extends Controller
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$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,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount']));
$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] = $response[$foreignCurrencyId] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd( $response[$foreignCurrencyId]['difference'] = bcadd(
$response[$foreignCurrencyId]['difference'], $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])
app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference'];
} }
@@ -109,12 +108,9 @@ class TagController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param GenericRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -150,13 +146,13 @@ class TagController extends Controller
// on currency ID // on currency ID
if (0 !== $currencyId) { if (0 !== $currencyId) {
$response[$key] = $response[$key] ?? [ $response[$key] = $response[$key] ?? [
'id' => (string)$tagId, 'id' => (string)$tagId,
'name' => $tag['name'], 'name' => $tag['name'],
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$currencyId, 'currency_id' => (string)$currencyId,
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$key]['difference'] = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount'])); $response[$key]['difference'] = bcadd($response[$key]['difference'], app('steam')->positive($journal['amount']));
$response[$key]['difference_float'] = (float)$response[$key]['difference']; $response[$key]['difference_float'] = (float)$response[$key]['difference'];
} }
@@ -164,16 +160,15 @@ class TagController extends Controller
// on foreign ID // on foreign ID
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignKey] = $journal[$foreignKey] ?? [ $response[$foreignKey] = $journal[$foreignKey] ?? [
'difference' => '0', 'difference' => '0',
'difference_float' => 0, 'difference_float' => 0,
'currency_id' => (string)$foreignCurrencyId, 'currency_id' => (string)$foreignCurrencyId,
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignKey]['difference'] = bcadd( $response[$foreignKey]['difference'] = bcadd(
$response[$foreignKey]['difference'], $response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount'])
app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; // intentional float $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference'];
} }
} }
} }

View File

@@ -40,7 +40,7 @@ class DestroyController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -56,19 +56,16 @@ class DestroyController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param Account $account
* *
* @codeCoverageIgnore
* @return JsonResponse * @return JsonResponse
*/ */
public function destroy(Account $account): JsonResponse public function destroy(Account $account): JsonResponse
{ {
$this->repository->destroy($account, null); $this->repository->destroy($account, null);
app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Account; namespace FireflyIII\Api\V1\Controllers\Models\Account;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
@@ -54,7 +53,7 @@ class ListController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -70,13 +69,10 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at: * @param Account $account
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAttachmentByAccount
*
* @param Account $account
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function attachments(Account $account): JsonResponse public function attachments(Account $account): JsonResponse
{ {
@@ -89,7 +85,7 @@ class ListController extends Controller
// 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);
@@ -102,13 +98,12 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at: * List all piggies.
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listPiggyBankByAccount
* *
* @param Account $account * @param Account $account
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function piggyBanks(Account $account): JsonResponse public function piggyBanks(Account $account): JsonResponse
{ {
@@ -125,7 +120,7 @@ class ListController extends Controller
// 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);
@@ -135,20 +130,18 @@ class ListController extends Controller
$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);
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listTransactionByAccount
*
* Show all transaction groups related to the account. * Show all transaction groups related to the account.
* *
* @codeCoverageIgnore
* *
* @param Request $request * @param Request $request
* @param Account $account * @param Account $account
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
*/ */
public function transactions(Request $request, Account $account): JsonResponse public function transactions(Request $request, Account $account): JsonResponse
{ {
@@ -177,7 +170,7 @@ class ListController extends Controller
} }
$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 */

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Account; namespace FireflyIII\Api\V1\Controllers\Models\Account;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\Support\Http\Api\AccountFilter;
@@ -50,7 +49,7 @@ class ShowController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -66,15 +65,12 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAccount
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Request $request * @param Request $request
* *
* @codeCoverageIgnore
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
*/ */
public function index(Request $request): JsonResponse public function index(Request $request): JsonResponse
{ {
@@ -88,17 +84,13 @@ class ShowController extends Controller
// 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);
$count = $collection->count(); $count = $collection->count();
$accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// continue sort:
$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);
@@ -111,12 +103,9 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/getAccount
*
* Show single instance. * Show single instance.
* *
* @param Account $account * @param Account $account
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -134,4 +123,5 @@ class ShowController extends Controller
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

@@ -42,7 +42,7 @@ class StoreController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -58,12 +58,9 @@ class StoreController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param StoreRequest $request
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -82,4 +79,5 @@ class StoreController extends Controller
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

@@ -30,8 +30,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Transformers\AccountTransformer; use FireflyIII\Transformers\AccountTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Illuminate\Support\Facades\Log; use Log;
use Preferences;
/** /**
* Class UpdateController * Class UpdateController
@@ -45,7 +44,7 @@ class UpdateController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -61,13 +60,10 @@ class UpdateController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/updateAccount
*
* Update account. * Update account.
* *
* @param UpdateRequest $request * @param UpdateRequest $request
* @param Account $account * @param Account $account
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -75,11 +71,10 @@ class UpdateController extends Controller
{ {
Log::debug(sprintf('Now in %s', __METHOD__)); 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();
/** @var AccountTransformer $transformer */ /** @var AccountTransformer $transformer */
$transformer = app(AccountTransformer::class); $transformer = app(AccountTransformer::class);

View File

@@ -40,7 +40,7 @@ class DestroyController extends Controller
/** /**
* DestroyController constructor. * DestroyController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -59,20 +59,17 @@ class DestroyController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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.
* *
* @codeCoverageIgnore
* *
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function destroy(Attachment $attachment): JsonResponse public function destroy(Attachment $attachment): JsonResponse
{ {
$this->repository->destroy($attachment); $this->repository->destroy($attachment);
app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -47,7 +47,7 @@ class ShowController extends Controller
/** /**
* ShowController constructor. * ShowController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -66,13 +66,11 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/downloadAttachment
*
* Download an attachment. * Download an attachment.
* *
* @param Attachment $attachment * @param Attachment $attachment
* *
* @codeCoverageIgnore
* @return LaravelResponse * @return LaravelResponse
* @throws FireflyException * @throws FireflyException
*/ */
@@ -96,7 +94,7 @@ class ShowController 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='.$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')
@@ -110,13 +108,10 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/listAttachment
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
@@ -132,7 +127,7 @@ class ShowController extends Controller
// 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);
@@ -145,12 +140,9 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param Attachment $attachment
* *
* @return JsonResponse * @return JsonResponse
*/ */

View File

@@ -35,7 +35,7 @@ use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use Illuminate\Support\Facades\Log; use Log;
/** /**
* Class StoreController * Class StoreController
@@ -47,7 +47,7 @@ class StoreController extends Controller
/** /**
* StoreController constructor. * StoreController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -66,12 +66,9 @@ class StoreController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/uploadAttachment
*
* Store a newly created resource in storage. * Store a newly created resource in storage.
* *
* @param StoreRequest $request * @param StoreRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @throws FireflyException
@@ -95,9 +92,10 @@ class StoreController extends Controller
/** /**
* Upload an attachment. * Upload an attachment.
* *
* @codeCoverageIgnore
* *
* @param Request $request * @param Request $request
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return JsonResponse * @return JsonResponse
*/ */

View File

@@ -43,7 +43,7 @@ class UpdateController extends Controller
/** /**
* UpdateController constructor. * UpdateController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -62,13 +62,10 @@ class UpdateController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 UpdateRequest $request
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return JsonResponse * @return JsonResponse
*/ */

View File

@@ -1,8 +1,7 @@
<?php <?php
/* /*
* NetWorthController.php * DestroyController.php
* Copyright (c) 2022 james@firefly-iii.org * Copyright (c) 2021 james@firefly-iii.org
* *
* This file is part of Firefly III (https://github.com/firefly-iii). * This file is part of Firefly III (https://github.com/firefly-iii).
* *
@@ -22,49 +21,54 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Api\V2\Controllers; namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget;
use FireflyIII\Api\V2\Request\Generic\SingleDateRequest; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Helpers\Report\NetWorthInterface; use FireflyIII\Models\AvailableBudget;
use FireflyIII\Support\Http\Api\ConvertsExchangeRates; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
* Class NetWorthController * Class DestroyController
*/ */
class NetWorthController extends Controller class DestroyController extends Controller
{ {
use ConvertsExchangeRates; private AvailableBudgetRepositoryInterface $abRepository;
private NetWorthInterface $netWorth;
/** /**
* AvailableBudgetController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
$this->netWorth = app(NetWorthInterface::class); /** @var User $user */
$this->netWorth->setUser(auth()->user()); $user = auth()->user();
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->abRepository->setUser($user);
return $next($request); return $next($request);
} }
); );
} }
/** /**
* This endpoint is documented at: * Remove the specified resource from storage.
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v2)#/net-worth/getNetWorth *
* @param SingleDateRequest $request * @param AvailableBudget $availableBudget
*
* @codeCoverageIgnore
*
* @return JsonResponse * @return JsonResponse
*/ */
public function get(SingleDateRequest $request): JsonResponse public function destroy(AvailableBudget $availableBudget): JsonResponse
{ {
$date = $request->getDate(); $this->abRepository->destroyAvailableBudget($availableBudget);
$result = $this->netWorth->sumNetWorthByCurrency($date);
$converted = $this->cerSum($result);
return response()->api($converted); return response()->json([], 204);
} }
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget; namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer; use FireflyIII\Transformers\AvailableBudgetTransformer;
@@ -45,7 +44,7 @@ class ShowController extends Controller
/** /**
* AvailableBudgetController constructor. * AvailableBudgetController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -63,13 +62,10 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/available_budgets/getAvailableBudget
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
@@ -88,7 +84,7 @@ class ShowController extends Controller
// 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);
@@ -101,14 +97,12 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param AvailableBudget $availableBudget
* *
* @return JsonResponse * @return JsonResponse
* @codeCoverageIgnore
*/ */
public function show(AvailableBudget $availableBudget): JsonResponse public function show(AvailableBudget $availableBudget): JsonResponse
{ {
@@ -122,4 +116,5 @@ class ShowController extends Controller
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

@@ -0,0 +1,98 @@
<?php
/*
* StoreController.php
* 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\AvailableBudget\Request;
use FireflyIII\Factory\TransactionCurrencyFactory;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use League\Fractal\Resource\Item;
/**
* Class StoreController
*/
class StoreController extends Controller
{
private AvailableBudgetRepositoryInterface $abRepository;
/**
* AvailableBudgetController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->abRepository->setUser($user);
return $next($request);
}
);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return JsonResponse
*/
public function store(Request $request): JsonResponse
{
$data = $request->getAll();
$data['start']->startOfDay();
$data['end']->endOfDay();
// currency is not mandatory:
if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) {
$factory = app(TransactionCurrencyFactory::class);
$currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null);
$data['currency_id'] = $currency->id;
unset($data['currency_code']);
}
if (!array_key_exists('currency_id', $data)) {
$currency = app('amount')->getDefaultCurrencyByUser(auth()->user());
$data['currency_id'] = $currency->id;
}
$availableBudget = $this->abRepository->store($data);
$manager = $this->getManager();
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
}

View File

@@ -0,0 +1,97 @@
<?php
/*
* UpdateController.php
* 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\AvailableBudget;
use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\AvailableBudget\Request;
use FireflyIII\Factory\TransactionCurrencyFactory;
use FireflyIII\Models\AvailableBudget;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use League\Fractal\Resource\Item;
/**
* Class UpdateController
*/
class UpdateController extends Controller
{
private AvailableBudgetRepositoryInterface $abRepository;
/**
* AvailableBudgetController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->abRepository->setUser($user);
return $next($request);
}
);
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param AvailableBudget $availableBudget
*
* @return JsonResponse
*/
public function update(Request $request, AvailableBudget $availableBudget): JsonResponse
{
$data = $request->getAll();
// find and validate currency ID
if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) {
$factory = app(TransactionCurrencyFactory::class);
$currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null) ?? app('amount')->getDefaultCurrency();
$currency->enabled = true;
$currency->save();
unset($data['currency_code']);
$data['currency_id'] = $currency->id;
}
$this->abRepository->updateAvailableBudget($availableBudget, $data);
$manager = $this->getManager();
/** @var AvailableBudgetTransformer $transformer */
$transformer = app(AvailableBudgetTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($availableBudget, $transformer, 'available_budgets');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
}

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\Bill;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
/** /**
@@ -38,7 +39,7 @@ class DestroyController extends Controller
/** /**
* BillController constructor. * BillController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -54,20 +55,18 @@ class DestroyController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param Bill $bill
* *
* @return JsonResponse * @return JsonResponse
* @codeCoverageIgnore
*/ */
public function destroy(Bill $bill): JsonResponse public function destroy(Bill $bill): JsonResponse
{ {
$this->repository->destroy($bill); $this->repository->destroy($bill);
app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Bill; namespace FireflyIII\Api\V1\Controllers\Models\Bill;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
@@ -51,7 +50,7 @@ class ListController extends Controller
/** /**
* BillController constructor. * BillController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -67,15 +66,12 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listAttachmentByBill
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Bill $bill * @param Bill $bill
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function attachments(Bill $bill): JsonResponse public function attachments(Bill $bill): JsonResponse
{ {
@@ -88,7 +84,7 @@ class ListController extends Controller
// 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);
@@ -101,15 +97,12 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listRuleByBill
*
* List all of them. * List all of them.
* *
* @param Bill $bill * @param Bill $bill
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function rules(Bill $bill): JsonResponse public function rules(Bill $bill): JsonResponse
{ {
@@ -125,7 +118,7 @@ class ListController extends Controller
// 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);
@@ -134,20 +127,18 @@ class ListController extends Controller
$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);
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listTransactionByBill
*
* Show all transactions. * Show all transactions.
* *
* @param Request $request * @param Request $request
* *
* @param Bill $bill * @param Bill $bill
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function transactions(Request $request, Bill $bill): JsonResponse public function transactions(Request $request, Bill $bill): JsonResponse
{ {
@@ -184,7 +175,7 @@ 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 */
@@ -196,4 +187,5 @@ class ListController extends Controller
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,10 +24,10 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Bill; namespace FireflyIII\Api\V1\Controllers\Models\Bill;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Transformers\BillTransformer; use FireflyIII\Transformers\BillTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
@@ -44,7 +44,7 @@ class ShowController extends Controller
/** /**
* BillController constructor. * BillController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -60,13 +60,10 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/listBill
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
@@ -89,14 +86,12 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param Bill $bill
* *
* @return JsonResponse * @return JsonResponse
* @codeCoverageIgnore
*/ */
public function show(Bill $bill): JsonResponse public function show(Bill $bill): JsonResponse
{ {

View File

@@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\BillTransformer; use FireflyIII\Transformers\BillTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
@@ -44,7 +45,7 @@ class StoreController extends Controller
/** /**
* BillController constructor. * BillController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -60,12 +61,9 @@ class StoreController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/storeBill
*
* Store a bill. * Store a bill.
* *
* @param StoreRequest $request * @param StoreRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @throws FireflyException

View File

@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Requests\Models\Bill\UpdateRequest;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Transformers\BillTransformer; use FireflyIII\Transformers\BillTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
@@ -41,7 +42,7 @@ class UpdateController extends Controller
/** /**
* BillController constructor. * BillController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -57,13 +58,10 @@ class UpdateController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 UpdateRequest $request
* @param Bill $bill * @param Bill $bill
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -80,5 +78,7 @@ class UpdateController extends Controller
$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

@@ -38,7 +38,7 @@ class DestroyController extends Controller
/** /**
* DestroyController constructor. * DestroyController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -54,19 +54,16 @@ class DestroyController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 * @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @codeCoverageIgnore
*/ */
public function destroy(Budget $budget): JsonResponse public function destroy(Budget $budget): JsonResponse
{ {
$this->repository->destroy($budget); $this->repository->destroy($budget);
app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Budget; namespace FireflyIII\Api\V1\Controllers\Models\Budget;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
@@ -53,7 +52,7 @@ class ListController extends Controller
/** /**
* ListController constructor. * ListController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -71,13 +70,10 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at: * @param Budget $budget
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listAttachmentByBudget
*
* @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function attachments(Budget $budget): JsonResponse public function attachments(Budget $budget): JsonResponse
{ {
@@ -90,7 +86,7 @@ class ListController extends Controller
// 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);
@@ -103,15 +99,12 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudgetLimitByBudget
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Budget $budget * @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function budgetLimits(Budget $budget): JsonResponse public function budgetLimits(Budget $budget): JsonResponse
{ {
@@ -122,7 +115,7 @@ class ListController extends Controller
$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);
@@ -134,17 +127,14 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionByBudget
*
* Show all transactions. * Show all transactions.
* *
* @param Request $request * @param Request $request
* *
* @param Budget $budget * @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function transactions(Request $request, Budget $budget): JsonResponse public function transactions(Request $request, Budget $budget): JsonResponse
{ {
@@ -186,7 +176,7 @@ class ListController extends Controller
} }
$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 */
@@ -198,66 +188,4 @@ class ListController extends Controller
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);
} }
/**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionWithoutBudget
*
* Show all transactions.
*
* @param Request $request
*
* @return JsonResponse
* @throws FireflyException
*/
public function withoutBudget(Request $request): JsonResponse
{
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// user can overrule page size with limit parameter.
$limit = $this->parameters->get('limit');
if (null !== $limit && $limit > 0) {
$pageSize = $limit;
}
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on budget.
->withoutBudget()
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.budgets.without-budget').$this->buildParams());
$transactions = $paginator->getCollection();
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE);
}
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\Budget; namespace FireflyIII\Api\V1\Controllers\Models\Budget;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
@@ -46,7 +45,7 @@ class ShowController extends Controller
/** /**
* ListController constructor. * ListController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -64,13 +63,10 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudget
*
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function index(): JsonResponse public function index(): JsonResponse
{ {
@@ -86,7 +82,7 @@ class ShowController extends Controller
// 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);
@@ -101,9 +97,10 @@ class ShowController extends Controller
/** /**
* Show a budget. * Show a budget.
* *
* @param Budget $budget * @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @codeCoverageIgnore
*/ */
public function show(Budget $budget): JsonResponse public function show(Budget $budget): JsonResponse
{ {
@@ -117,4 +114,5 @@ class ShowController extends Controller
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,7 +41,7 @@ class StoreController extends Controller
/** /**
* StoreController constructor. * StoreController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -57,12 +57,9 @@ class StoreController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/storeBudget
*
* Store a budget. * Store a budget.
* *
* @param StoreRequest $request * @param StoreRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @throws FireflyException

View File

@@ -41,7 +41,7 @@ class UpdateController extends Controller
/** /**
* UpdateController constructor. * UpdateController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -57,13 +57,10 @@ class UpdateController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 UpdateRequest $request
* @param Budget $budget * @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
*/ */
@@ -80,5 +77,6 @@ class UpdateController extends Controller
$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

@@ -41,7 +41,7 @@ class DestroyController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -59,16 +59,13 @@ class DestroyController extends Controller
} }
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/deleteBudgetLimit
*
* Remove the specified resource from storage. * Remove the specified resource from storage.
* *
* @param Budget $budget * @param Budget $budget
* @param BudgetLimit $budgetLimit * @param BudgetLimit $budgetLimit
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function destroy(Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function destroy(Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
@@ -76,7 +73,6 @@ class DestroyController extends Controller
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.');
} }
$this->blRepository->destroyBudgetLimit($budgetLimit); $this->blRepository->destroyBudgetLimit($budgetLimit);
app('preferences')->mark();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit; namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
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;
@@ -49,7 +48,7 @@ class ListController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -67,16 +66,14 @@ class ListController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 Request $request
* @param Budget $budget * @param Budget $budget
* @param BudgetLimit $budgetLimit * @param BudgetLimit $budgetLimit
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
@@ -109,7 +106,7 @@ class ListController extends Controller
$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 */

View File

@@ -24,7 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit; namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Data\SameDateRequest; use FireflyIII\Api\V1\Requests\Data\DateRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
@@ -50,7 +50,7 @@ class ShowController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -70,16 +70,12 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at: * Display a listing of the budget limits for this budget..
* 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. * @param Request $request
*
* @param Request $request
* @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function index(Request $request, Budget $budget): JsonResponse public function index(Request $request, Budget $budget): JsonResponse
{ {
@@ -90,7 +86,7 @@ class ShowController extends Controller
$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);
@@ -103,17 +99,14 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at: * Display a listing of the budget limits for this budget..
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudgetLimit
* *
* Display a listing of the budget limits for this budget. * @param DateRequest $request
*
* @param SameDateRequest $request
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @codeCoverageIgnore
*/ */
public function indexAll(SameDateRequest $request): JsonResponse public function indexAll(DateRequest $request): JsonResponse
{ {
$manager = $this->getManager(); $manager = $this->getManager();
$manager->parseIncludes('budget'); $manager->parseIncludes('budget');
@@ -122,7 +115,7 @@ class ShowController extends Controller
$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);
@@ -135,15 +128,11 @@ class ShowController extends Controller
} }
/** /**
* This endpoint is documented at: * @param Request $request
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/getBudgetLimit * @param Budget $budget
* * @param BudgetLimit $budgetLimit
* @param Request $request
* @param Budget $budget
* @param BudgetLimit $budgetLimit
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
*/ */
public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
@@ -161,4 +150,5 @@ class ShowController extends Controller
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

@@ -25,6 +25,7 @@ namespace FireflyIII\Api\V1\Controllers\Models\BudgetLimit;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest; use FireflyIII\Api\V1\Requests\Models\BudgetLimit\StoreRequest;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Transformers\BudgetLimitTransformer; use FireflyIII\Transformers\BudgetLimitTransformer;
@@ -42,7 +43,7 @@ class StoreController extends Controller
/** /**
* BudgetLimitController constructor. * BudgetLimitController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -60,15 +61,13 @@ class StoreController extends Controller
} }
/** /**
* This endpoint is documented at:
* 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 StoreRequest $request
* @param Budget $budget
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException
*
*/ */
public function store(StoreRequest $request, Budget $budget): JsonResponse public function store(StoreRequest $request, Budget $budget): JsonResponse
{ {

View File

@@ -42,12 +42,9 @@ class UpdateController extends Controller
private BudgetLimitRepositoryInterface $blRepository; private BudgetLimitRepositoryInterface $blRepository;
/** /**
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit
*
* BudgetLimitController constructor. * BudgetLimitController constructor.
* *
* @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
@@ -66,18 +63,16 @@ class UpdateController extends Controller
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
* This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit
* *
* @param UpdateRequest $request * @param UpdateRequest $request
* @param Budget $budget * @param Budget $budget
* @param BudgetLimit $budgetLimit * @param BudgetLimit $budgetLimit
* *
* @return JsonResponse * @return JsonResponse
* @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 ((int)$budget->id !== (int)$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.');
} }
@@ -93,5 +88,6 @@ class UpdateController extends Controller
$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);
} }
} }

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