public function it_can_update_a_block(Page $page, PageBlock $block, \PDOStatement $statement) { $uuid = Uuid::uuid4(); $page->getUuid()->willReturn($uuid); $page->metaDataSetUpdateTimestamp(new Argument\Token\TypeToken(\DateTimeImmutable::class))->shouldBeCalled(); $blockUuid = Uuid::uuid4(); $blockSortOrder = 42; $blockStatus = PageStatusValue::get('concept'); $block->getUuid()->willReturn($blockUuid); $block->getPage()->willReturn($page); $block->getParameters()->willReturn([]); $block->getSortOrder()->willReturn($blockSortOrder); $block->getStatus()->willReturn($blockStatus); $block->metaDataSetUpdateTimestamp(new Argument\Token\TypeToken(\DateTimeImmutable::class))->shouldBeCalled(); $this->pdo->beginTransaction()->shouldBeCalled(); $this->pdo->prepare(new Argument\Token\StringContainsToken('UPDATE page_blocks'))->willReturn($statement); $statement->execute(['page_block_uuid' => $blockUuid->getBytes(), 'parameters' => json_encode([]), 'sort_order' => $blockSortOrder, 'status' => $blockStatus->toString()])->shouldBeCalled(); $statement->rowCount()->willReturn(1); $this->objectRepository->update(Page::TYPE, $uuid)->shouldBeCalled(); $this->objectRepository->update(PageBlock::TYPE, $blockUuid)->shouldBeCalled(); $this->pdo->commit()->shouldBeCalled(); $this->updateBlockForPage($block, $page); }
public function updateBlockForPage(PageBlock $block, Page $page) { if (!$page->getUuid()->equals($block->getPage()->getUuid())) { throw new \OutOfBoundsException('PageBlock must belong to page to be added to it.'); } $this->pdo->beginTransaction(); try { $query = $this->executeSql(' UPDATE page_blocks SET parameters = :parameters, sort_order = :sort_order, status = :status WHERE page_block_uuid = :page_block_uuid ', ['page_block_uuid' => $block->getUuid()->getBytes(), 'parameters' => json_encode($block->getParameters()), 'sort_order' => $block->getSortOrder(), 'status' => $block->getStatus()->toString()]); // When at least one of the fields changes, the rowCount will be 1 and an update occurred if ($query->rowCount() === 1) { $this->objectRepository->update(Page::TYPE, $page->getUuid()); $page->metaDataSetUpdateTimestamp(new \DateTimeImmutable()); $this->objectRepository->update(PageBlock::TYPE, $block->getUuid()); $block->metaDataSetUpdateTimestamp(new \DateTimeImmutable()); } $this->pdo->commit(); } catch (\Throwable $exception) { $this->pdo->rollBack(); throw $exception; } }