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\Pool; |
||||
9 | use GuzzleHttp\Psr7\Request; |
||||
10 | use Psr\Http\Message\ResponseInterface; |
||||
11 | |||||
12 | /** |
||||
13 | * @author ochi51 <[email protected]> |
||||
14 | */ |
||||
15 | class Comments |
||||
16 | { |
||||
17 | /** |
||||
18 | * @var Client |
||||
19 | */ |
||||
20 | private $client; |
||||
21 | |||||
22 | 1 | public function __construct(Client $client) |
|||
23 | { |
||||
24 | 1 | $this->client = $client; |
|||
25 | } |
||||
26 | |||||
27 | /** |
||||
28 | * Get record comments |
||||
29 | * https://cybozudev.zendesk.com/hc/ja/articles/208242326 |
||||
30 | * |
||||
31 | * @param int $appId |
||||
32 | * @param int $recordId |
||||
33 | * @param string $order "asc" or "desc" |
||||
34 | * @param int $offset |
||||
35 | * @param int $limit Max = 10 |
||||
36 | * @param int $guestSpaceId |
||||
37 | * @return array |
||||
38 | */ |
||||
39 | 2 | public function get($appId, $recordId, $order = 'desc', $offset = 0, $limit = 10, $guestSpaceId = null): array |
|||
40 | { |
||||
41 | 2 | $options = ['json' => [ |
|||
42 | 2 | 'app' => $appId, |
|||
43 | 2 | 'record' => $recordId, |
|||
44 | 2 | 'order' => $order, |
|||
45 | 2 | 'offset' => $offset, |
|||
46 | 2 | 'limit' => $limit |
|||
47 | 2 | ]]; |
|||
48 | |||||
49 | /** @var JsonStream $stream */ |
||||
50 | 2 | $stream = $this->client |
|||
51 | 2 | ->get(KintoneApi::generateUrl('record/comments.json', $guestSpaceId), $options) |
|||
52 | 2 | ->getBody(); |
|||
53 | |||||
54 | 2 | return $stream->jsonSerialize()['comments']; |
|||
55 | } |
||||
56 | |||||
57 | /** |
||||
58 | * @param int $appId |
||||
59 | * @param array $recordIds |
||||
60 | * @param int|null $guestSpaceId |
||||
61 | * @return array [recordId => comments, ...] |
||||
62 | */ |
||||
63 | 1 | public function allByRecords($appId, array $recordIds, $guestSpaceId = null): array |
|||
64 | { |
||||
65 | 1 | $result = []; |
|||
66 | 1 | $concurrency = $this->client->getConfig('concurrency'); |
|||
0 ignored issues
–
show
|
|||||
67 | 1 | $offset = 0; |
|||
68 | 1 | while (count($recordIds) > 0) { |
|||
69 | 1 | $tmpIds = []; |
|||
70 | 1 | $requests = $this->createGetRequestsCallback($appId, $recordIds, $guestSpaceId, $offset); |
|||
71 | 1 | $pool = new Pool($this->client, $requests(), [ |
|||
72 | 1 | 'concurrency' => $concurrency ?: 1, |
|||
73 | 1 | 'fulfilled' => $this->createMergeCommentsCallback($result, $tmpIds, $recordIds) |
|||
74 | 1 | ]); |
|||
75 | 1 | $pool->promise()->wait(); |
|||
76 | 1 | $recordIds = $tmpIds; |
|||
77 | 1 | $offset += 10; |
|||
78 | } |
||||
79 | 1 | ksort($result); |
|||
80 | |||||
81 | 1 | return $result; |
|||
82 | } |
||||
83 | |||||
84 | /** |
||||
85 | * @param integer $appId |
||||
86 | * @param array $recordIds |
||||
87 | * @param integer $guestSpaceId |
||||
88 | * @param int $offset |
||||
89 | * @return \Closure |
||||
90 | */ |
||||
91 | 1 | private function createGetRequestsCallback($appId, $recordIds, $guestSpaceId = null, $offset = 0): callable |
|||
92 | { |
||||
93 | 1 | $headers = $this->client->getConfig('headers'); |
|||
0 ignored issues
–
show
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
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. ![]() |
|||||
94 | 1 | $headers['Content-Type'] = 'application/json'; |
|||
95 | 1 | $url = KintoneApi::generateUrl('record/comments.json', $guestSpaceId); |
|||
96 | |||||
97 | 1 | return static function () use ($appId, $recordIds, $url, $headers, $offset) { |
|||
98 | 1 | foreach ($recordIds as $id) { |
|||
99 | 1 | $body = \GuzzleHttp\json_encode([ |
|||
0 ignored issues
–
show
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
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. ![]() |
|||||
100 | 1 | 'app' => $appId, |
|||
101 | 1 | 'record' => $id, |
|||
102 | 1 | 'order' => 'asc', |
|||
103 | 1 | 'offset' => $offset, |
|||
104 | 1 | 'limit' => 10 |
|||
105 | 1 | ]); |
|||
106 | 1 | yield new Request('GET', $url, $headers, $body); |
|||
107 | } |
||||
108 | 1 | }; |
|||
109 | } |
||||
110 | |||||
111 | /** |
||||
112 | * @param array $result |
||||
113 | * @param array $tmpIds |
||||
114 | * @param array $ids |
||||
115 | * @return \Closure |
||||
116 | */ |
||||
117 | 1 | private function createMergeCommentsCallback(array &$result, array &$tmpIds, array $ids): callable |
|||
118 | { |
||||
119 | 1 | return static function (ResponseInterface $response, $index) use (&$result, &$tmpIds, $ids) { |
|||
120 | 1 | $recordId = $ids[$index]; |
|||
121 | /** @var JsonStream $stream */ |
||||
122 | 1 | $stream = $response->getBody(); |
|||
123 | 1 | $body = $stream->jsonSerialize(); |
|||
124 | 1 | if ($body['newer']) { |
|||
125 | 1 | $tmpIds[] = $recordId; |
|||
126 | } |
||||
127 | 1 | if (!isset($result[$recordId])) { |
|||
128 | 1 | $result[$recordId] = []; |
|||
129 | } |
||||
130 | /** @var array $comments */ |
||||
131 | 1 | $comments = $body['comments']; |
|||
132 | 1 | foreach ($comments as $comment) { |
|||
133 | 1 | $result[$recordId][] = $comment; |
|||
134 | } |
||||
135 | 1 | }; |
|||
136 | } |
||||
137 | |||||
138 | /** |
||||
139 | * @param int $appId |
||||
140 | * @param array $comments [recordId => [['text' => 'comment message', 'mentions' => []], ...], ...] |
||||
141 | * @param int|null $guestSpaceId |
||||
142 | * @return array |
||||
143 | */ |
||||
144 | 1 | public function postByRecords($appId, $comments, $guestSpaceId = null): array |
|||
145 | { |
||||
146 | 1 | $result = []; |
|||
147 | 1 | $concurrency = $this->client->getConfig('concurrency'); |
|||
0 ignored issues
–
show
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
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. ![]() |
|||||
148 | |||||
149 | 1 | while (count($comments) > 0) { |
|||
150 | 1 | $requests = $this->createPostRequestsCallback($appId, $comments, $guestSpaceId); |
|||
151 | 1 | $pool = new Pool($this->client, $requests(), [ |
|||
152 | 1 | 'concurrency' => $concurrency ?: 1, |
|||
153 | 1 | 'fulfilled' => $this->createPostFinishedAtCallback($result, $comments) |
|||
154 | 1 | ]); |
|||
155 | 1 | $pool->promise()->wait(); |
|||
156 | } |
||||
157 | 1 | ksort($result); |
|||
158 | |||||
159 | 1 | return $result; |
|||
160 | } |
||||
161 | |||||
162 | /** |
||||
163 | * @param int $appId |
||||
164 | * @param array $comments |
||||
165 | * @param int|null $guestSpaceId |
||||
166 | * @return \Closure |
||||
167 | */ |
||||
168 | 1 | private function createPostRequestsCallback($appId, array $comments, $guestSpaceId = null): callable |
|||
169 | { |
||||
170 | 1 | $headers = $this->client->getConfig('headers'); |
|||
0 ignored issues
–
show
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
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. ![]() |
|||||
171 | 1 | $headers['Content-Type'] = 'application/json'; |
|||
172 | 1 | $url = KintoneApi::generateUrl('record/comment.json', $guestSpaceId); |
|||
173 | |||||
174 | 1 | return static function () use ($appId, $comments, $url, $headers) { |
|||
175 | 1 | foreach ($comments as $recordId => $values) { |
|||
176 | 1 | $comment = reset($values); |
|||
177 | 1 | if (!isset($comment['text'])) { |
|||
178 | continue; |
||||
179 | } |
||||
180 | 1 | $body = \GuzzleHttp\json_encode([ |
|||
0 ignored issues
–
show
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
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. ![]() |
|||||
181 | 1 | 'app' => $appId, |
|||
182 | 1 | 'record' => $recordId, |
|||
183 | 1 | 'comment' => $comment |
|||
184 | 1 | ]); |
|||
185 | 1 | yield new Request('POST', $url, $headers, $body); |
|||
186 | } |
||||
187 | 1 | }; |
|||
188 | } |
||||
189 | |||||
190 | /** |
||||
191 | * @param array $result |
||||
192 | * @param array $comments |
||||
193 | * @return \Closure |
||||
194 | */ |
||||
195 | 1 | private function createPostFinishedAtCallback(array &$result, array &$comments): callable |
|||
196 | { |
||||
197 | 1 | $recordIds = array_keys($comments); |
|||
198 | 1 | return static function (ResponseInterface $response, $index) use (&$result, &$comments, $recordIds) { |
|||
199 | /** @var JsonStream $stream */ |
||||
200 | 1 | $stream = $response->getBody(); |
|||
201 | 1 | $commentId = $stream->jsonSerialize()['id']; |
|||
202 | 1 | $recordId = $recordIds[$index]; |
|||
203 | 1 | if (!isset($result[$recordId])) { |
|||
204 | 1 | $result[$recordId] = []; |
|||
205 | } |
||||
206 | 1 | $result[$recordId][] = $commentId; |
|||
207 | 1 | $keys = array_keys($comments[$recordId]); |
|||
208 | 1 | $firstKey = reset($keys); |
|||
209 | 1 | unset($comments[$recordId][$firstKey]); |
|||
210 | 1 | if (count($comments[$recordId]) === 0) { |
|||
211 | 1 | unset($comments[$recordId]); |
|||
212 | } |
||||
213 | 1 | }; |
|||
214 | } |
||||
215 | } |
||||
216 |
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.