27 protected static $right =
'translate-messagereview';
29 public function __construct(
32 private readonly RevisionLookup $revisionLookup,
33 private readonly TitleFormatter $titleFormatter,
34 private readonly IConnectionProvider $dbProvider,
37 parent::__construct( $main, $moduleName );
40 public function execute() {
41 $this->checkUserRightsAny( self::$right );
43 $params = $this->extractRequestParams();
45 $revRecord = $this->revisionLookup->getRevisionById( $params[
'revision'] );
47 $this->dieWithError( [
'apierror-nosuchrevid', $params[
'revision'] ],
'invalidrevision' );
50 $status = $this->getReviewBlockers( $this->getUser(), $revRecord );
51 if ( !$status->isGood() ) {
52 if ( $status->hasMessage(
'blocked' ) ) {
53 $this->dieBlocked( $this->getUser()->getBlock() );
55 $this->dieStatus( $status );
59 $ok = $this->doReview( $this->getUser(), $revRecord );
61 $this->addWarning(
'apiwarn-translate-alreadyreviewedbyyou' );
64 $prefixedText = $this->titleFormatter->getPrefixedText( $revRecord->getPageAsLinkTarget() );
65 $output = [
'review' => [
66 'title' => $prefixedText,
67 'pageid' => $revRecord->getPageId(),
68 'revision' => $revRecord->getId()
71 $this->getResult()->addValue(
null, $this->getModuleName(), $output );
78 private function doReview( User $user, RevisionRecord $revRecord ):
bool {
79 $dbw = $this->dbProvider->getPrimaryDatabase();
80 $dbw->newInsertQueryBuilder()
81 ->insertInto(
'translate_reviews' )
84 'trr_user' => $user->getId(),
85 'trr_page' => $revRecord->getPageId(),
86 'trr_revision' => $revRecord->getId(),
88 ->caller( __METHOD__ )
91 if ( !$dbw->affectedRows() ) {
95 $title = $revRecord->getPageAsLinkTarget();
97 $entry =
new ManualLogEntry(
'translationreview',
'message' );
98 $entry->setPerformer( $user );
99 $entry->setTarget( $title );
100 $entry->setParameters( [
101 '4::revision' => $revRecord->getId(),
104 $logid = $entry->insert();
105 $entry->publish( $logid );
108 $this->hookRunner->onTranslateEventTranslationReview( $handle );
117 private function getReviewBlockers( User $user, RevisionRecord $revRecord ): Status {
118 if ( !$user->isAllowed( self::$right ) ) {
119 return Status::newFatal(
'apierror-permissiondenied-generic' );
122 if ( $user->getBlock() ) {
123 return Status::newFatal(
'blocked' );
126 $title = $revRecord->getPageAsLinkTarget();
128 if ( !$handle->isValid() ) {
129 return Status::newFatal(
'apierror-translate-unknownmessage' );
132 if ( $user->equals( $revRecord->getUser() ) ) {
133 return Status::newFatal(
'apierror-translate-owntranslation' );
136 if ( $handle->isFuzzy() ) {
137 return Status::newFatal(
'apierror-translate-fuzzymessage' );
140 return Status::newGood();
143 public function isWriteMode():
bool {
147 public function needsToken():
string {
151 protected function getAllowedParams(): array {
154 ParamValidator::PARAM_TYPE =>
'integer',
155 ParamValidator::PARAM_REQUIRED =>
true,
160 protected function getExamplesMessages(): array {
162 'action=translationreview&revision=1&token=foo'
163 =>
'apihelp-translationreview-example-1',