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]&nbsp; 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-&gt;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-&gt;subscriptionKey()<br>#1 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(270): Drupal\danse_content\Payload-&gt;getSubscriptionReferences()<br>#2 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(159): Drupal\danse\PluginBase-&gt;getSubscribers()<br>#3 /var/www/html/website.com/web/modules/contrib/danse/src/Service.php(259): Drupal\danse\PluginBase-&gt;createNotifications()<br>#4 /var/www/html/website.com/web/modules/contrib/danse/danse.module(20): Drupal\danse\Service-&gt;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-&gt;invoke()<br>#8 /var/www/html/website.com/web/core/lib/Drupal/Core/Cron.php(134): Drupal\Core\Cron-&gt;invokeCronHandlers()<br>#9 /var/www/html/website.com/web/core/lib/Drupal/Core/ProxyClass/Cron.php(75): Drupal\Core\Cron-&gt;run()<br>#10 /var/www/html/website.com/vendor/drush/drush/src/Drupal/Commands/core/DrupalCommands.php(76): Drupal\Core\ProxyClass\Cron-&gt;run()<br>#11 [internal function]: Drush\Drupal\Commands\core\DrupalCommands-&gt;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-&gt;runCommandCallback()<br>#14 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(176): Consolidation\AnnotatedCommand\CommandProcessor-&gt;validateRunAndAlter()<br>#15 /var/www/html/website.com/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(302): Consolidation\AnnotatedCommand\CommandProcessor-&gt;process()<br>#16 /var/www/html/website.com/vendor/symfony/console/Command/Command.php(255): Consolidation\AnnotatedCommand\AnnotatedCommand-&gt;execute()<br>#17 /var/www/html/website.com/vendor/symfony/console/Application.php(1005): Symfony\Component\Console\Command\Command-&gt;run()<br>#18 /var/www/html/website.com/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application-&gt;doRunCommand()<br>#19 /var/www/html/website.com/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application-&gt;doRun()<br>#20 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(118): Symfony\Component\Console\Application-&gt;run()<br>#21 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(48): Drush\Runtime\Runtime-&gt;doRun()<br>#22 /var/www/html/website.com/vendor/drush/drush/drush.php(72): Drush\Runtime\Runtime-&gt;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-&gt;subscriptionKey()<br>#1 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(270): Drupal\danse_content\Payload-&gt;getSubscriptionReferences()<br>#2 /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php(159): Drupal\danse\PluginBase-&gt;getSubscribers()<br>#3 /var/www/html/website.com/web/modules/contrib/danse/src/Service.php(259): Drupal\danse\PluginBase-&gt;createNotifications()<br>#4 /var/www/html/website.com/web/modules/contrib/danse/danse.module(20): Drupal\danse\Service-&gt;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-&gt;invoke()<br>#8 /var/www/html/website.com/web/core/lib/Drupal/Core/Cron.php(134): Drupal\Core\Cron-&gt;invokeCronHandlers()<br>#9 /var/www/html/website.com/web/core/lib/Drupal/Core/ProxyClass/Cron.php(75): Drupal\Core\Cron-&gt;run()<br>#10 /var/www/html/website.com/vendor/drush/drush/src/Drupal/Commands/core/DrupalCommands.php(76): Drupal\Core\ProxyClass\Cron-&gt;run()<br>#11 [internal function]: Drush\Drupal\Commands\core\DrupalCommands-&gt;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-&gt;runCommandCallback()<br>#14 /var/www/html/website.com/vendor/consolidation/annotated-command/src/CommandProcessor.php(176): Consolidation\AnnotatedCommand\CommandProcessor-&gt;validateRunAndAlter()<br>#15 /var/www/html/website.com/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(302): Consolidation\AnnotatedCommand\CommandProcessor-&gt;process()<br>#16 /var/www/html/website.com/vendor/symfony/console/Command/Command.php(255): Consolidation\AnnotatedCommand\AnnotatedCommand-&gt;execute()<br>#17 /var/www/html/website.com/vendor/symfony/console/Application.php(1005): Symfony\Component\Console\Command\Command-&gt;run()<br>#18 /var/www/html/website.com/vendor/symfony/console/Application.php(255): Symfony\Component\Console\Application-&gt;doRunCommand()<br>#19 /var/www/html/website.com/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application-&gt;doRun()<br>#20 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(118): Symfony\Component\Console\Application-&gt;run()<br>#21 /var/www/html/website.com/vendor/drush/drush/src/Runtime/Runtime.php(48): Drush\Runtime\Runtime-&gt;doRun()<br>#22 /var/www/html/website.com/vendor/drush/drush/drush.php(72): Drush\Runtime\Runtime-&gt;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-&gt;subscriptionKey() (line 224 of /var/www/html/website.com/web/modules/contrib/danse/src/PluginBase.php).<br> [warning] Drush command terminated abnormally.</pre>
issue