Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 50
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiCrud
0.00% covered (danger)
0.00%
0 / 50
0.00% covered (danger)
0.00%
0 / 4
72
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
30
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\WikispeechSpeechDataCollector\Api;
4
5/**
6 * @file
7 * @ingroup Extensions
8 * @license GPL-2.0-or-later
9 */
10
11use ApiBase;
12use ApiMain;
13use ApiUsageException;
14use Exception;
15use FormatJson;
16use MediaWiki\Logger\LoggerFactory;
17use MediaWiki\Revision\RevisionStore;
18use MediaWiki\WikispeechSpeechDataCollector\Crud\CrudContext;
19use MediaWiki\WikispeechSpeechDataCollector\Crud\Transaction\CrudTransactionExecutor;
20use MediaWiki\WikispeechSpeechDataCollector\Crud\Transaction\CrudTransactionMWAssociativeArrayMarshaller;
21use Psr\Log\LoggerInterface;
22use Wikimedia\ParamValidator\ParamValidator;
23use Wikimedia\Rdbms\ILoadBalancer;
24
25/**
26 * @todo This is part of an internal development API. It should be removed before deployment.
27 *
28 * ?action=wikispeech-sdc-crud&transaction=json content
29 *
30 * Insecure and unlimited generic API access for
31 * creating, updating, reading and deleting persistent objects.
32 *
33 * This is for development purposes.
34 * It allows for communicating with the backend in a way that
35 * hopefully is easy to implement as secure ad hoc API features
36 * without having to make too many changes in the client code.
37 *
38 * @see CrudTransactionExecutor
39 * @since 0.1.0
40 */
41class ApiCrud extends ApiBase {
42
43    /** @var CrudContext */
44    private $context;
45
46    /** @var LoggerInterface */
47    private $logger;
48
49    /**
50     * @since 0.1.0
51     * @param ApiMain $mainModule
52     * @param string $moduleName Name of this module
53     * @param ILoadBalancer $dbLoadBalancer
54     * @param RevisionStore $revisionStore
55     * @param string $modulePrefix Prefix to use for parameter names
56     */
57    public function __construct(
58        ApiMain $mainModule,
59        $moduleName,
60        ILoadBalancer $dbLoadBalancer,
61        RevisionStore $revisionStore,
62        $modulePrefix = ''
63    ) {
64        parent::__construct( $mainModule, $moduleName, $modulePrefix );
65        $this->context = new CrudContext(
66            $dbLoadBalancer,
67            $this->getUser(),
68            $revisionStore
69        );
70        // @todo inject
71        $this->logger = LoggerFactory::getInstance( "Wikispeech-SDC-ApiCrud" );
72    }
73
74    /**
75     * @since 0.1.0
76     * @throws ApiUsageException
77     */
78    public function execute() {
79        $inputParameters = $this->extractRequestParams();
80        $jsonStatus = FormatJson::parse(
81            $inputParameters['transaction'],
82            FormatJson::FORCE_ASSOC
83        );
84        if ( !$jsonStatus->isOK() ) {
85            $this->logger->error( __METHOD__ . ': Failed to deserialize JSON. ' . $jsonStatus );
86            $this->dieWithError( 'apierror-wikispeech-sdc-crud-deserialize-transaction-json' );
87        }
88
89        $transactionMarshaller = new CrudTransactionMWAssociativeArrayMarshaller();
90
91        try {
92            $transactionRequest = $transactionMarshaller->deserializeRequest(
93                $jsonStatus->getValue()
94            );
95        } catch ( Exception $e ) {
96            $this->logger->error( __METHOD__ . ': Failed to deserialize transaction. ' . $e );
97            $this->dieWithError( 'apierror-wikispeech-sdc-crud-deserialize-transaction' );
98        }
99
100        $transactionExecutor = new CrudTransactionExecutor( $this->context );
101        try {
102            $transactionResponse = $transactionExecutor->execute( $transactionRequest );
103        } catch ( Exception $e ) {
104            $this->logger->error( __METHOD__ . ': Failed to execute transaction. ' . $e );
105            $this->dieWithError( 'apierror-wikispeech-sdc-crud-execute-transaction' );
106        }
107
108        try {
109            $serializedResponse = $transactionMarshaller->serializeResponse( $transactionResponse );
110        } catch ( Exception $e ) {
111            $this->logger->error( __METHOD__ . ': Failed to serialize response. ' . $e );
112            $this->dieWithError( 'apierror-wikispeech-sdc-crud-serialize-response' );
113        }
114
115        $this->getResult()->addValue(
116            null,
117            $this->getModuleName(),
118            $serializedResponse
119        );
120    }
121
122    /**
123     * Specify what parameters the API accepts.
124     *
125     * @since 0.1.0
126     * @return array
127     */
128    protected function getAllowedParams() {
129        return [
130            'transaction' => [
131                ParamValidator::PARAM_TYPE => 'string',
132                ParamValidator::PARAM_REQUIRED => true
133            ]
134        ];
135    }
136
137    /**
138     * Give examples of usage.
139     *
140     * @since 0.1.0
141     * @return array
142     */
143    public function getExamplesMessages() {
144        return [
145            // phpcs:ignore Generic.Files.LineLength
146            'action=wikispeech-sdc-crud&transaction={"create":{"Recording":[{"identity":null,"voiceOf":"61b25777-a277-406d-96c0-f1206ba64c69","recorded":"2020-11-02T11:15:44.000000Z","spokenDialect":"657c7d19-c871-4c59-82e6-45a7d3d00692","manuscriptPrompt":"4cba603f-ec8a-46ca-bde1-f44ae1a8d415"}]}}'
147            => 'apihelp-wikispeech-sdc-crud-example-1',
148            // phpcs:ignore Generic.Files.LineLength
149            'action=wikispeech-sdc-crud&transaction={"read":{"Recording":["bf8b38e3-12d4-49c0-be3a-ce52e0bfefcc"]}}'
150            => 'apihelp-wikispeech-sdc-crud-example-2',
151            // phpcs:ignore Generic.Files.LineLength
152            'action=wikispeech-sdc-crud&transaction={"delete":{"Recording":["bf8b38e3-12d4-49c0-be3a-ce52e0bfefcc"]}}'
153            => 'apihelp-wikispeech-sdc-crud-example-3',
154        ];
155    }
156
157}