diff --git a/app/Bootstrap/ConfigureLogging.php b/app/Bootstrap/ConfigureLogging.php index 74180e96db..eff190f44c 100644 --- a/app/Bootstrap/ConfigureLogging.php +++ b/app/Bootstrap/ConfigureLogging.php @@ -22,24 +22,40 @@ use Illuminate\Log\Writer; */ class ConfigureLogging extends IlluminateConfigureLogging { + /** - * @param Application $app - * @param Writer $log + * Configure the Monolog handlers for the application. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @param \Illuminate\Log\Writer $log + * + * @return void */ protected function configureDailyHandler(Application $app, Writer $log) { + $config = $app->make('config'); + + $maxFiles = $config->get('app.log_max_files'); + $log->useDailyFiles( - $app->storagePath() . '/logs/firefly-iii.log', - $app->make('config')->get('app.log_max_files', 5) + $app->storagePath() . '/logs/firefly-iii.log', is_null($maxFiles) ? 5 : $maxFiles, + $config->get('app.log_level', 'debug') ); } /** - * @param Application $app - * @param Writer $log + * Configure the Monolog handlers for the application. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @param \Illuminate\Log\Writer $log + * + * @return void */ protected function configureSingleHandler(Application $app, Writer $log) { - $log->useFiles($app->storagePath() . '/logs/firefly-iii.log'); + $log->useFiles( + $app->storagePath() . '/logs/firefly-iii.log', + $app->make('config')->get('app.log_level', 'debug') + ); } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php old mode 100644 new mode 100755 index 25b79b71eb..fbb1eb8b42 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -15,6 +15,7 @@ use FireflyIII\Console\Commands\EncryptFile; use FireflyIII\Console\Commands\Import; use FireflyIII\Console\Commands\UpgradeFireflyInstructions; use FireflyIII\Console\Commands\VerifyDatabase; +use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; /** @@ -24,11 +25,10 @@ use Illuminate\Foundation\Console\Kernel as ConsoleKernel; */ class Kernel extends ConsoleKernel { - /** * The bootstrap classes for the application. * - * This needs to be for with the next upgrade. + * Next upgrade verify these are the same. * * @var array */ @@ -55,5 +55,29 @@ class Kernel extends ConsoleKernel VerifyDatabase::class, Import::class, EncryptFile::class, + ]; + + /** + * Register the Closure based commands for the application. + * + * @return void + */ + protected function commands() + { + require base_path('routes/console.php'); + } + + /** + * Define the application's command schedule. + * + * @param \Illuminate\Console\Scheduling\Schedule $schedule + * + * @return void + */ + protected function schedule(Schedule $schedule) + { + // $schedule->command('inspire') + // ->hourly(); + } } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php old mode 100644 new mode 100755 index 9207bce274..2e7986c29e --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -15,9 +15,11 @@ use ErrorException; use Exception; use FireflyIII\Jobs\MailError; use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Auth\AuthenticationException; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; -use Request; +use Illuminate\Session\TokenMismatchException; +use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\HttpException; /** @@ -34,9 +36,12 @@ class Handler extends ExceptionHandler */ protected $dontReport = [ + AuthenticationException::class, AuthorizationException::class, HttpException::class, ModelNotFoundException::class, + TokenMismatchException::class, + ValidationException::class, ]; /** @@ -71,7 +76,6 @@ class Handler extends ExceptionHandler */ public function report(Exception $exception) { - if ($exception instanceof FireflyException || $exception instanceof ErrorException) { $userData = [ 'id' => 0, @@ -92,10 +96,28 @@ class Handler extends ExceptionHandler ]; // create job that will mail. - $job = new MailError($userData, env('SITE_OWNER'), Request::ip(), $data); + $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; + $job = new MailError($userData, env('SITE_OWNER'), $ip, $data); dispatch($job); } parent::report($exception); } + + /** + * Convert an authentication exception into an unauthenticated response. + * + * @param \Illuminate\Http\Request $request + * @param \Illuminate\Auth\AuthenticationException $exception + * + * @return \Illuminate\Http\Response + */ + protected function unauthenticated($request, AuthenticationException $exception) + { + if ($request->expectsJson()) { + return response()->json(['error' => 'Unauthenticated.'], 401); + } + + return redirect()->guest('login'); + } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php old mode 100644 new mode 100755 index 2036bab0d6..8732441d0f --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -6,7 +6,6 @@ * This software may be modified and distributed under the terms * of the MIT license. See the LICENSE file for details. */ - declare(strict_types = 1); namespace FireflyIII\Http; @@ -23,9 +22,11 @@ use FireflyIII\Http\Middleware\RedirectIfAuthenticated; use FireflyIII\Http\Middleware\RedirectIfTwoFactorAuthenticated; use FireflyIII\Http\Middleware\VerifyCsrfToken; use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth; +use Illuminate\Auth\Middleware\Authorize; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Foundation\Http\Kernel as HttpKernel; use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode; +use Illuminate\Routing\Middleware\SubstituteBindings; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Session\Middleware\StartSession; use Illuminate\View\Middleware\ShareErrorsFromSession; @@ -37,10 +38,11 @@ use Illuminate\View\Middleware\ShareErrorsFromSession; */ class Kernel extends HttpKernel { + /** * The bootstrap classes for the application. * - * Next upgrade should verify these are all here. + * Next upgrade verify these are the same. * * @var array */ @@ -83,6 +85,7 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, ], // MUST NOT be logged in. Does not care about 2FA or confirmation. 'user-not-logged-in' => [ @@ -91,9 +94,9 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, RedirectIfAuthenticated::class, ], - // MUST be logged in. // MUST NOT have 2FA // don't care about confirmation: @@ -103,6 +106,7 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, Authenticate::class, RedirectIfTwoFactorAuthenticated::class, ], @@ -115,6 +119,7 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, Authenticate::class, AuthenticateTwoFactor::class, IsNotConfirmed::class, @@ -129,6 +134,7 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, Authenticate::class, ], @@ -142,6 +148,7 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, Authenticate::class, AuthenticateTwoFactor::class, IsConfirmed::class, @@ -159,6 +166,7 @@ class Kernel extends HttpKernel StartSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, + SubstituteBindings::class, Authenticate::class, AuthenticateTwoFactor::class, IsConfirmed::class, @@ -168,8 +176,10 @@ class Kernel extends HttpKernel ], + 'api' => [ 'throttle:60,1', + 'bindings', ], ]; @@ -184,6 +194,8 @@ class Kernel extends HttpKernel = [ 'auth' => Authenticate::class, 'auth.basic' => AuthenticateWithBasicAuth::class, + 'bindings' => SubstituteBindings::class, + 'can' => Authorize::class, 'guest' => RedirectIfAuthenticated::class, 'throttle' => ThrottleRequests::class, 'range' => Range::class, diff --git a/app/Http/routes.php b/app/Http/routes.php deleted file mode 100644 index 901e1d2da4..0000000000 --- a/app/Http/routes.php +++ /dev/null @@ -1,443 +0,0 @@ - 'user-not-logged-in'], function () { - - // Authentication Routes... - Route::get('/login', 'Auth\AuthController@showLoginForm'); - Route::post('/login', 'Auth\AuthController@login'); - - // Registration Routes... - Route::get('/register', ['uses' => 'Auth\AuthController@showRegistrationForm', 'as' => 'register']); - Route::post('/register', 'Auth\AuthController@register'); - - Route::get('/password/reset', 'Auth\PasswordController@getReset'); - - // Password Reset Routes... - Route::get('/password/reset/{token?}', 'Auth\PasswordController@showResetForm'); - Route::post('/password/email', 'Auth\PasswordController@sendResetLinkEmail'); - Route::post('/password/reset', 'Auth\PasswordController@reset'); - - -} -); - -/** - * For some other routes, it is only relevant that the user is authenticated. - */ -Route::group( - ['middleware' => 'user-simple-auth'], function () { - Route::get('/error', 'HomeController@displayError'); - Route::get('/logout', ['uses' => 'Auth\AuthController@logout', 'as' => 'logout']); - Route::get('/flush', ['uses' => 'HomeController@flush']); -} -); - -/** - * For the two factor routes, the user must be logged in, but NOT 2FA. Account confirmation does not matter here. - */ -Route::group( - ['middleware' => 'user-logged-in-no-2fa'], function () { - Route::get('/two-factor', ['uses' => 'Auth\TwoFactorController@index', 'as' => 'two-factor']); - Route::get('/lost-two-factor', ['uses' => 'Auth\TwoFactorController@lostTwoFactor', 'as' => 'lost-two-factor']); - Route::post('/two-factor', ['uses' => 'Auth\TwoFactorController@postIndex', 'as' => 'two-factor-post']); - -} -); - -/** - * For the confirmation routes, the user must be logged in, also 2FA, but his account must not be confirmed. - */ -Route::group( - ['middleware' => 'user-logged-in-2fa-no-activation'], function () { - // - Route::get('/confirm-your-account', ['uses' => 'Auth\ConfirmationController@confirmationError', 'as' => 'confirmation_error']); - Route::get('/resend-confirmation', ['uses' => 'Auth\ConfirmationController@resendConfirmation', 'as' => 'resend_confirmation']); - Route::get('/confirmation/{code}', ['uses' => 'Auth\ConfirmationController@doConfirmation', 'as' => 'do_confirm_account']); - -} -); - -/** - * For all other routes, the user must be fully authenticated and have an activated account. - */ -Route::group( - ['middleware' => ['user-full-auth']], function () { - - /** - * Home Controller - */ - Route::get('/', ['uses' => 'HomeController@index', 'as' => 'index']); - Route::get('/home', ['uses' => 'HomeController@index', 'as' => 'home']); - Route::post('/daterange', ['uses' => 'HomeController@dateRange', 'as' => 'daterange']); - Route::get('/routes', ['uses' => 'HomeController@routes']); - /** - * Account Controller - */ - Route::get('/accounts/{what}', ['uses' => 'AccountController@index', 'as' => 'accounts.index'])->where('what', 'revenue|asset|expense'); - Route::get('/accounts/create/{what}', ['uses' => 'AccountController@create', 'as' => 'accounts.create'])->where('what', 'revenue|asset|expense'); - Route::get('/accounts/edit/{account}', ['uses' => 'AccountController@edit', 'as' => 'accounts.edit']); - Route::get('/accounts/delete/{account}', ['uses' => 'AccountController@delete', 'as' => 'accounts.delete']); - Route::get('/accounts/show/{account}', ['uses' => 'AccountController@show', 'as' => 'accounts.show']); - Route::get('/accounts/show/{account}/{date}', ['uses' => 'AccountController@showWithDate', 'as' => 'accounts.show.date']); - - - Route::post('/accounts/store', ['uses' => 'AccountController@store', 'as' => 'accounts.store']); - Route::post('/accounts/update/{account}', ['uses' => 'AccountController@update', 'as' => 'accounts.update']); - Route::post('/accounts/destroy/{account}', ['uses' => 'AccountController@destroy', 'as' => 'accounts.destroy']); - - - /** - * Attachment Controller - */ - - Route::post('/attachment/update/{attachment}', ['uses' => 'AttachmentController@update', 'as' => 'attachments.update']); - Route::post('/attachment/destroy/{attachment}', ['uses' => 'AttachmentController@destroy', 'as' => 'attachments.destroy']); - - Route::get('/attachment/edit/{attachment}', ['uses' => 'AttachmentController@edit', 'as' => 'attachments.edit']); - Route::get('/attachment/delete/{attachment}', ['uses' => 'AttachmentController@delete', 'as' => 'attachments.delete']); - Route::get('/attachment/preview/{attachment}', ['uses' => 'AttachmentController@preview', 'as' => 'attachments.preview']); - Route::get('/attachment/download/{attachment}', ['uses' => 'AttachmentController@download', 'as' => 'attachments.download']); - - - /** - * Bills Controller - */ - Route::get('/bills', ['uses' => 'BillController@index', 'as' => 'bills.index']); - Route::get('/bills/rescan/{bill}', ['uses' => 'BillController@rescan', 'as' => 'bills.rescan']); - Route::get('/bills/create', ['uses' => 'BillController@create', 'as' => 'bills.create']); - Route::get('/bills/edit/{bill}', ['uses' => 'BillController@edit', 'as' => 'bills.edit']); - Route::get('/bills/delete/{bill}', ['uses' => 'BillController@delete', 'as' => 'bills.delete']); - Route::get('/bills/show/{bill}', ['uses' => 'BillController@show', 'as' => 'bills.show']); - Route::post('/bills/store', ['uses' => 'BillController@store', 'as' => 'bills.store']); - Route::post('/bills/update/{bill}', ['uses' => 'BillController@update', 'as' => 'bills.update']); - Route::post('/bills/destroy/{bill}', ['uses' => 'BillController@destroy', 'as' => 'bills.destroy']); - - /** - * Budget Controller - */ - Route::get('/budgets', ['uses' => 'BudgetController@index', 'as' => 'budgets.index']); - Route::get('/budgets/income', ['uses' => 'BudgetController@updateIncome', 'as' => 'budgets.income']); - Route::get('/budgets/create', ['uses' => 'BudgetController@create', 'as' => 'budgets.create']); - Route::get('/budgets/edit/{budget}', ['uses' => 'BudgetController@edit', 'as' => 'budgets.edit']); - Route::get('/budgets/delete/{budget}', ['uses' => 'BudgetController@delete', 'as' => 'budgets.delete']); - Route::get('/budgets/show/{budget}', ['uses' => 'BudgetController@show', 'as' => 'budgets.show']); - Route::get('/budgets/show/{budget}/{limitrepetition}', ['uses' => 'BudgetController@showWithRepetition', 'as' => 'budgets.showWithRepetition']); - Route::get('/budgets/list/noBudget', ['uses' => 'BudgetController@noBudget', 'as' => 'budgets.noBudget']); - Route::post('/budgets/income', ['uses' => 'BudgetController@postUpdateIncome', 'as' => 'budgets.postIncome']); - Route::post('/budgets/store', ['uses' => 'BudgetController@store', 'as' => 'budgets.store']); - Route::post('/budgets/update/{budget}', ['uses' => 'BudgetController@update', 'as' => 'budgets.update']); - Route::post('/budgets/destroy/{budget}', ['uses' => 'BudgetController@destroy', 'as' => 'budgets.destroy']); - Route::post('budgets/amount/{budget}', ['uses' => 'BudgetController@amount']); - - /** - * Category Controller - */ - Route::get('/categories', ['uses' => 'CategoryController@index', 'as' => 'categories.index']); - Route::get('/categories/create', ['uses' => 'CategoryController@create', 'as' => 'categories.create']); - Route::get('/categories/edit/{category}', ['uses' => 'CategoryController@edit', 'as' => 'categories.edit']); - Route::get('/categories/delete/{category}', ['uses' => 'CategoryController@delete', 'as' => 'categories.delete']); - Route::get('/categories/show/{category}', ['uses' => 'CategoryController@show', 'as' => 'categories.show']); - Route::get('/categories/show/{category}/{date}', ['uses' => 'CategoryController@showWithDate', 'as' => 'categories.show.date']); - Route::get('/categories/list/noCategory', ['uses' => 'CategoryController@noCategory', 'as' => 'categories.noCategory']); - Route::post('/categories/store', ['uses' => 'CategoryController@store', 'as' => 'categories.store']); - Route::post('/categories/update/{category}', ['uses' => 'CategoryController@update', 'as' => 'categories.update']); - Route::post('/categories/destroy/{category}', ['uses' => 'CategoryController@destroy', 'as' => 'categories.destroy']); - - /** - * Currency Controller - */ - Route::get('/currency', ['uses' => 'CurrencyController@index', 'as' => 'currency.index']); - Route::get('/currency/create', ['uses' => 'CurrencyController@create', 'as' => 'currency.create']); - Route::get('/currency/edit/{currency}', ['uses' => 'CurrencyController@edit', 'as' => 'currency.edit']); - Route::get('/currency/delete/{currency}', ['uses' => 'CurrencyController@delete', 'as' => 'currency.delete']); - Route::get('/currency/default/{currency}', ['uses' => 'CurrencyController@defaultCurrency', 'as' => 'currency.default']); - Route::post('/currency/store', ['uses' => 'CurrencyController@store', 'as' => 'currency.store']); - Route::post('/currency/update/{currency}', ['uses' => 'CurrencyController@update', 'as' => 'currency.update']); - Route::post('/currency/destroy/{currency}', ['uses' => 'CurrencyController@destroy', 'as' => 'currency.destroy']); - - /** - * Export Controller - */ - Route::get('/export', ['uses' => 'ExportController@index', 'as' => 'export.index']); - Route::post('/export/submit', ['uses' => 'ExportController@postIndex', 'as' => 'export.export']); - Route::get('/export/status/{jobKey}', ['uses' => 'ExportController@getStatus', 'as' => 'export.status']); - Route::get('/export/download/{jobKey}', ['uses' => 'ExportController@download', 'as' => 'export.download']); - - - /** - * ALL CHART Controllers - */ - // accounts: - Route::get('/chart/account/frontpage', ['uses' => 'Chart\AccountController@frontpage']); - Route::get('/chart/account/expense', ['uses' => 'Chart\AccountController@expenseAccounts']); - Route::get('/chart/account/report/default/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\AccountController@report']); - Route::get('/chart/account/{account}', ['uses' => 'Chart\AccountController@single']); - Route::get('/chart/account/{account}/{date}', ['uses' => 'Chart\AccountController@specificPeriod']); - - - // bills: - Route::get('/chart/bill/frontpage', ['uses' => 'Chart\BillController@frontpage']); - Route::get('/chart/bill/{bill}', ['uses' => 'Chart\BillController@single']); - - // budgets: - Route::get('/chart/budget/frontpage', ['uses' => 'Chart\BudgetController@frontpage']); - - // this chart is used in reports: - Route::get('/chart/budget/multi-year/default/{start_date}/{end_date}/{accountList}/{budgetList}', ['uses' => 'Chart\BudgetController@multiYear']); - Route::get('/chart/budget/period/{budget}/default/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\BudgetController@period']); - Route::get('/chart/budget/{budget}/{limitrepetition}', ['uses' => 'Chart\BudgetController@budgetLimit']); - Route::get('/chart/budget/{budget}', ['uses' => 'Chart\BudgetController@budget']); - - // categories: - Route::get('/chart/category/frontpage', ['uses' => 'Chart\CategoryController@frontpage']); - - // these three charts are for reports: - Route::get('/chart/category/multi-year/default/{start_date}/{end_date}/{accountList}/{categoryList}', ['uses' => 'Chart\CategoryController@multiYear']); - - Route::get('/chart/category/{category}/period', ['uses' => 'Chart\CategoryController@currentPeriod']); - Route::get('/chart/category/{category}/period/{date}', ['uses' => 'Chart\CategoryController@specificPeriod']); - Route::get('/chart/category/{category}/all', ['uses' => 'Chart\CategoryController@all']); - - // piggy banks: - Route::get('/chart/piggy-bank/{piggyBank}', ['uses' => 'Chart\PiggyBankController@history']); - - // reports: - Route::get('/chart/report/in-out/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\ReportController@yearInOut']); - Route::get('/chart/report/in-out-sum/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\ReportController@yearInOutSummarized']); - Route::get('/chart/report/net-worth/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\ReportController@netWorth']); - - /** - * IMPORT CONTROLLER - */ - Route::get('/import', ['uses' => 'ImportController@index', 'as' => 'import.index']); - Route::post('/import/upload', ['uses' => 'ImportController@upload', 'as' => 'import.upload']); - Route::get('/import/configure/{importJob}', ['uses' => 'ImportController@configure', 'as' => 'import.configure']); - Route::post('/import/configure/{importJob}', ['uses' => 'ImportController@postConfigure', 'as' => 'import.process_configuration']); - Route::get('/import/settings/{importJob}', ['uses' => 'ImportController@settings', 'as' => 'import.settings']); - Route::post('/import/settings/{importJob}', ['uses' => 'ImportController@postSettings', 'as' => 'import.postSettings']); - Route::get('/import/complete/{importJob}', ['uses' => 'ImportController@complete', 'as' => 'import.complete']); - Route::get('/import/download/{importJob}', ['uses' => 'ImportController@download', 'as' => 'import.download']); - - Route::get('/import/status/{importJob}', ['uses' => 'ImportController@status', 'as' => 'import.status']); - Route::get('/import/json/{importJob}', ['uses' => 'ImportController@json', 'as' => 'import.json']); - - Route::post('/import/start/{importJob}', ['uses' => 'ImportController@start', 'as' => 'import.start']); - Route::get('/import/finished/{importJob}', ['uses' => 'ImportController@finished', 'as' => 'import.finished']); - - /** - * Help Controller - */ - Route::get('/help/{route}', ['uses' => 'HelpController@show', 'as' => 'help.show']); - - /** - * JSON Controller - */ - Route::get('/json/expense-accounts', ['uses' => 'JsonController@expenseAccounts', 'as' => 'json.expense-accounts']); - Route::get('/json/revenue-accounts', ['uses' => 'JsonController@revenueAccounts', 'as' => 'json.revenue-accounts']); - Route::get('/json/categories', ['uses' => 'JsonController@categories', 'as' => 'json.categories']); - Route::get('/json/tags', ['uses' => 'JsonController@tags', 'as' => 'json.tags']); - Route::get('/json/tour', ['uses' => 'JsonController@tour', 'as' => 'json.tour']); - Route::post('/json/end-tour', ['uses' => 'JsonController@endTour']); - - Route::get('/json/box/in', ['uses' => 'JsonController@boxIn', 'as' => 'json.box.in']); - Route::get('/json/box/out', ['uses' => 'JsonController@boxOut', 'as' => 'json.box.out']); - Route::get('/json/box/bills-unpaid', ['uses' => 'JsonController@boxBillsUnpaid', 'as' => 'json.box.paid']); - Route::get('/json/box/bills-paid', ['uses' => 'JsonController@boxBillsPaid', 'as' => 'json.box.unpaid']); - Route::get('/json/transaction-journals/{what}', 'JsonController@transactionJournals'); - - Route::get('/json/trigger', ['uses' => 'JsonController@trigger', 'as' => 'json.trigger']); - Route::get('/json/action', ['uses' => 'JsonController@action', 'as' => 'json.action']); - - /** - * New user Controller - */ - Route::get('/new-user', ['uses' => 'NewUserController@index', 'as' => 'new-user.index']); - Route::post('/new-user/submit', ['uses' => 'NewUserController@submit', 'as' => 'new-user.submit']); - - /** - * Piggy Bank Controller - */ - Route::get('/piggy-banks', ['uses' => 'PiggyBankController@index', 'as' => 'piggy-banks.index']); - Route::get('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@add', 'as' => 'piggy-banks.addMoney']); - Route::get('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@remove', 'as' => 'piggy-banks.removeMoney']); - Route::get('/piggy-banks/add-money/{piggyBank}', ['uses' => 'PiggyBankController@addMobile', 'as' => 'piggy-banks.add-money-mobile']); - Route::get('/piggy-banks/remove-money/{piggyBank}', ['uses' => 'PiggyBankController@removeMobile', 'as' => 'piggy-banks.remove-money-mobile']); - // Route::post('/piggy-banks/add-money/{piggyBank}', ['uses' => 'PiggyBankController@postAddMobile', 'as' => 'piggy-banks.post-add-mobile']); - // Route::post('/piggy-banks/remove-money/{piggyBank}', ['uses' => 'PiggyBankController@postRemoveMobile', 'as' => 'piggy-banks.post-remove-mobile']); - Route::get('/piggy-banks/create', ['uses' => 'PiggyBankController@create', 'as' => 'piggy-banks.create']); - Route::get('/piggy-banks/edit/{piggyBank}', ['uses' => 'PiggyBankController@edit', 'as' => 'piggy-banks.edit']); - Route::get('/piggy-banks/delete/{piggyBank}', ['uses' => 'PiggyBankController@delete', 'as' => 'piggy-banks.delete']); - Route::get('/piggy-banks/show/{piggyBank}', ['uses' => 'PiggyBankController@show', 'as' => 'piggy-banks.show']); - Route::post('/piggy-banks/store', ['uses' => 'PiggyBankController@store', 'as' => 'piggy-banks.store']); - Route::post('/piggy-banks/update/{piggyBank}', ['uses' => 'PiggyBankController@update', 'as' => 'piggy-banks.update']); - Route::post('/piggy-banks/destroy/{piggyBank}', ['uses' => 'PiggyBankController@destroy', 'as' => 'piggy-banks.destroy']); - - Route::post('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@postAdd', 'as' => 'piggy-banks.add']); - Route::post('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@postRemove', 'as' => 'piggy-banks.remove']); - - Route::post('/piggy-banks/sort', ['uses' => 'PiggyBankController@order', 'as' => 'piggy-banks.order']); - - /** - * Preferences Controller - */ - Route::get('/preferences', ['uses' => 'PreferencesController@index', 'as' => 'preferences']); - Route::post('/preferences', ['uses' => 'PreferencesController@postIndex', 'as' => 'preferences.update']); - Route::get('/preferences/code', ['uses' => 'PreferencesController@code', 'as' => 'preferences.code']); - Route::get('/preferences/delete-code', ['uses' => 'PreferencesController@deleteCode', 'as' => 'preferences.delete-code']); - Route::post('/preferences/code', ['uses' => 'PreferencesController@postCode', 'as' => 'preferences.code.store']); - - /** - * Profile Controller - */ - Route::get('/profile', ['uses' => 'ProfileController@index', 'as' => 'profile']); - Route::get('/profile/change-password', ['uses' => 'ProfileController@changePassword', 'as' => 'profile.change-password']); - Route::get('/profile/delete-account', ['uses' => 'ProfileController@deleteAccount', 'as' => 'profile.delete-account']); - Route::post('/profile/delete-account', ['uses' => 'ProfileController@postDeleteAccount', 'as' => 'profile.delete-account.post']); - Route::post('/profile/change-password', ['uses' => 'ProfileController@postChangePassword', 'as' => 'profile.change-password.store']); - - /** - * Report Controller - */ - Route::get('/reports', ['uses' => 'ReportController@index', 'as' => 'reports.index']); - Route::get('/reports/report/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'ReportController@report', 'as' => 'reports.report']); - - /** - * Rules Controller - */ - // index - Route::get('/rules', ['uses' => 'RuleController@index', 'as' => 'rules.index']); - - // rules GET: - Route::get('/rules/create/{ruleGroup}', ['uses' => 'RuleController@create', 'as' => 'rules.rule.create']); - Route::get('/rules/up/{rule}', ['uses' => 'RuleController@up', 'as' => 'rules.rule.up']); - Route::get('/rules/down/{rule}', ['uses' => 'RuleController@down', 'as' => 'rules.rule.down']); - Route::get('/rules/edit/{rule}', ['uses' => 'RuleController@edit', 'as' => 'rules.rule.edit']); - Route::get('/rules/delete/{rule}', ['uses' => 'RuleController@delete', 'as' => 'rules.rule.delete']); - Route::get('/rules/test', ['uses' => 'RuleController@testTriggers', 'as' => 'rules.rule.test_triggers']); - - // rules POST: - Route::post('/rules/trigger/order/{rule}', ['uses' => 'RuleController@reorderRuleTriggers']); - Route::post('/rules/action/order/{rule}', ['uses' => 'RuleController@reorderRuleActions']); - Route::post('/rules/store/{ruleGroup}', ['uses' => 'RuleController@store', 'as' => 'rules.rule.store']); - Route::post('/rules/update/{rule}', ['uses' => 'RuleController@update', 'as' => 'rules.rule.update']); - Route::post('/rules/destroy/{rule}', ['uses' => 'RuleController@destroy', 'as' => 'rules.rule.destroy']); - - - // rule groups GET - Route::get('/rule-groups/create', ['uses' => 'RuleGroupController@create', 'as' => 'rules.rule-group.create']); - Route::get('/rule-groups/edit/{ruleGroup}', ['uses' => 'RuleGroupController@edit', 'as' => 'rules.rule-group.edit']); - Route::get('/rule-groups/delete/{ruleGroup}', ['uses' => 'RuleGroupController@delete', 'as' => 'rules.rule-group.delete']); - Route::get('/rule-groups/up/{ruleGroup}', ['uses' => 'RuleGroupController@up', 'as' => 'rules.rule-group.up']); - Route::get('/rule-groups/down/{ruleGroup}', ['uses' => 'RuleGroupController@down', 'as' => 'rules.rule-group.down']); - Route::get('/rule-groups/select/{ruleGroup}', ['uses' => 'RuleGroupController@selectTransactions', 'as' => 'rules.rule-group.select_transactions']); - - // rule groups POST - Route::post('/rule-groups/store', ['uses' => 'RuleGroupController@store', 'as' => 'rules.rule-group.store']); - Route::post('/rule-groups/update/{ruleGroup}', ['uses' => 'RuleGroupController@update', 'as' => 'rules.rule-group.update']); - Route::post('/rule-groups/destroy/{ruleGroup}', ['uses' => 'RuleGroupController@destroy', 'as' => 'rules.rule-group.destroy']); - Route::post('/rule-groups/execute/{ruleGroup}', ['uses' => 'RuleGroupController@execute', 'as' => 'rules.rule-group.execute']); - - /** - * Search Controller - */ - Route::get('/search', ['uses' => 'SearchController@index', 'as' => 'search']); - - /** - * Split controller - */ - - Route::get('/transaction/create-split/{unfinishedJournal}', ['uses' => 'Transaction\SplitController@create', 'as' => 'split.journal.create']); - Route::post('/transaction/store-split/{unfinishedJournal}', ['uses' => 'Transaction\SplitController@store', 'as' => 'split.journal.store']); - Route::get('/transaction/edit-split/{tj}', ['uses' => 'Transaction\SplitController@edit', 'as' => 'split.journal.edit']); - Route::post('/transaction/edit-split/{tj}', ['uses' => 'Transaction\SplitController@update', 'as' => 'split.journal.update']); - /** - * Tag Controller - */ - Route::get('/tags', ['uses' => 'TagController@index', 'as' => 'tags.index']); - Route::get('/tags/create', ['uses' => 'TagController@create', 'as' => 'tags.create']); - Route::get('/tags/show/{tag}', ['uses' => 'TagController@show', 'as' => 'tags.show']); - Route::get('/tags/edit/{tag}', ['uses' => 'TagController@edit', 'as' => 'tags.edit']); - Route::get('/tags/delete/{tag}', ['uses' => 'TagController@delete', 'as' => 'tags.delete']); - - Route::post('/tags/store', ['uses' => 'TagController@store', 'as' => 'tags.store']); - Route::post('/tags/update/{tag}', ['uses' => 'TagController@update', 'as' => 'tags.update']); - Route::post('/tags/destroy/{tag}', ['uses' => 'TagController@destroy', 'as' => 'tags.destroy']); - - Route::post('/tags/hideTagHelp/{state}', ['uses' => 'TagController@hideTagHelp', 'as' => 'tags.hideTagHelp']); - - - /** - * Transaction Controller - */ - Route::get('/transactions/{what}', ['uses' => 'TransactionController@index', 'as' => 'transactions.index'])->where( - ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] - ); - Route::get('/transactions/create/{what}', ['uses' => 'TransactionController@create', 'as' => 'transactions.create'])->where( - ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] - ); - Route::get('/transaction/edit/{tj}', ['uses' => 'TransactionController@edit', 'as' => 'transactions.edit']); - Route::get('/transaction/delete/{tj}', ['uses' => 'TransactionController@delete', 'as' => 'transactions.delete']); - Route::get('/transaction/show/{tj}', ['uses' => 'TransactionController@show', 'as' => 'transactions.show']); - // transaction controller: - Route::post('/transactions/store/{what}', ['uses' => 'TransactionController@store', 'as' => 'transactions.store'])->where( - ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] - ); - Route::post('/transaction/update/{tj}', ['uses' => 'TransactionController@update', 'as' => 'transactions.update']); - Route::post('/transaction/destroy/{tj}', ['uses' => 'TransactionController@destroy', 'as' => 'transactions.destroy']); - Route::post('/transaction/reorder', ['uses' => 'TransactionController@reorder', 'as' => 'transactions.reorder']); - - // mass edit and mass delete. - Route::get('/transactions/mass-edit/{journalList}', ['uses' => 'Transaction\MassController@massEdit', 'as' => 'transactions.mass-edit']); - Route::get('/transactions/mass-delete/{journalList}', ['uses' => 'Transaction\MassController@massDelete', 'as' => 'transactions.mass-delete']); - Route::post('/transactions/mass-update', ['uses' => 'Transaction\MassController@massUpdate', 'as' => 'transactions.mass-update']); - Route::post('/transactions/mass-destroy', ['uses' => 'Transaction\MassController@massDestroy', 'as' => 'transactions.mass-destroy']); - - /** - * POPUP Controllers - */ - /** - * Report popup - */ - Route::get('/popup/report', ['uses' => 'Popup\ReportController@info', 'as' => 'popup.report']); - -} -); - -/** - * For the admin routes, the user must be logged in and have the role of 'owner' - */ -Route::group( - ['middleware' => 'admin'], function () { - - // admin home - Route::get('/admin', ['uses' => 'Admin\HomeController@index', 'as' => 'admin.index']); - - // user manager - Route::get('/admin/users', ['uses' => 'Admin\UserController@index', 'as' => 'admin.users']); - Route::get('/admin/users/edit/{user}', ['uses' => 'Admin\UserController@edit', 'as' => 'admin.users.edit']); - - // user domains: - Route::get('/admin/domains', ['uses' => 'Admin\DomainController@domains', 'as' => 'admin.users.domains']); - Route::get('/admin/domains/toggle/{domain}', ['uses' => 'Admin\DomainController@toggleDomain', 'as' => 'admin.users.domains.block-toggle']); - Route::post('/admin/domains/manual', ['uses' => 'Admin\DomainController@manual', 'as' => 'admin.users.domains.manual']); - - // FF configuration: - Route::get('/admin/configuration', ['uses' => 'Admin\ConfigurationController@index', 'as' => 'admin.configuration.index']); - Route::post('/admin/configuration', ['uses' => 'Admin\ConfigurationController@store', 'as' => 'admin.configuration.store']); - -} -); diff --git a/routes/web.php b/routes/web.php index e91e84a505..901e1d2da4 100755 --- a/routes/web.php +++ b/routes/web.php @@ -1,20 +1,443 @@ 'user-not-logged-in'], function () { -Route::get('/home', 'HomeController@index'); + // Authentication Routes... + Route::get('/login', 'Auth\AuthController@showLoginForm'); + Route::post('/login', 'Auth\AuthController@login'); + + // Registration Routes... + Route::get('/register', ['uses' => 'Auth\AuthController@showRegistrationForm', 'as' => 'register']); + Route::post('/register', 'Auth\AuthController@register'); + + Route::get('/password/reset', 'Auth\PasswordController@getReset'); + + // Password Reset Routes... + Route::get('/password/reset/{token?}', 'Auth\PasswordController@showResetForm'); + Route::post('/password/email', 'Auth\PasswordController@sendResetLinkEmail'); + Route::post('/password/reset', 'Auth\PasswordController@reset'); + + +} +); + +/** + * For some other routes, it is only relevant that the user is authenticated. + */ +Route::group( + ['middleware' => 'user-simple-auth'], function () { + Route::get('/error', 'HomeController@displayError'); + Route::get('/logout', ['uses' => 'Auth\AuthController@logout', 'as' => 'logout']); + Route::get('/flush', ['uses' => 'HomeController@flush']); +} +); + +/** + * For the two factor routes, the user must be logged in, but NOT 2FA. Account confirmation does not matter here. + */ +Route::group( + ['middleware' => 'user-logged-in-no-2fa'], function () { + Route::get('/two-factor', ['uses' => 'Auth\TwoFactorController@index', 'as' => 'two-factor']); + Route::get('/lost-two-factor', ['uses' => 'Auth\TwoFactorController@lostTwoFactor', 'as' => 'lost-two-factor']); + Route::post('/two-factor', ['uses' => 'Auth\TwoFactorController@postIndex', 'as' => 'two-factor-post']); + +} +); + +/** + * For the confirmation routes, the user must be logged in, also 2FA, but his account must not be confirmed. + */ +Route::group( + ['middleware' => 'user-logged-in-2fa-no-activation'], function () { + // + Route::get('/confirm-your-account', ['uses' => 'Auth\ConfirmationController@confirmationError', 'as' => 'confirmation_error']); + Route::get('/resend-confirmation', ['uses' => 'Auth\ConfirmationController@resendConfirmation', 'as' => 'resend_confirmation']); + Route::get('/confirmation/{code}', ['uses' => 'Auth\ConfirmationController@doConfirmation', 'as' => 'do_confirm_account']); + +} +); + +/** + * For all other routes, the user must be fully authenticated and have an activated account. + */ +Route::group( + ['middleware' => ['user-full-auth']], function () { + + /** + * Home Controller + */ + Route::get('/', ['uses' => 'HomeController@index', 'as' => 'index']); + Route::get('/home', ['uses' => 'HomeController@index', 'as' => 'home']); + Route::post('/daterange', ['uses' => 'HomeController@dateRange', 'as' => 'daterange']); + Route::get('/routes', ['uses' => 'HomeController@routes']); + /** + * Account Controller + */ + Route::get('/accounts/{what}', ['uses' => 'AccountController@index', 'as' => 'accounts.index'])->where('what', 'revenue|asset|expense'); + Route::get('/accounts/create/{what}', ['uses' => 'AccountController@create', 'as' => 'accounts.create'])->where('what', 'revenue|asset|expense'); + Route::get('/accounts/edit/{account}', ['uses' => 'AccountController@edit', 'as' => 'accounts.edit']); + Route::get('/accounts/delete/{account}', ['uses' => 'AccountController@delete', 'as' => 'accounts.delete']); + Route::get('/accounts/show/{account}', ['uses' => 'AccountController@show', 'as' => 'accounts.show']); + Route::get('/accounts/show/{account}/{date}', ['uses' => 'AccountController@showWithDate', 'as' => 'accounts.show.date']); + + + Route::post('/accounts/store', ['uses' => 'AccountController@store', 'as' => 'accounts.store']); + Route::post('/accounts/update/{account}', ['uses' => 'AccountController@update', 'as' => 'accounts.update']); + Route::post('/accounts/destroy/{account}', ['uses' => 'AccountController@destroy', 'as' => 'accounts.destroy']); + + + /** + * Attachment Controller + */ + + Route::post('/attachment/update/{attachment}', ['uses' => 'AttachmentController@update', 'as' => 'attachments.update']); + Route::post('/attachment/destroy/{attachment}', ['uses' => 'AttachmentController@destroy', 'as' => 'attachments.destroy']); + + Route::get('/attachment/edit/{attachment}', ['uses' => 'AttachmentController@edit', 'as' => 'attachments.edit']); + Route::get('/attachment/delete/{attachment}', ['uses' => 'AttachmentController@delete', 'as' => 'attachments.delete']); + Route::get('/attachment/preview/{attachment}', ['uses' => 'AttachmentController@preview', 'as' => 'attachments.preview']); + Route::get('/attachment/download/{attachment}', ['uses' => 'AttachmentController@download', 'as' => 'attachments.download']); + + + /** + * Bills Controller + */ + Route::get('/bills', ['uses' => 'BillController@index', 'as' => 'bills.index']); + Route::get('/bills/rescan/{bill}', ['uses' => 'BillController@rescan', 'as' => 'bills.rescan']); + Route::get('/bills/create', ['uses' => 'BillController@create', 'as' => 'bills.create']); + Route::get('/bills/edit/{bill}', ['uses' => 'BillController@edit', 'as' => 'bills.edit']); + Route::get('/bills/delete/{bill}', ['uses' => 'BillController@delete', 'as' => 'bills.delete']); + Route::get('/bills/show/{bill}', ['uses' => 'BillController@show', 'as' => 'bills.show']); + Route::post('/bills/store', ['uses' => 'BillController@store', 'as' => 'bills.store']); + Route::post('/bills/update/{bill}', ['uses' => 'BillController@update', 'as' => 'bills.update']); + Route::post('/bills/destroy/{bill}', ['uses' => 'BillController@destroy', 'as' => 'bills.destroy']); + + /** + * Budget Controller + */ + Route::get('/budgets', ['uses' => 'BudgetController@index', 'as' => 'budgets.index']); + Route::get('/budgets/income', ['uses' => 'BudgetController@updateIncome', 'as' => 'budgets.income']); + Route::get('/budgets/create', ['uses' => 'BudgetController@create', 'as' => 'budgets.create']); + Route::get('/budgets/edit/{budget}', ['uses' => 'BudgetController@edit', 'as' => 'budgets.edit']); + Route::get('/budgets/delete/{budget}', ['uses' => 'BudgetController@delete', 'as' => 'budgets.delete']); + Route::get('/budgets/show/{budget}', ['uses' => 'BudgetController@show', 'as' => 'budgets.show']); + Route::get('/budgets/show/{budget}/{limitrepetition}', ['uses' => 'BudgetController@showWithRepetition', 'as' => 'budgets.showWithRepetition']); + Route::get('/budgets/list/noBudget', ['uses' => 'BudgetController@noBudget', 'as' => 'budgets.noBudget']); + Route::post('/budgets/income', ['uses' => 'BudgetController@postUpdateIncome', 'as' => 'budgets.postIncome']); + Route::post('/budgets/store', ['uses' => 'BudgetController@store', 'as' => 'budgets.store']); + Route::post('/budgets/update/{budget}', ['uses' => 'BudgetController@update', 'as' => 'budgets.update']); + Route::post('/budgets/destroy/{budget}', ['uses' => 'BudgetController@destroy', 'as' => 'budgets.destroy']); + Route::post('budgets/amount/{budget}', ['uses' => 'BudgetController@amount']); + + /** + * Category Controller + */ + Route::get('/categories', ['uses' => 'CategoryController@index', 'as' => 'categories.index']); + Route::get('/categories/create', ['uses' => 'CategoryController@create', 'as' => 'categories.create']); + Route::get('/categories/edit/{category}', ['uses' => 'CategoryController@edit', 'as' => 'categories.edit']); + Route::get('/categories/delete/{category}', ['uses' => 'CategoryController@delete', 'as' => 'categories.delete']); + Route::get('/categories/show/{category}', ['uses' => 'CategoryController@show', 'as' => 'categories.show']); + Route::get('/categories/show/{category}/{date}', ['uses' => 'CategoryController@showWithDate', 'as' => 'categories.show.date']); + Route::get('/categories/list/noCategory', ['uses' => 'CategoryController@noCategory', 'as' => 'categories.noCategory']); + Route::post('/categories/store', ['uses' => 'CategoryController@store', 'as' => 'categories.store']); + Route::post('/categories/update/{category}', ['uses' => 'CategoryController@update', 'as' => 'categories.update']); + Route::post('/categories/destroy/{category}', ['uses' => 'CategoryController@destroy', 'as' => 'categories.destroy']); + + /** + * Currency Controller + */ + Route::get('/currency', ['uses' => 'CurrencyController@index', 'as' => 'currency.index']); + Route::get('/currency/create', ['uses' => 'CurrencyController@create', 'as' => 'currency.create']); + Route::get('/currency/edit/{currency}', ['uses' => 'CurrencyController@edit', 'as' => 'currency.edit']); + Route::get('/currency/delete/{currency}', ['uses' => 'CurrencyController@delete', 'as' => 'currency.delete']); + Route::get('/currency/default/{currency}', ['uses' => 'CurrencyController@defaultCurrency', 'as' => 'currency.default']); + Route::post('/currency/store', ['uses' => 'CurrencyController@store', 'as' => 'currency.store']); + Route::post('/currency/update/{currency}', ['uses' => 'CurrencyController@update', 'as' => 'currency.update']); + Route::post('/currency/destroy/{currency}', ['uses' => 'CurrencyController@destroy', 'as' => 'currency.destroy']); + + /** + * Export Controller + */ + Route::get('/export', ['uses' => 'ExportController@index', 'as' => 'export.index']); + Route::post('/export/submit', ['uses' => 'ExportController@postIndex', 'as' => 'export.export']); + Route::get('/export/status/{jobKey}', ['uses' => 'ExportController@getStatus', 'as' => 'export.status']); + Route::get('/export/download/{jobKey}', ['uses' => 'ExportController@download', 'as' => 'export.download']); + + + /** + * ALL CHART Controllers + */ + // accounts: + Route::get('/chart/account/frontpage', ['uses' => 'Chart\AccountController@frontpage']); + Route::get('/chart/account/expense', ['uses' => 'Chart\AccountController@expenseAccounts']); + Route::get('/chart/account/report/default/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\AccountController@report']); + Route::get('/chart/account/{account}', ['uses' => 'Chart\AccountController@single']); + Route::get('/chart/account/{account}/{date}', ['uses' => 'Chart\AccountController@specificPeriod']); + + + // bills: + Route::get('/chart/bill/frontpage', ['uses' => 'Chart\BillController@frontpage']); + Route::get('/chart/bill/{bill}', ['uses' => 'Chart\BillController@single']); + + // budgets: + Route::get('/chart/budget/frontpage', ['uses' => 'Chart\BudgetController@frontpage']); + + // this chart is used in reports: + Route::get('/chart/budget/multi-year/default/{start_date}/{end_date}/{accountList}/{budgetList}', ['uses' => 'Chart\BudgetController@multiYear']); + Route::get('/chart/budget/period/{budget}/default/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\BudgetController@period']); + Route::get('/chart/budget/{budget}/{limitrepetition}', ['uses' => 'Chart\BudgetController@budgetLimit']); + Route::get('/chart/budget/{budget}', ['uses' => 'Chart\BudgetController@budget']); + + // categories: + Route::get('/chart/category/frontpage', ['uses' => 'Chart\CategoryController@frontpage']); + + // these three charts are for reports: + Route::get('/chart/category/multi-year/default/{start_date}/{end_date}/{accountList}/{categoryList}', ['uses' => 'Chart\CategoryController@multiYear']); + + Route::get('/chart/category/{category}/period', ['uses' => 'Chart\CategoryController@currentPeriod']); + Route::get('/chart/category/{category}/period/{date}', ['uses' => 'Chart\CategoryController@specificPeriod']); + Route::get('/chart/category/{category}/all', ['uses' => 'Chart\CategoryController@all']); + + // piggy banks: + Route::get('/chart/piggy-bank/{piggyBank}', ['uses' => 'Chart\PiggyBankController@history']); + + // reports: + Route::get('/chart/report/in-out/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\ReportController@yearInOut']); + Route::get('/chart/report/in-out-sum/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\ReportController@yearInOutSummarized']); + Route::get('/chart/report/net-worth/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\ReportController@netWorth']); + + /** + * IMPORT CONTROLLER + */ + Route::get('/import', ['uses' => 'ImportController@index', 'as' => 'import.index']); + Route::post('/import/upload', ['uses' => 'ImportController@upload', 'as' => 'import.upload']); + Route::get('/import/configure/{importJob}', ['uses' => 'ImportController@configure', 'as' => 'import.configure']); + Route::post('/import/configure/{importJob}', ['uses' => 'ImportController@postConfigure', 'as' => 'import.process_configuration']); + Route::get('/import/settings/{importJob}', ['uses' => 'ImportController@settings', 'as' => 'import.settings']); + Route::post('/import/settings/{importJob}', ['uses' => 'ImportController@postSettings', 'as' => 'import.postSettings']); + Route::get('/import/complete/{importJob}', ['uses' => 'ImportController@complete', 'as' => 'import.complete']); + Route::get('/import/download/{importJob}', ['uses' => 'ImportController@download', 'as' => 'import.download']); + + Route::get('/import/status/{importJob}', ['uses' => 'ImportController@status', 'as' => 'import.status']); + Route::get('/import/json/{importJob}', ['uses' => 'ImportController@json', 'as' => 'import.json']); + + Route::post('/import/start/{importJob}', ['uses' => 'ImportController@start', 'as' => 'import.start']); + Route::get('/import/finished/{importJob}', ['uses' => 'ImportController@finished', 'as' => 'import.finished']); + + /** + * Help Controller + */ + Route::get('/help/{route}', ['uses' => 'HelpController@show', 'as' => 'help.show']); + + /** + * JSON Controller + */ + Route::get('/json/expense-accounts', ['uses' => 'JsonController@expenseAccounts', 'as' => 'json.expense-accounts']); + Route::get('/json/revenue-accounts', ['uses' => 'JsonController@revenueAccounts', 'as' => 'json.revenue-accounts']); + Route::get('/json/categories', ['uses' => 'JsonController@categories', 'as' => 'json.categories']); + Route::get('/json/tags', ['uses' => 'JsonController@tags', 'as' => 'json.tags']); + Route::get('/json/tour', ['uses' => 'JsonController@tour', 'as' => 'json.tour']); + Route::post('/json/end-tour', ['uses' => 'JsonController@endTour']); + + Route::get('/json/box/in', ['uses' => 'JsonController@boxIn', 'as' => 'json.box.in']); + Route::get('/json/box/out', ['uses' => 'JsonController@boxOut', 'as' => 'json.box.out']); + Route::get('/json/box/bills-unpaid', ['uses' => 'JsonController@boxBillsUnpaid', 'as' => 'json.box.paid']); + Route::get('/json/box/bills-paid', ['uses' => 'JsonController@boxBillsPaid', 'as' => 'json.box.unpaid']); + Route::get('/json/transaction-journals/{what}', 'JsonController@transactionJournals'); + + Route::get('/json/trigger', ['uses' => 'JsonController@trigger', 'as' => 'json.trigger']); + Route::get('/json/action', ['uses' => 'JsonController@action', 'as' => 'json.action']); + + /** + * New user Controller + */ + Route::get('/new-user', ['uses' => 'NewUserController@index', 'as' => 'new-user.index']); + Route::post('/new-user/submit', ['uses' => 'NewUserController@submit', 'as' => 'new-user.submit']); + + /** + * Piggy Bank Controller + */ + Route::get('/piggy-banks', ['uses' => 'PiggyBankController@index', 'as' => 'piggy-banks.index']); + Route::get('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@add', 'as' => 'piggy-banks.addMoney']); + Route::get('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@remove', 'as' => 'piggy-banks.removeMoney']); + Route::get('/piggy-banks/add-money/{piggyBank}', ['uses' => 'PiggyBankController@addMobile', 'as' => 'piggy-banks.add-money-mobile']); + Route::get('/piggy-banks/remove-money/{piggyBank}', ['uses' => 'PiggyBankController@removeMobile', 'as' => 'piggy-banks.remove-money-mobile']); + // Route::post('/piggy-banks/add-money/{piggyBank}', ['uses' => 'PiggyBankController@postAddMobile', 'as' => 'piggy-banks.post-add-mobile']); + // Route::post('/piggy-banks/remove-money/{piggyBank}', ['uses' => 'PiggyBankController@postRemoveMobile', 'as' => 'piggy-banks.post-remove-mobile']); + Route::get('/piggy-banks/create', ['uses' => 'PiggyBankController@create', 'as' => 'piggy-banks.create']); + Route::get('/piggy-banks/edit/{piggyBank}', ['uses' => 'PiggyBankController@edit', 'as' => 'piggy-banks.edit']); + Route::get('/piggy-banks/delete/{piggyBank}', ['uses' => 'PiggyBankController@delete', 'as' => 'piggy-banks.delete']); + Route::get('/piggy-banks/show/{piggyBank}', ['uses' => 'PiggyBankController@show', 'as' => 'piggy-banks.show']); + Route::post('/piggy-banks/store', ['uses' => 'PiggyBankController@store', 'as' => 'piggy-banks.store']); + Route::post('/piggy-banks/update/{piggyBank}', ['uses' => 'PiggyBankController@update', 'as' => 'piggy-banks.update']); + Route::post('/piggy-banks/destroy/{piggyBank}', ['uses' => 'PiggyBankController@destroy', 'as' => 'piggy-banks.destroy']); + + Route::post('/piggy-banks/add/{piggyBank}', ['uses' => 'PiggyBankController@postAdd', 'as' => 'piggy-banks.add']); + Route::post('/piggy-banks/remove/{piggyBank}', ['uses' => 'PiggyBankController@postRemove', 'as' => 'piggy-banks.remove']); + + Route::post('/piggy-banks/sort', ['uses' => 'PiggyBankController@order', 'as' => 'piggy-banks.order']); + + /** + * Preferences Controller + */ + Route::get('/preferences', ['uses' => 'PreferencesController@index', 'as' => 'preferences']); + Route::post('/preferences', ['uses' => 'PreferencesController@postIndex', 'as' => 'preferences.update']); + Route::get('/preferences/code', ['uses' => 'PreferencesController@code', 'as' => 'preferences.code']); + Route::get('/preferences/delete-code', ['uses' => 'PreferencesController@deleteCode', 'as' => 'preferences.delete-code']); + Route::post('/preferences/code', ['uses' => 'PreferencesController@postCode', 'as' => 'preferences.code.store']); + + /** + * Profile Controller + */ + Route::get('/profile', ['uses' => 'ProfileController@index', 'as' => 'profile']); + Route::get('/profile/change-password', ['uses' => 'ProfileController@changePassword', 'as' => 'profile.change-password']); + Route::get('/profile/delete-account', ['uses' => 'ProfileController@deleteAccount', 'as' => 'profile.delete-account']); + Route::post('/profile/delete-account', ['uses' => 'ProfileController@postDeleteAccount', 'as' => 'profile.delete-account.post']); + Route::post('/profile/change-password', ['uses' => 'ProfileController@postChangePassword', 'as' => 'profile.change-password.store']); + + /** + * Report Controller + */ + Route::get('/reports', ['uses' => 'ReportController@index', 'as' => 'reports.index']); + Route::get('/reports/report/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'ReportController@report', 'as' => 'reports.report']); + + /** + * Rules Controller + */ + // index + Route::get('/rules', ['uses' => 'RuleController@index', 'as' => 'rules.index']); + + // rules GET: + Route::get('/rules/create/{ruleGroup}', ['uses' => 'RuleController@create', 'as' => 'rules.rule.create']); + Route::get('/rules/up/{rule}', ['uses' => 'RuleController@up', 'as' => 'rules.rule.up']); + Route::get('/rules/down/{rule}', ['uses' => 'RuleController@down', 'as' => 'rules.rule.down']); + Route::get('/rules/edit/{rule}', ['uses' => 'RuleController@edit', 'as' => 'rules.rule.edit']); + Route::get('/rules/delete/{rule}', ['uses' => 'RuleController@delete', 'as' => 'rules.rule.delete']); + Route::get('/rules/test', ['uses' => 'RuleController@testTriggers', 'as' => 'rules.rule.test_triggers']); + + // rules POST: + Route::post('/rules/trigger/order/{rule}', ['uses' => 'RuleController@reorderRuleTriggers']); + Route::post('/rules/action/order/{rule}', ['uses' => 'RuleController@reorderRuleActions']); + Route::post('/rules/store/{ruleGroup}', ['uses' => 'RuleController@store', 'as' => 'rules.rule.store']); + Route::post('/rules/update/{rule}', ['uses' => 'RuleController@update', 'as' => 'rules.rule.update']); + Route::post('/rules/destroy/{rule}', ['uses' => 'RuleController@destroy', 'as' => 'rules.rule.destroy']); + + + // rule groups GET + Route::get('/rule-groups/create', ['uses' => 'RuleGroupController@create', 'as' => 'rules.rule-group.create']); + Route::get('/rule-groups/edit/{ruleGroup}', ['uses' => 'RuleGroupController@edit', 'as' => 'rules.rule-group.edit']); + Route::get('/rule-groups/delete/{ruleGroup}', ['uses' => 'RuleGroupController@delete', 'as' => 'rules.rule-group.delete']); + Route::get('/rule-groups/up/{ruleGroup}', ['uses' => 'RuleGroupController@up', 'as' => 'rules.rule-group.up']); + Route::get('/rule-groups/down/{ruleGroup}', ['uses' => 'RuleGroupController@down', 'as' => 'rules.rule-group.down']); + Route::get('/rule-groups/select/{ruleGroup}', ['uses' => 'RuleGroupController@selectTransactions', 'as' => 'rules.rule-group.select_transactions']); + + // rule groups POST + Route::post('/rule-groups/store', ['uses' => 'RuleGroupController@store', 'as' => 'rules.rule-group.store']); + Route::post('/rule-groups/update/{ruleGroup}', ['uses' => 'RuleGroupController@update', 'as' => 'rules.rule-group.update']); + Route::post('/rule-groups/destroy/{ruleGroup}', ['uses' => 'RuleGroupController@destroy', 'as' => 'rules.rule-group.destroy']); + Route::post('/rule-groups/execute/{ruleGroup}', ['uses' => 'RuleGroupController@execute', 'as' => 'rules.rule-group.execute']); + + /** + * Search Controller + */ + Route::get('/search', ['uses' => 'SearchController@index', 'as' => 'search']); + + /** + * Split controller + */ + + Route::get('/transaction/create-split/{unfinishedJournal}', ['uses' => 'Transaction\SplitController@create', 'as' => 'split.journal.create']); + Route::post('/transaction/store-split/{unfinishedJournal}', ['uses' => 'Transaction\SplitController@store', 'as' => 'split.journal.store']); + Route::get('/transaction/edit-split/{tj}', ['uses' => 'Transaction\SplitController@edit', 'as' => 'split.journal.edit']); + Route::post('/transaction/edit-split/{tj}', ['uses' => 'Transaction\SplitController@update', 'as' => 'split.journal.update']); + /** + * Tag Controller + */ + Route::get('/tags', ['uses' => 'TagController@index', 'as' => 'tags.index']); + Route::get('/tags/create', ['uses' => 'TagController@create', 'as' => 'tags.create']); + Route::get('/tags/show/{tag}', ['uses' => 'TagController@show', 'as' => 'tags.show']); + Route::get('/tags/edit/{tag}', ['uses' => 'TagController@edit', 'as' => 'tags.edit']); + Route::get('/tags/delete/{tag}', ['uses' => 'TagController@delete', 'as' => 'tags.delete']); + + Route::post('/tags/store', ['uses' => 'TagController@store', 'as' => 'tags.store']); + Route::post('/tags/update/{tag}', ['uses' => 'TagController@update', 'as' => 'tags.update']); + Route::post('/tags/destroy/{tag}', ['uses' => 'TagController@destroy', 'as' => 'tags.destroy']); + + Route::post('/tags/hideTagHelp/{state}', ['uses' => 'TagController@hideTagHelp', 'as' => 'tags.hideTagHelp']); + + + /** + * Transaction Controller + */ + Route::get('/transactions/{what}', ['uses' => 'TransactionController@index', 'as' => 'transactions.index'])->where( + ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] + ); + Route::get('/transactions/create/{what}', ['uses' => 'TransactionController@create', 'as' => 'transactions.create'])->where( + ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] + ); + Route::get('/transaction/edit/{tj}', ['uses' => 'TransactionController@edit', 'as' => 'transactions.edit']); + Route::get('/transaction/delete/{tj}', ['uses' => 'TransactionController@delete', 'as' => 'transactions.delete']); + Route::get('/transaction/show/{tj}', ['uses' => 'TransactionController@show', 'as' => 'transactions.show']); + // transaction controller: + Route::post('/transactions/store/{what}', ['uses' => 'TransactionController@store', 'as' => 'transactions.store'])->where( + ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] + ); + Route::post('/transaction/update/{tj}', ['uses' => 'TransactionController@update', 'as' => 'transactions.update']); + Route::post('/transaction/destroy/{tj}', ['uses' => 'TransactionController@destroy', 'as' => 'transactions.destroy']); + Route::post('/transaction/reorder', ['uses' => 'TransactionController@reorder', 'as' => 'transactions.reorder']); + + // mass edit and mass delete. + Route::get('/transactions/mass-edit/{journalList}', ['uses' => 'Transaction\MassController@massEdit', 'as' => 'transactions.mass-edit']); + Route::get('/transactions/mass-delete/{journalList}', ['uses' => 'Transaction\MassController@massDelete', 'as' => 'transactions.mass-delete']); + Route::post('/transactions/mass-update', ['uses' => 'Transaction\MassController@massUpdate', 'as' => 'transactions.mass-update']); + Route::post('/transactions/mass-destroy', ['uses' => 'Transaction\MassController@massDestroy', 'as' => 'transactions.mass-destroy']); + + /** + * POPUP Controllers + */ + /** + * Report popup + */ + Route::get('/popup/report', ['uses' => 'Popup\ReportController@info', 'as' => 'popup.report']); + +} +); + +/** + * For the admin routes, the user must be logged in and have the role of 'owner' + */ +Route::group( + ['middleware' => 'admin'], function () { + + // admin home + Route::get('/admin', ['uses' => 'Admin\HomeController@index', 'as' => 'admin.index']); + + // user manager + Route::get('/admin/users', ['uses' => 'Admin\UserController@index', 'as' => 'admin.users']); + Route::get('/admin/users/edit/{user}', ['uses' => 'Admin\UserController@edit', 'as' => 'admin.users.edit']); + + // user domains: + Route::get('/admin/domains', ['uses' => 'Admin\DomainController@domains', 'as' => 'admin.users.domains']); + Route::get('/admin/domains/toggle/{domain}', ['uses' => 'Admin\DomainController@toggleDomain', 'as' => 'admin.users.domains.block-toggle']); + Route::post('/admin/domains/manual', ['uses' => 'Admin\DomainController@manual', 'as' => 'admin.users.domains.manual']); + + // FF configuration: + Route::get('/admin/configuration', ['uses' => 'Admin\ConfigurationController@index', 'as' => 'admin.configuration.index']); + Route::post('/admin/configuration', ['uses' => 'Admin\ConfigurationController@store', 'as' => 'admin.configuration.store']); + +} +);