From 7b2ba6ef820335df682fbe3dcfaceef3a62cf4a5 Mon Sep 17 00:00:00 2001
From: ArthurHoaro <arthur@hoa.ro>
Date: Mon, 18 May 2020 17:17:36 +0200
Subject: RSS/ATOM feeds: process through Slim controller

---
 application/front/controllers/FeedController.php | 79 ++++++++++++++++++++++++
 1 file changed, 79 insertions(+)
 create mode 100644 application/front/controllers/FeedController.php

(limited to 'application/front/controllers/FeedController.php')

diff --git a/application/front/controllers/FeedController.php b/application/front/controllers/FeedController.php
new file mode 100644
index 00000000..78d826d9
--- /dev/null
+++ b/application/front/controllers/FeedController.php
@@ -0,0 +1,79 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Shaarli\Front\Controller;
+
+use Shaarli\Feed\FeedBuilder;
+use Slim\Http\Request;
+use Slim\Http\Response;
+
+/**
+ * Class FeedController
+ *
+ * Slim controller handling ATOM and RSS feed.
+ *
+ * @package Front\Controller
+ */
+class FeedController extends ShaarliController
+{
+    public function atom(Request $request, Response $response): Response
+    {
+        return $this->processRequest(FeedBuilder::$FEED_ATOM, $request, $response);
+    }
+
+    public function rss(Request $request, Response $response): Response
+    {
+        return $this->processRequest(FeedBuilder::$FEED_RSS, $request, $response);
+    }
+
+    protected function processRequest(string $feedType, Request $request, Response $response): Response
+    {
+        $response = $response->withHeader('Content-Type', 'application/'. $feedType .'+xml; charset=utf-8');
+
+        $pageUrl = page_url($this->container->environment);
+        $cache = $this->container->pageCacheManager->getCachePage($pageUrl);
+
+        $cached = $cache->cachedVersion();
+        if (!empty($cached)) {
+            return $response->write($cached);
+        }
+
+        // Generate data.
+        $this->container->feedBuilder->setLocale(strtolower(setlocale(LC_COLLATE, 0)));
+        $this->container->feedBuilder->setHideDates($this->container->conf->get('privacy.hide_timestamps', false));
+        $this->container->feedBuilder->setUsePermalinks(
+            null !== $request->getParam('permalinks') || !$this->container->conf->get('feed.rss_permalinks')
+        );
+
+        $data = $this->container->feedBuilder->buildData($feedType, $request->getParams());
+
+        $this->executeHooks($data, $feedType);
+        $this->assignAllView($data);
+
+        $content = $this->render('feed.'. $feedType);
+
+        $cache->cache($content);
+
+        return $response->write($content);
+    }
+
+    /**
+     * @param mixed[] $data Template data
+     *
+     * @return mixed[] Template data after active plugins hook execution.
+     */
+    protected function executeHooks(array $data, string $feedType): array
+    {
+        $this->container->pluginManager->executeHooks(
+            'render_feed',
+            $data,
+            [
+                'loggedin' => $this->container->loginManager->isLoggedIn(),
+                'target' => $feedType,
+            ]
+        );
+
+        return $data;
+    }
+}
-- 
cgit v1.2.3