99use Drupal \Core \Entity \EntityInterface ;
1010use Drupal \Core \Entity \EntityTypeManager ;
1111use Drupal \Core \Logger \LoggerChannelFactory ;
12+ use Drupal \webform \WebformSubmissionInterface ;
1213
1314/**
1415 * Helper for managing failed jobs.
@@ -37,15 +38,18 @@ public function __construct(
3738 * @param string $jobId
3839 * The job id.
3940 *
40- * @return \Drupal\advancedqueue\Job
41+ * @return \Drupal\advancedqueue\Job|null
4142 * A list of attributes related to a job.
4243 */
43- public function getJobFromId (string $ jobId ): Job {
44+ public function getJobFromId (string $ jobId ): Job | NULL {
4445 $ query = $ this ->connection ->select ('advancedqueue ' , 'a ' );
4546 $ query ->fields ('a ' );
4647 $ query ->condition ('job_id ' , $ jobId , '= ' );
4748 $ definition = $ query ->execute ()->fetchAssoc ();
4849
50+ if (empty ($ definition )) {
51+ return NULL ;
52+ }
4953 // Match Job constructor id.
5054 $ definition ['id ' ] = $ definition ['job_id ' ];
5155
@@ -66,6 +70,9 @@ public function getJobFromId(string $jobId): Job {
6670 */
6771 public function getSubmissionIdFromJob (string $ jobId ): ?int {
6872 $ job = $ this ->getJobFromId ($ jobId );
73+ if (empty ($ job )) {
74+ return NULL ;
75+ }
6976 $ payload = $ job ->getPayload ();
7077
7178 return $ payload ['submissionId ' ] ?? $ payload ['submission ' ]['id ' ] ?? NULL ;
@@ -257,6 +264,64 @@ public function getDataFromJob(Job $job): ?array {
257264 }
258265 }
259266
267+ /**
268+ * Get a list of queue submission relations without existing submission.
269+ *
270+ * @param string|null $submissionId
271+ * A specific webform submission id.
272+ *
273+ * @return array
274+ * A list of queue submission relations.
275+ *
276+ * @phpstan-return array<string, mixed>
277+ */
278+ public function getDetachedQueueSubmissionRelations (string $ submissionId = NULL ): array {
279+ $ query = $ this ->connection ->select ('os2forms_failed_jobs_queue_submission_relation ' , 'o ' );
280+ $ query ->fields ('o ' , ['job_id ' , 'submission_id ' ]);
281+ if ($ submissionId ) {
282+ $ query ->condition ('submission_id ' , $ submissionId , '= ' );
283+ }
284+
285+ return $ query ->execute ()->fetchAll ();
286+ }
287+
288+ /**
289+ * Remove a list relations.
290+ *
291+ * @param array $entries
292+ * List of entries with job_id and submission_id.
293+ *
294+ * @phpstan-param array<string, mixed> $entries
295+ */
296+ public function removeRelations (array $ entries ): void {
297+ foreach ($ entries as $ entry ) {
298+ try {
299+ $ submission = $ this ->entityTypeManager ->getStorage ('webform_submission ' )
300+ ->getQuery ()
301+ ->accessCheck (FALSE )
302+ ->condition ('sid ' , $ entry ->submission_id )
303+ ->execute ();
304+ if (empty ($ submission )) {
305+ $ this ->removeQueueSubmissionRelation ($ entry ->submission_id );
306+ }
307+ }
308+ catch (InvalidPluginDefinitionException | PluginNotFoundException $ e ) {
309+ }
310+
311+ }
312+ }
313+
314+ /**
315+ * Cleanup relations.
316+ *
317+ * @param \Drupal\webform\WebformSubmissionInterface|null $submission
318+ * A webform submission.
319+ */
320+ public function cleanUp (WebformSubmissionInterface $ submission = NULL ): void {
321+ $ relations = $ this ->getDetachedQueueSubmissionRelations ($ submission ?->id());
322+ $ this ->removeRelations ($ relations );
323+ }
324+
260325 /**
261326 * Get all entries from the advancedqueue table.
262327 *
@@ -331,4 +396,19 @@ private function getAllRelations(): array {
331396 return $ query ->execute ()->fetchAllAssoc ('job_id ' );
332397 }
333398
399+ /**
400+ * Delete advanced queue submission relation.
401+ *
402+ * @param string $submissionId
403+ * The advanced queue submission id.
404+ */
405+ private function removeQueueSubmissionRelation (string $ submissionId ): void {
406+ // Delete os2forms_failed_jobs_queue_submission_relation.
407+ if ($ this ->connection ->schema ()->tableExists ('os2forms_failed_jobs_queue_submission_relation ' )) {
408+ $ this ->connection ->delete ('os2forms_failed_jobs_queue_submission_relation ' )
409+ ->condition ('submission_id ' , $ submissionId )
410+ ->execute ();
411+ }
412+ }
413+
334414}
0 commit comments