From 15505a03779326f9497644e9827477cdcc26c2d2 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Sat, 13 Jun 2020 19:36:24 +0200 Subject: tec: Refactor the export feature (#3045) Even if the issue #3035 seemed pretty simple at a first glance, it was more complicated than I expected. Because we send CSP headers AFTER running the controller actions, it means we can't "echo" any content from the controller. It's in fact a good practice, but it was easier at the time we developed the feature. To fix that, the only thing I had to do was to move the `print()` and `readfile()` function into the view. The problem was that we needed to output the content from the CLI too. Then, things became more complicated. I decided to extract the export-related methods in a `FreshRSS_Export_Service` class, in order to use it from both the controller and the CLI. It was an opportunity to refactor the whole feature in order to make it a bit more linear and easy to read. Reference: https://github.com/FreshRSS/FreshRSS/issues/3035 --- cli/export-zip-for-user.php | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'cli/export-zip-for-user.php') diff --git a/cli/export-zip-for-user.php b/cli/export-zip-for-user.php index 67421ea29..15ab94e5f 100755 --- a/cli/export-zip-for-user.php +++ b/cli/export-zip-for-user.php @@ -13,19 +13,35 @@ if (!validateOptions($argv, $params) || empty($options['user'])) { fail('Usage: ' . basename(__FILE__) . " --user username ( --max-feed-entries 100 ) > /path/to/file.zip"); } +if (!extension_loaded('zip')) { + fail('FreshRSS error: Lacking php-zip extension!'); +} + $username = cliInitUser($options['user']); fwrite(STDERR, 'FreshRSS exporting ZIP for user “' . $username . "”…\n"); -$importController = new FreshRSS_importExport_Controller(); - -$ok = false; +$export_service = new FreshRSS_Export_Service($username); $number_entries = empty($options['max-feed-entries']) ? 100 : intval($options['max-feed-entries']); -try { - $ok = $importController->exportFile($username, true, true, true, true, $number_entries); -} catch (FreshRSS_ZipMissing_Exception $zme) { - fail('FreshRSS error: Lacking php-zip extension!'); -} +$exported_files = []; + +// First, we generate the OPML file +list($filename, $content) = $export_service->generateOpml(); +$exported_files[$filename] = $content; + +// Then, labelled and starred entries +list($filename, $content) = $export_service->generateStarredEntries('ST'); +$exported_files[$filename] = $content; + +// And a list of entries based on the complete list of feeds +$feeds_exported_files = $export_service->generateAllFeedEntries($number_entries); +$exported_files = array_merge($exported_files, $feeds_exported_files); + +// Finally, we compress all these files into a single Zip archive and we output +// the content +list($filename, $content) = $export_service->zip($exported_files); +echo $content; + invalidateHttpCache($username); -done($ok); +done(); -- cgit v1.2.3