xref: /plugin/combo/ComboStrap/Api/ApiRouter.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap\Api;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Api\AjaxHandler;
6*04fd306cSNickeauuse ComboStrap\ExceptionInternal;
7*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
8*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
9*04fd306cSNickeauuse ComboStrap\ExecutionContext;
10*04fd306cSNickeauuse ComboStrap\HttpResponseStatus;
11*04fd306cSNickeauuse ComboStrap\IFetcher;
12*04fd306cSNickeauuse ComboStrap\Mime;
13*04fd306cSNickeauuse ComboStrap\PluginUtility;
14*04fd306cSNickeauuse ComboStrap\Web\Url;
15*04fd306cSNickeauuse dokuwiki\Extension\Event;
16*04fd306cSNickeau
17*04fd306cSNickeauclass ApiRouter
18*04fd306cSNickeau{
19*04fd306cSNickeau    public const CANONICAL = "ajax";
20*04fd306cSNickeau
21*04fd306cSNickeau    /**
22*04fd306cSNickeau     * The generic call that should be used for {@link \action_plugin_combo_ajax call}
23*04fd306cSNickeau     */
24*04fd306cSNickeau    public const AJAX_CALL_VALUE = "combo";
25*04fd306cSNickeau    const AJAX_CALL_ATTRIBUTE = 'call';
26*04fd306cSNickeau
27*04fd306cSNickeau    /**
28*04fd306cSNickeau     * @param Event $event
29*04fd306cSNickeau     * @return void
30*04fd306cSNickeau     */
31*04fd306cSNickeau    public static function handle(Event $event)
32*04fd306cSNickeau    {
33*04fd306cSNickeau
34*04fd306cSNickeau        $call = $event->data;
35*04fd306cSNickeau        switch ($call) {
36*04fd306cSNickeau            case QualityMessageHandler::CALL_ID:
37*04fd306cSNickeau                QualityMessageHandler::handle($event);
38*04fd306cSNickeau                return;
39*04fd306cSNickeau            case MetaManagerHandler::META_MANAGER_CALL_ID:
40*04fd306cSNickeau            case MetaManagerHandler::META_VIEWER_CALL_ID:
41*04fd306cSNickeau                MetaManagerHandler::handle($event);
42*04fd306cSNickeau                return;
43*04fd306cSNickeau        }
44*04fd306cSNickeau
45*04fd306cSNickeau        $fetchUrl = Url::createFromGetOrPostGlobalVariable();
46*04fd306cSNickeau        if ($call !== self::AJAX_CALL_VALUE && !$fetchUrl->hasProperty(IFetcher::FETCHER_KEY)) {
47*04fd306cSNickeau            return;
48*04fd306cSNickeau        }
49*04fd306cSNickeau
50*04fd306cSNickeau        // no other ajax call handlers needed
51*04fd306cSNickeau        $event->stopPropagation();
52*04fd306cSNickeau        $event->preventDefault();
53*04fd306cSNickeau
54*04fd306cSNickeau
55*04fd306cSNickeau        $executionContext = ExecutionContext::getActualOrCreateFromEnv();
56*04fd306cSNickeau        try {
57*04fd306cSNickeau            $fetcher = $executionContext->createStringMainFetcherFromRequestedUrl($fetchUrl);
58*04fd306cSNickeau        } catch (\Exception $e) {
59*04fd306cSNickeau            if (PluginUtility::isTest()) {
60*04fd306cSNickeau                throw new ExceptionRuntimeInternal("Error while creating the ajax fetcher.", self::CANONICAL, 1, $e);
61*04fd306cSNickeau            }
62*04fd306cSNickeau            $executionContext
63*04fd306cSNickeau                ->response()
64*04fd306cSNickeau                ->setException($e)
65*04fd306cSNickeau                ->setBody("Error while creating the fetcher for the fetch Url ($fetchUrl)", Mime::getText())
66*04fd306cSNickeau                ->end();
67*04fd306cSNickeau            return;
68*04fd306cSNickeau        }
69*04fd306cSNickeau
70*04fd306cSNickeau        $executionContext
71*04fd306cSNickeau            ->response()
72*04fd306cSNickeau            ->setStatus(HttpResponseStatus::ALL_GOOD)
73*04fd306cSNickeau            ->setBody($fetcher->getFetchString(), $fetcher->getMime())
74*04fd306cSNickeau            ->end();
75*04fd306cSNickeau
76*04fd306cSNickeau
77*04fd306cSNickeau    }
78*04fd306cSNickeau
79*04fd306cSNickeau    /**
80*04fd306cSNickeau     * @throws ExceptionNotFound
81*04fd306cSNickeau     */
82*04fd306cSNickeau    public static function getRequestParameter(string $parameter)
83*04fd306cSNickeau    {
84*04fd306cSNickeau        /**
85*04fd306cSNickeau         * Shared check between post and get HTTP method
86*04fd306cSNickeau         */
87*04fd306cSNickeau        if (array_key_exists($parameter, $_GET)) {
88*04fd306cSNickeau            /**
89*04fd306cSNickeau             * May be null value with boolean
90*04fd306cSNickeau             */
91*04fd306cSNickeau            return $_GET[$parameter];
92*04fd306cSNickeau        }
93*04fd306cSNickeau
94*04fd306cSNickeau        /**
95*04fd306cSNickeau         * With {@link TestRequest}
96*04fd306cSNickeau         * for instance
97*04fd306cSNickeau         */
98*04fd306cSNickeau        if (array_key_exists($parameter, $_REQUEST)) {
99*04fd306cSNickeau            return $_REQUEST[$parameter];
100*04fd306cSNickeau        }
101*04fd306cSNickeau
102*04fd306cSNickeau        global $INPUT;
103*04fd306cSNickeau        if ($INPUT->has($parameter)) {
104*04fd306cSNickeau            return $INPUT->str($parameter);
105*04fd306cSNickeau        }
106*04fd306cSNickeau
107*04fd306cSNickeau        if (defined('DOKU_UNITTEST')) {
108*04fd306cSNickeau            global $COMBO;
109*04fd306cSNickeau            if (array_key_exists($parameter, $COMBO)) {
110*04fd306cSNickeau                return $COMBO[$parameter];
111*04fd306cSNickeau            }
112*04fd306cSNickeau        }
113*04fd306cSNickeau
114*04fd306cSNickeau        throw new ExceptionNotFound("The parameter ($parameter) was not found for this request");
115*04fd306cSNickeau
116*04fd306cSNickeau    }
117*04fd306cSNickeau
118*04fd306cSNickeau    public static function hasRequestParameter(string $parameter): bool
119*04fd306cSNickeau    {
120*04fd306cSNickeau        try {
121*04fd306cSNickeau            self::getRequestParameter($parameter);
122*04fd306cSNickeau            return true;
123*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
124*04fd306cSNickeau            return false;
125*04fd306cSNickeau        }
126*04fd306cSNickeau    }
127*04fd306cSNickeau}
128