wikimedia/mediawiki-core

View on GitHub
includes/Rest/Handler/Helper/PageRestHelperFactory.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

namespace MediaWiki\Rest\Handler\Helper;

use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Edit\ParsoidOutputStash;
use MediaWiki\Languages\LanguageConverterFactory;
use MediaWiki\Languages\LanguageFactory;
use MediaWiki\Page\PageIdentity;
use MediaWiki\Page\PageLookup;
use MediaWiki\Page\ParserOutputAccess;
use MediaWiki\Page\RedirectStore;
use MediaWiki\Parser\Parsoid\Config\SiteConfig as ParsoidSiteConfig;
use MediaWiki\Parser\Parsoid\HtmlTransformFactory;
use MediaWiki\Permissions\Authority;
use MediaWiki\Rest\RequestInterface;
use MediaWiki\Rest\ResponseFactory;
use MediaWiki\Rest\Router;
use MediaWiki\Revision\RevisionLookup;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\RevisionRenderer;
use MediaWiki\Title\TitleFormatter;
use Wikimedia\Bcp47Code\Bcp47Code;

/**
 * @since 1.40 Factory for helper objects designed for sharing logic between REST handlers that deal with page content.
 * @unstable during Parsoid migration
 */
class PageRestHelperFactory {

    /**
     * @internal
     */
    public const CONSTRUCTOR_OPTIONS = PageContentHelper::CONSTRUCTOR_OPTIONS;

    private ServiceOptions $options;
    private RevisionLookup $revisionLookup;
    private RevisionRenderer $revisionRenderer;
    private TitleFormatter $titleFormatter;
    private PageLookup $pageLookup;
    private ParsoidOutputStash $parsoidOutputStash;
    private StatsdDataFactoryInterface $stats;
    private ParserOutputAccess $parserOutputAccess;
    private ParsoidSiteConfig $parsoidSiteConfig;
    private HtmlTransformFactory $htmlTransformFactory;
    private IContentHandlerFactory $contentHandlerFactory;
    private LanguageFactory $languageFactory;
    private RedirectStore $redirectStore;
    private LanguageConverterFactory $languageConverterFactory;

    /**
     * @param ServiceOptions $options
     * @param RevisionLookup $revisionLookup
     * @param RevisionRenderer $revisionRenderer
     * @param TitleFormatter $titleFormatter
     * @param PageLookup $pageLookup
     * @param ParsoidOutputStash $parsoidOutputStash
     * @param StatsdDataFactoryInterface $statsDataFactory
     * @param ParserOutputAccess $parserOutputAccess
     * @param ParsoidSiteConfig $parsoidSiteConfig
     * @param HtmlTransformFactory $htmlTransformFactory
     * @param IContentHandlerFactory $contentHandlerFactory
     * @param LanguageFactory $languageFactory
     * @param RedirectStore $redirectStore
     * @param LanguageConverterFactory $languageConverterFactory
     */
    public function __construct(
        ServiceOptions $options,
        RevisionLookup $revisionLookup,
        RevisionRenderer $revisionRenderer,
        TitleFormatter $titleFormatter,
        PageLookup $pageLookup,
        ParsoidOutputStash $parsoidOutputStash,
        StatsdDataFactoryInterface $statsDataFactory,
        ParserOutputAccess $parserOutputAccess,
        ParsoidSiteConfig $parsoidSiteConfig,
        HtmlTransformFactory $htmlTransformFactory,
        IContentHandlerFactory $contentHandlerFactory,
        LanguageFactory $languageFactory,
        RedirectStore $redirectStore,
        LanguageConverterFactory $languageConverterFactory
    ) {
        $this->options = $options;
        $this->revisionLookup = $revisionLookup;
        $this->revisionRenderer = $revisionRenderer;
        $this->titleFormatter = $titleFormatter;
        $this->pageLookup = $pageLookup;
        $this->parsoidOutputStash = $parsoidOutputStash;
        $this->stats = $statsDataFactory;
        $this->parserOutputAccess = $parserOutputAccess;
        $this->parsoidSiteConfig = $parsoidSiteConfig;
        $this->htmlTransformFactory = $htmlTransformFactory;
        $this->contentHandlerFactory = $contentHandlerFactory;
        $this->languageFactory = $languageFactory;
        $this->redirectStore = $redirectStore;
        $this->languageConverterFactory = $languageConverterFactory;
    }

    public function newRevisionContentHelper(): RevisionContentHelper {
        return new RevisionContentHelper(
            $this->options,
            $this->revisionLookup,
            $this->titleFormatter,
            $this->pageLookup
        );
    }

    public function newPageContentHelper(): PageContentHelper {
        return new PageContentHelper(
            $this->options,
            $this->revisionLookup,
            $this->titleFormatter,
            $this->pageLookup
        );
    }

    /**
     * Should we ignore page id mismatches between page and revision objects
     * in HTML/pagebundle requests? Mismatches arise because of page moves.
     * This is recommended only for handling calls to internal APIs.
     * @note Since 1.43, passing 'null' for $page has been deprecated.
     * @note Since 1.43, passing 'null' for $authority has been deprecated.
     * @note Since 1.43, passing $lenientRevHandling as the first parameter
     *  has been deprecated.
     * @param bool|PageIdentity|null $page
     *  If `false`, this argument is used as the value for $lenientRevHandling,
     *  for backward-compatibility.
     * @param array $parameters
     * @param ?Authority $authority
     * @param int|RevisionRecord|null $revision
     * @param bool $lenientRevHandling
     */
    public function newHtmlOutputRendererHelper(
        $page = null,
        array $parameters = [],
        ?Authority $authority = null,
        $revision = null,
        bool $lenientRevHandling = false
    ): HtmlOutputRendererHelper {
        if ( is_bool( $page ) ) {
            // Backward compatibility w/ pre-1.43 (deprecated)
            $lenientRevHandling = $page;
            $page = null;
            wfDeprecated( __METHOD__ . ' with boolean first parameter', '1.43' );
        }
        if ( $page === null ) {
            wfDeprecated( __METHOD__ . ' with null $page', '1.43' );
        }
        if ( $authority === null ) {
            wfDeprecated( __METHOD__ . ' with null $authority', '1.43' );
        }
        return new HtmlOutputRendererHelper(
            $this->parsoidOutputStash,
            $this->stats,
            $this->parserOutputAccess,
            $this->pageLookup,
            $this->revisionLookup,
            $this->revisionRenderer,
            $this->parsoidSiteConfig,
            $this->htmlTransformFactory,
            $this->contentHandlerFactory,
            $this->languageFactory,
            $page,
            $parameters,
            $authority,
            $revision,
            $lenientRevHandling
        );
    }

    /**
     * @note Since 1.43, passing a null $page is deprecated.
     */
    public function newHtmlMessageOutputHelper( ?PageIdentity $page = null ): HtmlMessageOutputHelper {
        if ( $page === null ) {
            wfDeprecated( __METHOD__ . ' with null $page', '1.43' );
        }
        return new HtmlMessageOutputHelper( $page );
    }

    public function newHtmlInputTransformHelper(
        $envOptions = [],
        ?PageIdentity $page = null,
        $body = null,
        array $parameters = [],
        ?RevisionRecord $originalRevision = null,
        ?Bcp47Code $pageLanguage = null
    ): HtmlInputTransformHelper {
        if ( $page === null || $body === null ) {
            wfDeprecated( __METHOD__ . ' without $page or $body' );
        }
        return new HtmlInputTransformHelper(
            $this->stats,
            $this->htmlTransformFactory,
            $this->parsoidOutputStash,
            $this->parserOutputAccess,
            $this->pageLookup,
            $this->revisionLookup,
            $envOptions,
            $page,
            $body ?? '',
            $parameters,
            $originalRevision,
            $pageLanguage
        );
    }

    /**
     * @since 1.41
     */
    public function newPageRedirectHelper(
        ResponseFactory $responseFactory,
        Router $router,
        string $route,
        RequestInterface $request
    ): PageRedirectHelper {
        return new PageRedirectHelper(
            $this->redirectStore,
            $this->titleFormatter,
            $responseFactory,
            $router,
            $route,
            $request,
            $this->languageConverterFactory
        );
    }

}