summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Gadgets/includes/GadgetRepo.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Gadgets/includes/GadgetRepo.php')
-rw-r--r--www/wiki/extensions/Gadgets/includes/GadgetRepo.php104
1 files changed, 104 insertions, 0 deletions
diff --git a/www/wiki/extensions/Gadgets/includes/GadgetRepo.php b/www/wiki/extensions/Gadgets/includes/GadgetRepo.php
new file mode 100644
index 00000000..11996f8e
--- /dev/null
+++ b/www/wiki/extensions/Gadgets/includes/GadgetRepo.php
@@ -0,0 +1,104 @@
+<?php
+
+use MediaWiki\Linker\LinkTarget;
+
+abstract class GadgetRepo {
+
+ /**
+ * @var GadgetRepo|null
+ */
+ private static $instance;
+
+ /**
+ * Get the ids of the gadgets provided by this repository
+ *
+ * It's possible this could be out of sync with what
+ * getGadget() will return due to caching
+ *
+ * @return string[]
+ */
+ abstract public function getGadgetIds();
+
+ /**
+ * Get the Gadget object for a given gadget id
+ *
+ * @param string $id
+ * @throws InvalidArgumentException
+ * @return Gadget
+ */
+ abstract public function getGadget( $id );
+
+ /**
+ * Given that the provided page was updated, invalidate
+ * caches if necessary
+ *
+ * @param LinkTarget $target
+ *
+ * @return void
+ */
+ public function handlePageUpdate( LinkTarget $target ) {
+ }
+
+ /**
+ * Given that the provided page was created, invalidate
+ * caches if necessary
+ *
+ * @param LinkTarget $target
+ *
+ * @return void
+ */
+ public function handlePageCreation( LinkTarget $target ) {
+ }
+
+ /**
+ * Given that the provided page was updated, invalidate
+ * caches if necessary
+ *
+ * @param LinkTarget $target
+ *
+ * @return void
+ */
+ public function handlePageDeletion( LinkTarget $target ) {
+ }
+
+ /**
+ * Get a list of gadgets sorted by category
+ *
+ * @return array [ 'category' => [ 'name' => $gadget ] ]
+ */
+ public function getStructuredList() {
+ $list = [];
+ foreach ( $this->getGadgetIds() as $id ) {
+ try {
+ $gadget = $this->getGadget( $id );
+ } catch ( InvalidArgumentException $e ) {
+ continue;
+ }
+ $list[$gadget->getCategory()][$gadget->getName()] = $gadget;
+ }
+
+ return $list;
+ }
+
+ /**
+ * Get the configured default GadgetRepo.
+ *
+ * @return GadgetRepo
+ */
+ public static function singleton() {
+ if ( self::$instance === null ) {
+ global $wgGadgetsRepoClass; // @todo use Config here
+ self::$instance = new $wgGadgetsRepoClass();
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Should only be used by unit tests
+ *
+ * @param GadgetRepo|null $repo
+ */
+ public static function setSingleton( $repo = null ) {
+ self::$instance = $repo;
+ }
+}