Passed
Push — master ( d0634e...13c37e )
by Yuichi
10:21 queued 22s
created

File::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
namespace CybozuHttp\Api\Kintone;
4
5
use CybozuHttp\Client;
6
use CybozuHttp\Api\KintoneApi;
7
use CybozuHttp\Middleware\JsonStream;
8
use GuzzleHttp\Exception\RequestException;
9
use GuzzleHttp\Pool;
10
use GuzzleHttp\Psr7\MultipartStream;
11
use GuzzleHttp\Psr7\Request;
12
use Psr\Http\Message\ResponseInterface;
13
14
15
/**
16
 * @author ochi51 <[email protected]>
17
 */
18
class File
19
{
20
    /**
21
     * @var Client
22
     */
23
    private $client;
24
25 2
    public function __construct(Client $client)
26
    {
27 2
        $this->client = $client;
28
    }
29
30
    /**
31
     * Get file
32
     * https://cybozudev.zendesk.com/hc/ja/articles/202166180#step1
33
     *
34
     * @param string $fileKey
35
     * @param int $guestSpaceId
36
     * @return string
37
     */
38 1
    public function get($fileKey, $guestSpaceId = null): string
39
    {
40 1
        $options = ['json' => ['fileKey' => $fileKey]];
41 1
        $response = $this->client->get(KintoneApi::generateUrl('file.json', $guestSpaceId), $options);
42
43 1
        return (string)$response->getBody();
44
    }
45
46
    /**
47
     * Get file stream response
48
     * https://cybozudev.zendesk.com/hc/ja/articles/202166180#step1
49
     *
50
     * @param string $fileKey
51
     * @param int $guestSpaceId
52
     * @return ResponseInterface
53
     * @throws RequestException
54
     */
55 2
    public function getStreamResponse($fileKey, $guestSpaceId = null): ResponseInterface
56
    {
57 2
        $options = [
58 2
            'json' => ['fileKey' => $fileKey],
59 2
            'stream' => true
60 2
        ];
61 2
        return $this->client->get(KintoneApi::generateUrl('file.json', $guestSpaceId), $options);
62
    }
63
64
    /**
65
     * @param array $fileKeys
66
     * @param int|null $guestSpaceId
67
     * @return array [contents, contents, ...] The order of $fileKeys
68
     */
69 1
    public function multiGet(array $fileKeys, $guestSpaceId = null): array
70
    {
71 1
        $result = [];
72 1
        $concurrency = $this->client->getConfig('concurrency');
0 ignored issues
show
Deprecated Code introduced by
The function GuzzleHttp\Client::getConfig() has been deprecated: Client::getConfig will be removed in guzzlehttp/guzzle:8.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

72
        $concurrency = /** @scrutinizer ignore-deprecated */ $this->client->getConfig('concurrency');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
73 1
        $headers = $this->client->getConfig('headers');
0 ignored issues
show
Deprecated Code introduced by
The function GuzzleHttp\Client::getConfig() has been deprecated: Client::getConfig will be removed in guzzlehttp/guzzle:8.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

73
        $headers = /** @scrutinizer ignore-deprecated */ $this->client->getConfig('headers');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
74 1
        $headers['Content-Type'] = 'application/json';
75 1
        $url = KintoneApi::generateUrl('file.json', $guestSpaceId);
76 1
        $requests = static function () use ($fileKeys, $url, $headers) {
77 1
            foreach ($fileKeys as $fileKey) {
78 1
                $body = \GuzzleHttp\json_encode(['fileKey' => $fileKey]);
0 ignored issues
show
Deprecated Code introduced by
The function GuzzleHttp\json_encode() has been deprecated: json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

78
                $body = /** @scrutinizer ignore-deprecated */ \GuzzleHttp\json_encode(['fileKey' => $fileKey]);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
79 1
                yield new Request('GET', $url, $headers, $body);
80
            }
81 1
        };
82 1
        $pool = new Pool($this->client, $requests(), [
83 1
            'concurrency' => $concurrency ?: 1,
84 1
            'fulfilled' => static function (ResponseInterface $response, $index) use (&$result) {
85 1
                $result[$index] = (string)$response->getBody();
86 1
            }
87 1
        ]);
88 1
        $pool->promise()->wait();
89
90 1
        return $result;
91
    }
92
93
    /**
94
     * Post file
95
     * https://cybozudev.zendesk.com/hc/ja/articles/201941824#step1
96
     *
97
     * @param string $path
98
     * @param int|null $guestSpaceId
99
     * @param string|null $filename
100
     * @return string
101
     */
102 2
    public function post($path, $guestSpaceId = null, $filename = null): string
103
    {
104 2
        $options = ['multipart' => [self::createMultipart($path, $filename)]];
105 2
        $this->changeLocale();
106
107
        /** @var JsonStream $stream */
108 2
        $stream = $this->client
109 2
            ->post(KintoneApi::generateUrl('file.json', $guestSpaceId), $options)
110 2
            ->getBody();
111
112 2
        return $stream->jsonSerialize()['fileKey'];
113
    }
114
115
    /**
116
     * @param array $fileNames
117
     * @param int|null $guestSpaceId
118
     * @return array [fileKey, fileKey, ...] The order of $fileNames
119
     * @throws \InvalidArgumentException
120
     */
121 1
    public function multiPost(array $fileNames, $guestSpaceId = null): array
122
    {
123 1
        $this->changeLocale();
124
125 1
        $result = [];
126 1
        $concurrency = $this->client->getConfig('concurrency');
0 ignored issues
show
Deprecated Code introduced by
The function GuzzleHttp\Client::getConfig() has been deprecated: Client::getConfig will be removed in guzzlehttp/guzzle:8.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

126
        $concurrency = /** @scrutinizer ignore-deprecated */ $this->client->getConfig('concurrency');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
127 1
        $headers = $this->client->getConfig('headers');
0 ignored issues
show
Deprecated Code introduced by
The function GuzzleHttp\Client::getConfig() has been deprecated: Client::getConfig will be removed in guzzlehttp/guzzle:8.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

127
        $headers = /** @scrutinizer ignore-deprecated */ $this->client->getConfig('headers');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
128 1
        $url = KintoneApi::generateUrl('file.json', $guestSpaceId);
129 1
        $requests = static function () use ($fileNames, $url, $headers) {
130 1
            foreach ($fileNames as $filename) {
131 1
                $body = new MultipartStream([self::createMultipart($filename)]);
132 1
                yield new Request('POST', $url, $headers, $body);
133
            }
134 1
        };
135 1
        $pool = new Pool($this->client, $requests(), [
136 1
            'concurrency' => $concurrency ?: 1,
137 1
            'fulfilled' => static function (ResponseInterface $response, $index) use (&$result) {
138
                /** @var JsonStream $stream */
139 1
                $stream = $response->getBody();
140 1
                $result[$index] = $stream->jsonSerialize()['fileKey'];
141 1
            }
142 1
        ]);
143 1
        $pool->promise()->wait();
144 1
        ksort($result);
145
146 1
        return $result;
147
    }
148
149
    /**
150
     * Returns locale independent base name of the given path.
151
     *
152
     * @param string $name The new file name
153
     * @return string containing
154
     */
155 12
    public static function getFilename($name): string
156
    {
157 12
        $originalName = str_replace('\\', '/', $name);
158 12
        $pos = strrpos($originalName, '/');
159 12
        $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1);
160
161 12
        return $originalName;
162
    }
163
164 3
    private function changeLocale(): void
165
    {
166 3
        $baseUri = $this->client->getConfig('base_uri');
0 ignored issues
show
Deprecated Code introduced by
The function GuzzleHttp\Client::getConfig() has been deprecated: Client::getConfig will be removed in guzzlehttp/guzzle:8.0. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

166
        $baseUri = /** @scrutinizer ignore-deprecated */ $this->client->getConfig('base_uri');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
167 3
        if (strpos($baseUri->getHost(), 'cybozu.com') > 0) { // Japanese kintone
168 3
            setlocale(LC_ALL, 'ja_JP.UTF-8');
169
        }
170
    }
171
172
    /**
173
     * @param string $path
174
     * @param string|null $filename
175
     * @return array
176
     */
177 3
    private static function createMultipart($path, $filename = null): array
178
    {
179 3
        return [
180 3
            'name' => 'file',
181 3
            'filename' => self::getFilename($filename ?: $path),
182 3
            'contents' => fopen($path, 'rb'),
183 3
            'headers' => ['Content-Type' => mime_content_type($path)]
184 3
        ];
185
    }
186
}
187