diff --git a/app/Console/Commands/Support/GmailDiagnoseCommand.php b/app/Console/Commands/Support/GmailDiagnoseCommand.php new file mode 100644 index 000000000..0f01203c5 --- /dev/null +++ b/app/Console/Commands/Support/GmailDiagnoseCommand.php @@ -0,0 +1,86 @@ +line(json_encode([ + 'enabled' => (bool) config('support_gmail.enabled'), + 'dry_run' => (bool) config('support_gmail.dry_run', true), + 'notify_email' => config('support_gmail.notify_email'), + 'subject_prefix' => config('support_gmail.subject_prefix'), + 'label' => config('support_gmail.label'), + 'effective_poll_query' => SupportGmailPollQuery::resolve(), + 'queue_connection' => config('queue.default'), + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + + if (!config('support_gmail.enabled')) { + $this->warn('SUPPORT_GMAIL_ENABLED is false.'); + + return self::FAILURE; + } + + try { + $result = $connector->fetchNewMessages( + mailbox: (string) config('support_gmail.user', 'me'), + label: config('support_gmail.label'), + query: SupportGmailPollQuery::resolve(), + sinceHistoryId: null, + max: 5, + ); + + $preview = []; + foreach ($result['messages'] as $msg) { + $preview[] = [ + 'id' => $msg->id, + 'subject' => $msg->subject, + 'from' => $msg->from, + ]; + } + + $this->line(json_encode([ + 'gmail_matches' => count($preview), + 'warnings' => $result['warnings'] ?? [], + 'messages' => $preview, + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } catch (\Throwable $e) { + $this->error('Gmail API error: '.$e->getMessage()); + + return self::FAILURE; + } + + $cases = SupportCase::query()->orderByDesc('id')->limit(5)->get([ + 'id', 'subject', 'status', 'source_channel', 'created_at', 'forwarded_by_email', + ]); + + $this->line(json_encode([ + 'recent_support_cases' => $cases->toArray(), + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + + if (DB::getSchemaBuilder()->hasTable('failed_jobs')) { + $failed = DB::table('failed_jobs') + ->where('payload', 'like', '%ProcessSupportCase%') + ->orderByDesc('id') + ->limit(3) + ->get(['id', 'failed_at']); + + $this->line(json_encode([ + 'failed_support_jobs' => $failed->toArray(), + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } + + return self::SUCCESS; + } +} diff --git a/app/Jobs/Support/ProcessSupportCaseDiagnosticsJob.php b/app/Jobs/Support/ProcessSupportCaseDiagnosticsJob.php index f129e170b..7b89c60e9 100644 --- a/app/Jobs/Support/ProcessSupportCaseDiagnosticsJob.php +++ b/app/Jobs/Support/ProcessSupportCaseDiagnosticsJob.php @@ -66,7 +66,7 @@ public function handle( 'correlation_id' => $case->correlation_id, ]); - ProcessSupportCaseResolutionJob::dispatch($case->id); + ProcessSupportCaseResolutionJob::dispatchSync($case->id); } } diff --git a/app/Jobs/Support/ProcessSupportCaseTriageJob.php b/app/Jobs/Support/ProcessSupportCaseTriageJob.php index 3da1e8b3f..5022cfd11 100644 --- a/app/Jobs/Support/ProcessSupportCaseTriageJob.php +++ b/app/Jobs/Support/ProcessSupportCaseTriageJob.php @@ -51,7 +51,7 @@ public function handle(TriageAgentService $triage, SupportActionLogger $logger): correlationId: $case->correlation_id, ); - ProcessSupportCaseDiagnosticsJob::dispatch($case->id); + ProcessSupportCaseDiagnosticsJob::dispatchSync($case->id); } } diff --git a/app/Services/Support/Gmail/GmailIngestService.php b/app/Services/Support/Gmail/GmailIngestService.php index 0ea460441..a9d3ca3f3 100644 --- a/app/Services/Support/Gmail/GmailIngestService.php +++ b/app/Services/Support/Gmail/GmailIngestService.php @@ -114,7 +114,8 @@ public function pollAndIngest(int $max = 25): array correlationId: $correlationId, ); - ProcessSupportCaseTriageJob::dispatch($case->id); + // Run pipeline synchronously so scheduler poll does not depend on queue workers. + ProcessSupportCaseTriageJob::dispatchSync($case->id); } else { $duplicates++; }