xref: /plugin/combo/ComboStrap/QualityTag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4*04fd306cSNickeau
5*04fd306cSNickeauuse ComboStrap\Api\QualityMessageHandler;
6*04fd306cSNickeauuse renderer_plugin_combo_analytics;
7*04fd306cSNickeau
8*04fd306cSNickeauclass QualityTag
9*04fd306cSNickeau{
10*04fd306cSNickeau
11*04fd306cSNickeau    public const MARKUP_TAG = "quality";
12*04fd306cSNickeau    const CANONICAL = ":dynamic-quality-monitoring";
13*04fd306cSNickeau
14*04fd306cSNickeau    /**
15*04fd306cSNickeau     * @param WikiPath $wikiPath
16*04fd306cSNickeau     * @return Message
17*04fd306cSNickeau     */
18*04fd306cSNickeau    public static function createQualityReport(WikiPath $wikiPath): Message
19*04fd306cSNickeau    {
20*04fd306cSNickeau
21*04fd306cSNickeau        if (!FileSystems::exists($wikiPath)) {
22*04fd306cSNickeau            return Message::createInfoMessage("The resource ($wikiPath) does not exist, no quality report can be computed.");
23*04fd306cSNickeau        }
24*04fd306cSNickeau
25*04fd306cSNickeau        try {
26*04fd306cSNickeau            $path = MarkupPath::createPageFromPathObject($wikiPath)->fetchAnalyticsPath();
27*04fd306cSNickeau            $analyticsArray = Json::createFromPath($path)->toArray();
28*04fd306cSNickeau        } catch (ExceptionCompile $e) {
29*04fd306cSNickeau            return Message::createErrorMessage("Error while trying to read the JSON analytics document. {$e->getMessage()}")
30*04fd306cSNickeau                ->setStatus(HttpResponseStatus::INTERNAL_ERROR);
31*04fd306cSNickeau        }
32*04fd306cSNickeau
33*04fd306cSNickeau        $rules = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::RULES];
34*04fd306cSNickeau
35*04fd306cSNickeau        /**
36*04fd306cSNickeau         * We may got null
37*04fd306cSNickeau         * array_key_exists() expects parameter 2 to be array,
38*04fd306cSNickeau         * null given in /opt/www/datacadamia.com/lib/plugins/combo/action/qualitymessage.php on line 113
39*04fd306cSNickeau         */
40*04fd306cSNickeau        if ($rules == null) {
41*04fd306cSNickeau            return Message::createInfoMessage("No rules found in the analytics document");
42*04fd306cSNickeau        }
43*04fd306cSNickeau
44*04fd306cSNickeau        /**
45*04fd306cSNickeau         * If there is no info, nothing to show
46*04fd306cSNickeau         */
47*04fd306cSNickeau        if (!array_key_exists(renderer_plugin_combo_analytics::INFO, $rules)) {
48*04fd306cSNickeau            return Message::createInfoMessage("No quality rules information to show");
49*04fd306cSNickeau        }
50*04fd306cSNickeau
51*04fd306cSNickeau        /**
52*04fd306cSNickeau         * The error info
53*04fd306cSNickeau         */
54*04fd306cSNickeau        $qualityInfoRules = $rules[renderer_plugin_combo_analytics::INFO];
55*04fd306cSNickeau
56*04fd306cSNickeau        /**
57*04fd306cSNickeau         * Excluding the excluded rules
58*04fd306cSNickeau         */
59*04fd306cSNickeau
60*04fd306cSNickeau        $excludedRulesConf =ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getValue(QualityMessageHandler::CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING);
61*04fd306cSNickeau        $excludedRules = preg_split("/,/", $excludedRulesConf);
62*04fd306cSNickeau        foreach ($excludedRules as $excludedRule) {
63*04fd306cSNickeau            if (array_key_exists($excludedRule, $qualityInfoRules)) {
64*04fd306cSNickeau                unset($qualityInfoRules[$excludedRule]);
65*04fd306cSNickeau            }
66*04fd306cSNickeau        }
67*04fd306cSNickeau
68*04fd306cSNickeau        if (sizeof($qualityInfoRules) <= 0) {
69*04fd306cSNickeau            return Message::createInfoMessage("No quality rules information to show");
70*04fd306cSNickeau        }
71*04fd306cSNickeau
72*04fd306cSNickeau        $qualityScore = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::SCORING][renderer_plugin_combo_analytics::SCORE];
73*04fd306cSNickeau        $message = "<p>The page has a " . PluginUtility::getDocumentationHyperLink("quality:score", "quality score") . " of {$qualityScore}.</p>";
74*04fd306cSNickeau
75*04fd306cSNickeau        $lowQuality = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::LOW];
76*04fd306cSNickeau        if ($lowQuality) {
77*04fd306cSNickeau
78*04fd306cSNickeau            $mandatoryFailedRules = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::FAILED_MANDATORY_RULES];
79*04fd306cSNickeau            $rulesUrl = PluginUtility::getDocumentationHyperLink("quality:rule", "rules");
80*04fd306cSNickeau            $lqPageUrl = PluginUtility::getDocumentationHyperLink("low_quality_page", "low quality page");
81*04fd306cSNickeau            $message .= "<div class='alert alert-warning'>This is a {$lqPageUrl} because it has failed the following mandatory {$rulesUrl}:";
82*04fd306cSNickeau            $message .= "<ul style='margin-bottom: 0'>";
83*04fd306cSNickeau            /**
84*04fd306cSNickeau             * A low quality page should have
85*04fd306cSNickeau             * failed mandatory rules
86*04fd306cSNickeau             * but due to the asycn nature, sometimes
87*04fd306cSNickeau             * we don't have an array
88*04fd306cSNickeau             */
89*04fd306cSNickeau            if (is_array($mandatoryFailedRules)) {
90*04fd306cSNickeau                foreach ($mandatoryFailedRules as $mandatoryFailedRule) {
91*04fd306cSNickeau                    $message .= "<li>" . PluginUtility::getDocumentationHyperLink("quality:rule#list", $mandatoryFailedRule) . "</li>";
92*04fd306cSNickeau                }
93*04fd306cSNickeau            }
94*04fd306cSNickeau            $message .= "</ul>";
95*04fd306cSNickeau            $message .= "</div>";
96*04fd306cSNickeau        }
97*04fd306cSNickeau        $message .= "<p>You can still win a couple of points.</p>";
98*04fd306cSNickeau        $message .= "<ul>";
99*04fd306cSNickeau        foreach ($qualityInfoRules as $qualityRule => $qualityInfo) {
100*04fd306cSNickeau            $message .= "<li>$qualityInfo</li>";
101*04fd306cSNickeau        }
102*04fd306cSNickeau        $message .= "</ul>";
103*04fd306cSNickeau
104*04fd306cSNickeau        $page = MarkupPath::createPageFromPathObject($wikiPath);
105*04fd306cSNickeau        $qualityMonitoringIndicator = QualityDynamicMonitoringOverwrite::createFromPage($page)->getValueOrDefault();
106*04fd306cSNickeau        if (!$qualityMonitoringIndicator) {
107*04fd306cSNickeau            $docLink = PluginUtility::getDocumentationHyperLink(self::CANONICAL, "configuration");
108*04fd306cSNickeau            $message .= "<p>This page is not quality monitored due its $docLink.</p>";
109*04fd306cSNickeau        }
110*04fd306cSNickeau        return Message::createInfoMessage($message);
111*04fd306cSNickeau
112*04fd306cSNickeau    }
113*04fd306cSNickeau
114*04fd306cSNickeau    public static function renderXhtml(TagAttributes $tagAttributes): string
115*04fd306cSNickeau    {
116*04fd306cSNickeau        $pageId = $tagAttributes->getComponentAttributeValue("page-id");
117*04fd306cSNickeau        if (empty($pageId)) {
118*04fd306cSNickeau            $contextPath = ExecutionContext::getActualOrCreateFromEnv()->getContextPath();
119*04fd306cSNickeau        } else {
120*04fd306cSNickeau            $contextPath = WikiPath::createMarkupPathFromId($pageId);
121*04fd306cSNickeau        }
122*04fd306cSNickeau        $message = QualityTag::createQualityReport($contextPath);
123*04fd306cSNickeau        return $message->getContent();
124*04fd306cSNickeau
125*04fd306cSNickeau
126*04fd306cSNickeau    }
127*04fd306cSNickeau}
128