mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 18:54:58 +00:00 
			
		
		
		
	Compare commits
	
		
			332 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | c2216843d8 | ||
|  | 339fb5099f | ||
|  | cf56707b02 | ||
|  | 19f38aa6ed | ||
|  | 9f69e112d0 | ||
|  | 8eb4259be0 | ||
|  | d3a1f43cbb | ||
|  | 18b06ff283 | ||
|  | 53addcf99a | ||
|  | 0fa4d75a47 | ||
|  | 2ef86c3339 | ||
|  | d48c3a6d2f | ||
|  | 2260ede559 | ||
|  | 5690a44c38 | ||
|  | e36a9fda1b | ||
|  | 10f195d334 | ||
|  | 54afc6ca8c | ||
|  | 2e67bd3b78 | ||
|  | f27eb084c7 | ||
|  | 7629dfd54a | ||
|  | f62fd18b72 | ||
|  | c6b60ff6b4 | ||
|  | e9655e6d86 | ||
|  | 3bca9b06f8 | ||
|  | d97fdc3393 | ||
|  | 7dc72f98bf | ||
|  | da00179066 | ||
|  | 89910031cd | ||
|  | 5676aeac80 | ||
|  | b0b9055e2e | ||
|  | c0aefed764 | ||
|  | e2ec9ca5fb | ||
|  | 8e38f5c2c0 | ||
|  | 99b2858863 | ||
|  | b43669e731 | ||
|  | 3bc9905715 | ||
|  | c55aebd005 | ||
|  | 55c331f536 | ||
|  | ce236284f4 | ||
|  | c24cac68f6 | ||
|  | db149ca6e1 | ||
|  | 0502f2a4a5 | ||
|  | f13df7e605 | ||
|  | 36a6981329 | ||
|  | 7abcdea816 | ||
|  | 0509e54a95 | ||
|  | b8893bcad7 | ||
|  | c9356c1237 | ||
|  | 2d7b7c2f3f | ||
|  | d0db1117f7 | ||
|  | e287e76db5 | ||
|  | 8c28c4b5ac | ||
|  | f048e943f8 | ||
|  | 12a84572e2 | ||
|  | c8de1d3372 | ||
|  | 234e3f4ca5 | ||
|  | 7749fb1a0b | ||
|  | f55d4e32c0 | ||
|  | cfd98a33fe | ||
|  | 7bdf20fee5 | ||
|  | e906fa3653 | ||
|  | 57cf7f6f0d | ||
|  | d378e7e897 | ||
|  | a8e666db34 | ||
|  | 7b46339a5d | ||
|  | 20aa6e429b | ||
|  | 7ba11a57a8 | ||
|  | 49de4f2200 | ||
|  | 5d01955133 | ||
|  | 7591f3fa29 | ||
|  | 89f8f9b45b | ||
|  | 59f5b38dca | ||
|  | 5b0e61033c | ||
|  | 096af00a72 | ||
|  | dca2dc4600 | ||
|  | 96b482dac5 | ||
|  | e05664f34f | ||
|  | 72cca5ccbf | ||
|  | 0b9be029ac | ||
|  | 91701473af | ||
|  | ad6a9a7df7 | ||
|  | 32b6ded008 | ||
|  | 4f2d0a0322 | ||
|  | 793cfcb2c5 | ||
|  | 3a71bd01fb | ||
|  | a1d99c1954 | ||
|  | 19a874b274 | ||
|  | b95dd5c238 | ||
|  | 7c84af2370 | ||
|  | db1c27d833 | ||
|  | 636cd84f4f | ||
|  | f2d4fae813 | ||
|  | 986c9ab20a | ||
|  | cd7e222b72 | ||
|  | 50b599b1a9 | ||
|  | 1d162edb59 | ||
|  | 7bdd4ddeab | ||
|  | ae6e5a5599 | ||
|  | 1222184b68 | ||
|  | 18f779c6de | ||
|  | 138f67581c | ||
|  | 597d6ac513 | ||
|  | 3ab25c2e8c | ||
|  | b11d97ba4e | ||
|  | 080c810131 | ||
|  | 56bc79d64e | ||
|  | 72d2c9d600 | ||
|  | 0374c32236 | ||
|  | d73cd4b515 | ||
|  | 54e3e3f051 | ||
|  | abf218fc21 | ||
|  | dcf90b6159 | ||
|  | 1cf91c78f8 | ||
|  | 968abd26e8 | ||
|  | aa05f7a2d2 | ||
|  | 181c23b07c | ||
|  | 955cde3ed9 | ||
|  | 477a3c7eb2 | ||
|  | f4b66b980b | ||
|  | 281de63e0d | ||
|  | c19a700662 | ||
|  | fc011ba1d9 | ||
|  | b941f590e0 | ||
|  | 8f4db78ff2 | ||
|  | 4b4dc2e298 | ||
|  | 2de19547ca | ||
|  | 5a058491b0 | ||
|  | 6743d99d9b | ||
|  | 35a5ec78c3 | ||
|  | 3440c3e77a | ||
|  | dd17f06362 | ||
|  | 8a15cb3a34 | ||
|  | 4a548ac282 | ||
|  | d22353b13d | ||
|  | c18046c25d | ||
|  | 4a12d4d156 | ||
|  | 20044427b4 | ||
|  | 073dedd483 | ||
|  | 06c25c913c | ||
|  | 08d06cf465 | ||
|  | 1e9eb843c0 | ||
|  | 78a5dae2a0 | ||
|  | 19443a5b34 | ||
|  | 74acc90702 | ||
|  | 349f580371 | ||
|  | f019d33a03 | ||
|  | c7af25ac38 | ||
|  | b52bd59cea | ||
|  | 332d32c319 | ||
|  | 2f824ba1a8 | ||
|  | a6b09acd5e | ||
|  | d4779c8c8f | ||
|  | ba01c4bbe8 | ||
|  | ddc1d81665 | ||
|  | 790aeb3c46 | ||
|  | 6ed5be10b1 | ||
|  | a7b8470d9e | ||
|  | 2a05cc382f | ||
|  | 1e10a6ce1b | ||
|  | 7645ef55c2 | ||
|  | 6ce200b60d | ||
|  | d782e28906 | ||
|  | da3bd31fb8 | ||
|  | aa3ed40430 | ||
|  | ad7e564f14 | ||
|  | f23ee2dac5 | ||
|  | 1962f74439 | ||
|  | 0064d060ea | ||
|  | e47e6b1958 | ||
|  | 4c04415e80 | ||
|  | 3654e75b8c | ||
|  | 66fa73aea4 | ||
|  | df87d03f32 | ||
|  | 3fbe851a0b | ||
|  | d1b2e63950 | ||
|  | 34fd8cf751 | ||
|  | f1fe90fce0 | ||
|  | 2ba6fa0dda | ||
|  | f2928e3d7d | ||
|  | 895ab9c5d8 | ||
|  | fb07c68132 | ||
|  | 68e7d45f63 | ||
|  | 49e302e1bc | ||
|  | b33ca786ae | ||
|  | dc77d8edda | ||
|  | c339a183b9 | ||
|  | f263795a99 | ||
|  | e9e771e57b | ||
|  | fbb9d7c6b4 | ||
|  | 10abd7b0ae | ||
|  | 3de36901b8 | ||
|  | 5b4967acb9 | ||
|  | 0a007b1e6e | ||
|  | 4ad68b7dfa | ||
|  | 73aef1b9a4 | ||
|  | dcfea20973 | ||
|  | 9b6766d3b2 | ||
|  | b8bc8e2c47 | ||
|  | 039e3aa34c | ||
|  | 551ff109c9 | ||
|  | 664451d0c6 | ||
|  | 4031057bc0 | ||
|  | fcf9b782c1 | ||
|  | d693d382b9 | ||
|  | 0a1b6c7793 | ||
|  | 5acba2bddf | ||
|  | 883b16fad1 | ||
|  | ef48b3e751 | ||
|  | 3c956e7e98 | ||
|  | 519ea271a9 | ||
|  | 09d5160404 | ||
|  | 97dcf03334 | ||
|  | 896a804a72 | ||
|  | 656bb5043d | ||
|  | e953becbae | ||
|  | 6c9901b919 | ||
|  | ff45c94106 | ||
|  | a8a3fbeef4 | ||
|  | dae8092ecd | ||
|  | 70110208fc | ||
|  | 217ca98933 | ||
|  | c2945c532e | ||
|  | ea750576b3 | ||
|  | 82538ba4fc | ||
|  | 2b2f37a8c9 | ||
|  | 4db2ec60e0 | ||
|  | 7d88d35556 | ||
|  | 3c3e91ff48 | ||
|  | 039e8d6e17 | ||
|  | 50bf79ab18 | ||
|  | 467c6762fa | ||
|  | 740f4e403f | ||
|  | 5664d51695 | ||
|  | b195a61498 | ||
|  | 94e6816bf6 | ||
|  | ebf97f710f | ||
|  | 714b54ed06 | ||
|  | 620c5f515e | ||
|  | c06fd12b07 | ||
|  | 2c206bba64 | ||
|  | 04953b5645 | ||
|  | 1732ce63f3 | ||
|  | dd44a1e517 | ||
|  | 9f26757e8a | ||
|  | a9c8c8384d | ||
|  | 69019d5215 | ||
|  | 96411b17e9 | ||
|  | 5a093b58d8 | ||
|  | 470b3e0973 | ||
|  | dc251c216c | ||
|  | ae9ef61f80 | ||
|  | d9ca7b7277 | ||
|  | 0c99248deb | ||
|  | 1aae84a4d0 | ||
|  | 528da3f08e | ||
|  | 9c507f7f62 | ||
|  | 07da2fdda3 | ||
|  | ca3366544e | ||
|  | ccee7b483c | ||
|  | 5903133e3b | ||
|  | 5bf520b6ed | ||
|  | a47da92d81 | ||
|  | 63f84ae7b1 | ||
|  | 4d6bc55723 | ||
|  | 9bb4df4cc3 | ||
|  | c47a5379ae | ||
|  | cde9c4a2bc | ||
|  | 5a560b42ef | ||
|  | 50874c9cf7 | ||
|  | 6f984aa591 | ||
|  | 274162afcd | ||
|  | 6bd23d897f | ||
|  | 73f29ebf69 | ||
|  | cabcb9c6d0 | ||
|  | 116f7ed613 | ||
|  | 6ef0eb73d0 | ||
|  | 7f4feb0cfc | ||
|  | 626f7357bb | ||
|  | 690c9203c8 | ||
|  | 1209f3b39a | ||
|  | a4524b3c2c | ||
|  | a3cbdadb39 | ||
|  | 9e3c5fd984 | ||
|  | 7d80ac37a6 | ||
|  | f74b9ba7ab | ||
|  | 3ac240dc1c | ||
|  | d233b3f24f | ||
|  | 19fff681d2 | ||
|  | bc7c3bb9b3 | ||
|  | 57be7f2905 | ||
|  | 1c0da454db | ||
|  | b541f7b944 | ||
|  | 6e84326583 | ||
|  | ca14496e4e | ||
|  | 480d65fc1f | ||
|  | 6bddb63b45 | ||
|  | c5142aeba5 | ||
|  | 38d9f10672 | ||
|  | 937394af7a | ||
|  | fe10955eb9 | ||
|  | ccda71ff8e | ||
|  | cd75224cdd | ||
|  | 1c2089b8a3 | ||
|  | 3ead4d4587 | ||
|  | f2b71bc280 | ||
|  | f027d71136 | ||
|  | fa41d6df04 | ||
|  | d2bb65bf04 | ||
|  | b5be1b11d1 | ||
|  | 9fb049991f | ||
|  | fba847dd28 | ||
|  | b33883b334 | ||
|  | f74a6dffca | ||
|  | 7390e20218 | ||
|  | 9646dc439e | ||
|  | 554c63b9c7 | ||
|  | 24d8640e9b | ||
|  | ea151d069c | ||
|  | f140d2f37a | ||
|  | 4e163c4bda | ||
|  | ddcf8b892b | ||
|  | 49138eb03a | ||
|  | 71b63bd33b | ||
|  | 88348f59c2 | ||
|  | 7eb5643204 | ||
|  | 565cb6d79e | ||
|  | c0d715c78a | ||
|  | a3d0355ddd | ||
|  | bc4e06568d | ||
|  | 8acb9f4056 | ||
|  | 9cbbd581ee | ||
|  | fdc9467218 | 
| @@ -1,8 +1,23 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # make sure the correct directories exists (suggested by @chrif): | ||||
| mkdir -p $FIREFLY_PATH/storage/app | ||||
| mkdir -p $FIREFLY_PATH/storage/app/public | ||||
| mkdir -p $FIREFLY_PATH/storage/build | ||||
| mkdir -p $FIREFLY_PATH/storage/database | ||||
| mkdir -p $FIREFLY_PATH/storage/debugbar | ||||
| mkdir -p $FIREFLY_PATH/storage/export | ||||
| mkdir -p $FIREFLY_PATH/storage/framework/cache | ||||
| mkdir -p $FIREFLY_PATH/storage/framework/sessions | ||||
| mkdir -p $FIREFLY_PATH/storage/framework/testing | ||||
| mkdir -p $FIREFLY_PATH/storage/framework/views | ||||
| mkdir -p $FIREFLY_PATH/storage/logs | ||||
| mkdir -p $FIREFLY_PATH/storage/upload | ||||
|  | ||||
|  | ||||
| # make sure we own the volumes: | ||||
| chown -R www-data:www-data -R $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload $FIREFLY_PATH/storage/logs $FIREFLY_PATH/storage/cache | ||||
| chmod -R 775 $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload $FIREFLY_PATH/storage/upload $FIREFLY_PATH/storage/logs $FIREFLY_PATH/storage/cache | ||||
| chown -R www-data:www-data -R $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload $FIREFLY_PATH/storage/logs $FIREFLY_PATH/storage/framework/cache | ||||
| chmod -R 775 $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload $FIREFLY_PATH/storage/upload $FIREFLY_PATH/storage/logs $FIREFLY_PATH/storage/framework/cache | ||||
|  | ||||
| # remove any lingering files that may break upgrades: | ||||
| rm -f $FIREFLY_PATH/storage/logs/laravel.log | ||||
|   | ||||
| @@ -50,6 +50,7 @@ COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html | ||||
| MAIL_DRIVER=${MAIL_DRIVER} | ||||
| MAIL_HOST=${MAIL_HOST} | ||||
| MAIL_PORT=${MAIL_PORT} | ||||
| @@ -58,6 +59,12 @@ MAIL_USERNAME=${MAIL_USERNAME} | ||||
| MAIL_PASSWORD=${MAIL_PASSWORD} | ||||
| MAIL_ENCRYPTION=${MAIL_ENCRYPTION} | ||||
|  | ||||
| # Other mail drivers: | ||||
| MAILGUN_DOMAIN=${MAILGUN_DOMAIN} | ||||
| MAILGUN_SECRET=${MAILGUN_SECRET} | ||||
| MANDRILL_SECRET=${MANDRILL_SECRET} | ||||
| SPARKPOST_SECRET=${SPARKPOST_SECRET} | ||||
|  | ||||
| # Firefly III can send you the following messages | ||||
| SEND_REGISTRATION_MAIL=true | ||||
| SEND_ERROR_MESSAGE=false | ||||
| @@ -95,4 +102,5 @@ DEMO_PASSWORD= | ||||
| IS_DOCKER=true | ||||
| IS_SANDSTORM=false | ||||
| IS_HEROKU=false | ||||
| BUNQ_USE_SANDBOX=false | ||||
| TZ=${TZ} | ||||
|   | ||||
							
								
								
									
										10
									
								
								.env.example
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								.env.example
									
									
									
									
									
								
							| @@ -54,6 +54,7 @@ COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html | ||||
| MAIL_DRIVER=log | ||||
| MAIL_HOST=smtp.mailtrap.io | ||||
| MAIL_PORT=2525 | ||||
| @@ -62,6 +63,12 @@ MAIL_USERNAME=null | ||||
| MAIL_PASSWORD=null | ||||
| MAIL_ENCRYPTION=null | ||||
|  | ||||
| # Other mail drivers: | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
| MANDRILL_SECRET= | ||||
| SPARKPOST_SECRET= | ||||
|  | ||||
| # Firefly III can send you the following messages | ||||
| SEND_REGISTRATION_MAIL=true | ||||
| SEND_ERROR_MESSAGE=true | ||||
| @@ -98,4 +105,7 @@ DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| IS_DOCKER=false | ||||
| IS_SANDSTORM=false | ||||
| BUNQ_USE_SANDBOX=false | ||||
| IS_HEROKU=false | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
|   | ||||
							
								
								
									
										10
									
								
								.env.heroku
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								.env.heroku
									
									
									
									
									
								
							| @@ -54,6 +54,7 @@ COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html | ||||
| MAIL_DRIVER=log | ||||
| MAIL_HOST=smtp.mailtrap.io | ||||
| MAIL_PORT=2525 | ||||
| @@ -62,6 +63,12 @@ MAIL_USERNAME=null | ||||
| MAIL_PASSWORD=null | ||||
| MAIL_ENCRYPTION=null | ||||
|  | ||||
| # Other mail drivers: | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
| MANDRILL_SECRET= | ||||
| SPARKPOST_SECRET= | ||||
|  | ||||
| # Firefly III can send you the following messages | ||||
| SEND_REGISTRATION_MAIL=true | ||||
| SEND_ERROR_MESSAGE=true | ||||
| @@ -98,4 +105,7 @@ DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| IS_DOCKER=false | ||||
| IS_SANDSTORM=false | ||||
| BUNQ_USE_SANDBOX=false | ||||
| IS_HEROKU=true | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
|   | ||||
| @@ -54,6 +54,7 @@ COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html | ||||
| MAIL_DRIVER=log | ||||
| MAIL_HOST=smtp.mailtrap.io | ||||
| MAIL_PORT=2525 | ||||
| @@ -62,6 +63,12 @@ MAIL_USERNAME=null | ||||
| MAIL_PASSWORD=null | ||||
| MAIL_ENCRYPTION=null | ||||
|  | ||||
| # Other mail drivers: | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
| MANDRILL_SECRET= | ||||
| SPARKPOST_SECRET= | ||||
|  | ||||
| # Firefly III can send you the following messages | ||||
| SEND_REGISTRATION_MAIL=true | ||||
| SEND_ERROR_MESSAGE=true | ||||
| @@ -98,4 +105,7 @@ DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| IS_DOCKER=false | ||||
| IS_SANDSTORM=true | ||||
| BUNQ_USE_SANDBOX=false | ||||
| IS_HEROKU=false | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
|   | ||||
							
								
								
									
										12
									
								
								.env.testing
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								.env.testing
									
									
									
									
									
								
							| @@ -49,6 +49,7 @@ COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html | ||||
| MAIL_DRIVER=log | ||||
| MAIL_HOST=smtp.mailtrap.io | ||||
| MAIL_PORT=2525 | ||||
| @@ -57,9 +58,11 @@ MAIL_USERNAME=null | ||||
| MAIL_PASSWORD=null | ||||
| MAIL_ENCRYPTION=null | ||||
|  | ||||
| # Firefly III can send you the following messages | ||||
| SEND_REGISTRATION_MAIL=true | ||||
| SEND_ERROR_MESSAGE=false | ||||
| # Other mail drivers: | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
| MANDRILL_SECRET= | ||||
| SPARKPOST_SECRET= | ||||
|  | ||||
|  | ||||
| # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. | ||||
| @@ -94,4 +97,7 @@ DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| IS_DOCKER=false | ||||
| IS_SANDSTORM=false | ||||
| BUNQ_USE_SANDBOX=true | ||||
| IS_HEROKU=false | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
|   | ||||
							
								
								
									
										22
									
								
								.github/ISSUE_TEMPLATE/Bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.github/ISSUE_TEMPLATE/Bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| --- | ||||
| name: Bug report | ||||
| about: Create a report to help Firefly III improve | ||||
|  | ||||
| --- | ||||
|  | ||||
| **Bug description** | ||||
| I am running Firefly III version x.x.x | ||||
|  | ||||
| (please give a clear and concise description of what the bug is) | ||||
|  | ||||
| **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). | ||||
|  | ||||
| **Bonus points** | ||||
| Earn bonus points by: | ||||
|  | ||||
| - Post a stacktrace from your log files | ||||
| - Add a screenshot | ||||
							
								
								
									
										27
									
								
								.github/ISSUE_TEMPLATE/Custom.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.github/ISSUE_TEMPLATE/Custom.md
									
									
									
									
										vendored
									
									
										Normal 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** | ||||
|  | ||||
|  | ||||
|  | ||||
| **Steps to reproduce**  | ||||
| (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).  | ||||
|  | ||||
|  | ||||
|  | ||||
| **Bonus points** | ||||
| Earn bonus points by: | ||||
|  | ||||
| - Add a screenshot | ||||
| - Replicate the problem on the demo site https://demo.firefly-iii.org/ | ||||
							
								
								
									
										21
									
								
								.github/ISSUE_TEMPLATE/Feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.github/ISSUE_TEMPLATE/Feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| name: Feature request | ||||
| about: Suggest an idea or feature for Firefly III | ||||
|  | ||||
| --- | ||||
|  | ||||
| **Description** | ||||
| Please describe your feature request: | ||||
|  | ||||
| - I would like Firefly III to do X. | ||||
| - What if you would add feature Y? | ||||
| - Firefly III doesn't do Z. | ||||
|  | ||||
| **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. | ||||
							
								
								
									
										11
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
								
							| @@ -1,11 +0,0 @@ | ||||
| I am running Firefly III version x.x.x  | ||||
|  | ||||
| #### Description of my issue: | ||||
|  | ||||
| #### Steps to reproduce  | ||||
|  | ||||
| (please include if this problem also exists on the demo site) | ||||
|  | ||||
| #### Other important details (log files, system info): | ||||
|  | ||||
| Please click the version number in the right corner of any Firefly III page to get debug information.  | ||||
							
								
								
									
										3
									
								
								.github/stale.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/stale.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| # Configuration for probot-stale - https://github.com/probot/stale | ||||
|  | ||||
| # Number of days of inactivity before an Issue or Pull Request becomes stale | ||||
| daysUntilStale: 30 | ||||
| daysUntilStale: 14 | ||||
|  | ||||
| # 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. | ||||
| @@ -12,6 +12,7 @@ daysUntilClose: 7 | ||||
| exemptLabels: | ||||
|   - enhancement | ||||
|   - feature | ||||
|   - bug | ||||
|  | ||||
| # Set to true to ignore issues in a project (defaults to false) | ||||
| exemptProjects: false | ||||
|   | ||||
| @@ -1,7 +1,50 @@ | ||||
| # 4.7.5 | ||||
| - A new feature called "recurring transactions" that will make Firefly III automatically create transactions for you. | ||||
| - New API end points for attachments, available budgets, budgets, budget limits, categories, configuration, currency exchange rates, journal links, link types, piggy banks, preferences, recurring transactions, rules, rule groups and tags. | ||||
| - Added support for YunoHost. | ||||
| - The 2FA secret is visible so you can type it into 2FA apps. | ||||
| - Bunq and Spectre imports will now ask to apply rules. | ||||
| - Sandstorm users can now make API keys. | ||||
| - Various typo's in the English translations. [issue 1493](https://github.com/firefly-iii/firefly-iii/issues/1493) | ||||
| - Bug where Spectre was never called [issue 1492](https://github.com/firefly-iii/firefly-iii/issues/1492) | ||||
| - Clear cache after journal is created through API [issue 1483](https://github.com/firefly-iii/firefly-iii/issues/1483) | ||||
| - Make sure docker directories exist [issue 1500](https://github.com/firefly-iii/firefly-iii/issues/1500) | ||||
| - Broken link to bill edit [issue 1505](https://github.com/firefly-iii/firefly-iii/issues/1505) | ||||
| - Several bugs in the editing of split transactions [issue 1509](https://github.com/firefly-iii/firefly-iii/issues/1509) | ||||
| - Import routine ignored formatting of several date fields [issue 1510](https://github.com/firefly-iii/firefly-iii/issues/1510) | ||||
| - Piggy bank events now show the correct currency [issue 1446](https://github.com/firefly-iii/firefly-iii/issues/1446) | ||||
| - Inactive accounts are no longer suggested [issue 1463](https://github.com/firefly-iii/firefly-iii/issues/1463) | ||||
| - Some income / expense charts are less confusing [issue 1518](https://github.com/firefly-iii/firefly-iii/issues/1518) | ||||
| - Validation bug in multi-currency create view [issue 1521](https://github.com/firefly-iii/firefly-iii/issues/1521) | ||||
|  | ||||
| # 4.7.4 | ||||
| - [Issue 1409](https://github.com/firefly-iii/firefly-iii/issues/1409), add Indian Rupee and explain that users can do this themselves [issue 1413](https://github.com/firefly-iii/firefly-iii/issues/1413) | ||||
| - [Issue 1445](https://github.com/firefly-iii/firefly-iii/issues/1445), upgrade Curl in Docker image. | ||||
| - [Issue 1386](https://github.com/firefly-iii/firefly-iii/issues/1386), quick links to often used pages. | ||||
| - [Issue 1405](https://github.com/firefly-iii/firefly-iii/issues/1405), show proposed amount to piggy banks. | ||||
| - [Issue 1416](https://github.com/firefly-iii/firefly-iii/issues/1416), ability to delete lost attachments. | ||||
| - A completely rewritten import routine that can handle bunq (thanks everybody for testing!), CSV files and Spectre. Please make sure you read about this at http://bit.ly/FF3-new-import | ||||
| - [Issue 1392](https://github.com/firefly-iii/firefly-iii/issues/1392), explicitly mention rules are inactive (when they are). | ||||
| - [Issue 1406](https://github.com/firefly-iii/firefly-iii/issues/1406), bill conversion to rules will be smarter about the rules they create. | ||||
| - [Issue 1369](https://github.com/firefly-iii/firefly-iii/issues/1369), you can now properly order piggy banks again. | ||||
| - [Issue 1389](https://github.com/firefly-iii/firefly-iii/issues/1389), null-pointer in the import routine. | ||||
| - [Issue 1400](https://github.com/firefly-iii/firefly-iii/issues/1400), missing translation. | ||||
| - [Issue 1403](https://github.com/firefly-iii/firefly-iii/issues/1403), bill would always be marked as inactive in edit screen. | ||||
| - [Issue 1418](https://github.com/firefly-iii/firefly-iii/issues/1418), missing note text on bill page. | ||||
| - Export routine would break when encountering un-decryptable files. | ||||
| - [Issue 1425](https://github.com/firefly-iii/firefly-iii/issues/1425), empty fields when edit multiple transactions at once. | ||||
| - [Issue 1449](https://github.com/firefly-iii/firefly-iii/issues/1449), bad calculations in "budget left to spend" view. | ||||
| - [Issue 1451](https://github.com/firefly-iii/firefly-iii/issues/1451), same but in another view. | ||||
| - [Issue 1453](https://github.com/firefly-iii/firefly-iii/issues/1453), same as [issue 1403](https://github.com/firefly-iii/firefly-iii/issues/1403). | ||||
| - [Issue 1455](https://github.com/firefly-iii/firefly-iii/issues/1455), could add income to a budget. | ||||
| - [Issue 1442](https://github.com/firefly-iii/firefly-iii/issues/1442), issues with editing a split deposit. | ||||
| - [Issue 1452](https://github.com/firefly-iii/firefly-iii/issues/1452), date range problems with tags. | ||||
| - [Issue 1458](https://github.com/firefly-iii/firefly-iii/issues/1458), same for transactions. | ||||
| - [Issue 1415](https://github.com/firefly-iii/firefly-iii/issues/1415), will email you when OAuth2 keys are generated. | ||||
|  | ||||
| # 4.7.3.2 | ||||
| - Forgot to increase the version number :(. | ||||
|  | ||||
|  | ||||
| # 4.7.3.1 | ||||
| - Fixed a critical bug where the rules-engine would fire inadvertently. | ||||
|  | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = ( | ||||
|  | ||||
|   manifest = ( | ||||
|     appTitle = (defaultText = "Firefly III"), | ||||
|     appVersion = 12, | ||||
|     appMarketingVersion = (defaultText = "4.7.3.2"), | ||||
|     appVersion = 14, | ||||
|     appMarketingVersion = (defaultText = "4.7.5"), | ||||
|  | ||||
|     actions = [ | ||||
|       # Define your "new document" handlers here. | ||||
| @@ -65,9 +65,9 @@ const pkgdef :Spk.PackageDefinition = ( | ||||
|         # Sizes are given in device-independent pixels, so if you took these | ||||
|         # screenshots on a Retina-style high DPI screen, divide each dimension by two. | ||||
|  | ||||
|         (width = 1291, height = 800, png = embed "screenshots/screenshot-1.png"), | ||||
|         (width = 1291, height = 800, png = embed "screenshots/screenshot-2.png"), | ||||
|         (width = 1291, height = 800, png = embed "screenshots/screenshot-3.png"), | ||||
|         (width = 1290, height = 800, png = embed "screenshots/screenshot-1.png"), | ||||
|         (width = 1290, height = 800, png = embed "screenshots/screenshot-2.png"), | ||||
|         (width = 1290, height = 800, png = embed "screenshots/screenshot-3.png"), | ||||
|  | ||||
|       ], | ||||
|       changeLog = (defaultText = embed "changelog.md"), | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 173 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 171 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 163 KiB | 
| @@ -1,7 +1,6 @@ | ||||
| language: php | ||||
| php: | ||||
|   - 7.1 | ||||
|   - 7.2 | ||||
|   - 7.1.18 | ||||
|  | ||||
| cache: | ||||
|     directories: | ||||
| @@ -14,7 +13,6 @@ install: | ||||
|   - cp .env.testing .env | ||||
|   - php artisan clear-compiled | ||||
|   - php artisan env | ||||
|   - cp .env.testing .env | ||||
|   - wget -q https://github.com/firefly-iii/test-data/raw/master/storage/database.sqlite -O storage/database/database.sqlite | ||||
|   - mkdir -p build/logs | ||||
|  | ||||
|   | ||||
							
								
								
									
										42
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -3,6 +3,8 @@ FROM php:7.1-apache | ||||
|  | ||||
| # set working dir | ||||
| ENV FIREFLY_PATH /var/www/firefly-iii | ||||
| ENV CURL_VERSION 7.60.0 | ||||
| ENV OPENSSL_VERSION 1.1.1-pre6 | ||||
| WORKDIR $FIREFLY_PATH | ||||
| ADD . $FIREFLY_PATH | ||||
|  | ||||
| @@ -11,7 +13,8 @@ RUN apt-get update -y && \ | ||||
|     apt-get install -y --no-install-recommends libcurl4-openssl-dev \ | ||||
|                                                zlib1g-dev \ | ||||
|                                                libjpeg62-turbo-dev \ | ||||
|                                                libpng12-dev \ | ||||
|                                                wget \ | ||||
|                                                libpng-dev \ | ||||
|                                                libicu-dev \ | ||||
|                                                libedit-dev \ | ||||
|                                                libtidy-dev \ | ||||
| @@ -20,10 +23,38 @@ RUN apt-get update -y && \ | ||||
|                                                libpq-dev \ | ||||
|                                                libbz2-dev \ | ||||
|                                                gettext-base \ | ||||
|                                                cron \ | ||||
|                                                locales && \ | ||||
|                                                apt-get clean && \ | ||||
|                                                rm -rf /var/lib/apt/lists/* | ||||
|  | ||||
| # Setup the Composer installer | ||||
| RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer | ||||
|  | ||||
| # Install latest curl | ||||
| RUN cd /tmp && \ | ||||
|     wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \ | ||||
|     tar -xvf openssl-${OPENSSL_VERSION}.tar.gz && \ | ||||
|     cd openssl-${OPENSSL_VERSION} && \ | ||||
|     ./config && \ | ||||
|     make && \ | ||||
|     make install | ||||
|  | ||||
| RUN cd /tmp && \ | ||||
|     wget https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz && \ | ||||
|     tar -xvf curl-${CURL_VERSION}.tar.gz && \ | ||||
|     cd curl-${CURL_VERSION} && \ | ||||
|     ./configure --with-ssl && \ | ||||
|     make && \ | ||||
|     make install | ||||
|  | ||||
|  | ||||
| # Create the log file to be able to run tail | ||||
| RUN touch /var/log/cron.log | ||||
|  | ||||
| # Setup cron job | ||||
| RUN (crontab -l ; echo "* * * * * root $FIREFLY_PATH/artisan schedule:run >> /var/log/cron.log") | crontab | ||||
|  | ||||
| # Install PHP exentions. | ||||
| RUN docker-php-ext-install -j$(nproc) curl gd intl json readline tidy zip bcmath xml mbstring pdo_sqlite pdo_mysql bz2 pdo_pgsql | ||||
|  | ||||
| @@ -42,9 +73,6 @@ RUN a2enmod ssl | ||||
| # Create volumes for several directories: | ||||
| VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload | ||||
|  | ||||
| # Setup the Composer installer | ||||
| RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer | ||||
|  | ||||
| # Enable default site (Firefly III) | ||||
| COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf | ||||
|  | ||||
| @@ -57,5 +85,9 @@ RUN composer install --prefer-dist --no-dev --no-scripts --no-suggest | ||||
| # Expose port 80 | ||||
| EXPOSE 80 | ||||
|  | ||||
| # Run the command on container startup | ||||
| CMD cron | ||||
|  | ||||
| # Run entrypoint thing | ||||
| ENTRYPOINT [".deploy/docker/entrypoint.sh"] | ||||
| ENTRYPOINT [".deploy/docker/entrypoint.sh"] | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AboutController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,25 +20,31 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use DB; | ||||
| use FireflyIII\Transformers\UserTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * Returns basic information about this installation. | ||||
|  * | ||||
|  * Class AboutController | ||||
|  */ | ||||
| class AboutController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      * Returns system information. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function about() | ||||
|     public function about(): JsonResponse | ||||
|     { | ||||
|         $search        = ['~', '#']; | ||||
|         $replace       = ['\~', '# ']; | ||||
| @@ -58,11 +64,13 @@ class AboutController extends Controller | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns information about the user. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function user(Request $request) | ||||
|     public function user(Request $request): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AccountController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| @@ -29,6 +30,8 @@ use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| @@ -36,7 +39,6 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Preferences; | ||||
|  | ||||
| /** | ||||
|  * Class AccountController | ||||
| @@ -50,20 +52,20 @@ class AccountController extends Controller | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
|      * @throws \FireflyIII\Exceptions\FireflyException | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|                 // @var AccountRepositoryInterface repository | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser(auth()->user()); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
| @@ -75,9 +77,9 @@ class AccountController extends Controller | ||||
|      * | ||||
|      * @param \FireflyIII\Models\Account $account | ||||
|      * | ||||
|      * @return \Illuminate\Http\Response | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Account $account) | ||||
|     public function delete(Account $account): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($account, null); | ||||
|  | ||||
| @@ -89,12 +91,12 @@ class AccountController extends Controller | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request) | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager(); | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // read type from URI | ||||
| @@ -103,7 +105,7 @@ class AccountController extends Controller | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $types    = $this->mapTypes($this->parameters->get('type')); | ||||
|         $pageSize = (int)Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $collection = $this->repository->getAccountsByType($types); | ||||
| @@ -128,9 +130,9 @@ class AccountController extends Controller | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Account $account) | ||||
|     public function show(Request $request, Account $account): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
| @@ -148,7 +150,7 @@ class AccountController extends Controller | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function store(AccountRequest $request) | ||||
|     public function store(AccountRequest $request): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         // if currency ID is 0, find the currency by the code: | ||||
| @@ -157,7 +159,7 @@ class AccountController extends Controller | ||||
|             $data['currency_id'] = null === $currency ? 0 : $currency->id; | ||||
|         } | ||||
|         $account = $this->repository->store($data); | ||||
|         $manager = new Manager(); | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
| @@ -174,7 +176,7 @@ class AccountController extends Controller | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function update(AccountRequest $request, Account $account) | ||||
|     public function update(AccountRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         // if currency ID is 0, find the currency by the code: | ||||
| @@ -185,7 +187,7 @@ class AccountController extends Controller | ||||
|         // set correct type: | ||||
|         $data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type); | ||||
|         $this->repository->update($account, $data); | ||||
|         $manager = new Manager(); | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|   | ||||
							
								
								
									
										229
									
								
								app/Api/V1/Controllers/AttachmentController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								app/Api/V1/Controllers/AttachmentController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,229 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AttachmentController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\AttachmentRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Http\Response as LaravelResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * Class AttachmentController | ||||
|  */ | ||||
| class AttachmentController extends Controller | ||||
| { | ||||
|     /** @var AttachmentRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AttachmentRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($attachment); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function download(Attachment $attachment): LaravelResponse | ||||
|     { | ||||
|         if ($attachment->uploaded === false) { | ||||
|             throw new FireflyException('No file has been uploaded for this attachment (yet).'); | ||||
|         } | ||||
|         if ($this->repository->exists($attachment)) { | ||||
|             $content = $this->repository->getContent($attachment); | ||||
|             $quoted  = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); | ||||
|  | ||||
|             /** @var LaravelResponse $response */ | ||||
|             $response = response($content, 200); | ||||
|             $response | ||||
|                 ->header('Content-Description', 'File Transfer') | ||||
|                 ->header('Content-Type', 'application/octet-stream') | ||||
|                 ->header('Content-Disposition', 'attachment; filename=' . $quoted) | ||||
|                 ->header('Content-Transfer-Encoding', 'binary') | ||||
|                 ->header('Connection', 'Keep-Alive') | ||||
|                 ->header('Expires', '0') | ||||
|                 ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') | ||||
|                 ->header('Pragma', 'public') | ||||
|                 ->header('Content-Length', \strlen($content)); | ||||
|  | ||||
|             return $response; | ||||
|         } | ||||
|         throw new FireflyException('Could not find the indicated attachment. The file is no longer there.'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $collection  = $this->repository->get(); | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.attachments.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($attachments, new AttachmentTransformer($this->parameters), 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param AttachmentRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(AttachmentRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getAll(); | ||||
|         $attachment = $this->repository->store($data); | ||||
|         $manager    = new Manager; | ||||
|         $baseUrl    = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param AttachmentRequest $request | ||||
|      * @param Attachment        $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(AttachmentRequest $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $this->repository->update($attachment, $data); | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($attachment, new AttachmentTransformer($this->parameters), 'attachments'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Request    $request | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function upload(Request $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         /** @var AttachmentHelperInterface $helper */ | ||||
|         $helper = app(AttachmentHelperInterface::class); | ||||
|         $body   = $request->getContent(); | ||||
|         $helper->saveAttachmentFromApi($attachment, $body); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										183
									
								
								app/Api/V1/Controllers/AvailableBudgetController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								app/Api/V1/Controllers/AvailableBudgetController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AvailableBudgetController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\AvailableBudgetRequest; | ||||
| use FireflyIII\Models\AvailableBudget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Transformers\AvailableBudgetTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * Class AvailableBudgetController | ||||
|  */ | ||||
| class AvailableBudgetController extends Controller | ||||
| { | ||||
|     /** @var CurrencyRepositoryInterface */ | ||||
|     private $currencyRepository; | ||||
|     /** @var BudgetRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user                     = auth()->user(); | ||||
|                 $this->repository         = app(BudgetRepositoryInterface::class); | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroyAvailableBudget($availableBudget); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of available budgets. Count it and split it. | ||||
|         $collection       = $this->repository->getAvailableBudgets(); | ||||
|         $count            = $collection->count(); | ||||
|         $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.available_budgets.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($availableBudgets, new AvailableBudgetTransformer($this->parameters), 'available_budgets'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param Request          $request | ||||
|      * @param  AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|  | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param AvailableBudgetRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(AvailableBudgetRequest $request): JsonResponse | ||||
|     { | ||||
|         $data            = $request->getAll(); | ||||
|         $currency        = $this->currencyRepository->findNull($data['transaction_currency_id']); | ||||
|         $availableBudget = $this->repository->setAvailableBudget($currency, $data['start_date'], $data['end_date'], $data['amount']); | ||||
|         $manager         = new Manager; | ||||
|         $baseUrl         = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param AvailableBudgetRequest $request | ||||
|      * @param AvailableBudget        $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(AvailableBudgetRequest $request, AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         $this->repository->updateAvailableBudget($availableBudget, $data); | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($availableBudget, new AvailableBudgetTransformer($this->parameters), 'available_budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * BillController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\BillRequest; | ||||
| @@ -35,7 +37,6 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Preferences; | ||||
|  | ||||
| /** | ||||
|  * Class BillController | ||||
| @@ -47,8 +48,6 @@ class BillController extends Controller | ||||
|  | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -87,7 +86,7 @@ class BillController extends Controller | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         $pageSize  = (int)Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize  = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $paginator = $this->repository->getPaginator($pageSize); | ||||
|         /** @var Collection $bills */ | ||||
|         $bills = $paginator->getCollection(); | ||||
|   | ||||
							
								
								
									
										176
									
								
								app/Api/V1/Controllers/BudgetController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								app/Api/V1/Controllers/BudgetController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\BudgetRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetController | ||||
|  */ | ||||
| class BudgetController extends Controller | ||||
| { | ||||
|     /** @var BudgetRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** | ||||
|      * BudgetController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var BudgetRepositoryInterface repository */ | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($budget); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getBudgets(); | ||||
|         $count      = $collection->count(); | ||||
|         $budgets    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($budgets, new BudgetTransformer($this->parameters), 'budgets'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param Request $request | ||||
|      * @param Budget  $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param BudgetRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(BudgetRequest $request): JsonResponse | ||||
|     { | ||||
|         $budget = $this->repository->store($request->getAll()); | ||||
|         if (null !== $budget) { | ||||
|             $manager = new Manager(); | ||||
|             $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|             $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|             $resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets'); | ||||
|  | ||||
|             return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|         } | ||||
|         throw new FireflyException('Could not store new budget.'); // @codeCoverageIgnore | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param BudgetRequest $request | ||||
|      * @param Budget        $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(BudgetRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $budget  = $this->repository->update($budget, $data); | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($budget, new BudgetTransformer($this->parameters), 'budgets'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										232
									
								
								app/Api/V1/Controllers/BudgetLimitController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								app/Api/V1/Controllers/BudgetLimitController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,232 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetLimitController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use Exception; | ||||
| use FireflyIII\Api\V1\Requests\AvailableBudgetRequest; | ||||
| use FireflyIII\Api\V1\Requests\BudgetLimitRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use InvalidArgumentException; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Log; | ||||
| use Throwable; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetLimitController | ||||
|  */ | ||||
| class BudgetLimitController extends Controller | ||||
| { | ||||
|     ///** @var CurrencyRepositoryInterface */ | ||||
|     //private $currencyRepository; | ||||
|     /** @var BudgetRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(BudgetRepositoryInterface::class); | ||||
|                 //$this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroyBudgetLimit($budgetLimit); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // read budget from request | ||||
|         $budgetId = (int)($request->get('budget_id') ?? 0); | ||||
|         $budget   = null; | ||||
|         if ($budgetId > 0) { | ||||
|             $budget = $this->repository->findNull($budgetId); | ||||
|         } | ||||
|         // read start date from request | ||||
|         $start = null; | ||||
|         try { | ||||
|             $start = Carbon::createFromFormat('Y-m-d', $request->get('start')); | ||||
|             $this->parameters->set('start', $start->format('Y-m-d')); | ||||
|         } catch (InvalidArgumentException $e) { | ||||
|             Log::debug(sprintf('Could not parse start date "%s": %s', $request->get('start'), $e->getMessage())); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // read end date from request | ||||
|         $end = null; | ||||
|         try { | ||||
|             $end = Carbon::createFromFormat('Y-m-d', $request->get('end')); | ||||
|             $this->parameters->set('end', $end->format('Y-m-d')); | ||||
|         } catch (InvalidArgumentException $e) { | ||||
|             Log::debug(sprintf('Could not parse end date "%s": %s', $request->get('end'), $e->getMessage())); | ||||
|         } | ||||
|         $this->parameters->set('budget_id', $budgetId); | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budget limits. Count it and split it. | ||||
|         $collection = new Collection; | ||||
|         if (null === $budget) { | ||||
|             $collection = $this->repository->getAllBudgetLimits($start, $end); | ||||
|         } | ||||
|         if (null !== $budget) { | ||||
|             $collection = $this->repository->getBudgetLimits($budget, $start, $end); | ||||
|         } | ||||
|  | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budget_limits.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($budgetLimits, new BudgetLimitTransformer($this->parameters), 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param Request     $request | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param BudgetLimitRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(BudgetLimitRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getAll(); | ||||
|         $budget = $this->repository->findNull($data['budget_id']); | ||||
|         if (null === $budget) { | ||||
|             throw new FireflyException('Unknown budget.'); | ||||
|         } | ||||
|         $data['budget'] = $budget; | ||||
|         $budgetLimit    = $this->repository->storeBudgetLimit($data); | ||||
|         $manager        = new Manager; | ||||
|         $baseUrl        = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param AvailableBudgetRequest $request | ||||
|      * @param BudgetLimit            $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(BudgetLimitRequest $request, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getAll(); | ||||
|         $budget = $this->repository->findNull($data['budget_id']); | ||||
|         if (null === $budget) { | ||||
|             $budget = $budgetLimit->budget; | ||||
|         } | ||||
|         $data['budget'] = $budget; | ||||
|         $budgetLimit    = $this->repository->updateBudgetLimit($budgetLimit, $data); | ||||
|         $manager        = new Manager; | ||||
|         $baseUrl        = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($budgetLimit, new BudgetLimitTransformer($this->parameters), 'budget_limits'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										176
									
								
								app/Api/V1/Controllers/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								app/Api/V1/Controllers/CategoryController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CategoryController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\CategoryRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Transformers\CategoryTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryController | ||||
|  */ | ||||
| class CategoryController extends Controller | ||||
| { | ||||
|     /** @var CategoryRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var CategoryRepositoryInterface repository */ | ||||
|                 $this->repository = app(CategoryRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Category $category): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($category); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getCategories(); | ||||
|         $count      = $collection->count(); | ||||
|         $categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($categories, new CategoryTransformer($this->parameters), 'categories'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param Request  $request | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Category $category): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($category, new CategoryTransformer($this->parameters), 'categories'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param CategoryRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(CategoryRequest $request): JsonResponse | ||||
|     { | ||||
|         $category = $this->repository->store($request->getAll()); | ||||
|         if (null !== $category) { | ||||
|             $manager = new Manager(); | ||||
|             $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|             $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|             $resource = new Item($category, new CategoryTransformer($this->parameters), 'categories'); | ||||
|  | ||||
|             return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|         } | ||||
|         throw new FireflyException('Could not store new category.'); // @codeCoverageIgnore | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param CategoryRequest $request | ||||
|      * @param Category        $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(CategoryRequest $request, Category $category): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getAll(); | ||||
|         $category = $this->repository->update($category, $data); | ||||
|         $manager  = new Manager(); | ||||
|         $baseUrl  = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($category, new CategoryTransformer($this->parameters), 'categories'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										105
									
								
								app/Api/V1/Controllers/ConfigurationController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								app/Api/V1/Controllers/ConfigurationController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| <?php | ||||
| /** | ||||
|  * ConfigurationController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Configuration; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
|  | ||||
| /** | ||||
|  * Class ConfigurationController | ||||
|  */ | ||||
| class ConfigurationController extends Controller | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index() | ||||
|     { | ||||
|         if (!auth()->user()->hasRole('owner')) { | ||||
|             throw new FireflyException('No access to method.'); // @codeCoverageIgnore | ||||
|         } | ||||
|         $configData = $this->getConfigData(); | ||||
|  | ||||
|         return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function update(Request $request): JsonResponse | ||||
|     { | ||||
|         if (!auth()->user()->hasRole('owner')) { | ||||
|             throw new FireflyException('No access to method.'); // @codeCoverageIgnore | ||||
|         } | ||||
|         $name  = $request->get('name'); | ||||
|         $value = $request->get('value'); | ||||
|         $valid = ['is_demo_site', 'permission_update_check', 'single_user_mode']; | ||||
|         if (!\in_array($name, $valid, true)) { | ||||
|             throw new FireflyException('You cannot edit this configuration value.'); | ||||
|         } | ||||
|         $configValue = ''; | ||||
|         switch ($name) { | ||||
|             case 'is_demo_site': | ||||
|             case 'single_user_mode': | ||||
|                 $configValue = $value === 'true'; | ||||
|                 break; | ||||
|             case 'permission_update_check': | ||||
|                 $configValue = (int)$value >= -1 && (int)$value <= 1 ? (int)$value : -1; | ||||
|                 break; | ||||
|         } | ||||
|         app('fireflyconfig')->set($name, $configValue); | ||||
|         $configData = $this->getConfigData(); | ||||
|  | ||||
|         return response()->json(['data' => $configData], 200)->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     private function getConfigData(): array | ||||
|     { | ||||
|         /** @var Configuration $isDemoSite */ | ||||
|         $isDemoSite = app('fireflyconfig')->get('is_demo_site'); | ||||
|         /** @var Configuration $updateCheck */ | ||||
|         $updateCheck = app('fireflyconfig')->get('permission_update_check'); | ||||
|         /** @var Configuration $lastCheck */ | ||||
|         $lastCheck = app('fireflyconfig')->get('last_update_check'); | ||||
|         /** @var Configuration $singleUser */ | ||||
|         $singleUser = app('fireflyconfig')->get('single_user_mode'); | ||||
|         $data       = [ | ||||
|             'is_demo_site'            => null === $isDemoSite ? null : $isDemoSite->data, | ||||
|             'permission_update_check' => null === $updateCheck ? null : (int)$updateCheck->data, | ||||
|             'last_update_check'       => null === $lastCheck ? null : (int)$lastCheck->data, | ||||
|             'single_user_mode'        => null === $singleUser ? null : $singleUser->data, | ||||
|         ]; | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Controller.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,12 +20,12 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use Carbon\Exceptions\InvalidDateException; | ||||
| use FireflyConfig; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use Illuminate\Foundation\Auth\Access\AuthorizesRequests; | ||||
| use Illuminate\Foundation\Bus\DispatchesJobs; | ||||
| use Illuminate\Foundation\Validation\ValidatesRequests; | ||||
|   | ||||
| @@ -24,7 +24,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\BillRequest; | ||||
| use FireflyIII\Api\V1\Requests\CurrencyRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| @@ -39,7 +38,6 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Preferences; | ||||
|  | ||||
| /** | ||||
|  * Class CurrencyController | ||||
| @@ -102,7 +100,7 @@ class CurrencyController extends Controller | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         $pageSize   = (int)Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->get(); | ||||
|         $count      = $collection->count(); | ||||
|         // slice them: | ||||
| @@ -158,8 +156,8 @@ class CurrencyController extends Controller | ||||
|         $currency = $this->repository->store($request->getAll()); | ||||
|  | ||||
|         if ($request->boolean('default') === true) { | ||||
|             Preferences::set('currencyPreference', $currency->code); | ||||
|             Preferences::mark(); | ||||
|             app('preferences')->set('currencyPreference', $currency->code); | ||||
|             app('preferences')->mark(); | ||||
|         } | ||||
|         if (null !== $currency) { | ||||
|             $manager = new Manager(); | ||||
| @@ -178,7 +176,7 @@ class CurrencyController extends Controller | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @param CurrencyRequest         $request | ||||
|      * @param CurrencyRequest     $request | ||||
|      * @param TransactionCurrency $currency | ||||
|      * | ||||
|      * @return JsonResponse | ||||
| @@ -189,8 +187,8 @@ class CurrencyController extends Controller | ||||
|         $currency = $this->repository->update($currency, $data); | ||||
|  | ||||
|         if ($request->boolean('default') === true) { | ||||
|             Preferences::set('currencyPreference', $currency->code); | ||||
|             Preferences::mark(); | ||||
|             app('preferences')->set('currencyPreference', $currency->code); | ||||
|             app('preferences')->mark(); | ||||
|         } | ||||
|  | ||||
|         $manager = new Manager(); | ||||
|   | ||||
							
								
								
									
										115
									
								
								app/Api/V1/Controllers/CurrencyExchangeRateController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								app/Api/V1/Controllers/CurrencyExchangeRateController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CurrencyExchangeRateController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Services\Currency\ExchangeRateInterface; | ||||
| use FireflyIII\Transformers\CurrencyExchangeRateTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use InvalidArgumentException; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class CurrencyExchangeRateController | ||||
|  */ | ||||
| class CurrencyExchangeRateController extends Controller | ||||
| { | ||||
|     /** @var CurrencyRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** | ||||
|      * CurrencyExchangeRateController constructor. | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->repository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->repository->setUser(auth()->user()); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // currencies | ||||
|         $fromCurrency = $this->repository->findByCodeNull($request->get('from') ?? 'EUR'); | ||||
|         $toCurrency   = $this->repository->findByCodeNull($request->get('to') ?? 'USD'); | ||||
|  | ||||
|         if (null === $fromCurrency) { | ||||
|             throw new FireflyException('Unknown source currency.'); | ||||
|         } | ||||
|         if (null === $toCurrency) { | ||||
|             throw new FireflyException('Unknown destination currency.'); | ||||
|         } | ||||
|  | ||||
|         $dateObj = new Carbon; | ||||
|         try { | ||||
|             $dateObj = Carbon::createFromFormat('Y-m-d', $request->get('date') ?? date('Y-m-d')); | ||||
|         } catch (InvalidArgumentException $e) { | ||||
|             Log::debug($e->getMessage()); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         $this->parameters->set('from', $fromCurrency->code); | ||||
|         $this->parameters->set('to', $toCurrency->code); | ||||
|         $this->parameters->set('date', $dateObj->format('Y-m-d')); | ||||
|  | ||||
|         // get the exchange rate. | ||||
|         $rate = $this->repository->getExchangeRate($fromCurrency, $toCurrency, $dateObj); | ||||
|         if (null === $rate) { | ||||
|             // create service: | ||||
|             /** @var ExchangeRateInterface $service */ | ||||
|             $service = app(ExchangeRateInterface::class); | ||||
|             $service->setUser(auth()->user()); | ||||
|  | ||||
|             // get rate: | ||||
|             $rate = $service->getRate($fromCurrency, $toCurrency, $dateObj); | ||||
|         } | ||||
|  | ||||
|         $resource = new Item($rate, new CurrencyExchangeRateTransformer($this->parameters), 'currency_exchange_rates'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										207
									
								
								app/Api/V1/Controllers/JournalLinkController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								app/Api/V1/Controllers/JournalLinkController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| <?php | ||||
| /** | ||||
|  * JournalLinkController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\JournalLinkRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\TransactionJournalLink; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Transformers\JournalLinkTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| class JournalLinkController extends Controller | ||||
| { | ||||
|     /** @var JournalRepositoryInterface */ | ||||
|     private $journalRepository; | ||||
|     /** @var LinkTypeRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->repository        = app(LinkTypeRepositoryInterface::class); | ||||
|                 $this->journalRepository = app(JournalRepositoryInterface::class); | ||||
|  | ||||
|                 $this->repository->setUser($user); | ||||
|                 $this->journalRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param TransactionJournalLink $link | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(TransactionJournalLink $link): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroyLink($link); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // read type from URI | ||||
|         $name = $request->get('name') ?? null; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         $linkType = $this->repository->findByName($name); | ||||
|  | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $collection   = $this->repository->getJournalLinks($linkType); | ||||
|         $count        = $collection->count(); | ||||
|         $journalLinks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($journalLinks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.journal_links.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($journalLinks, new JournalLinkTransformer($this->parameters), 'journal_links'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request                $request | ||||
|      * @param TransactionJournalLink $journalLink | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, TransactionJournalLink $journalLink): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param JournalLinkRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(JournalLinkRequest $request): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $data    = $request->getAll(); | ||||
|         $inward  = $this->journalRepository->findNull($data['inward_id'] ?? 0); | ||||
|         $outward = $this->journalRepository->findNull($data['outward_id'] ?? 0); | ||||
|         if (null === $inward || null === $outward) { | ||||
|             throw new FireflyException('Source or destination is NULL.'); | ||||
|         } | ||||
|         $data['direction'] = 'inward'; | ||||
|  | ||||
|         $journalLink = $this->repository->storeLink($data, $inward, $outward); | ||||
|  | ||||
|         $resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param JournalLinkRequest     $request | ||||
|      * @param TransactionJournalLink $journalLink | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function update(JournalLinkRequest $request, TransactionJournalLink $journalLink): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|  | ||||
|         $data            = $request->getAll(); | ||||
|         $data['inward']  = $this->journalRepository->findNull($data['inward_id'] ?? 0); | ||||
|         $data['outward'] = $this->journalRepository->findNull($data['outward_id'] ?? 0); | ||||
|         if (null === $data['inward'] || null === $data['outward']) { | ||||
|             throw new FireflyException('Source or destination is NULL.'); | ||||
|         } | ||||
|         $data['direction'] = 'inward'; | ||||
|         $journalLink       = $this->repository->updateLink($journalLink, $data); | ||||
|  | ||||
|         $resource = new Item($journalLink, new JournalLinkTransformer($this->parameters), 'journal_links'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										197
									
								
								app/Api/V1/Controllers/LinkTypeController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								app/Api/V1/Controllers/LinkTypeController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | ||||
| <?php | ||||
| /** | ||||
|  * LinkTypeController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\LinkTypeRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\LinkType; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Transformers\LinkTypeTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class LinkTypeController | ||||
|  */ | ||||
| class LinkTypeController extends Controller | ||||
| { | ||||
|     /** @var LinkTypeRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     /** @var UserRepositoryInterface */ | ||||
|     private $userRepository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user                 = auth()->user(); | ||||
|                 $this->repository     = app(LinkTypeRepositoryInterface::class); | ||||
|                 $this->userRepository = app(UserRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param LinkType $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function delete(LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         if ($linkType->editable === false) { | ||||
|             throw new FireflyException(sprintf('You cannot delete this link type (#%d, "%s")', $linkType->id, $linkType->name)); | ||||
|         } | ||||
|         $this->repository->destroy($linkType, null); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager  = new Manager; | ||||
|         $baseUrl  = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of accounts. Count it and split it. | ||||
|         $collection = $this->repository->get(); | ||||
|         $count      = $collection->count(); | ||||
|         $linkTypes  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($linkTypes, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.link_types.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($linkTypes, new LinkTypeTransformer($this->parameters), 'link_types'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request  $request | ||||
|      * @param LinkType $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager; | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param LinkTypeRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(LinkTypeRequest $request): JsonResponse | ||||
|     { | ||||
|         if (!$this->userRepository->hasRole(auth()->user(), 'owner')) { | ||||
|             throw new FireflyException('You need the "owner"-role to do this.'); | ||||
|         } | ||||
|         $data = $request->getAll(); | ||||
|         // if currency ID is 0, find the currency by the code: | ||||
|         $linkType = $this->repository->store($data); | ||||
|         $manager  = new Manager; | ||||
|         $baseUrl  = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param LinkTypeRequest $request | ||||
|      * @param LinkType        $linkType | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function update(LinkTypeRequest $request, LinkType $linkType): JsonResponse | ||||
|     { | ||||
|         if ($linkType->editable === false) { | ||||
|             throw new FireflyException(sprintf('You cannot edit this link type (#%d, "%s")', $linkType->id, $linkType->name)); | ||||
|         } | ||||
|         if (!$this->userRepository->hasRole(auth()->user(), 'owner')) { | ||||
|             throw new FireflyException('You need the "owner"-role to do this.'); | ||||
|         } | ||||
|  | ||||
|         $data = $request->getAll(); | ||||
|         $this->repository->update($linkType, $data); | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($linkType, new LinkTypeTransformer($this->parameters), 'link_types'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										180
									
								
								app/Api/V1/Controllers/PiggyBankController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								app/Api/V1/Controllers/PiggyBankController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PiggyBankController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\PiggyBankRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Transformers\PiggyBankTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * TODO order up and down. | ||||
|  * Class PiggyBankController | ||||
|  */ | ||||
| class PiggyBankController extends Controller | ||||
| { | ||||
|  | ||||
|     /** @var PiggyBankRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->repository = app(PiggyBankRepositoryInterface::class); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param PiggyBank $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($piggyBank); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getPiggyBanks(); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy_banks.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($piggyBanks, new PiggyBankTransformer($this->parameters), 'piggy_banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request   $request | ||||
|      * @param PiggyBank $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param PiggyBankRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(PiggyBankRequest $request): JsonResponse | ||||
|     { | ||||
|         $piggyBank = $this->repository->store($request->getAll()); | ||||
|         if (null !== $piggyBank) { | ||||
|             $manager = new Manager(); | ||||
|             $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|             $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|             $resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks'); | ||||
|  | ||||
|             return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|         } | ||||
|         throw new FireflyException('Could not store new piggy bank.'); // @codeCoverageIgnore | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param PiggyBankRequest $request | ||||
|      * @param PiggyBank        $piggyBank | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(PiggyBankRequest $request, PiggyBank $piggyBank): JsonResponse | ||||
|     { | ||||
|         $piggyBank = $this->repository->update($piggyBank, $request->getAll()); | ||||
|         $manager   = new Manager(); | ||||
|         $baseUrl   = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										157
									
								
								app/Api/V1/Controllers/PreferenceController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								app/Api/V1/Controllers/PreferenceController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PreferencesController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\PreferenceRequest; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Transformers\PreferenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Support\Collection; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Preferences; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class PreferenceController | ||||
|  */ | ||||
| class PreferenceController extends Controller | ||||
| { | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 // todo add local repositories. | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         /** @var User $user */ | ||||
|         $user        = auth()->user(); | ||||
|         $available   = [ | ||||
|             'language', 'customFiscalYear', 'fiscalYearStart', 'currencyPreference', | ||||
|             'transaction_journal_optional_fields', 'frontPageAccounts', 'viewRange', | ||||
|             'listPageSize, twoFactorAuthEnabled', | ||||
|         ]; | ||||
|         $preferences = new Collection; | ||||
|         foreach ($available as $name) { | ||||
|             $pref = Preferences::getForUser($user, $name); | ||||
|             if (null !== $pref) { | ||||
|                 $preferences->push($pref); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($preferences, new PreferenceTransformer($this->parameters), 'preferences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Preference $preference | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Preference $preference): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($preference, new PreferenceTransformer($this->parameters), 'preferences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param PreferenceRequest $request | ||||
|      * @param Preference        $preference | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(PreferenceRequest $request, Preference $preference): JsonResponse | ||||
|     { | ||||
|  | ||||
|         $data     = $request->getAll(); | ||||
|         $newValue = $data['data']; | ||||
|         switch ($preference->name) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'transaction_journal_optional_fields': | ||||
|             case 'frontPageAccounts': | ||||
|                 $newValue = explode(',', $data['data']); | ||||
|                 break; | ||||
|             case 'listPageSize': | ||||
|                 $newValue = (int)$data['data']; | ||||
|                 break; | ||||
|             case 'customFiscalYear': | ||||
|             case 'twoFactorAuthEnabled': | ||||
|                 $newValue = (int)$data['data'] === 1; | ||||
|                 break; | ||||
|         } | ||||
|         $result = Preferences::set($preference->name, $newValue); | ||||
|  | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($result, new PreferenceTransformer($this->parameters), 'preferences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										179
									
								
								app/Api/V1/Controllers/RecurrenceController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								app/Api/V1/Controllers/RecurrenceController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | ||||
| <?php | ||||
| /** | ||||
|  * RecurrenceController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\RecurrenceRequest; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Transformers\RecurrenceTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class RecurrenceController | ||||
|  */ | ||||
| class RecurrenceController extends Controller | ||||
| { | ||||
|     /** @var RecurringRepositoryInterface */ | ||||
|     private $repository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 /** @var RecurringRepositoryInterface repository */ | ||||
|                 $this->repository = app(RecurringRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param Recurrence $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $this->repository->destroy($recurrence); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->repository->getAll(); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.recurrences.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($piggyBanks, new RecurrenceTransformer($this->parameters), 'recurrences'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Recurrence $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($recurrence, new RecurrenceTransformer($this->parameters), 'recurrences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param RecurrenceRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(RecurrenceRequest $request): JsonResponse | ||||
|     { | ||||
|         $recurrence = $this->repository->store($request->getAll()); | ||||
|         $manager    = new Manager(); | ||||
|         $baseUrl    = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new Item($recurrence, new RecurrenceTransformer($this->parameters), 'recurrences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param RecurrenceRequest $request | ||||
|      * @param Recurrence        $recurrence | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(RecurrenceRequest $request, Recurrence $recurrence): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getAll(); | ||||
|  | ||||
|         // | ||||
|  | ||||
|         $category = $this->repository->update($recurrence, $data); | ||||
|         $manager  = new Manager(); | ||||
|         $baseUrl  = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($category, new RecurrenceTransformer($this->parameters), 'recurrences'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										173
									
								
								app/Api/V1/Controllers/RuleController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								app/Api/V1/Controllers/RuleController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| <?php | ||||
| /** | ||||
|  * RuleController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\RuleRequest; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
| /** | ||||
|  * Class RuleController | ||||
|  */ | ||||
| class RuleController extends Controller | ||||
| { | ||||
|     /** @var RuleRepositoryInterface */ | ||||
|     private $ruleRepository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleRepository = app(RuleRepositoryInterface::class); | ||||
|                 $this->ruleRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param Rule $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(Rule $rule): JsonResponse | ||||
|     { | ||||
|         $this->ruleRepository->destroy($rule); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->ruleRepository->getAll(); | ||||
|         $count      = $collection->count(); | ||||
|         $rules      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.piggy_banks.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($rules, new RuleTransformer($this->parameters), 'rules'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * @param Rule    $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Rule $rule): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($rule, new RuleTransformer($this->parameters), 'rules'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(RuleRequest $request): JsonResponse | ||||
|     { | ||||
|         $rule    = $this->ruleRepository->store($request->getAll()); | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($rule, new RuleTransformer($this->parameters), 'rules'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param RuleRequest $request | ||||
|      * @param Rule        $rule | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(RuleRequest $request, Rule $rule): JsonResponse | ||||
|     { | ||||
|         $rule = $this->ruleRepository->update($rule, $request->getAll()); | ||||
|         $manager   = new Manager(); | ||||
|         $baseUrl   = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($rule, new RuleTransformer($this->parameters), 'rules'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										171
									
								
								app/Api/V1/Controllers/RuleGroupController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								app/Api/V1/Controllers/RuleGroupController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | ||||
| <?php | ||||
| /** | ||||
|  * RuleGroupController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Api\V1\Requests\RuleGroupRequest; | ||||
| use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; | ||||
| use FireflyIII\Transformers\RuleGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
|  | ||||
|  | ||||
| class RuleGroupController extends Controller | ||||
| { | ||||
|     /** @var RuleGroupRepositoryInterface */ | ||||
|     private $ruleGroupRepository; | ||||
|  | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user = auth()->user(); | ||||
|  | ||||
|                 $this->ruleGroupRepository = app(RuleGroupRepositoryInterface::class); | ||||
|                 $this->ruleGroupRepository->setUser($user); | ||||
|  | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete the resource. | ||||
|      * | ||||
|      * @param string $object | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function delete(RuleGroup $ruleGroup): JsonResponse | ||||
|     { | ||||
|         $this->ruleGroupRepository->destroy($ruleGroup, null); | ||||
|  | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse] | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         // create some objects: | ||||
|         $manager = new Manager; | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|  | ||||
|         // types to get, page size: | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // get list of budgets. Count it and split it. | ||||
|         $collection = $this->ruleGroupRepository->get(); | ||||
|         $count      = $collection->count(); | ||||
|         $ruleGroups = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|  | ||||
|         // make paginator: | ||||
|         $paginator = new LengthAwarePaginator($ruleGroups, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.rule_groups.index') . $this->buildParams()); | ||||
|  | ||||
|         // present to user. | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|         $resource = new FractalCollection($ruleGroups, new RuleGroupTransformer($this->parameters), 'rule_groups'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List single resource. | ||||
|      * | ||||
|      * @param Request   $request | ||||
|      * @param RuleGroup $ruleGroup | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, RuleGroup $ruleGroup): JsonResponse | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new object. | ||||
|      * | ||||
|      * @param RuleGroupRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(RuleGroupRequest $request): JsonResponse | ||||
|     { | ||||
|         $ruleGroup = $this->ruleGroupRepository->store($request->getAll()); | ||||
|         $manager   = new Manager(); | ||||
|         $baseUrl   = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Request $request | ||||
|      * @param string  $object | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(RuleGroupRequest $request, RuleGroup $ruleGroup): JsonResponse | ||||
|     { | ||||
|         $ruleGroup = $this->ruleGroupRepository->update($ruleGroup, $request->getAll()); | ||||
|         $manager   = new Manager(); | ||||
|         $baseUrl   = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         $resource = new Item($ruleGroup, new RuleGroupTransformer($this->parameters), 'rule_groups'); | ||||
|  | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * TransactionController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| @@ -39,7 +40,6 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Log; | ||||
| use Preferences; | ||||
|  | ||||
| /** | ||||
|  * Class TransactionController | ||||
| @@ -91,7 +91,7 @@ class TransactionController extends Controller | ||||
|      */ | ||||
|     public function index(Request $request) | ||||
|     { | ||||
|         $pageSize = (int)Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // read type from URI | ||||
|         $type = $request->get('type') ?? 'default'; | ||||
| @@ -135,17 +135,19 @@ class TransactionController extends Controller | ||||
|     /** | ||||
|      * @param Request     $request | ||||
|      * @param Transaction $transaction | ||||
|      * @param string      $include | ||||
|      * | ||||
|      * @return \Illuminate\Http\JsonResponse | ||||
|      */ | ||||
|     public function show(Request $request, Transaction $transaction) | ||||
|     public function show(Request $request, Transaction $transaction, string $include = null) | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
|  | ||||
|         // add include parameter: | ||||
|         $include = $request->get('include') ?? ''; | ||||
|         $include = $include ?? ''; | ||||
|         $include = $request->get('include') ?? $include; | ||||
|         $manager->parseIncludes($include); | ||||
|  | ||||
|         // collect transactions using the journal collector | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UserController.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Controllers; | ||||
|  | ||||
| @@ -35,7 +36,6 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Preferences; | ||||
|  | ||||
|  | ||||
| /** | ||||
| @@ -93,7 +93,7 @@ class UserController extends Controller | ||||
|     public function index(Request $request) | ||||
|     { | ||||
|         // user preferences | ||||
|         $pageSize = (int)Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|  | ||||
|         // make manager | ||||
|         $manager = new Manager(); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AccountRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
|   | ||||
							
								
								
									
										92
									
								
								app/Api/V1/Requests/AttachmentRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								app/Api/V1/Requests/AttachmentRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AttachmentRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Models\ImportJob; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Rules\IsBase64; | ||||
| use FireflyIII\Rules\IsValidAttachmentModel; | ||||
|  | ||||
| /** | ||||
|  * Class AttachmentRequest | ||||
|  */ | ||||
| class AttachmentRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'filename' => $this->string('filename'), | ||||
|             'title'    => $this->string('title'), | ||||
|             'notes'    => $this->string('notes'), | ||||
|             'model'    => $this->string('model'), | ||||
|             'model_id' => $this->integer('model_id'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $models = implode( | ||||
|             ',', [ | ||||
|                    Bill::class, | ||||
|                    ImportJob::class, | ||||
|                    TransactionJournal::class, | ||||
|                ] | ||||
|         ); | ||||
|         $model  = $this->string('model'); | ||||
|         $rules  = [ | ||||
|             'filename' => 'required|between:1,255', | ||||
|             'title'    => 'between:1,255', | ||||
|             'notes'    => 'between:1,65000', | ||||
|             'model'    => sprintf('required|in:%s', $models), | ||||
|             'model_id' => ['required', 'numeric', new IsValidAttachmentModel($model)], | ||||
|         ]; | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 unset($rules['model'], $rules['model_id']); | ||||
|                 $rules['filename'] = 'between:1,255'; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										69
									
								
								app/Api/V1/Requests/AvailableBudgetRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								app/Api/V1/Requests/AvailableBudgetRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AvailableBudgetRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| /** | ||||
|  * Class AvailableBudgetRequest | ||||
|  */ | ||||
| class AvailableBudgetRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'transaction_currency_id' => $this->integer('transaction_currency_id'), | ||||
|             'amount'                  => $this->string('amount'), | ||||
|             'start_date'              => $this->date('start_date'), | ||||
|             'end_date'                => $this->date('end_date'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'transaction_currency_id' => 'required|numeric|exists:transaction_currencies,id', | ||||
|             'amount'                  => 'required|numeric|more:0', | ||||
|             'start_date'              => 'required|date|before:end_date', | ||||
|             'end_date'                => 'required|date|after:start_date', | ||||
|         ]; | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * BillRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| @@ -85,8 +86,8 @@ class BillRequest extends Request | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 $bill           = $this->route()->parameter('bill'); | ||||
|                 $rules['name']  .= ',' . $bill->id; | ||||
|                 $bill          = $this->route()->parameter('bill'); | ||||
|                 $rules['name'] .= ',' . $bill->id; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|   | ||||
							
								
								
									
										77
									
								
								app/Api/V1/Requests/BudgetLimitRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								app/Api/V1/Requests/BudgetLimitRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetLimitRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Class BudgetLimitRequest | ||||
|  */ | ||||
| class BudgetLimitRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'budget_id'  => $this->integer('budget_id'), | ||||
|             'start_date' => $this->date('start_date'), | ||||
|             'end_date'   => $this->date('end_date'), | ||||
|             'amount'     => $this->string('amount'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'budget_id'  => 'required|exists:budgets,id|belongsToUser:budgets,id', | ||||
|             'start_date' => 'required|before:end_date|date', | ||||
|             'end_date'   => 'required|after:start_date|date', | ||||
|             'amount'     => 'required|more:0', | ||||
|         ]; | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 $rules['budget_id'] = 'required|exists:budgets,id|belongsToUser:budgets,id'; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										76
									
								
								app/Api/V1/Requests/BudgetRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								app/Api/V1/Requests/BudgetRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| <?php | ||||
| /** | ||||
|  * BudgetRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Models\Budget; | ||||
|  | ||||
| /** | ||||
|  * Class BudgetRequest | ||||
|  */ | ||||
| class BudgetRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'name'   => $this->string('name'), | ||||
|             'active' => $this->boolean('active'), | ||||
|             'order'  => 0, | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'name'   => 'required|between:1,100|uniqueObjectForUser:budgets,name', | ||||
|             'active' => 'required|boolean', | ||||
|         ]; | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 /** @var Budget $budget */ | ||||
|                 $budget        = $this->route()->parameter('budget'); | ||||
|                 $rules['name'] = sprintf('required|between:1,100|uniqueObjectForUser:budgets,name,%d', $budget->id); | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										75
									
								
								app/Api/V1/Requests/CategoryRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								app/Api/V1/Requests/CategoryRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| <?php | ||||
| /** | ||||
|  * CategoryRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Models\Category; | ||||
|  | ||||
| /** | ||||
|  * Class CategoryRequest | ||||
|  */ | ||||
| class CategoryRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'name'   => $this->string('name'), | ||||
|             'active' => $this->boolean('active'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'name'   => 'required|between:1,100|uniqueObjectForUser:categories,name', | ||||
|             'active' => 'required|boolean', | ||||
|         ]; | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 /** @var Category $category */ | ||||
|                 $category      = $this->route()->parameter('category'); | ||||
|                 $rules['name'] = sprintf('required|between:1,100|uniqueObjectForUser:categories,name,%d', $category->id); | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
| } | ||||
| @@ -41,7 +41,7 @@ class CurrencyRequest extends Request | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll() | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'name'           => $this->string('name'), | ||||
| @@ -80,4 +80,4 @@ class CurrencyRequest extends Request | ||||
|         return $rules; | ||||
|  | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
							
								
								
									
										68
									
								
								app/Api/V1/Requests/JournalLinkRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								app/Api/V1/Requests/JournalLinkRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| <?php | ||||
| /** | ||||
|  * JournalLinkRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class JournalLinkRequest | ||||
|  */ | ||||
| class JournalLinkRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'link_type_id' => $this->integer('link_type_id'), | ||||
|             'inward_id'    => $this->integer('inward_id'), | ||||
|             'outward_id'   => $this->integer('outward_id'), | ||||
|             'notes'        => $this->string('notes'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'link_type_id' => 'required|exists:link_types,id', | ||||
|             'inward_id'    => 'required|belongsToUser:transaction_journals,id', | ||||
|             'outward_id'   => 'required|belongsToUser:transaction_journals,id', | ||||
|             'notes'        => 'between:0,65000', | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										86
									
								
								app/Api/V1/Requests/LinkTypeRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								app/Api/V1/Requests/LinkTypeRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| <?php | ||||
| /** | ||||
|  * LinkTypeRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Models\LinkType; | ||||
| use Illuminate\Validation\Rule; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class LinkTypeRequest | ||||
|  */ | ||||
| class LinkTypeRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'name'    => $this->string('name'), | ||||
|             'outward' => $this->string('outward'), | ||||
|             'inward'  => $this->string('inward'), | ||||
|         ]; | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'name'    => 'required|unique:link_types,name|min:1', | ||||
|             'outward' => 'required|unique:link_types,outward|min:1|different:inward', | ||||
|             'inward'  => 'required|unique:link_types,inward|min:1|different:outward', | ||||
|         ]; | ||||
|         //        Rule::unique('users')->ignore($user->id), | ||||
|  | ||||
|  | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 /** @var LinkType $linkType */ | ||||
|                 $linkType         = $this->route()->parameter('linkType'); | ||||
|                 $rules['name']    = ['required', Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1']; | ||||
|                 $rules['outward'] = ['required', 'different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1']; | ||||
|                 $rules['inward']  = ['required', 'different:outward', Rule::unique('link_types', 'inward')->ignore($linkType->id), 'min:1']; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										90
									
								
								app/Api/V1/Requests/PiggyBankRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								app/Api/V1/Requests/PiggyBankRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PiggyBankRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Models\PiggyBank; | ||||
| use FireflyIII\Rules\IsAssetAccountId; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class PiggyBankRequest | ||||
|  */ | ||||
| class PiggyBankRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'name'           => $this->string('name'), | ||||
|             'account_id'     => $this->integer('account_id'), | ||||
|             'targetamount'   => $this->string('target_amount'), | ||||
|             'current_amount' => $this->string('current_amount'), | ||||
|             'start_date'     => $this->date('start_date'), | ||||
|             'target_date'    => $this->date('target_date'), | ||||
|             'note'           => $this->string('notes'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'name'           => 'required|between:1,255|uniquePiggyBankForUser', | ||||
|             'account_id'     => ['required', 'belongsToUser:accounts', new IsAssetAccountId], | ||||
|             'target_amount'  => 'required|numeric|more:0', | ||||
|             'current_amount' => 'numeric|more:0|lte:target_amount', | ||||
|             'start_date'     => 'date|nullable', | ||||
|             'target_date'    => 'date|nullable', | ||||
|             'notes'          => 'max:65000', | ||||
|         ]; | ||||
|  | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 /** @var PiggyBank $piggyBank */ | ||||
|                 $piggyBank     = $this->route()->parameter('piggyBank'); | ||||
|                 $rules['name'] = 'required|between:1,255|uniquePiggyBankForUser:' . $piggyBank->id; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /** | ||||
|  * FileProcessorInterface.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * PreferenceRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -18,32 +18,40 @@ | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
| 
 | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace FireflyIII\Import\FileProcessor; | ||||
| 
 | ||||
| use FireflyIII\Models\ImportJob; | ||||
| use Illuminate\Support\Collection; | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
| 
 | ||||
| /** | ||||
|  * Interface FileProcessorInterface. | ||||
|  * | ||||
|  * Class PreferenceRequest | ||||
|  */ | ||||
| interface FileProcessorInterface | ||||
| class PreferenceRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return Collection | ||||
|      */ | ||||
|     public function getObjects(): Collection; | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function run(): bool; | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users
 | ||||
|         return auth()->check(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param ImportJob $job | ||||
|      * | ||||
|      * @return FileProcessorInterface | ||||
|      */ | ||||
|     public function setJob(ImportJob $job): FileProcessorInterface; | ||||
| } | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'data' => $this->get('data'), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function rules(): array | ||||
|     { | ||||
|         return [ | ||||
|             'data' => 'required|between:1,65000', | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										482
									
								
								app/Api/V1/Requests/RecurrenceRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										482
									
								
								app/Api/V1/Requests/RecurrenceRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,482 @@ | ||||
| <?php | ||||
| /** | ||||
|  * RecurrenceRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Rules\BelongsUser; | ||||
| use Illuminate\Validation\Validator; | ||||
| use InvalidArgumentException; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class RecurrenceRequest | ||||
|  */ | ||||
| class RecurrenceRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         $return = [ | ||||
|             'recurrence'   => [ | ||||
|                 'type'         => $this->string('type'), | ||||
|                 'title'        => $this->string('title'), | ||||
|                 'description'  => $this->string('description'), | ||||
|                 'first_date'   => $this->date('first_date'), | ||||
|                 'repeat_until' => $this->date('repeat_until'), | ||||
|                 'repetitions'  => $this->integer('nr_of_repetitions'), | ||||
|                 'apply_rules'  => $this->boolean('apply_rules'), | ||||
|                 'active'       => $this->boolean('active'), | ||||
|             ], | ||||
|             'meta'         => [ | ||||
|                 'piggy_bank_id'   => $this->integer('piggy_bank_id'), | ||||
|                 'piggy_bank_name' => $this->string('piggy_bank_name'), | ||||
|                 'tags'            => explode(',', $this->string('tags')), | ||||
|             ], | ||||
|             'transactions' => [], | ||||
|             'repetitions'  => [], | ||||
|         ]; | ||||
|  | ||||
|         // repetition data: | ||||
|         /** @var array $repetitions */ | ||||
|         $repetitions = $this->get('repetitions'); | ||||
|         /** @var array $repetition */ | ||||
|         foreach ($repetitions as $repetition) { | ||||
|             $return['repetitions'][] = [ | ||||
|                 'type'    => $repetition['type'], | ||||
|                 'moment'  => $repetition['moment'], | ||||
|                 'skip'    => (int)$repetition['skip'], | ||||
|                 'weekend' => (int)$repetition['weekend'], | ||||
|             ]; | ||||
|         } | ||||
|         // transaction data: | ||||
|         /** @var array $transactions */ | ||||
|         $transactions = $this->get('transactions'); | ||||
|         /** @var array $transaction */ | ||||
|         foreach ($transactions as $transaction) { | ||||
|             $return['transactions'][] = [ | ||||
|                 'amount' => $transaction['amount'], | ||||
|  | ||||
|                 'currency_id'   => isset($transaction['currency_id']) ? (int)$transaction['currency_id'] : null, | ||||
|                 'currency_code' => $transaction['currency_code'] ?? null, | ||||
|  | ||||
|                 'foreign_amount'        => $transaction['foreign_amount'] ?? null, | ||||
|                 'foreign_currency_id'   => isset($transaction['foreign_currency_id']) ? (int)$transaction['foreign_currency_id'] : null, | ||||
|                 'foreign_currency_code' => $transaction['foreign_currency_code'] ?? null, | ||||
|  | ||||
|                 'budget_id'     => isset($transaction['budget_id']) ? (int)$transaction['budget_id'] : null, | ||||
|                 'budget_name'   => $transaction['budget_name'] ?? null, | ||||
|                 'category_id'   => isset($transaction['category_id']) ? (int)$transaction['category_id'] : null, | ||||
|                 'category_name' => $transaction['category_name'] ?? null, | ||||
|  | ||||
|                 'source_id'        => isset($transaction['source_id']) ? (int)$transaction['source_id'] : null, | ||||
|                 'source_name'      => isset($transaction['source_name']) ? (string)$transaction['source_name'] : null, | ||||
|                 'destination_id'   => isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null, | ||||
|                 'destination_name' => isset($transaction['destination_name']) ? (string)$transaction['destination_name'] : null, | ||||
|  | ||||
|                 'description' => $transaction['description'], | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return $return; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $today = new Carbon; | ||||
|         $today->addDay(); | ||||
|  | ||||
|         return [ | ||||
|             'type'                                 => 'required|in:withdrawal,transfer,deposit', | ||||
|             'title'                                => 'required|between:1,255|uniqueObjectForUser:recurrences,title', | ||||
|             'description'                          => 'between:1,65000', | ||||
|             'first_date'                           => sprintf('required|date|after:%s', $today->format('Y-m-d')), | ||||
|             'repeat_until'                         => sprintf('date|after:%s', $today->format('Y-m-d')), | ||||
|             'nr_of_repetitions'                    => 'numeric|between:1,31', | ||||
|             'apply_rules'                          => 'required|boolean', | ||||
|             'active'                               => 'required|boolean', | ||||
|  | ||||
|             // rules for meta values: | ||||
|             'tags'                                 => 'between:1,64000', | ||||
|             'piggy_bank_id'                        => 'numeric', | ||||
|  | ||||
|             // rules for repetitions. | ||||
|             'repetitions.*.type'                   => 'required|in:daily,weekly,ndom,monthly,yearly', | ||||
|             'repetitions.*.moment'                 => 'between:0,10', | ||||
|             'repetitions.*.skip'                   => 'required|numeric|between:0,31', | ||||
|             'repetitions.*.weekend'                => 'required|numeric|min:1|max:4', | ||||
|  | ||||
|             // rules for transactions. | ||||
|             'transactions.*.currency_id'           => 'numeric|exists:transaction_currencies,id|required_without:transactions.*.currency_code', | ||||
|             'transactions.*.currency_code'         => 'min:3|max:3|exists:transaction_currencies,code|required_without:transactions.*.currency_id', | ||||
|             'transactions.*.foreign_amount'        => 'numeric|more:0', | ||||
|             'transactions.*.foreign_currency_id'   => 'numeric|exists:transaction_currencies,id', | ||||
|             'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', | ||||
|             'transactions.*.budget_id'             => ['mustExist:budgets,id', new BelongsUser], | ||||
|             'transactions.*.category_name'         => 'between:1,255|nullable', | ||||
|             'transactions.*.source_id'             => ['numeric', 'nullable', new BelongsUser], | ||||
|             'transactions.*.source_name'           => 'between:1,255|nullable', | ||||
|             'transactions.*.destination_id'        => ['numeric', 'nullable', new BelongsUser], | ||||
|             'transactions.*.destination_name'      => 'between:1,255|nullable', | ||||
|             'transactions.*.amount'                => 'required|numeric|more:0', | ||||
|             'transactions.*.description'           => 'required|between:1,255', | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Configure the validator instance. | ||||
|      * | ||||
|      * @param  Validator $validator | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator) { | ||||
|                 $this->atLeastOneTransaction($validator); | ||||
|                 $this->atLeastOneRepetition($validator); | ||||
|                 $this->validRepeatsUntil($validator); | ||||
|                 $this->validRepetitionMoment($validator); | ||||
|                 $this->foreignCurrencyInformation($validator); | ||||
|                 $this->validateAccountInformation($validator); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Throws an error when this asset account is invalid. | ||||
|      * | ||||
|      * @noinspection MoreThanThreeArgumentsInspection | ||||
|      * | ||||
|      * @param Validator   $validator | ||||
|      * @param int|null    $accountId | ||||
|      * @param null|string $accountName | ||||
|      * @param string      $idField | ||||
|      * @param string      $nameField | ||||
|      * | ||||
|      * @return null|Account | ||||
|      */ | ||||
|     protected function assetAccountExists(Validator $validator, ?int $accountId, ?string $accountName, string $idField, string $nameField): ?Account | ||||
|     { | ||||
|         $accountId   = (int)$accountId; | ||||
|         $accountName = (string)$accountName; | ||||
|         // both empty? hard exit. | ||||
|         if ($accountId < 1 && '' === $accountName) { | ||||
|             $validator->errors()->add($idField, trans('validation.filled', ['attribute' => $idField])); | ||||
|  | ||||
|             return null; | ||||
|         } | ||||
|         // ID belongs to user and is asset account: | ||||
|         /** @var AccountRepositoryInterface $repository */ | ||||
|         $repository = app(AccountRepositoryInterface::class); | ||||
|         $repository->setUser(auth()->user()); | ||||
|         $set = $repository->getAccountsById([$accountId]); | ||||
|         Log::debug(sprintf('Count of accounts found by ID %d is: %d', $accountId, $set->count())); | ||||
|         if ($set->count() === 1) { | ||||
|             /** @var Account $first */ | ||||
|             $first = $set->first(); | ||||
|             if ($first->accountType->type !== AccountType::ASSET) { | ||||
|                 $validator->errors()->add($idField, trans('validation.belongs_user')); | ||||
|  | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             // we ignore the account name at this point. | ||||
|             return $first; | ||||
|         } | ||||
|  | ||||
|         $account = $repository->findByName($accountName, [AccountType::ASSET]); | ||||
|         if (null === $account) { | ||||
|             $validator->errors()->add($nameField, trans('validation.belongs_user')); | ||||
|  | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         return $account; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Adds an error to the validator when there are no repetitions in the array of data. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function atLeastOneRepetition(Validator $validator): void | ||||
|     { | ||||
|         $data        = $validator->getData(); | ||||
|         $repetitions = $data['repetitions'] ?? []; | ||||
|         // need at least one transaction | ||||
|         if (\count($repetitions) === 0) { | ||||
|             $validator->errors()->add('description', trans('validation.at_least_one_repetition')); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Adds an error to the validator when there are no transactions in the array of data. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function atLeastOneTransaction(Validator $validator): void | ||||
|     { | ||||
|         $data         = $validator->getData(); | ||||
|         $transactions = $data['transactions'] ?? []; | ||||
|         // need at least one transaction | ||||
|         if (\count($transactions) === 0) { | ||||
|             $validator->errors()->add('description', trans('validation.at_least_one_transaction')); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO can be made a rule? | ||||
|      * If the transactions contain foreign amounts, there must also be foreign currency information. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function foreignCurrencyInformation(Validator $validator): void | ||||
|     { | ||||
|         $data         = $validator->getData(); | ||||
|         $transactions = $data['transactions'] ?? []; | ||||
|         foreach ($transactions as $index => $transaction) { | ||||
|             // must have currency info. | ||||
|             if (isset($transaction['foreign_amount']) | ||||
|                 && !(isset($transaction['foreign_currency_id']) | ||||
|                      || isset($transaction['foreign_currency_code']))) { | ||||
|                 $validator->errors()->add( | ||||
|                     'transactions.' . $index . '.foreign_amount', | ||||
|                     trans('validation.require_currency_info') | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Throws an error when the given opposing account (of type $type) is invalid. | ||||
|      * Empty data is allowed, system will default to cash. | ||||
|      * | ||||
|      * @noinspection MoreThanThreeArgumentsInspection | ||||
|      * | ||||
|      * @param Validator   $validator | ||||
|      * @param string      $type | ||||
|      * @param int|null    $accountId | ||||
|      * @param null|string $accountName | ||||
|      * @param string      $idField | ||||
|      * | ||||
|      * @return null|Account | ||||
|      */ | ||||
|     protected function opposingAccountExists(Validator $validator, string $type, ?int $accountId, ?string $accountName, string $idField): ?Account | ||||
|     { | ||||
|         $accountId   = (int)$accountId; | ||||
|         $accountName = (string)$accountName; | ||||
|         // both empty? done! | ||||
|         if ($accountId < 1 && \strlen($accountName) === 0) { | ||||
|             return null; | ||||
|         } | ||||
|         if ($accountId !== 0) { | ||||
|             // ID belongs to user and is $type account: | ||||
|             /** @var AccountRepositoryInterface $repository */ | ||||
|             $repository = app(AccountRepositoryInterface::class); | ||||
|             $repository->setUser(auth()->user()); | ||||
|             $set = $repository->getAccountsById([$accountId]); | ||||
|             if ($set->count() === 1) { | ||||
|                 /** @var Account $first */ | ||||
|                 $first = $set->first(); | ||||
|                 if ($first->accountType->type !== $type) { | ||||
|                     $validator->errors()->add($idField, trans('validation.belongs_user')); | ||||
|  | ||||
|                     return null; | ||||
|                 } | ||||
|  | ||||
|                 // we ignore the account name at this point. | ||||
|                 return $first; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // not having an opposing account by this name is NOT a problem. | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO can be a rule? | ||||
|      * | ||||
|      * Validates the given account information. Switches on given transaction type. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function validateAccountInformation(Validator $validator): void | ||||
|     { | ||||
|         $data            = $validator->getData(); | ||||
|         $transactions    = $data['transactions'] ?? []; | ||||
|         $idField         = 'description'; | ||||
|         $transactionType = $data['type'] ?? 'false'; | ||||
|         foreach ($transactions as $index => $transaction) { | ||||
|             $sourceId           = isset($transaction['source_id']) ? (int)$transaction['source_id'] : null; | ||||
|             $sourceName         = $transaction['source_name'] ?? null; | ||||
|             $destinationId      = isset($transaction['destination_id']) ? (int)$transaction['destination_id'] : null; | ||||
|             $destinationName    = $transaction['destination_name'] ?? null; | ||||
|             $sourceAccount      = null; | ||||
|             $destinationAccount = null; | ||||
|             switch ($transactionType) { | ||||
|                 case 'withdrawal': | ||||
|                     $idField            = 'transactions.' . $index . '.source_id'; | ||||
|                     $nameField          = 'transactions.' . $index . '.source_name'; | ||||
|                     $sourceAccount      = $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField); | ||||
|                     $idField            = 'transactions.' . $index . '.destination_id'; | ||||
|                     $destinationAccount = $this->opposingAccountExists($validator, AccountType::EXPENSE, $destinationId, $destinationName, $idField); | ||||
|                     break; | ||||
|                 case 'deposit': | ||||
|                     $idField       = 'transactions.' . $index . '.source_id'; | ||||
|                     $sourceAccount = $this->opposingAccountExists($validator, AccountType::REVENUE, $sourceId, $sourceName, $idField); | ||||
|  | ||||
|                     $idField            = 'transactions.' . $index . '.destination_id'; | ||||
|                     $nameField          = 'transactions.' . $index . '.destination_name'; | ||||
|                     $destinationAccount = $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField); | ||||
|                     break; | ||||
|                 case 'transfer': | ||||
|                     $idField       = 'transactions.' . $index . '.source_id'; | ||||
|                     $nameField     = 'transactions.' . $index . '.source_name'; | ||||
|                     $sourceAccount = $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField); | ||||
|  | ||||
|                     $idField            = 'transactions.' . $index . '.destination_id'; | ||||
|                     $nameField          = 'transactions.' . $index . '.destination_name'; | ||||
|                     $destinationAccount = $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField); | ||||
|                     break; | ||||
|                 default: | ||||
|                     $validator->errors()->add($idField, trans('validation.invalid_account_info')); | ||||
|  | ||||
|                     return; | ||||
|  | ||||
|             } | ||||
|             // add some errors in case of same account submitted: | ||||
|             if (null !== $sourceAccount && null !== $destinationAccount && $sourceAccount->id === $destinationAccount->id) { | ||||
|                 $validator->errors()->add($idField, trans('validation.source_equals_destination')); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     private function validRepeatsUntil(Validator $validator): void | ||||
|     { | ||||
|         $data        = $validator->getData(); | ||||
|         $repetitions = $data['nr_of_repetitions'] ?? null; | ||||
|         $repeatUntil = $data['repeat_until'] ?? null; | ||||
|         if (null !== $repetitions && null !== $repeatUntil) { | ||||
|             // expect a date OR count: | ||||
|             $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); | ||||
|             $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO merge this in a rule somehow. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     private function validRepetitionMoment(Validator $validator): void | ||||
|     { | ||||
|         $data        = $validator->getData(); | ||||
|         $repetitions = $data['repetitions'] ?? []; | ||||
|         /** | ||||
|          * @var int   $index | ||||
|          * @var array $repetition | ||||
|          */ | ||||
|         foreach ($repetitions as $index => $repetition) { | ||||
|             switch ($repetition['type']) { | ||||
|                 default: | ||||
|                     $validator->errors()->add(sprintf('repetitions.%d.type', $index), trans('validation.valid_recurrence_rep_type')); | ||||
|  | ||||
|                     return; | ||||
|                 case 'daily': | ||||
|                     if ('' !== (string)$repetition['moment']) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|                     } | ||||
|  | ||||
|                     return; | ||||
|                 case 'monthly': | ||||
|                     $dayOfMonth = (int)$repetition['moment']; | ||||
|                     if ($dayOfMonth < 1 || $dayOfMonth > 31) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|                     } | ||||
|  | ||||
|                     return; | ||||
|                 case 'ndom': | ||||
|                     $parameters = explode(',', $repetition['moment']); | ||||
|                     if (\count($parameters) !== 2) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|  | ||||
|                         return; | ||||
|                     } | ||||
|                     $nthDay    = (int)($parameters[0] ?? 0.0); | ||||
|                     $dayOfWeek = (int)($parameters[1] ?? 0.0); | ||||
|                     if ($nthDay < 1 || $nthDay > 5) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|  | ||||
|                         return; | ||||
|                     } | ||||
|                     if ($dayOfWeek < 1 || $dayOfWeek > 7) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|  | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     return; | ||||
|                 case 'weekly': | ||||
|                     $dayOfWeek = (int)$repetition['moment']; | ||||
|                     if ($dayOfWeek < 1 || $dayOfWeek > 7) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|  | ||||
|                         return; | ||||
|                     } | ||||
|                     break; | ||||
|                 case 'yearly': | ||||
|                     try { | ||||
|                         Carbon::createFromFormat('Y-m-d', $repetition['moment']); | ||||
|                     } catch (InvalidArgumentException $e) { | ||||
|                         $validator->errors()->add(sprintf('repetitions.%d.moment', $index), trans('validation.valid_recurrence_rep_moment')); | ||||
|  | ||||
|                         return; | ||||
|                     } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Request.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Http\Requests\Request as FireflyIIIRequest; | ||||
|   | ||||
							
								
								
									
										79
									
								
								app/Api/V1/Requests/RuleGroupRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								app/Api/V1/Requests/RuleGroupRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| <?php | ||||
| /** | ||||
|  * RuleGroupRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use FireflyIII\Models\RuleGroup; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Class RuleGroupRequest | ||||
|  */ | ||||
| class RuleGroupRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         return [ | ||||
|             'title'       => $this->string('title'), | ||||
|             'description' => $this->string('description'), | ||||
|             'active'      => $this->boolean('active'), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $rules = [ | ||||
|             'title'       => 'required|between:1,100|uniqueObjectForUser:rule_groups,title', | ||||
|             'description' => 'between:1,5000|nullable', | ||||
|             'active'      => 'required|boolean', | ||||
|         ]; | ||||
|         switch ($this->method()) { | ||||
|             default: | ||||
|                 break; | ||||
|             case 'PUT': | ||||
|             case 'PATCH': | ||||
|                 /** @var RuleGroup $ruleGroup */ | ||||
|                 $ruleGroup      = $this->route()->parameter('ruleGroup'); | ||||
|                 $rules['title'] = 'required|between:1,100|uniqueObjectForUser:rule_groups,title,' . $ruleGroup->id; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										156
									
								
								app/Api/V1/Requests/RuleRequest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								app/Api/V1/Requests/RuleRequest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| <?php | ||||
| /** | ||||
|  * RuleRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| use Illuminate\Validation\Validator; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Class RuleRequest | ||||
|  */ | ||||
| class RuleRequest extends Request | ||||
| { | ||||
|     /** | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function authorize(): bool | ||||
|     { | ||||
|         // Only allow authenticated users | ||||
|         return auth()->check(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getAll(): array | ||||
|     { | ||||
|         $data = [ | ||||
|             'title'            => $this->string('title'), | ||||
|             'description'      => $this->string('description'), | ||||
|             'rule_group_id'    => $this->integer('rule_group_id'), | ||||
|             'rule_group_title' => $this->string('rule_group_title'), | ||||
|             'trigger'          => $this->string('trigger'), | ||||
|             'strict'           => $this->boolean('strict'), | ||||
|             'stop-processing'  => $this->boolean('stop_processing'), | ||||
|             'active'           => $this->boolean('active'), | ||||
|             'rule-triggers'    => [], | ||||
|             'rule-actions'     => [], | ||||
|         ]; | ||||
|  | ||||
|         foreach ($this->get('rule-triggers') as $trigger) { | ||||
|             $data['rule-triggers'][] = [ | ||||
|                 'name'            => $trigger['name'], | ||||
|                 'value'           => $trigger['value'], | ||||
|                 'stop-processing' => (int)($trigger['stop-processing'] ?? 0) === 1, | ||||
|             ]; | ||||
|         } | ||||
|         foreach ($this->get('rule-actions') as $action) { | ||||
|             $data['rule-actions'][] = [ | ||||
|                 'name'            => $action['name'], | ||||
|                 'value'           => $action['value'], | ||||
|                 'stop-processing' => (int)($action['stop-processing'] ?? 0) === 1, | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return array | ||||
|      */ | ||||
|     public function rules(): array | ||||
|     { | ||||
|         $validTriggers = array_keys(config('firefly.rule-triggers')); | ||||
|         $validActions  = array_keys(config('firefly.rule-actions')); | ||||
|  | ||||
|         // some actions require text: | ||||
|         $contextActions = implode(',', config('firefly.rule-actions-text')); | ||||
|  | ||||
|         $rules = [ | ||||
|             'title'                           => 'required|between:1,100|uniqueObjectForUser:rules,title', | ||||
|             'description'                     => 'between:1,5000|nullable', | ||||
|             'rule_group_id'                   => 'required|belongsToUser:rule_groups|required_without:rule_group_title', | ||||
|             'rule_group_title'                => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title', | ||||
|             'trigger'                         => 'required|in:store-journal,update-journal', | ||||
|             'rule-triggers.*.name'            => 'required|in:' . implode(',', $validTriggers), | ||||
|             'rule-triggers.*.stop-processing' => 'boolean', | ||||
|             'rule-triggers.*.value'           => 'required|min:1|ruleTriggerValue', // | ||||
|             'rule-actions.*.name'             => 'required|in:' . implode(',', $validActions), | ||||
|             'rule-actions.*.value'            => 'required_if:rule-action.*.type,' . $contextActions . '|ruleActionValue', | ||||
|             'rule-actions.*.stop-processing'  => 'boolean', | ||||
|             'strict'                          => 'required|boolean', | ||||
|             'stop_processing'                 => 'required|boolean', | ||||
|             'active'                          => 'required|boolean', | ||||
|         ]; | ||||
|  | ||||
|         return $rules; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Configure the validator instance. | ||||
|      * | ||||
|      * @param  Validator $validator | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|     public function withValidator(Validator $validator): void | ||||
|     { | ||||
|         $validator->after( | ||||
|             function (Validator $validator) { | ||||
|                 $this->atLeastOneTrigger($validator); | ||||
|                 $this->atLeastOneAction($validator); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Adds an error to the validator when there are no repetitions in the array of data. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function atLeastOneAction(Validator $validator): void | ||||
|     { | ||||
|         $data        = $validator->getData(); | ||||
|         $repetitions = $data['rule-actions'] ?? []; | ||||
|         // need at least one transaction | ||||
|         if (\count($repetitions) === 0) { | ||||
|             $validator->errors()->add('title', trans('validation.at_least_one_action')); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Adds an error to the validator when there are no repetitions in the array of data. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function atLeastOneTrigger(Validator $validator): void | ||||
|     { | ||||
|         $data        = $validator->getData(); | ||||
|         $repetitions = $data['rule-triggers'] ?? []; | ||||
|         // need at least one transaction | ||||
|         if (\count($repetitions) === 0) { | ||||
|             $validator->errors()->add('title', trans('validation.at_least_one_trigger')); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * TransactionRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
| @@ -187,6 +188,8 @@ class TransactionRequest extends Request | ||||
|     /** | ||||
|      * Throws an error when this asset account is invalid. | ||||
|      * | ||||
|      * @noinspection MoreThanThreeArgumentsInspection | ||||
|      * | ||||
|      * @param Validator   $validator | ||||
|      * @param int|null    $accountId | ||||
|      * @param null|string $accountName | ||||
| @@ -255,7 +258,7 @@ class TransactionRequest extends Request | ||||
|      * | ||||
|      * @param Validator $validator | ||||
|      */ | ||||
|     protected function checkValidDescriptions(Validator $validator) | ||||
|     protected function checkValidDescriptions(Validator $validator): void | ||||
|     { | ||||
|         $data               = $validator->getData(); | ||||
|         $transactions       = $data['transactions'] ?? []; | ||||
| @@ -316,6 +319,8 @@ class TransactionRequest extends Request | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * TODO can be made a rule? | ||||
|      * | ||||
|      * If the transactions contain foreign amounts, there must also be foreign currency information. | ||||
|      * | ||||
|      * @param Validator $validator | ||||
| @@ -341,6 +346,8 @@ class TransactionRequest extends Request | ||||
|      * Throws an error when the given opposing account (of type $type) is invalid. | ||||
|      * Empty data is allowed, system will default to cash. | ||||
|      * | ||||
|      * @noinspection MoreThanThreeArgumentsInspection | ||||
|      * | ||||
|      * @param Validator   $validator | ||||
|      * @param string      $type | ||||
|      * @param int|null    $accountId | ||||
| @@ -453,7 +460,7 @@ class TransactionRequest extends Request | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     protected function validateSplitAccounts(Validator $validator) | ||||
|     protected function validateSplitAccounts(Validator $validator): void | ||||
|     { | ||||
|         $data  = $validator->getData(); | ||||
|         $count = isset($data['transactions']) ? \count($data['transactions']) : 0; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UserRequest.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Api\V1\Requests; | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * CreateExport.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * CreateImport.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,15 +20,18 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use Exception; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Import\Prerequisites\PrerequisitesInterface; | ||||
| use FireflyIII\Import\Routine\RoutineInterface; | ||||
| use FireflyIII\Import\Storage\ImportArrayStorage; | ||||
| use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Services\Internal\File\EncryptService; | ||||
| use Illuminate\Console\Command; | ||||
| use Illuminate\Support\MessageBag; | ||||
| use Log; | ||||
| use Preferences; | ||||
|  | ||||
| @@ -52,18 +55,17 @@ class CreateImport extends Command | ||||
|      */ | ||||
|     protected $signature | ||||
|         = 'firefly:create-import | ||||
|                             {file : The file to import.} | ||||
|                             {configuration : The configuration file to use for the import.} | ||||
|                             {file? : The file to import.} | ||||
|                             {configuration? : The configuration file to use for the import.} | ||||
|                             {--type=csv : The file type of the import.} | ||||
|                             {--user= : The user ID that the import should import for.} | ||||
|                             {--provider=file : The file type of the import.} | ||||
|                             {--user=1 : The user ID that the import should import for.} | ||||
|                             {--token= : The user\'s access token.} | ||||
|                             {--start : Starts the job immediately.}'; | ||||
|  | ||||
|     /** | ||||
|      * Run the command. | ||||
|      * | ||||
|      * @noinspection MultipleReturnStatementsInspection | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function handle(): int | ||||
| @@ -74,77 +76,155 @@ class CreateImport extends Command | ||||
|             return 1; | ||||
|         } | ||||
|         /** @var UserRepositoryInterface $userRepository */ | ||||
|         $userRepository = app(UserRepositoryInterface::class); | ||||
|         $file           = $this->argument('file'); | ||||
|         $configuration  = $this->argument('configuration'); | ||||
|         $user           = $userRepository->findNull((int)$this->option('user')); | ||||
|         $cwd            = getcwd(); | ||||
|         $type           = strtolower($this->option('type')); | ||||
|         $userRepository    = app(UserRepositoryInterface::class); | ||||
|         $file              = (string)$this->argument('file'); | ||||
|         $configuration     = (string)$this->argument('configuration'); | ||||
|         $user              = $userRepository->findNull((int)$this->option('user')); | ||||
|         $cwd               = getcwd(); | ||||
|         $type              = strtolower((string)$this->option('type')); | ||||
|         $provider          = strtolower((string)$this->option('provider')); | ||||
|         $configurationData = []; | ||||
|  | ||||
|         if (!$this->validArguments()) { | ||||
|             $this->errorLine('Invalid arguments.'); | ||||
|  | ||||
|             return 1; | ||||
|         } | ||||
|         if (\strlen($configuration) > 0) { | ||||
|             $configurationData = json_decode(file_get_contents($configuration), true); | ||||
|             if (null === $configurationData) { | ||||
|                 $this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd)); | ||||
|  | ||||
|         $configurationData = json_decode(file_get_contents($configuration), true); | ||||
|         if (null === $configurationData) { | ||||
|             $this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd)); | ||||
|  | ||||
|             return 1; | ||||
|                 return 1; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|  | ||||
|         $this->infoLine(sprintf('Going to create a job to import file: %s', $file)); | ||||
|         $this->infoLine(sprintf('Using configuration file: %s', $configuration)); | ||||
|         $this->infoLine(sprintf('Import into user: #%d (%s)', $user->id, $user->email)); | ||||
|         $this->infoLine(sprintf('Type of import: %s', $type)); | ||||
|         $this->infoLine(sprintf('Type of import: %s', $provider)); | ||||
|  | ||||
|         /** @var ImportJobRepositoryInterface $jobRepository */ | ||||
|         $jobRepository = app(ImportJobRepositoryInterface::class); | ||||
|         $jobRepository->setUser($user); | ||||
|         $job = $jobRepository->create($type); | ||||
|         $this->infoLine(sprintf('Created job "%s"', $job->key)); | ||||
|         $importJob = $jobRepository->create($provider); | ||||
|         $this->infoLine(sprintf('Created job "%s"', $importJob->key)); | ||||
|  | ||||
|         /** @var EncryptService $service */ | ||||
|         $service = app(EncryptService::class); | ||||
|         $service->encrypt($file, $job->key); | ||||
|  | ||||
|         $this->infoLine('Stored import data...'); | ||||
|  | ||||
|         $jobRepository->setConfiguration($job, $configurationData); | ||||
|         $jobRepository->updateStatus($job, 'configured'); | ||||
|         $this->infoLine('Stored configuration...'); | ||||
|  | ||||
|         if (true === $this->option('start')) { | ||||
|             $this->infoLine('The import will start in a moment. This process is not visible...'); | ||||
|             Log::debug('Go for import!'); | ||||
|  | ||||
|             // normally would refer to other firefly:start-import but that doesn't seem to work all to well... | ||||
|  | ||||
|             // start the actual routine: | ||||
|             $type      = 'csv' === $job->file_type ? 'file' : $job->file_type; | ||||
|             $key       = sprintf('import.routine.%s', $type); | ||||
|             $className = config($key); | ||||
|             if (null === $className || !class_exists($className)) { | ||||
|                 throw new FireflyException(sprintf('Cannot find import routine class for job of type "%s".', $type)); // @codeCoverageIgnore | ||||
|         // make sure that job has no prerequisites. | ||||
|         if ((bool)config(sprintf('import.has_prereq.%s', $provider))) { | ||||
|             // make prerequisites thing. | ||||
|             $class = (string)config(sprintf('import.prerequisites.%s', $provider)); | ||||
|             if (!class_exists($class)) { | ||||
|                 throw new FireflyException(sprintf('No class to handle prerequisites for "%s".', $provider)); // @codeCoverageIgnore | ||||
|             } | ||||
|             /** @var RoutineInterface $routine */ | ||||
|             $routine = app($className); | ||||
|             $routine->setJob($job); | ||||
|             $routine->run(); | ||||
|             /** @var PrerequisitesInterface $object */ | ||||
|             $object = app($class); | ||||
|             $object->setUser($user); | ||||
|             if (!$object->isComplete()) { | ||||
|                 $this->errorLine(sprintf('Import provider "%s" has prerequisites that can only be filled in using the browser.', $provider)); | ||||
|  | ||||
|             // give feedback. | ||||
|             /** @var MessageBag $error */ | ||||
|             foreach ($routine->getErrors() as $index => $error) { | ||||
|                 $this->errorLine(sprintf('Error importing line #%d: %s', $index, $error)); | ||||
|                 return 1; | ||||
|             } | ||||
|             $this->infoLine( | ||||
|                 sprintf( | ||||
|                     'The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines() | ||||
|                 ) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         // store file as attachment. | ||||
|         if (\strlen($file) > 0) { | ||||
|             $messages = $jobRepository->storeCLIUpload($importJob, 'import_file', $file); | ||||
|             if ($messages->count() > 0) { | ||||
|                 $this->errorLine($messages->first()); | ||||
|  | ||||
|                 return 1; | ||||
|             } | ||||
|             $this->infoLine('File content saved.'); | ||||
|         } | ||||
|  | ||||
|         $this->infoLine('Job configuration saved.'); | ||||
|         $jobRepository->setConfiguration($importJob, $configurationData); | ||||
|         $jobRepository->setStatus($importJob, 'ready_to_run'); | ||||
|  | ||||
|  | ||||
|         if (true === $this->option('start')) { | ||||
|             $this->infoLine('The has started. The process is not visible. Please wait.'); | ||||
|             Log::debug('Go for import!'); | ||||
|  | ||||
|             // run it! | ||||
|             $key       = sprintf('import.routine.%s', $provider); | ||||
|             $className = config($key); | ||||
|             if (null === $className || !class_exists($className)) { | ||||
|                 // @codeCoverageIgnoreStart | ||||
|                 $this->errorLine(sprintf('No routine for provider "%s"', $provider)); | ||||
|  | ||||
|                 return 1; | ||||
|                 // @codeCoverageIgnoreEnd | ||||
|             } | ||||
|  | ||||
|             // keep repeating this call until job lands on "provider_finished" | ||||
|             $valid = ['provider_finished']; | ||||
|             $count = 0; | ||||
|             while (!\in_array($importJob->status, $valid, true) && $count < 6) { | ||||
|                 Log::debug(sprintf('Now in loop #%d.', $count + 1)); | ||||
|                 /** @var RoutineInterface $routine */ | ||||
|                 $routine = app($className); | ||||
|                 $routine->setImportJob($importJob); | ||||
|                 try { | ||||
|                     $routine->run(); | ||||
|                 } catch (FireflyException|Exception $e) { | ||||
|                     $message = 'The import routine crashed: ' . $e->getMessage(); | ||||
|                     Log::error($message); | ||||
|                     Log::error($e->getTraceAsString()); | ||||
|  | ||||
|                     // set job errored out: | ||||
|                     $jobRepository->setStatus($importJob, 'error'); | ||||
|                     $this->errorLine($message); | ||||
|  | ||||
|                     return 1; | ||||
|                 } | ||||
|                 $count++; | ||||
|             } | ||||
|             if ($importJob->status === 'provider_finished') { | ||||
|                 $this->infoLine('Import has finished. Please wait for storage of data.'); | ||||
|                 // set job to be storing data: | ||||
|                 $jobRepository->setStatus($importJob, 'storing_data'); | ||||
|  | ||||
|                 /** @var ImportArrayStorage $storage */ | ||||
|                 $storage = app(ImportArrayStorage::class); | ||||
|                 $storage->setImportJob($importJob); | ||||
|  | ||||
|                 try { | ||||
|                     $storage->store(); | ||||
|                 } catch (FireflyException|Exception $e) { | ||||
|                     $message = 'The import routine crashed: ' . $e->getMessage(); | ||||
|                     Log::error($message); | ||||
|                     Log::error($e->getTraceAsString()); | ||||
|  | ||||
|                     // set job errored out: | ||||
|                     $jobRepository->setStatus($importJob, 'error'); | ||||
|                     $this->errorLine($message); | ||||
|  | ||||
|                     return 1; | ||||
|                 } | ||||
|                 // set storage to be finished: | ||||
|                 $jobRepository->setStatus($importJob, 'storage_finished'); | ||||
|             } | ||||
|  | ||||
|             // give feedback: | ||||
|             $this->infoLine('Job has finished.'); | ||||
|             if (null !== $importJob->tag) { | ||||
|                 $this->infoLine(sprintf('%d transaction(s) have been imported.', $importJob->tag->transactionJournals->count())); | ||||
|                 $this->infoLine(sprintf('You can find your transactions under tag "%s"', $importJob->tag->tag)); | ||||
|             } | ||||
|  | ||||
|             if (null === $importJob->tag) { | ||||
|                 $this->errorLine('No transactions have been imported :(.'); | ||||
|             } | ||||
|             if (\count($importJob->errors) > 0) { | ||||
|                 $this->infoLine(sprintf('%d error(s) occurred:', \count($importJob->errors))); | ||||
|                 foreach ($importJob->errors as $err) { | ||||
|                     $this->errorLine('- ' . $err); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // clear cache for user: | ||||
|         Preferences::setForUser($user, 'lastActivity', microtime()); | ||||
|  | ||||
| @@ -185,20 +265,28 @@ class CreateImport extends Command | ||||
|         $cwd           = getcwd(); | ||||
|         $validTypes    = config('import.options.file.import_formats'); | ||||
|         $type          = strtolower($this->option('type')); | ||||
|         $provider      = strtolower($this->option('provider')); | ||||
|         $enabled       = (bool)config(sprintf('import.enabled.%s', $provider)); | ||||
|  | ||||
|         if (!\in_array($type, $validTypes, true)) { | ||||
|         if (false === $enabled) { | ||||
|             $this->errorLine(sprintf('Provider "%s" is not enabled.', $provider)); | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if ($provider === 'file' && !\in_array($type, $validTypes, true)) { | ||||
|             $this->errorLine(sprintf('Cannot import file of type "%s"', $type)); | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (!file_exists($file)) { | ||||
|         if ($provider === 'file' && !file_exists($file)) { | ||||
|             $this->errorLine(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd)); | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (!file_exists($configuration)) { | ||||
|         if ($provider === 'file' && !file_exists($configuration)) { | ||||
|             $this->errorLine(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd)); | ||||
|  | ||||
|             return false; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * DecryptAttachment.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * EncryptFile.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Import.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * ScanAttachments.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use Crypt; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UpgradeDatabase.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use DB; | ||||
| @@ -159,28 +161,41 @@ class UpgradeDatabase extends Command | ||||
|                             'order'           => 2, | ||||
|                         ] | ||||
|                     ); | ||||
|  | ||||
|                     // add triggers for amounts: | ||||
|                     RuleTrigger::create( | ||||
|                         [ | ||||
|                             'rule_id'         => $rule->id, | ||||
|                             'trigger_type'    => 'amount_less', | ||||
|                             'trigger_value'   => round($bill->amount_max, $currency->decimal_places), | ||||
|                             'active'          => 1, | ||||
|                             'stop_processing' => 0, | ||||
|                             'order'           => 3, | ||||
|                         ] | ||||
|                     ); | ||||
|                     RuleTrigger::create( | ||||
|                         [ | ||||
|                             'rule_id'         => $rule->id, | ||||
|                             'trigger_type'    => 'amount_more', | ||||
|                             'trigger_value'   => round($bill->amount_min, $currency->decimal_places), | ||||
|                             'active'          => 1, | ||||
|                             'stop_processing' => 0, | ||||
|                             'order'           => 4, | ||||
|                         ] | ||||
|                     ); | ||||
|                     if ($bill->amount_max !== $bill->amount_min) { | ||||
|                         // add triggers for amounts: | ||||
|                         RuleTrigger::create( | ||||
|                             [ | ||||
|                                 'rule_id'         => $rule->id, | ||||
|                                 'trigger_type'    => 'amount_less', | ||||
|                                 'trigger_value'   => round($bill->amount_max, $currency->decimal_places), | ||||
|                                 'active'          => 1, | ||||
|                                 'stop_processing' => 0, | ||||
|                                 'order'           => 3, | ||||
|                             ] | ||||
|                         ); | ||||
|                         RuleTrigger::create( | ||||
|                             [ | ||||
|                                 'rule_id'         => $rule->id, | ||||
|                                 'trigger_type'    => 'amount_more', | ||||
|                                 'trigger_value'   => round($bill->amount_min, $currency->decimal_places), | ||||
|                                 'active'          => 1, | ||||
|                                 'stop_processing' => 0, | ||||
|                                 'order'           => 4, | ||||
|                             ] | ||||
|                         ); | ||||
|                     } | ||||
|                     if ($bill->amount_max === $bill->amount_min) { | ||||
|                         RuleTrigger::create( | ||||
|                             [ | ||||
|                                 'rule_id'         => $rule->id, | ||||
|                                 'trigger_type'    => 'amount_exactly', | ||||
|                                 'trigger_value'   => round($bill->amount_min, $currency->decimal_places), | ||||
|                                 'active'          => 1, | ||||
|                                 'stop_processing' => 0, | ||||
|                                 'order'           => 3, | ||||
|                             ] | ||||
|                         ); | ||||
|                     } | ||||
|  | ||||
|                     // create action | ||||
|                     RuleAction::create( | ||||
| @@ -600,12 +615,16 @@ class UpgradeDatabase extends Command | ||||
|             $opposing->transaction_currency_id = $currency->id; | ||||
|             $transaction->save(); | ||||
|             $opposing->save(); | ||||
|             Log::debug(sprintf('Currency for account "%s" is %s, and currency for account "%s" is also | ||||
|             Log::debug( | ||||
|                 sprintf( | ||||
|                     'Currency for account "%s" is %s, and currency for account "%s" is also | ||||
|              %s, so %s #%d (#%d and #%d) has been verified to be to %s exclusively.', | ||||
|                                $opposing->account->name, $opposingCurrency->code, | ||||
|                                $transaction->account->name, $transaction->transactionCurrency->code, | ||||
|                                $journal->transactionType->type, $journal->id, | ||||
|                                $transaction->id, $opposing->id, $currency->code)); | ||||
|                     $opposing->account->name, $opposingCurrency->code, | ||||
|                     $transaction->account->name, $transaction->transactionCurrency->code, | ||||
|                     $journal->transactionType->type, $journal->id, | ||||
|                     $transaction->id, $opposing->id, $currency->code | ||||
|                 ) | ||||
|             ); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UpgradeFireflyInstructions.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use Illuminate\Console\Command; | ||||
|   | ||||
| @@ -1,9 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UseEncryption.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -21,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use Illuminate\Console\Command; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * VerifiesAccessToken.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * VerifyDatabase.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console\Commands; | ||||
|  | ||||
| use Crypt; | ||||
| @@ -88,6 +90,7 @@ class VerifyDatabase extends Command | ||||
|         $this->createAccessTokens(); | ||||
|         $this->fixDoubleAmounts(); | ||||
|         $this->fixBadMeta(); | ||||
|         $this->removeBills(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -162,7 +165,8 @@ class VerifyDatabase extends Command | ||||
|             if (isset($results[$key]) && $results[$key] !== $category) { | ||||
|                 $this->error( | ||||
|                     sprintf( | ||||
|                         'Transaction #%d referred to the wrong category. Was category #%d but is fixed to be category #%d.', $obj->transaction_journal_id, $category, $results[$key] | ||||
|                         'Transaction #%d referred to the wrong category. Was category #%d but is fixed to be category #%d.', $obj->transaction_journal_id, | ||||
|                         $category, $results[$key] | ||||
|                     ) | ||||
|                 ); | ||||
|                 DB::table('category_transaction')->where('id', $obj->ct_id)->update(['category_id' => $results[$key]]); | ||||
| @@ -182,14 +186,15 @@ class VerifyDatabase extends Command | ||||
|             ->get(['transactions.id', 'transaction_journal_id', 'identifier', 'budget_transaction.budget_id', 'budget_transaction.id as ct_id']); | ||||
|         $results = []; | ||||
|         foreach ($set as $obj) { | ||||
|             $key      = $obj->transaction_journal_id . '-' . $obj->identifier; | ||||
|             $key    = $obj->transaction_journal_id . '-' . $obj->identifier; | ||||
|             $budget = (int)$obj->budget_id; | ||||
|  | ||||
|             // value exists and is not budget: | ||||
|             if (isset($results[$key]) && $results[$key] !== $budget) { | ||||
|                 $this->error( | ||||
|                     sprintf( | ||||
|                         'Transaction #%d referred to the wrong budget. Was budget #%d but is fixed to be budget #%d.', $obj->transaction_journal_id, $budget, $results[$key] | ||||
|                         'Transaction #%d referred to the wrong budget. Was budget #%d but is fixed to be budget #%d.', $obj->transaction_journal_id, $budget, | ||||
|                         $results[$key] | ||||
|                     ) | ||||
|                 ); | ||||
|                 DB::table('budget_transaction')->where('id', $obj->ct_id)->update(['budget_id' => $results[$key]]); | ||||
| @@ -251,6 +256,23 @@ class VerifyDatabase extends Command | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function removeBills(): void | ||||
|     { | ||||
|         /** @var TransactionType $withdrawal */ | ||||
|         $withdrawal = TransactionType::where('type', TransactionType::WITHDRAWAL)->first(); | ||||
|         $journals   = TransactionJournal::whereNotNull('bill_id') | ||||
|                                         ->where('transaction_type_id', '!=', $withdrawal->id)->get(); | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
|             $this->line(sprintf('Transaction journal #%d should not be linked to bill #%d.', $journal->id, $journal->bill_id)); | ||||
|             $journal->bill_id = null; | ||||
|             $journal->save(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Eeport (and fix) piggy banks. Make sure there are only transfers linked to piggy bank events. | ||||
|      */ | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Kernel.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,13 +20,17 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Console; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Jobs\CreateRecurringTransactions; | ||||
| use Illuminate\Console\Scheduling\Schedule; | ||||
| use Illuminate\Foundation\Console\Kernel as ConsoleKernel; | ||||
|  | ||||
| /** | ||||
|  * File to make sure commnds work. | ||||
|  * File to make sure commands work. | ||||
|  */ | ||||
| class Kernel extends ConsoleKernel | ||||
| { | ||||
| @@ -42,7 +46,7 @@ class Kernel extends ConsoleKernel | ||||
|     /** | ||||
|      * Register the commands for the application. | ||||
|      */ | ||||
|     protected function commands() | ||||
|     protected function commands(): void | ||||
|     { | ||||
|         $this->load(__DIR__ . '/Commands'); | ||||
|  | ||||
| @@ -53,10 +57,9 @@ class Kernel extends ConsoleKernel | ||||
|      * Define the application's command schedule. | ||||
|      * | ||||
|      * @param \Illuminate\Console\Scheduling\Schedule $schedule | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     protected function schedule(Schedule $schedule) | ||||
|     protected function schedule(Schedule $schedule): void | ||||
|     { | ||||
|         $schedule->job(new CreateRecurringTransactions(new Carbon))->daily(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AdminRequestedTestMessage.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use FireflyIII\User; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Event.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * RegisteredUser.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use FireflyIII\User; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * RequestedNewPassword.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use FireflyIII\User; | ||||
|   | ||||
							
								
								
									
										46
									
								
								app/Events/RequestedReportOnJournals.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								app/Events/RequestedReportOnJournals.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| <?php | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use Illuminate\Broadcasting\InteractsWithSockets; | ||||
| use Illuminate\Broadcasting\PrivateChannel; | ||||
| use Illuminate\Foundation\Events\Dispatchable; | ||||
| use Illuminate\Queue\SerializesModels; | ||||
| use Illuminate\Support\Collection; | ||||
| use Log; | ||||
|  | ||||
| /** | ||||
|  * Class RequestedReportOnJournals | ||||
|  */ | ||||
| class RequestedReportOnJournals | ||||
| { | ||||
|     use Dispatchable, InteractsWithSockets, SerializesModels; | ||||
|  | ||||
|     /** @var Collection */ | ||||
|     public $journals; | ||||
|     /** @var int */ | ||||
|     public $userId; | ||||
|  | ||||
|     /** | ||||
|      * Create a new event instance. | ||||
|      * | ||||
|      * @param int        $userId | ||||
|      * @param Collection $journals | ||||
|      */ | ||||
|     public function __construct(int $userId, Collection $journals) | ||||
|     { | ||||
|         Log::debug('In event RequestedReportOnJournals.'); | ||||
|         $this->userId   = $userId; | ||||
|         $this->journals = $journals; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the channels the event should broadcast on. | ||||
|      * | ||||
|      * @return \Illuminate\Broadcasting\Channel|array | ||||
|      */ | ||||
|     public function broadcastOn() | ||||
|     { | ||||
|         return new PrivateChannel('channel-name'); | ||||
|     } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * RequestedVersionCheckStatus.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * StoredTransactionJournal.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UpdatedTransactionJournal.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UserChangedEmail.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Events; | ||||
|  | ||||
| use FireflyIII\User; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * FireflyException.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Exceptions; | ||||
|  | ||||
| use Exception; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Handler.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Exceptions; | ||||
|  | ||||
| use ErrorException; | ||||
| @@ -28,6 +30,7 @@ use FireflyIII\Jobs\MailError; | ||||
| use Illuminate\Auth\AuthenticationException; | ||||
| use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; | ||||
| use Illuminate\Validation\ValidationException; | ||||
| use League\OAuth2\Server\Exception\OAuthServerException; | ||||
| use Request; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
|  | ||||
| @@ -79,6 +82,11 @@ class Handler extends ExceptionHandler | ||||
|             return response()->json(['message' => 'Unauthenticated', 'exception' => 'AuthenticationException'], 401); | ||||
|         } | ||||
|  | ||||
|         if ($exception instanceof OAuthServerException && $request->expectsJson()) { | ||||
|             // somehow Laravel handler does not catch this: | ||||
|             return response()->json(['message' => $exception->getMessage(), 'exception' => 'OAuthServerException'], 401); | ||||
|         } | ||||
|  | ||||
|         if ($request->expectsJson()) { | ||||
|             $isDebug = config('app.debug', false); | ||||
|             if ($isDebug) { | ||||
| @@ -96,7 +104,7 @@ class Handler extends ExceptionHandler | ||||
|             return response()->json(['message' => 'Internal Firefly III Exception. See log files.', 'exception' => \get_class($exception)], 500); | ||||
|         } | ||||
|  | ||||
|         if ($exception instanceof FireflyException || $exception instanceof ErrorException) { | ||||
|         if ($exception instanceof FireflyException || $exception instanceof ErrorException || $exception instanceof OAuthServerException) { | ||||
|             $isDebug = env('APP_DEBUG', false); | ||||
|  | ||||
|             return response()->view('errors.FireflyException', ['exception' => $exception, 'debug' => $isDebug], 500); | ||||
| @@ -120,8 +128,20 @@ class Handler extends ExceptionHandler | ||||
|      */ | ||||
|     public function report(Exception $exception) | ||||
|     { | ||||
|  | ||||
|         $doMailError = env('SEND_ERROR_MESSAGE', true); | ||||
|         if (($exception instanceof FireflyException || $exception instanceof ErrorException) && $doMailError) { | ||||
|         if ( | ||||
|             // if the user wants us to mail: | ||||
|             $doMailError === true | ||||
|             && ( | ||||
|                 // and if is one of these error instances | ||||
|                 $exception instanceof FireflyException | ||||
|                 || $exception instanceof ErrorException | ||||
|                 || $exception instanceof OAuthServerException | ||||
|  | ||||
|             ) | ||||
|         ) { | ||||
|             // then, send email | ||||
|             $userData = [ | ||||
|                 'id'    => 0, | ||||
|                 'email' => 'unknown@example.com', | ||||
| @@ -139,6 +159,9 @@ class Handler extends ExceptionHandler | ||||
|                 'line'         => $exception->getLine(), | ||||
|                 'code'         => $exception->getCode(), | ||||
|                 'version'      => config('firefly.version'), | ||||
|                 'url'          => Request::fullUrl(), | ||||
|                 'userAgent'    => Request::userAgent(), | ||||
|                 'json'         => Request::acceptsJson(), | ||||
|             ]; | ||||
|  | ||||
|             // create job that will mail. | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * NotImplementedException.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Exceptions; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * ValidationException.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Exceptions; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AttachmentCollector.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Collector; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| @@ -94,7 +96,8 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface | ||||
|      */ | ||||
|     private function exportAttachment(Attachment $attachment): bool | ||||
|     { | ||||
|         $file = $attachment->fileName(); | ||||
|         $file      = $attachment->fileName(); | ||||
|         $decrypted = false; | ||||
|         if ($this->uploadDisk->exists($file)) { | ||||
|             try { | ||||
|                 $decrypted = Crypt::decrypt($this->uploadDisk->get($file)); | ||||
| @@ -104,6 +107,9 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         if ($decrypted === false) { | ||||
|             return false; | ||||
|         } | ||||
|         $exportFile = $this->exportFileName($attachment); | ||||
|         $this->exportDisk->put($exportFile, $decrypted); | ||||
|         $this->getEntries()->push($exportFile); | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * BasicCollector.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Collector; | ||||
|  | ||||
| use FireflyIII\Models\ExportJob; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * CollectorInterface.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Collector; | ||||
|  | ||||
| use FireflyIII\Models\ExportJob; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * UploadCollector.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Collector; | ||||
|  | ||||
| use Crypt; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * Entry.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Entry; | ||||
|  | ||||
| use FireflyIII\Models\Transaction; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * ExpandedProcessor.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export; | ||||
|  | ||||
| use Crypt; | ||||
| @@ -34,12 +36,12 @@ use FireflyIII\Models\AccountMeta; | ||||
| use FireflyIII\Models\ExportJob; | ||||
| use FireflyIII\Models\Note; | ||||
| use FireflyIII\Models\Transaction; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use Illuminate\Support\Collection; | ||||
| use Log; | ||||
| use Storage; | ||||
| use ZipArchive; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
|  | ||||
| /** | ||||
|  * Class ExpandedProcessor. | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * BasicExporter.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Exporter; | ||||
|  | ||||
| use FireflyIII\Models\ExportJob; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * CsvExporter.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Exporter; | ||||
|  | ||||
| use FireflyIII\Export\Entry\Entry; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * ExporterInterface.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export\Exporter; | ||||
|  | ||||
| use FireflyIII\Models\ExportJob; | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * ProcessorInterface.php | ||||
|  * Copyright (c) 2017 thegrumpydictator@gmail.com | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Export; | ||||
|  | ||||
| use Illuminate\Support\Collection; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AccountFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * AccountMetaFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
|   | ||||
							
								
								
									
										79
									
								
								app/Factory/AttachmentFactory.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								app/Factory/AttachmentFactory.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| <?php | ||||
| /** | ||||
|  * AttachmentFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
|  * | ||||
|  * This file is part of Firefly III. | ||||
|  * | ||||
|  * Firefly III is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * Firefly III 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 General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Models\Note; | ||||
| use FireflyIII\User; | ||||
|  | ||||
| /** | ||||
|  * Class AttachmentFactory | ||||
|  */ | ||||
| class AttachmentFactory | ||||
| { | ||||
|     /** @var User */ | ||||
|     private $user; | ||||
|  | ||||
|     /** | ||||
|      * @param array $data | ||||
|      * | ||||
|      * @return Attachment|null | ||||
|      */ | ||||
|     public function create(array $data): ?Attachment | ||||
|     { | ||||
|         // create attachment: | ||||
|         $attachment = Attachment::create( | ||||
|             [ | ||||
|                 'user_id'         => $this->user->id, | ||||
|                 'attachable_id'   => $data['model_id'], | ||||
|                 'attachable_type' => $data['model'], | ||||
|                 'md5'             => '', | ||||
|                 'filename'        => $data['filename'], | ||||
|                 'title'           => '' === $data['title'] ? null : $data['title'], | ||||
|                 'description'     => null, | ||||
|                 'mime'            => '', | ||||
|                 'size'            => 0, | ||||
|                 'uploaded'        => 0, | ||||
|             ] | ||||
|         ); | ||||
|         $notes      = (string)($data['notes'] ?? ''); | ||||
|         if ('' !== $notes) { | ||||
|             $note = new Note; | ||||
|             $note->noteable()->associate($attachment); | ||||
|             $note->text = $notes; | ||||
|             $note->save(); | ||||
|         } | ||||
|  | ||||
|         return $attachment; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param User $user | ||||
|      */ | ||||
|     public function setUser(User $user): void | ||||
|     { | ||||
|         $this->user = $user; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * BillFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
| @@ -57,8 +58,8 @@ class BillFactory | ||||
|                 'date'                    => $data['date'], | ||||
|                 'repeat_freq'             => $data['repeat_freq'], | ||||
|                 'skip'                    => $data['skip'], | ||||
|                 'automatch'               => true, | ||||
|                 'active'                  => $data['active'], | ||||
|                 'automatch'               => $data['automatch'] ?? true, | ||||
|                 'active'                  => $data['active'] ?? true, | ||||
|             ] | ||||
|         ); | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * BudgetFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,8 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * CategoryFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
| @@ -71,7 +72,7 @@ class CategoryFactory | ||||
|  | ||||
|         Log::debug(sprintf('Going to find category with ID %d and name "%s"', $categoryId, $categoryName)); | ||||
|  | ||||
|         if (\strlen($categoryName) === 0 && $categoryId === 0) { | ||||
|         if ('' === $categoryName && $categoryId === 0) { | ||||
|             return null; | ||||
|         } | ||||
|         // first by ID: | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?php | ||||
| declare(strict_types=1); | ||||
|  | ||||
| /** | ||||
|  * PiggyBankEventFactory.php | ||||
|  * Copyright (c) 2018 thegrumpydictator@gmail.com | ||||
| @@ -20,6 +20,7 @@ declare(strict_types=1); | ||||
|  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace FireflyIII\Factory; | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user