Fail gracefully when content is deleted before notification is sent
>>> [!note] Migrated issue
<!-- Drupal.org comment -->
<!-- Migrated from issue #3231348. -->
Reported by: [rex.barkdoll](https://www.drupal.org/user/1808716)
>>>
<h3 id="summary-problem-motivation">Problem/Motivation</h3>
<p>As a continuation of this problem that I originally posted under Push Framework <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/push_framework/issues/3218315" title="Status: Closed (fixed)">#3218315: Gracefully fail on a non-existent notification</a></span>, it turns out it's actually a DANSE issue (because I tested it without <em>Push Framework</em> being available and it still broke Drush). I've also confirmed that this happens on v2.2.0 and 2.2.dev</p>
<p>The goal is to be able to create and delete an entity, which creates a DANSE event, before cron runs. Right now, doing this causes a cron error.</p>
<p>The reason we need this functionality is because we have an environment where content is moderated. It starts off in a draft state and then is reviewed by moderators and published or deleted. The problem comes in where a moderator might delete an entity before it's notification has been processed by cron and then cron is basically non-functional until we run all the edel commands (<code>drush edel danse_event</code> at minimum). The problem is that there may also be other valid notifications that haven't yet gone out and those get lost when we run the edel commands. </p>
<p>If DANSE could find a way to not break cron when entities are deleted before it runs, that would be awesome.</p>
<h4 id="summary-steps-reproduce">Steps to reproduce</h4>
<p>Get DANSE setup, I'm personally focusing on individual entity subscriptions and nothing else. </p>
<ol>
<li>Fresh Site setup</li>
<li>Enable DANSE and DANSE_content</li>
<li>Create article and comments, setup DANSE subscriptions for both</li>
<li>Subscribe to comments on article entity</li>
<li>Post a comment</li>
<li>Delete the comment</li>
<li>Run <code>drush cron</code></li>
<li>Notice that drush cron now has errors as seen below:</li>
</ol>
<pre>[error] TypeError: Argument 2 passed to Drupal\danse\PluginBase::subscriptionKey() must be of the type string, null given, called in /var/www/html/website.com/web/modules/contrib/danse/modules/content/src/Payload.php on line 68 in Drupal\danse\PluginBase->subscriptionKey() (line 224 of /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php) #0 /var/www/html/website.com/web/modules/contrib/danse/modules/content/src/Payload.php(68): Drupal\danse\PluginBase->subscriptionKey()<br>#1 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(270): Drupal\danse_content\Payload->getSubscriptionReferences()<br>#2 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(159): Drupal\danse\PluginBase->getSubscribers()<br>#3 /var/www/html/website.com/web/modules/contrib/danse/src/Service.php(259): Drupal\danse\PluginBase->createNotifications()<br>#4 /var/www/html/website.com/web/modules/contrib/danse/danse.module(20): Drupal\danse\Service->createNotifications()<br>#5 [internal function]: danse_cron()<br>#6 /var/www/html/website.com/web/core/lib/Drupal/Core/Extension/ModuleHandler.php(392): call_user_func_array()<br>#7 /var/www/html/website.com/web/core/lib/Drupal/Core/Cron.php(236): Drupal\Core\Extension\ModuleHandler->invoke()<br>#8 /var/www/html/website.com/web/core/lib/Drupal/Core/Cron.php(134): Drupal\Core\Cron->invokeCronHandlers()<br>#9 /var/www/html/website.com/web/core/lib/Drupal/Core/ProxyClass/Cron.php(75): Drupal\Core\Cron->run()<br>#10 /var/www/html/website.com/vendor/drush/drush/src/Drupal/Commands/core/DrupalCommands.php(76): Drupal\Core\ProxyClass\Cron->run()<br>#11 [internal function]: Drush\Drupal\Commands\core\DrupalCommands->cron()<br>#12 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(257): call_user_func_array()<br>#13 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(212): Consolidation\AnnotatedCommand\CommandProcessor->runCommandCallback()<br>#14 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(176): Consolidation\AnnotatedCommand\CommandProcessor->validateRunAndAlter()<br>#15 /var/www/html/website.com/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(302): Consolidation\AnnotatedCommand\CommandProcessor->process()<br>#16 /var/www/html/website.com/vendor/symfony/console/Command/Command.php(255): Consolidation\AnnotatedCommand\AnnotatedCommand->execute()<br>#17 /var/www/html/website.com/vendor/symfony/console/Application.php(1005): Symfony\Component\Console\Command\Command->run()<br>#18 /var/www/html/website.com/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application->doRunCommand()<br>#19 /var/www/html/website.com/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun()<br>#20 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(118): Symfony\Component\Console\Application->run()<br>#21 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(48): Drush\Runtime\Runtime->doRun()<br>#22 /var/www/html/website.com/vendor/drush/drush/drush.php(72): Drush\Runtime\Runtime->run()<br>#23 /var/www/html/website.com/vendor/drush/drush/drush(4): require('/var/www/html/w...')<br>#24 {main}.<br>TypeError: Argument 2 passed to Drupal\danse\PluginBase::subscriptionKey() must be of the type string, null given, called in /var/www/html/website.com/web/modules/contrib/danse/modules/content/src/Payload.php on line 68 in /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php on line 224 #0 /var/www/html/website.com/web/modules/contrib/danse/modules/content/src/Payload.php(68): Drupal\danse\PluginBase->subscriptionKey()<br>#1 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(270): Drupal\danse_content\Payload->getSubscriptionReferences()<br>#2 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(159): Drupal\danse\PluginBase->getSubscribers()<br>#3 /var/www/html/website.com/web/modules/contrib/danse/src/Service.php(259): Drupal\danse\PluginBase->createNotifications()<br>#4 /var/www/html/website.com/web/modules/contrib/danse/danse.module(20): Drupal\danse\Service->createNotifications()<br>#5 [internal function]: danse_cron()<br>#6 /var/www/html/website.com/web/core/lib/Drupal/Core/Extension/ModuleHandler.php(392): call_user_func_array()<br>#7 /var/www/html/website.com/web/core/lib/Drupal/Core/Cron.php(236): Drupal\Core\Extension\ModuleHandler->invoke()<br>#8 /var/www/html/website.com/web/core/lib/Drupal/Core/Cron.php(134): Drupal\Core\Cron->invokeCronHandlers()<br>#9 /var/www/html/website.com/web/core/lib/Drupal/Core/ProxyClass/Cron.php(75): Drupal\Core\Cron->run()<br>#10 /var/www/html/website.com/vendor/drush/drush/src/Drupal/Commands/core/DrupalCommands.php(76): Drupal\Core\ProxyClass\Cron->run()<br>#11 [internal function]: Drush\Drupal\Commands\core\DrupalCommands->cron()<br>#12 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(257): call_user_func_array()<br>#13 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(212): Consolidation\AnnotatedCommand\CommandProcessor->runCommandCallback()<br>#14 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(176): Consolidation\AnnotatedCommand\CommandProcessor->validateRunAndAlter()<br>#15 /var/www/html/website.com/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(302): Consolidation\AnnotatedCommand\CommandProcessor->process()<br>#16 /var/www/html/website.com/vendor/symfony/console/Command/Command.php(255): Consolidation\AnnotatedCommand\AnnotatedCommand->execute()<br>#17 /var/www/html/website.com/vendor/symfony/console/Application.php(1005): Symfony\Component\Console\Command\Command->run()<br>#18 /var/www/html/website.com/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application->doRunCommand()<br>#19 /var/www/html/website.com/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun()<br>#20 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(118): Symfony\Component\Console\Application->run()<br>#21 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(48): Drush\Runtime\Runtime->doRun()<br>#22 /var/www/html/website.com/vendor/drush/drush/drush.php(72): Drush\Runtime\Runtime->run()<br>#23 /var/www/html/website.com/vendor/drush/drush/drush(4): require('/var/www/html/n...')<br>#24 {main}<br>TypeError: Argument 2 passed to Drupal\danse\PluginBase::subscriptionKey() must be of the type string, null given, called in /var/www/html/website.com/web/modules/contrib/danse/modules/content/src/Payload.php on line 68 in Drupal\danse\PluginBase->subscriptionKey() (line 224 of /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php).<br> [warning] Drush command terminated abnormally.</pre>
issue