From fba73dae590001ba6434ba148757b5aec4677ab6 Mon Sep 17 00:00:00 2001
From: Eric Bremner <ebremner@uwaterloo.ca>
Date: Mon, 19 Sep 2022 14:21:55 -0400
Subject: [PATCH] ISTWCMS-5754: updating to use DI to menu report

---
 src/Controller/UwDownloadCsvController.php | 48 ++++++++++++++++++++--
 1 file changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/Controller/UwDownloadCsvController.php b/src/Controller/UwDownloadCsvController.php
index 128d60e5..2bcb5492 100644
--- a/src/Controller/UwDownloadCsvController.php
+++ b/src/Controller/UwDownloadCsvController.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\uw_cfg_common\Controller;
 
+use Drupal\Core\Config\ConfigFactory;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Url;
 use Drupal\path_alias\AliasManager;
+use Drupal\transliterate_filenames\SanitizeName;
 use Drupal\Core\Database\Connection;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Response;
@@ -29,6 +31,21 @@ class UwDownloadCsvController extends ControllerBase {
    */
   protected $pathAlias;
 
+  /**
+   * Sanitize name.
+   *
+   * @var Drupal\transliterate_filenames\SanitizeName
+   */
+  protected $sanitizeName;
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactory
+   */
+  protected $configFactory;
+
+
   /**
    * The database connection.
    *
@@ -43,16 +60,25 @@ class UwDownloadCsvController extends ControllerBase {
    *   The entity type manager.
    * @param Drupal\path_alias\AliasManager $pathAlias
    *   The path alias.
+   * @param Drupal\transliterate_filenames\SanitizeName $sanitizeName
+   *   The sanitize name.
+   * @param Drupal\Core\Config\ConfigFactory $configFactory
+   *   The config factory.
    * @param \Drupal\Core\Database\Connection $database
    *   The database.
    */
   public function __construct(
     EntityTypeManagerInterface $entityTypeManager,
     AliasManager $pathAlias,
+    SanitizeName $sanitizeName,
+    ConfigFactory $configFactory,
     Connection $database
   ) {
+
     $this->entityTypeManager = $entityTypeManager;
     $this->pathAlias = $pathAlias;
+    $this->sanitizeName = $sanitizeName;
+    $this->configFactory = $configFactory;
     $this->database = $database;
   }
 
@@ -63,6 +89,8 @@ class UwDownloadCsvController extends ControllerBase {
     return new static(
       $container->get('entity_type.manager'),
       $container->get('path_alias.manager'),
+      $container->get('transliterate_filenames.sanitize_name'),
+      $container->get('config.factory'),
       $container->get('database')
     );
   }
@@ -107,7 +135,7 @@ class UwDownloadCsvController extends ControllerBase {
         // Pull out the info about the node.
         $data = [
           'nid' => $node->id(),
-          'title' => '"' . $node->getTitle() . '"',
+          'title' => '"' . str_replace('"', '""', $node->getTitle()) . '"',
           'type' => $node->type->entity->label(),
           'path' => $this->pathAlias->getAliasByPath('/node/' . $node->id()),
           'published' => $node->status->value,
@@ -125,9 +153,16 @@ class UwDownloadCsvController extends ControllerBase {
       // Create the response for the CSV page.
       $response = new Response($content);
 
+      // Determine the filename for the CSV.
+      $sitename = $this->configFactory->get('system.site')->get('name');
+      $filename = $sitename . '_content_report.csv';
+
+      // Make sure we are using a safe filename.
+      $filename = $this->sanitizeName->sanitizeFilename($filename);
+
       // Set the headers for the CSV.
       $response->headers->set('Content-Type', 'text/csv');
-      $response->headers->set('Content-Disposition', 'attachment; filename="content_report.csv"');
+      $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');
     }
 
     return $response;
@@ -312,9 +347,16 @@ class UwDownloadCsvController extends ControllerBase {
     // Create the response for the CSV page.
     $response = new Response($content);
 
+    // Determine the filename for the CSV.
+    $sitename = $this->configFactory->get('system.site')->get('name');
+    $filename = $sitename . '_menu_report.csv';
+
+    // Make sure we are using a safe filename.
+    $filename = $this->sanitizeName->sanitizeFilename($filename);
+
     // Set the headers for the CSV.
     $response->headers->set('Content-Type', 'text/csv');
-    $response->headers->set('Content-Disposition', 'attachment; filename="menu_report.csv"');
+    $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');
 
     return $response;
   }
-- 
GitLab