diff --git a/app/Http/Controllers/DebugController.php b/app/Http/Controllers/DebugController.php index 2b74bdf588..f3cfc468cf 100644 --- a/app/Http/Controllers/DebugController.php +++ b/app/Http/Controllers/DebugController.php @@ -30,6 +30,7 @@ use FireflyIII\Enums\AccountTypeEnum; use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Middleware\IsDemoUser; +use FireflyIII\Models\Configuration; use FireflyIII\Models\PeriodStatistic; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; @@ -53,10 +54,8 @@ use Illuminate\View\View; use Monolog\Handler\RotatingFileHandler; use Safe\Exceptions\FilesystemException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; - use function Safe\file_get_contents; use function Safe\ini_get; - use const PHP_INT_SIZE; use const PHP_SAPI; @@ -141,16 +140,16 @@ final class DebugController extends Controller * * @throws FilesystemException */ - public function index(): Factory|\Illuminate\Contracts\View\View + public function index(): Factory | \Illuminate\Contracts\View\View { - $table = $this->generateTable(); + $table = $this->generateTable(); $table = str_replace(["\n", "\t", ' '], '', $table); $now = now(config('app.timezone'))->format('Y-m-d H:i:s'); $logContent = ''; if (auth()->check() && auth()->user()->hasRole('owner')) { // get latest log file: - $logger = Log::driver(); + $logger = Log::driver(); // PHPstan doesn't recognize the method because of its polymorphic nature. $handlers = $logger->getHandlers(); @@ -164,7 +163,7 @@ final class DebugController extends Controller } if ('' !== $logContent) { // last few lines - $logContent = 'Truncated from this point <----|'.substr($logContent, -16_384); + $logContent = 'Truncated from this point <----|' . substr($logContent, -16_384); } } @@ -245,13 +244,13 @@ final class DebugController extends Controller continue; } - $params = []; + $params = []; foreach ($route->parameterNames() as $name) { $params[] = $this->getParameter($name); } $return[$route->getName()] = route($route->getName(), $params); } - $count = 0; + $count = 0; echo '
'; echo '

Routes

'; echo sprintf('

%s

', $count); @@ -289,38 +288,53 @@ final class DebugController extends Controller $app = $this->getAppInfo(); $user = $this->getUserInfo(); - return (string) view('partials.debug-table', ['system' => $system, 'docker' => $docker, 'app' => $app, 'user' => $user]); + return (string)view('partials.debug-table', ['system' => $system, 'docker' => $docker, 'app' => $app, 'user' => $user]); } private function getAppInfo(): array { - $userGuard = config('auth.defaults.guard'); + $userGuard = config('auth.defaults.guard'); - $config = AppConfiguration::get('last_rt_job', 0); - $lastTime = (int) $config->data; - $lastCronjob = 'never'; - $lastCronjobAgo = 'never'; - if ($lastTime > 0) { - $carbon = Carbon::createFromTimestamp($lastTime); - $lastCronjob = $carbon->format('Y-m-d H:i:s'); - $lastCronjobAgo = $carbon->locale('en')->diffForHumans(); + $config = AppConfiguration::get('last_rt_job', 0); + // last_rt_job_1 + $configs = AppConfiguration::getByPrefix('last_rt_job'); + $cronJobs = []; + + /** @var Configuration $config */ + foreach ($configs as $config) { + if ('last_rt_job' === $config->name) { + continue; + } + $parts = explode('_', $config->name); + $userId = (int)$parts[count($parts) - 1]; + $time = (int)$config->data; + if ($time > 0) { + $carbon = Carbon::createFromTimestamp($time); + $lastCronjob = $carbon->format('Y-m-d H:i:s'); + $lastCronjobAgo = $carbon->locale('en')->diffForHumans(); + $cronJobs[] = [ + 'user' => $userId, + 'last_run' => $lastCronjob, + 'last_run_ago' => $lastCronjobAgo, + ]; + } } - return [ 'debug' => var_export(config('app.debug'), return: true), 'audit_log_channel' => implode(', ', config('logging.channels.audit.channels')), - 'default_language' => (string) config('firefly.default_language'), - 'default_locale' => (string) config('firefly.default_locale'), + 'default_language' => (string)config('firefly.default_language'), + 'default_locale' => (string)config('firefly.default_locale'), 'remote_header' => 'remote_user_guard' === $userGuard ? config('auth.guard_header') : 'N/A', 'remote_mail_header' => 'remote_user_guard' === $userGuard ? config('auth.guard_email') : 'N/A', - 'stateful_domains' => implode(', ', config('sanctum.stateful')), + //'stateful_domains' => implode(', ', config('sanctum.stateful')), + 'cron_jobs' => $cronJobs, // the dates for the cron job are based on the recurring cron job's times. // any of the cron jobs will do, they always run at the same time. // but this job is the oldest, so the biggest chance it ran once - 'last_cronjob' => $lastCronjob, - 'last_cronjob_ago' => $lastCronjobAgo, + // 'last_cronjob' => $lastCronjob, + // 'last_cronjob_ago' => $lastCronjobAgo, ]; } @@ -470,7 +484,7 @@ final class DebugController extends Controller 'bits' => PHP_INT_SIZE * 8, 'bcscale' => bcscale(), 'display_errors' => ini_get('display_errors'), - 'error_reporting' => $this->errorReporting((int) ini_get('error_reporting')), + 'error_reporting' => $this->errorReporting((int)ini_get('error_reporting')), 'upload_size' => min($maxFileSize, $maxPostSize), 'all_drivers' => $drivers, 'current_driver' => $currentDriver, @@ -479,10 +493,10 @@ final class DebugController extends Controller private function getUserFlags(): string { - $flags = []; + $flags = []; /** @var User $user */ - $user = auth()->user(); + $user = auth()->user(); // has liabilities if ($user->accounts()->accountTypeIn([AccountTypeEnum::DEBT->value, AccountTypeEnum::LOAN->value, AccountTypeEnum::MORTGAGE->value])->count() > 0) { @@ -498,7 +512,7 @@ final class DebugController extends Controller } // has stored reconciliations - $type = TransactionType::whereType(TransactionTypeEnum::RECONCILIATION->value)->first(); + $type = TransactionType::whereType(TransactionTypeEnum::RECONCILIATION->value)->first(); if ($user->transactionJournals()->where('transaction_type_id', $type->id)->count() > 0) { $flags[] = ':ledger:'; } @@ -530,22 +544,22 @@ final class DebugController extends Controller private function getUserInfo(): array { - $userFlags = $this->getUserFlags(); + $userFlags = $this->getUserFlags(); // user info - $userAgent = request()->header('user-agent'); + $userAgent = request()->header('user-agent'); // set languages, see what happens: $original = setlocale(LC_ALL, '0'); $localeAttempts = []; $parts = Steam::getLocaleArray(Steam::getLocale()); foreach ($parts as $code) { - $code = trim($code); + $code = trim($code); Log::debug(sprintf('Trying to set %s', $code)); $result = setlocale(LC_ALL, $code); $localeAttempts[$code] = $result === $code; } - setlocale(LC_ALL, (string) $original); + setlocale(LC_ALL, (string)$original); return [ 'user_id' => auth()->user()->id, diff --git a/app/Support/AppConfiguration.php b/app/Support/AppConfiguration.php index 9ccf721331..c4c6a5b402 100644 --- a/app/Support/AppConfiguration.php +++ b/app/Support/AppConfiguration.php @@ -29,6 +29,7 @@ use FireflyIII\Models\Configuration; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Encryption\EncryptException; use Illuminate\Database\QueryException; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Log; @@ -78,6 +79,17 @@ class AppConfiguration return $this->set($name, $default); } + public function getByPrefix(string $name): Collection + { + try { + /** @var Collection $collection */ + $collection = Configuration::query()->whereLike('name', sprintf('%s%%',$name))->get(['id', 'name', 'data']); + } catch (Exception|FireflyException|QueryException $e) { + throw new FireflyException(sprintf('Could not poll the database: %s', $e->getMessage()), 0, $e); + } + return $collection; + } + public function getEncrypted(string $name, mixed $default = null): ?Configuration { $result = $this->get($name, $default); diff --git a/resources/views/partials/debug-table.blade.php b/resources/views/partials/debug-table.blade.php index 4a43edb609..122426042d 100644 --- a/resources/views/partials/debug-table.blade.php +++ b/resources/views/partials/debug-table.blade.php @@ -114,8 +114,11 @@ --}} - Last cron job - {{ $app['last_cronjob'] }} ({{ $app['last_cronjob_ago'] }}) + Last cron job(s) + + @foreach($app['cron_jobs'] as $cronJob) + #{{ $cronJob['user'] }}: {{ $cronJob['last_run'] }} ({{ $cronJob['last_run_ago'] }})
+ @endforeach Mailer