Issues (17)

src/Response/XmlResponseWriter.php (2 issues)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Usox\HyperSonic\Response;
6
7
use AaronDDM\XMLBuilder\XMLArray;
8
use AaronDDM\XMLBuilder\XMLBuilder;
9
use Psr\Http\Message\ResponseInterface;
10
use Usox\HyperSonic\Exception\ErrorCodeEnum;
11
12
/**
13
 * Writes response data in xml format
14
 */
15
final class XmlResponseWriter implements ResponseWriterInterface
16
{
17
    private ?XMLArray $rootNode = null;
18
19 3
    public function __construct(
20
        private readonly XMLBuilder $xmlBuilder,
21
        private readonly string $apiVersion,
22
    ) {
23 3
    }
24
25
    /**
26
     * Write response for successful api requests
27
     */
28 1
    public function write(
29
        ResponseInterface $response,
30
        FormattedResponderInterface $responder,
31
    ): ResponseInterface {
32 1
        $rootNode = $this->getRootNode();
33
34 1
        $responder->writeXml($rootNode);
35
36 1
        $rootNode->end();
37
38 1
        return $this->writeToResponse($response);
39
    }
40
41
    /**
42
     * Write response for erroneous api requests
43
     */
44 1
    public function writeError(
45
        ResponseInterface $response,
46
        ErrorCodeEnum $errorCode,
47
        string $message = ''
48
    ): ResponseInterface {
49 1
        $this->xmlBuilder->createXMLArray()
50 1
            ->start(
51 1
                'subsonic-response',
52 1
                [
53 1
                    'xmlns' => 'http://subsonic.org/restapi',
54 1
                    'status' => 'failed',
55 1
                    'version' => $this->apiVersion,
56 1
                ]
57 1
            )
58 1
            ->add(
59 1
                'error',
60 1
                null,
61 1
                ['code' => $errorCode->value, 'message' => $message]
62 1
            )
63 1
            ->end();
64
65 1
        return $this->writeToResponse($response);
66
    }
67
68 2
    private function writeToResponse(
69
        ResponseInterface $response
70
    ): ResponseInterface {
71 2
        $response->getBody()->write(
72 2
            $this->xmlBuilder->getXML()
73 2
        );
74
75 2
        return $response->withHeader('Content-Type', 'application/xml');
0 ignored issues
show
Bug Best Practice introduced by
The expression return $response->withHe...pe', 'application/xml') returns the type Psr\Http\Message\MessageInterface which includes types incompatible with the type-hinted return Psr\Http\Message\ResponseInterface.
Loading history...
76
    }
77
78 1
    private function getRootNode(): XMLArray
79
    {
80 1
        if ($this->rootNode === null) {
81 1
            $this->rootNode = $this->xmlBuilder->createXMLArray()
82 1
                ->start(
83 1
                    'subsonic-response',
84 1
                    [
85 1
                        'xmlns' => 'http://subsonic.org/restapi',
86 1
                        'status' => 'ok',
87 1
                        'version' => $this->apiVersion,
88 1
                    ]
89 1
                );
90
        }
91
92 1
        return $this->rootNode;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->rootNode could return the type null which is incompatible with the type-hinted return AaronDDM\XMLBuilder\XMLArray. Consider adding an additional type-check to rule them out.
Loading history...
93
    }
94
}
95