@@ -614,6 +614,7 @@ public function searchRaw($boardIds, $term, $limit = null, $offset = null) {
614614
615615 public function delete (Entity $ entity ): Entity {
616616 $ this ->labelMapper ->deleteLabelAssignmentsForCard ($ entity ->getId ());
617+ $ this ->removeDependenciesForCard ($ entity ->getId ());
617618 $ this ->cache ->remove ('findBoardId: ' . $ entity ->getId ());
618619 return parent ::delete ($ entity );
619620 }
@@ -643,6 +644,76 @@ public function removeLabel(int $card, int $label): void {
643644 $ qb ->executeStatement ();
644645 }
645646
647+ /**
648+ * @param int[] $cardIds
649+ * @return array<int, int[]>
650+ */
651+ public function findDependenciesForCards (array $ cardIds ): array {
652+ if ($ cardIds === []) {
653+ return [];
654+ }
655+
656+ $ qb = $ this ->db ->getQueryBuilder ();
657+ $ qb ->select ('card_id ' , 'dependent_card_id ' )
658+ ->from ('deck_dependent_cards ' )
659+ ->where ($ qb ->expr ()->in ('card_id ' , $ qb ->createNamedParameter ($ cardIds , IQueryBuilder::PARAM_INT_ARRAY )))
660+ ->orderBy ('card_id ' )
661+ ->addOrderBy ('dependent_card_id ' );
662+
663+ $ result = [];
664+ $ queryResult = $ qb ->executeQuery ();
665+ while ($ row = $ queryResult ->fetch ()) {
666+ $ cardId = (int )$ row ['card_id ' ];
667+ $ result [$ cardId ][] = (int )$ row ['dependent_card_id ' ];
668+ }
669+
670+ return $ result ;
671+ }
672+
673+ public function addDependency (int $ cardId , int $ dependentCardId ): bool {
674+ if ($ this ->hasDependency ($ cardId , $ dependentCardId )) {
675+ return false ;
676+ }
677+
678+ $ qb = $ this ->db ->getQueryBuilder ();
679+ $ qb ->insert ('deck_dependent_cards ' )
680+ ->values ([
681+ 'card_id ' => $ qb ->createNamedParameter ($ cardId , IQueryBuilder::PARAM_INT ),
682+ 'dependent_card_id ' => $ qb ->createNamedParameter ($ dependentCardId , IQueryBuilder::PARAM_INT ),
683+ ]);
684+ $ qb ->executeStatement ();
685+
686+ return true ;
687+ }
688+
689+ public function removeDependency (int $ cardId , int $ dependentCardId ): bool {
690+ $ qb = $ this ->db ->getQueryBuilder ();
691+ $ qb ->delete ('deck_dependent_cards ' )
692+ ->where ($ qb ->expr ()->eq ('card_id ' , $ qb ->createNamedParameter ($ cardId , IQueryBuilder::PARAM_INT )))
693+ ->andWhere ($ qb ->expr ()->eq ('dependent_card_id ' , $ qb ->createNamedParameter ($ dependentCardId , IQueryBuilder::PARAM_INT )));
694+
695+ return $ qb ->executeStatement () > 0 ;
696+ }
697+
698+ public function removeDependenciesForCard (int $ cardId ): void {
699+ $ qb = $ this ->db ->getQueryBuilder ();
700+ $ qb ->delete ('deck_dependent_cards ' )
701+ ->where ($ qb ->expr ()->eq ('card_id ' , $ qb ->createNamedParameter ($ cardId , IQueryBuilder::PARAM_INT )))
702+ ->orWhere ($ qb ->expr ()->eq ('dependent_card_id ' , $ qb ->createNamedParameter ($ cardId , IQueryBuilder::PARAM_INT )));
703+ $ qb ->executeStatement ();
704+ }
705+
706+ private function hasDependency (int $ cardId , int $ dependentCardId ): bool {
707+ $ qb = $ this ->db ->getQueryBuilder ();
708+ $ qb ->select ('id ' )
709+ ->from ('deck_dependent_cards ' )
710+ ->where ($ qb ->expr ()->eq ('card_id ' , $ qb ->createNamedParameter ($ cardId , IQueryBuilder::PARAM_INT )))
711+ ->andWhere ($ qb ->expr ()->eq ('dependent_card_id ' , $ qb ->createNamedParameter ($ dependentCardId , IQueryBuilder::PARAM_INT )))
712+ ->setMaxResults (1 );
713+
714+ return $ qb ->executeQuery ()->fetchOne () !== false ;
715+ }
716+
646717 public function isOwner (string $ userId , int $ id ): bool {
647718 $ qb = $ this ->db ->getQueryBuilder ();
648719 $ qb ->select ('c.id ' )
0 commit comments