. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Services\PendingChangesService; use Fisharebest\Webtrees\Services\SiteLogsService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use stdClass; use function response; use function str_replace; /** * Download logs. */ class SiteLogsDownload implements RequestHandlerInterface { /** @var SiteLogsService */ private $site_logs_service; /** * @param SiteLogsService $site_logs_service */ public function __construct(SiteLogsService $site_logs_service) { $this->site_logs_service = $site_logs_service; } /** * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { $content = $this->site_logs_service->logsQuery($request->getQueryParams()) ->orderBy('log_id') ->get() ->map(static function (stdClass $row): string { return '"' . $row->log_time . '",' . '"' . $row->log_type . '",' . '"' . str_replace('"', '""', $row->log_message) . '",' . '"' . $row->ip_address . '",' . '"' . str_replace('"', '""', $row->user_name) . '",' . '"' . str_replace('"', '""', $row->gedcom_name) . '"' . "\n"; }) ->implode(''); return response($content, StatusCodeInterface::STATUS_OK, [ 'Content-Type' => 'text/csv; charset=utf-8', 'Content-Disposition' => 'attachment; filename="webtrees-logs.csv"', ]); } }