src/EventSubscriber/TablePositionSubscriber.php line 31
<?phpnamespace App\EventSubscriber;use ApiPlatform\Symfony\EventListener\EventPriorities;use App\Document\Area\Area;use App\Document\Area\TablePosition;use Doctrine\ODM\MongoDB\DocumentManager;use Doctrine\ODM\MongoDB\MongoDBException;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpKernel\Event\ViewEvent;use Symfony\Component\HttpKernel\KernelEvents;final class TablePositionSubscriber implements EventSubscriberInterface{public function __construct(private readonly DocumentManager $manager){}public static function getSubscribedEvents(): array{return [KernelEvents::VIEW => ['updateTablePosition', EventPriorities::PRE_WRITE],];}/*** @throws MongoDBException*/public function updateTablePosition(ViewEvent $event): void{$tablePosition = $event->getControllerResult();$method = $event->getRequest()->getMethod();if (!$tablePosition instanceof TablePosition || !in_array($method, [Request::METHOD_POST, Request::METHOD_PUT])) {return;}if (Request::METHOD_POST === $method) {$area = $tablePosition->getArea();$this->updateOtherTablePositions($area);}if (Request::METHOD_PUT === $method) {$newPosition = $tablePosition->getPosition();/** @var int $oldPosition */$oldPosition = $this->manager->getUnitOfWork()->getOriginalDocumentData($tablePosition)['position'];$area = $tablePosition->getArea();if ($newPosition != $oldPosition) {if ($newPosition > $oldPosition) {$this->updateOtherTablePositions($area, $oldPosition);} else {$this->updateOtherTablePositions($area, null, $oldPosition);}}}}/*** @throws MongoDBException*/private function updateOtherTablePositions(Area $area, ?int $gt = null, ?int $lte = null): void{$query = $this->manager->createQueryBuilder(TablePosition::class);$query->updateMany()->field('area')->references($area);if ($gt) {$query->field('position')->gt($gt);}if ($lte) {$query->field('position')->lte($lte);}if ($gt && $lte) {$query->addAnd($query->expr()->field('position')->gt($gt));$query->addAnd($query->expr()->field('position')->lte($lte));}$query->field('position')->inc($gt ? -1 : 1);$query->getQuery()->execute();}}