. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\SiteLogsService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function str_replace; /** * Download logs. */ class SiteLogsDownload implements RequestHandlerInterface { private SiteLogsService $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) ->orderBy('log_id') ->get() ->map(static fn(object $row): string => '"' . $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 Registry::responseFactory()->response($content, StatusCodeInterface::STATUS_OK, [ 'content-type' => 'text/csv; charset=UTF-8', 'content-disposition' => 'attachment; filename="webtrees-logs.csv"', ]); } }