wikimedia/mediawiki-extensions-Translate

View on GitHub
src/Synchronization/ClearGroupSyncCacheMaintenanceScript.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
declare( strict_types = 1 );

namespace MediaWiki\Extension\Translate\Synchronization;

use MediaWiki\Extension\Translate\Services;
use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
use MediaWiki\MediaWikiServices;

/**
 * Clear the contents of the group synchronization cache
 * @author Abijeet Patro
 * @license GPL-2.0-or-later
 * @since 2021.01
 */
class ClearGroupSyncCacheMaintenanceScript extends BaseMaintenanceScript {
    public function __construct() {
        parent::__construct();
        $this->addDescription( 'Clear the contents of the group synchronization cache for a single or all groups' );

        $this->addOption(
            'group',
            '(optional) Group Id being cleared',
            self::OPTIONAL,
            self::HAS_ARG
        );
        $this->addOption(
            'all',
            '(optional) Clear all groups'
        );

        $this->requireExtension( 'Translate' );
    }

    public function execute() {
        $config = MediaWikiServices::getInstance()->getMainConfig();

        if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
            $this->fatalError( 'GroupSynchronizationCache is not enabled' );
        }

        $this->validateParamsAndArgs();
        $groupId = $this->getOption( 'group' );
        $all = $this->hasOption( 'all' );
        $groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();

        if ( $groupId ) {
            $this->clearGroupFromSync( $groupSyncCache, $groupId );
            $this->output( "Ended synchronization for group: $groupId\n" );
        } elseif ( $all ) {
            // Remove all groups
            $groupsInSync = $groupSyncCache->getGroupsInSync();
            $this->output( 'Found ' . count( $groupsInSync ) . " groups in sync.\n" );
            foreach ( $groupsInSync as $groupId ) {
                $this->clearGroupFromSync( $groupSyncCache, $groupId );
                $this->output( "Ended synchronization for group: $groupId\n" );
            }
        }
    }

    public function validateParamsAndArgs() {
        parent::validateParamsAndArgs();

        $group = $this->getOption( 'group' );
        $all = $this->hasOption( 'all' );

        if ( $all && $group !== null ) {
            $this->fatalError( 'The "all" and "group" options cannot be used together.' );
        }

        if ( !$all && $group === null ) {
            $this->fatalError( 'One of "all" OR "group" options must be specified.' );
        }
    }

    private function clearGroupFromSync( GroupSynchronizationCache $groupSyncCache, string $groupId ): void {
        if ( !$groupSyncCache->isGroupBeingProcessed( $groupId ) ) {
            $this->fatalError( "$groupId is currently not being processed" );
        }

        $groupSyncCache->forceEndSync( $groupId );
    }
}