VSVverkeerskunde/gvq-api

View on GitHub
src/Common/Controllers/ResponseFactory.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php declare(strict_types=1);

namespace VSV\GVQ_API\Common\Controllers;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;

class ResponseFactory
{
    /**
     * @param string $data
     * @param string $model
     * @return Response
     */
    public function createCsvResponse(string $data, string $model): Response
    {
        $response = new Response(
            $this->createCsvData($data)
        );

        $response->headers->set('Content-Encoding', 'UTF-8');
        $response->headers->set('Content-Type', 'application/csv; charset=UTF-8');
        $response->headers->set('Content-Transfer-Encoding', 'binary');

        $now = new \DateTime();
        $fileName = $model.'_'.$now->format(\DateTime::ATOM).'.csv';
        $response->headers->set(
            'Content-Disposition',
            'attachment; filename="'.$fileName.'"'
        );

        return $response;
    }

    /**
     * @param \Closure $callBack
     * @param string $model
     * @return StreamedResponse
     */
    public function createStreamedCsvResponse(\Closure $callBack, string $model): StreamedResponse
    {
        $response = new StreamedResponse();

        $response->headers->set('Content-Encoding', 'UTF-8');
        $response->headers->set('Content-Type', 'application/csv; charset=UTF-8');
        $response->headers->set('Content-Transfer-Encoding', 'binary');

        $now = new \DateTime();
        $fileName = $model.'_'.$now->format(\DateTime::ATOM).'.csv';
        $response->headers->set(
            'Content-Disposition',
            'attachment; filename="'.$fileName.'"'
        );

        $response->setCallback($callBack);

        return $response;
    }

    /**
     * @param string $data
     * @return string
     */
    private function createCsvData(string $data): string
    {
        /**
         * @see: https://github.com/thephpleague/csv/blob/507815707cbdbebaf076873bff04cd6ad65fe0fe/docs/9.0/connections/bom.md
         */
        $csvData = chr(0xFF).chr(0xFE);
        $csvData .= mb_convert_encoding('sep=,'.PHP_EOL.$data, 'UTF-16LE', 'UTF-8');
        return $csvData;
    }
}