fix(notifications): use createFromMessage directly for CLI-safe scheduler notifications

createForTenantAdminUsersFromMessage relies on listActiveUserIdsByTenantId
which returns empty results in CLI context (scheduler). Instead, iterate
admin users directly and call createFromMessage per user per tenant.
Verified end-to-end: notification created, dedup blocks duplicates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 12:38:47 +02:00
parent 34892aff6f
commit fe88e748a3
2 changed files with 52 additions and 45 deletions

View File

@@ -57,33 +57,18 @@ final class SchedulerJobFailedNotificationListener implements EventListener
]
);
$tenantIds = $this->resolveAdminTenantIds($adminUserIds);
foreach ($tenantIds as $tenantId) {
$this->notificationService->createForTenantAdminUsersFromMessage(
$tenantId,
$message,
null,
$adminSet
);
}
}
/**
* Collect all unique tenant IDs across admin users.
*
* @param list<int> $userIds
* @return list<int>
*/
private function resolveAdminTenantIds(array $userIds): array
{
$tenantIds = [];
foreach ($userIds as $userId) {
foreach ($this->userTenantRepository->listTenantIdsByUserId($userId) as $tenantId) {
$tenantIds[$tenantId] = true;
// Create notifications directly per admin user + tenant.
// This avoids listActiveUserIdsByTenantId which requires a web-context
// DB session — the scheduler runs in CLI where that lookup may fail.
foreach ($adminUserIds as $userId) {
$tenantIds = $this->userTenantRepository->listTenantIdsByUserId($userId);
if ($tenantIds === []) {
$this->notificationService->createFromMessage($userId, null, $message);
continue;
}
foreach ($tenantIds as $tenantId) {
$this->notificationService->createFromMessage($userId, $tenantId, $message);
}
}
return array_keys($tenantIds);
}
}