From 0260cc212ac3e512a485de54e7c8cef948003bfc Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:03:39 -0400 Subject: [PATCH 1/7] add `StringCorrection` model --- .../Model/StringCorrection.php | 109 ++++++++++++++++++ .../Model/StringCorrectionTest.php | 59 ++++++++++ 2 files changed, 168 insertions(+) create mode 100644 src/CrowdinApiClient/Model/StringCorrection.php create mode 100644 tests/CrowdinApiClient/Model/StringCorrectionTest.php diff --git a/src/CrowdinApiClient/Model/StringCorrection.php b/src/CrowdinApiClient/Model/StringCorrection.php new file mode 100644 index 00000000..bb77b9cd --- /dev/null +++ b/src/CrowdinApiClient/Model/StringCorrection.php @@ -0,0 +1,109 @@ +id = (integer)$this->getDataProperty('id'); + $this->text = (string)$this->getDataProperty('text'); + $this->pluralCategoryName = (string)$this->getDataProperty('pluralCategoryName'); + $this->user = (array)$this->getDataProperty('user'); + $this->createdAt = (string)$this->getDataProperty('createdAt'); + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @return string + */ + public function getText(): string + { + return $this->text; + } + + /** + * @param string $text + */ + public function setText(string $text): void + { + $this->text = $text; + } + + /** + * @return string + */ + public function getPluralCategoryName(): string + { + return $this->pluralCategoryName; + } + + /** + * @param string $pluralCategoryName + */ + public function setPluralCategoryName(string $pluralCategoryName): void + { + $this->pluralCategoryName = $pluralCategoryName; + } + + /** + * @return array + */ + public function getUser(): array + { + return $this->user; + } + + /** + * @param array $user + */ + public function setUser(array $user): void + { + $this->user = $user; + } + + /** + * @return string + */ + public function getCreatedAt(): string + { + return $this->createdAt; + } +} diff --git a/tests/CrowdinApiClient/Model/StringCorrectionTest.php b/tests/CrowdinApiClient/Model/StringCorrectionTest.php new file mode 100644 index 00000000..fffb611d --- /dev/null +++ b/tests/CrowdinApiClient/Model/StringCorrectionTest.php @@ -0,0 +1,59 @@ + 190695, + 'text' => 'This string has been corrected', + 'pluralCategoryName' => 'few', + 'user' => [ + 'id' => 19, + 'username' => 'john_doe', + 'fullName' => 'John Smith', + 'avatarUrl' => '' + ], + 'createdAt' => '2019-09-23T11:26:54+00:00' + ]; + + public function testLoadData() + { + $this->stringCorrection = new StringCorrection($this->data); + $this->checkData(); + } + + public function testSetData() + { + $this->stringCorrection = new StringCorrection(); + $this->stringCorrection->setText($this->data['text']); + $this->stringCorrection->setPluralCategoryName($this->data['pluralCategoryName']); + $this->stringCorrection->setUser($this->data['user']); + + $this->assertEquals($this->data['text'], $this->stringCorrection->getText()); + $this->assertEquals($this->data['pluralCategoryName'], $this->stringCorrection->getPluralCategoryName()); + $this->assertEquals($this->data['user'], $this->stringCorrection->getUser()); + } + + public function checkData() + { + $this->assertEquals($this->data['id'], $this->stringCorrection->getId()); + $this->assertEquals($this->data['text'], $this->stringCorrection->getText()); + $this->assertEquals($this->data['pluralCategoryName'], $this->stringCorrection->getPluralCategoryName()); + $this->assertEquals($this->data['createdAt'], $this->stringCorrection->getCreatedAt()); + + $this->assertEquals($this->data['user'], $this->stringCorrection->getUser()); + $this->assertEquals($this->data['user']['id'], $this->stringCorrection->getUser()['id']); + $this->assertEquals($this->data['user']['username'], $this->stringCorrection->getUser()['username']); + $this->assertEquals($this->data['user']['fullName'], $this->stringCorrection->getUser()['fullName']); + $this->assertEquals($this->data['user']['avatarUrl'], $this->stringCorrection->getUser()['avatarUrl']); + } +} From 1513d63334a21722b3a3568a7e22b15267c15f52 Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:09:48 -0400 Subject: [PATCH 2/7] add `StringCorrectionApi::list` --- .../Api/Enterprise/StringCorrectionApi.php | 35 ++++++++++++++ src/CrowdinApiClient/Crowdin.php | 2 + .../Enterprise/StringCorrectionApiTest.php | 46 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php create mode 100644 tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php diff --git a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php new file mode 100644 index 00000000..c0c691e7 --- /dev/null +++ b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php @@ -0,0 +1,35 @@ + + * integer $params[limit] default: 25
+ * integer $params[offset] default: 0
+ * string $params[orderBy]
+ * integer $params[denormalizePlaceholders] + * + * @return ModelCollection + */ + public function list(int $projectId, array $params = []): ModelCollection + { + $path = sprintf('projects/%d/corrections', $projectId); + return $this->_list($path, StringCorrection::class, $params); + } +} diff --git a/src/CrowdinApiClient/Crowdin.php b/src/CrowdinApiClient/Crowdin.php index 6fa62dbb..3c0fb262 100644 --- a/src/CrowdinApiClient/Crowdin.php +++ b/src/CrowdinApiClient/Crowdin.php @@ -48,6 +48,7 @@ * @property \CrowdinApiClient\Api\ReportArchiveApi|\CrowdinApiClient\Api\Enterprise\ReportArchiveApi $reportArchive * @property \CrowdinApiClient\Api\GraphqlApi $graphql * @property \CrowdinApiClient\Api\SecurityLogApi|\CrowdinApiClient\Api\Enterprise\SecurityLogApi $securityLog + * @property \CrowdinApiClient\Api\Enterprise\StringCorrectionApi $stringCorrection */ class Crowdin { @@ -160,6 +161,7 @@ class Crowdin 'reportArchive', 'graphql', 'securityLog', + 'stringCorrection', ]; public function __construct(array $config) diff --git a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php new file mode 100644 index 00000000..bea482c7 --- /dev/null +++ b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php @@ -0,0 +1,46 @@ +mockRequest([ + 'path' => '/projects/2/corrections', + 'method' => 'get', + 'response' => '{ + "data": [ + { + "data": { + "id": 190695, + "text": "This string has been corrected", + "pluralCategoryName": "few", + "user": { + "id": 19, + "username": "john_doe", + "fullName": "John Smith", + "avatarUrl": "" + }, + "createdAt": "2019-09-23T11:26:54+00:00" + } + } + ], + "pagination": { + "offset": 0, + "limit": 25 + } + }', + ]); + + $corrections = $this->crowdin->stringCorrection->list(2); + + $this->assertInstanceOf(ModelCollection::class, $corrections); + $this->assertCount(1, $corrections); + $this->assertInstanceOf(StringCorrection::class, $corrections[0]); + $this->assertEquals(190695, $corrections[0]->getId()); + } +} From ce04a82b8a0fe6b5cd9fa4eaf86f6baf1e197ce9 Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:18:40 -0400 Subject: [PATCH 3/7] add `StringCorrectionApi::get` --- .../Api/Enterprise/StringCorrectionApi.php | 17 ++++++++++++ .../Enterprise/StringCorrectionApiTest.php | 27 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php index c0c691e7..7ae05c62 100644 --- a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php +++ b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php @@ -32,4 +32,21 @@ public function list(int $projectId, array $params = []): ModelCollection $path = sprintf('projects/%d/corrections', $projectId); return $this->_list($path, StringCorrection::class, $params); } + + /** + * Get Correction + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/String-Corrections/operation/api.projects.corrections.get API Documentation + * + * @param int $projectId + * @param int $correctionId + * @param array $params + * integer $params[denormalizePlaceholders] default: 0 + * + * @return StringCorrection|null + */ + public function get(int $projectId, int $correctionId, array $params = []): ?StringCorrection + { + $path = sprintf('projects/%d/corrections/%d', $projectId, $correctionId); + return $this->_get($path, StringCorrection::class, $params); + } } diff --git a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php index bea482c7..58065ecc 100644 --- a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php +++ b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php @@ -43,4 +43,31 @@ public function testList(): void $this->assertInstanceOf(StringCorrection::class, $corrections[0]); $this->assertEquals(190695, $corrections[0]->getId()); } + + public function testGet(): void + { + $this->mockRequestGet( + '/projects/2/corrections/190695', + '{ + "data": { + "id": 190695, + "text": "This string has been corrected", + "pluralCategoryName": "few", + "user": { + "id": 19, + "username": "john_doe", + "fullName": "John Smith", + "avatarUrl": "" + }, + "createdAt": "2019-09-23T11:26:54+00:00" + } + }' + ); + + $correction = $this->crowdin->stringCorrection->get(2, 190695); + + $this->assertInstanceOf(StringCorrection::class, $correction); + $this->assertEquals(190695, $correction->getId()); + $this->assertEquals('This string has been corrected', $correction->getText()); + } } From 16ef30284f023d922c1a1c0603bc21d4cddacc5a Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:19:11 -0400 Subject: [PATCH 4/7] add `StringCorrectionApi::create` --- .../Api/Enterprise/StringCorrectionApi.php | 18 ++++++++++ .../Enterprise/StringCorrectionApiTest.php | 35 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php index 7ae05c62..a98ab896 100644 --- a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php +++ b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php @@ -49,4 +49,22 @@ public function get(int $projectId, int $correctionId, array $params = []): ?Str $path = sprintf('projects/%d/corrections/%d', $projectId, $correctionId); return $this->_get($path, StringCorrection::class, $params); } + + /** + * Add Correction + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/String-Corrections/operation/api.projects.corrections.post API Documentation + * + * @param int $projectId + * @param array $data + * integer $data[stringId] required
+ * string $data[text] required
+ * string $data[pluralCategoryName] + * + * @return StringCorrection|null + */ + public function create(int $projectId, array $data): ?StringCorrection + { + $path = sprintf('projects/%d/corrections', $projectId); + return $this->_create($path, StringCorrection::class, $data); + } } diff --git a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php index 58065ecc..278330ae 100644 --- a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php +++ b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php @@ -70,4 +70,39 @@ public function testGet(): void $this->assertEquals(190695, $correction->getId()); $this->assertEquals('This string has been corrected', $correction->getText()); } + + public function testCreate(): void + { + $params = [ + 'stringId' => 123, + 'text' => 'Corrected string text', + 'pluralCategoryName' => 'few', + ]; + + $this->mockRequest([ + 'path' => '/projects/2/corrections', + 'method' => 'post', + 'body' => json_encode($params), + 'response' => '{ + "data": { + "id": 190696, + "text": "Corrected string text", + "pluralCategoryName": "few", + "user": { + "id": 19, + "username": "john_doe", + "fullName": "John Smith", + "avatarUrl": "" + }, + "createdAt": "2019-09-23T11:26:54+00:00" + } + }', + ]); + + $correction = $this->crowdin->stringCorrection->create(2, $params); + + $this->assertInstanceOf(StringCorrection::class, $correction); + $this->assertEquals(190696, $correction->getId()); + $this->assertEquals('Corrected string text', $correction->getText()); + } } From 40c0e2283f0cbc5eb026c418a6dbb2d69627611a Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:21:59 -0400 Subject: [PATCH 5/7] add `StringCorrectionApi::restore` --- .../Api/Enterprise/StringCorrectionApi.php | 14 ++++++++++ .../Enterprise/StringCorrectionApiTest.php | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php index a98ab896..af6b1818 100644 --- a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php +++ b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php @@ -67,4 +67,18 @@ public function create(int $projectId, array $data): ?StringCorrection $path = sprintf('projects/%d/corrections', $projectId); return $this->_create($path, StringCorrection::class, $data); } + + /** + * Restore Correction + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/String-Corrections/operation/api.projects.corrections.put API Documentation + * + * @param int $projectId + * @param int $correctionId + * @return StringCorrection|null + */ + public function restore(int $projectId, int $correctionId): ?StringCorrection + { + $path = sprintf('projects/%d/corrections/%d', $projectId, $correctionId); + return $this->_put($path, StringCorrection::class, []); + } } diff --git a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php index 278330ae..779e9625 100644 --- a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php +++ b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php @@ -105,4 +105,31 @@ public function testCreate(): void $this->assertEquals(190696, $correction->getId()); $this->assertEquals('Corrected string text', $correction->getText()); } + + public function testRestore(): void + { + $this->mockRequest([ + 'path' => '/projects/2/corrections/190695', + 'method' => 'put', + 'response' => '{ + "data": { + "id": 190695, + "text": "This string has been corrected", + "pluralCategoryName": "few", + "user": { + "id": 19, + "username": "john_doe", + "fullName": "John Smith", + "avatarUrl": "" + }, + "createdAt": "2019-09-23T11:26:54+00:00" + } + }', + ]); + + $correction = $this->crowdin->stringCorrection->restore(2, 190695); + + $this->assertInstanceOf(StringCorrection::class, $correction); + $this->assertEquals(190695, $correction->getId()); + } } From 32b62dd42ecf08ef92b03f5617423157e48f43e4 Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:24:36 -0400 Subject: [PATCH 6/7] add `StringCorrectionApi::delete` --- .../Api/Enterprise/StringCorrectionApi.php | 14 ++++++++++++++ .../Api/Enterprise/StringCorrectionApiTest.php | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php index af6b1818..cce0bfee 100644 --- a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php +++ b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php @@ -81,4 +81,18 @@ public function restore(int $projectId, int $correctionId): ?StringCorrection $path = sprintf('projects/%d/corrections/%d', $projectId, $correctionId); return $this->_put($path, StringCorrection::class, []); } + + /** + * Delete Correction + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/String-Corrections/operation/api.projects.corrections.delete API Documentation + * + * @param int $projectId + * @param int $correctionId + * @return mixed + */ + public function delete(int $projectId, int $correctionId) + { + $path = sprintf('projects/%d/corrections/%d', $projectId, $correctionId); + return $this->_delete($path); + } } diff --git a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php index 779e9625..d98e5f52 100644 --- a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php +++ b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php @@ -132,4 +132,10 @@ public function testRestore(): void $this->assertInstanceOf(StringCorrection::class, $correction); $this->assertEquals(190695, $correction->getId()); } + + public function testDelete(): void + { + $this->mockRequestDelete('/projects/2/corrections/190695'); + $this->crowdin->stringCorrection->delete(2, 190695); + } } From 7d7c77c554474b6f71fe021572764697ddd3ff66 Mon Sep 17 00:00:00 2001 From: Paul DelRe Date: Fri, 3 Oct 2025 10:39:28 -0400 Subject: [PATCH 7/7] add `StringCorrectionApi::deleteAll` --- .../Api/Enterprise/StringCorrectionApi.php | 14 ++++++++++++++ .../Api/Enterprise/StringCorrectionApiTest.php | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php index cce0bfee..d7f7cd5b 100644 --- a/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php +++ b/src/CrowdinApiClient/Api/Enterprise/StringCorrectionApi.php @@ -95,4 +95,18 @@ public function delete(int $projectId, int $correctionId) $path = sprintf('projects/%d/corrections/%d', $projectId, $correctionId); return $this->_delete($path); } + + /** + * Delete Corrections + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/String-Corrections/operation/api.projects.corrections.deleteMany API Documentation + * + * @param int $projectId + * @param int $stringId + * @return mixed + */ + public function deleteAll(int $projectId, int $stringId) + { + $path = sprintf('projects/%d/corrections', $projectId); + return $this->_delete($path, ['stringId' => $stringId]); + } } diff --git a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php index d98e5f52..cb6feeef 100644 --- a/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php +++ b/tests/CrowdinApiClient/Api/Enterprise/StringCorrectionApiTest.php @@ -138,4 +138,10 @@ public function testDelete(): void $this->mockRequestDelete('/projects/2/corrections/190695'); $this->crowdin->stringCorrection->delete(2, 190695); } + + public function testDeleteAll(): void + { + $this->mockRequestDelete('/projects/2/corrections?stringId=123'); + $this->crowdin->stringCorrection->deleteAll(2, 123); + } }