diff options
Diffstat (limited to 'Translate/src/MessageGroupProcessing/TranslatableBundleStatusStore.php')
-rw-r--r-- | Translate/src/MessageGroupProcessing/TranslatableBundleStatusStore.php | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/Translate/src/MessageGroupProcessing/TranslatableBundleStatusStore.php b/Translate/src/MessageGroupProcessing/TranslatableBundleStatusStore.php new file mode 100644 index 00000000..166de6dc --- /dev/null +++ b/Translate/src/MessageGroupProcessing/TranslatableBundleStatusStore.php @@ -0,0 +1,110 @@ +<?php +declare( strict_types = 1 ); + +namespace MediaWiki\Extension\Translate\MessageGroupProcessing; + +use Collation; +use InvalidArgumentException; +use MediaWiki\Extension\Translate\MessageBundleTranslation\MessageBundle; +use MediaWiki\Extension\Translate\PageTranslation\TranslatablePage; +use Title; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\IMaintainableDatabase; + +/** + * Store service for looking up and storing status for translatable bundle status. + * @author Abijeet Patro + * @license GPL-2.0-or-later + * @since 2022.09 + */ +class TranslatableBundleStatusStore { + private const TABLE_NAME = 'translate_translatable_bundles'; + /** @var IDatabase */ + private $database; + /** @var Collation */ + private $collation; + /** @var IMaintainableDatabase */ + private $dbMaintainance; + /** @var ?bool */ + private $tableExists = null; + + public function __construct( + IDatabase $database, + Collation $collation, + IMaintainableDatabase $dbMaintainance + ) { + $this->database = $database; + $this->collation = $collation; + $this->dbMaintainance = $dbMaintainance; + } + + public function setStatus( Title $title, TranslatableBundleStatus $status, string $bundleType ): void { + if ( !$this->doesTableExist() ) { + return; + } + + $sortKey = substr( $this->collation->getSortKey( $title->getPrefixedDBkey() ), 0, 255 ); + $bundleTypeId = $this->getBundleTypeId( $bundleType ); + $this->database->replace( + self::TABLE_NAME, + [ 'ttb_page_id' ], + [ + 'ttb_page_id' => $title->getArticleID(), + 'ttb_type' => $bundleTypeId, + 'ttb_status' => $status->getId(), + 'ttb_sortkey' => $sortKey + ], + __METHOD__ + ); + } + + /** Return all bundles in an array with key being page id, value being status */ + public function getAllWithStatus(): array { + if ( !$this->doesTableExist() ) { + return []; + } + + $resultSet = $this->database->newSelectQueryBuilder() + ->select( [ 'ttb_page_id' , 'ttb_status' ] ) + ->from( self::TABLE_NAME ) + ->fetchResultSet(); + + $result = []; + foreach ( $resultSet as $row ) { + $result[$row->ttb_page_id] = (int)$row->ttb_status; + } + + return $result; + } + + public function removeStatus( int ...$pageIds ): void { + if ( !$this->doesTableExist() ) { + return; + } + + $this->database->delete( + self::TABLE_NAME, + [ 'ttb_page_id' => $pageIds ], + __METHOD__ + ); + } + + private function getBundleTypeId( string $bundle ): int { + if ( $bundle === TranslatablePage::class ) { + return 1; + } elseif ( $bundle === MessageBundle::class ) { + return 2; + } + + throw new InvalidArgumentException( "Unknown translatable bundle type: $bundle" ); + } + + /** TODO: Remove this check once table is available on Wikimedia sites that use Translate */ + private function doesTableExist(): bool { + if ( $this->tableExists === null ) { + $this->tableExists = $this->dbMaintainance->tableExists( self::TABLE_NAME, __METHOD__ ); + } + + return $this->tableExists; + } +} |