From 47d76bfd4696f0d0fbd4aa2afd7a4ec6207e238e Mon Sep 17 00:00:00 2001 From: Federico Ruggi Date: Mon, 17 Sep 2018 12:00:47 +0200 Subject: [PATCH 1/6] add support for get activities endpoint --- lib/GetStream/Stream/Client.php | 27 ++++++++++ .../Stream/GetActivitiesOperation.php | 51 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 lib/GetStream/Stream/GetActivitiesOperation.php diff --git a/lib/GetStream/Stream/Client.php b/lib/GetStream/Stream/Client.php index 7b1dfa7..5475f78 100644 --- a/lib/GetStream/Stream/Client.php +++ b/lib/GetStream/Stream/Client.php @@ -202,6 +202,33 @@ public function updateActivity($activity) return $this->updateActivities([$activity]); } + private function getActivities($data) { + $token = $this->signer->jwtScopeToken('*', 'activities', '*'); + $getActivitiesOp = new GetActivitiesOperation($this, $this->api_key, $token); + return $getActivitiesOp->getActivities($data); + } + + /** + * Retrieves activities for the current app having the given IDs. + * @param array $ids + * @return mixed + */ + public function getActivitiesById($ids = []) + { + return $this->getAppActivities(['ids' => $ids]); + } + + /** + * Retrieves activities for the current app having the given foreign IDs and time combinations. The two arrays must have the same length. + * @param array $foreignIds + * @param array $timestamps + * @return mixed + */ + public function getActivitiesByForeignId($foreignIds = [], $timestamps = []) + { + return $this->getAppActivities(['foreign_ids' => $foreignIds, 'timestamps' => $timestamps]); + } + /** * Creates a redirect url for tracking the given events in the context of diff --git a/lib/GetStream/Stream/GetActivitiesOperation.php b/lib/GetStream/Stream/GetActivitiesOperation.php new file mode 100644 index 0000000..ea6d2e6 --- /dev/null +++ b/lib/GetStream/Stream/GetActivitiesOperation.php @@ -0,0 +1,51 @@ +client = $client; + $this->api_key = $api_key; + $this->token = $token; + } + + /** + * @param string $resource + * @param string $action + * + * @return array + */ + protected function getHttpRequestHeaders($resource, $action) + { + $headers = parent::getHttpRequestHeaders($resource, $action); + $headers['Authorization'] = $this->token; + + return $headers; + } + + public function getActivities($data = []) + { + if (empty($activities)) { + return; + } + + $params = []; + foreach ($hash as $key => $value) { + array_push($params, implode(',', $value)); + } + + return $this->makeHttpRequest('activities/', 'GET', [], params); + } +} From 86c601197a74f3b3e41d621519b44ba65296530f Mon Sep 17 00:00:00 2001 From: Federico Ruggi Date: Mon, 17 Sep 2018 13:41:48 +0200 Subject: [PATCH 2/6] adjust impl and test --- lib/GetStream/Stream/Client.php | 22 +++++++++++++------ ...tion.php => GetAppActivitiesOperation.php} | 14 +++++------- tests/integration/FeedTest.php | 14 ++++++++++++ 3 files changed, 34 insertions(+), 16 deletions(-) rename lib/GetStream/Stream/{GetActivitiesOperation.php => GetAppActivitiesOperation.php} (75%) diff --git a/lib/GetStream/Stream/Client.php b/lib/GetStream/Stream/Client.php index 5475f78..136b505 100644 --- a/lib/GetStream/Stream/Client.php +++ b/lib/GetStream/Stream/Client.php @@ -202,10 +202,10 @@ public function updateActivity($activity) return $this->updateActivities([$activity]); } - private function getActivities($data) { + private function getAppActivities($data) { $token = $this->signer->jwtScopeToken('*', 'activities', '*'); - $getActivitiesOp = new GetActivitiesOperation($this, $this->api_key, $token); - return $getActivitiesOp->getActivities($data); + $getAppActivitiesOp = new GetAppActivitiesOperation($this, $this->api_key, $token); + return $getAppActivitiesOp->getAppActivities($data); } /** @@ -219,13 +219,21 @@ public function getActivitiesById($ids = []) } /** - * Retrieves activities for the current app having the given foreign IDs and time combinations. The two arrays must have the same length. - * @param array $foreignIds - * @param array $timestamps + * Retrieves activities for the current app having the given list of [foreign ID, time] elements. + * @param array $foreignIdTimes * @return mixed */ - public function getActivitiesByForeignId($foreignIds = [], $timestamps = []) + public function getActivitiesByForeignId($foreignIdTimes = []) { + $foreignIds = []; + $timestamps = []; + foreach ($foreignIdTimes as $fidTime) { + if (count($fidTime) != 2) { + throw new Exception('malformed foreign ID and time combination'); + } + array_push($foreignIds, $fidTime[0]); + array_push($timestamps, $fidTime[1]); + } return $this->getAppActivities(['foreign_ids' => $foreignIds, 'timestamps' => $timestamps]); } diff --git a/lib/GetStream/Stream/GetActivitiesOperation.php b/lib/GetStream/Stream/GetAppActivitiesOperation.php similarity index 75% rename from lib/GetStream/Stream/GetActivitiesOperation.php rename to lib/GetStream/Stream/GetAppActivitiesOperation.php index ea6d2e6..2f4ff8a 100644 --- a/lib/GetStream/Stream/GetActivitiesOperation.php +++ b/lib/GetStream/Stream/GetAppActivitiesOperation.php @@ -2,7 +2,7 @@ namespace GetStream\Stream; -class GetActivitiesOperation extends Feed +class GetAppActivitiesOperation extends Feed { /** * @var string @@ -35,17 +35,13 @@ protected function getHttpRequestHeaders($resource, $action) return $headers; } - public function getActivities($data = []) + public function getAppActivities($data = []) { - if (empty($activities)) { - return; - } - $params = []; - foreach ($hash as $key => $value) { - array_push($params, implode(',', $value)); + foreach ($data as $key => $value) { + $params[$key] = implode(',', $value); } - return $this->makeHttpRequest('activities/', 'GET', [], params); + return $this->makeHttpRequest('activities/', 'GET', [], $params); } } diff --git a/tests/integration/FeedTest.php b/tests/integration/FeedTest.php index 7b272c7..c1faee4 100644 --- a/tests/integration/FeedTest.php +++ b/tests/integration/FeedTest.php @@ -631,4 +631,18 @@ public function testUpdateActivitiesWithZeroActivitiesShouldNotFail() { $this->client->updateActivities([]); } + + public function testGetAppActivities() + { + $fid = Uuid::uuid4(); + $time = '2006-01-02T15:04:05.999999999'; + $resp = $this->client->feed('flat', Uuid::uuid4())->addActivity( + ['actor'=>'bob', 'verb'=>'does', 'object'=>'something', 'foreign_id'=>$fid, 'time'=>$time] + ); + $id = $resp['id']; + + $resp = $this->client->getActivitiesById([$id]); + $this->assertCount(1, $resp['results']); + $this->assertSame($resp['results'][0]['id'], $id); + } } From 90da942c792692b227928b72e09c756f118dc184 Mon Sep 17 00:00:00 2001 From: Federico Ruggi Date: Mon, 17 Sep 2018 15:09:08 +0200 Subject: [PATCH 3/6] unify all activities operations --- ...sOperation.php => ActivitiesOperation.php} | 11 ++++- .../Stream/ActivityUpdateOperation.php | 46 ------------------- lib/GetStream/Stream/Client.php | 8 ++-- 3 files changed, 14 insertions(+), 51 deletions(-) rename lib/GetStream/Stream/{GetAppActivitiesOperation.php => ActivitiesOperation.php} (79%) delete mode 100644 lib/GetStream/Stream/ActivityUpdateOperation.php diff --git a/lib/GetStream/Stream/GetAppActivitiesOperation.php b/lib/GetStream/Stream/ActivitiesOperation.php similarity index 79% rename from lib/GetStream/Stream/GetAppActivitiesOperation.php rename to lib/GetStream/Stream/ActivitiesOperation.php index 2f4ff8a..4e00004 100644 --- a/lib/GetStream/Stream/GetAppActivitiesOperation.php +++ b/lib/GetStream/Stream/ActivitiesOperation.php @@ -2,7 +2,7 @@ namespace GetStream\Stream; -class GetAppActivitiesOperation extends Feed +class ActivitiesOperation extends Feed { /** * @var string @@ -35,6 +35,15 @@ protected function getHttpRequestHeaders($resource, $action) return $headers; } + public function updateActivities($activities) + { + if (empty($activities)) { + return; + } + + return $this->makeHttpRequest('activities/', 'POST', compact('activities')); + } + public function getAppActivities($data = []) { $params = []; diff --git a/lib/GetStream/Stream/ActivityUpdateOperation.php b/lib/GetStream/Stream/ActivityUpdateOperation.php deleted file mode 100644 index 0fceeb4..0000000 --- a/lib/GetStream/Stream/ActivityUpdateOperation.php +++ /dev/null @@ -1,46 +0,0 @@ -client = $client; - $this->api_key = $api_key; - $this->token = $token; - } - - /** - * @param string $resource - * @param string $action - * - * @return array - */ - protected function getHttpRequestHeaders($resource, $action) - { - $headers = parent::getHttpRequestHeaders($resource, $action); - $headers['Authorization'] = $this->token; - - return $headers; - } - - public function updateActivities($activities) - { - if (empty($activities)) { - return; - } - - return $this->makeHttpRequest('activities/', 'POST', compact('activities')); - } -} diff --git a/lib/GetStream/Stream/Client.php b/lib/GetStream/Stream/Client.php index 136b505..ab9ae89 100644 --- a/lib/GetStream/Stream/Client.php +++ b/lib/GetStream/Stream/Client.php @@ -193,8 +193,8 @@ public function updateActivities($activities) } $token = $this->signer->jwtScopeToken('*', 'activities', '*'); - $activityUpdateOp = new ActivityUpdateOperation($this, $this->api_key, $token); - return $activityUpdateOp->updateActivities($activities); + $op = new ActivitiesOperation($this, $this->api_key, $token); + return $op->updateActivities($activities); } public function updateActivity($activity) @@ -204,8 +204,8 @@ public function updateActivity($activity) private function getAppActivities($data) { $token = $this->signer->jwtScopeToken('*', 'activities', '*'); - $getAppActivitiesOp = new GetAppActivitiesOperation($this, $this->api_key, $token); - return $getAppActivitiesOp->getAppActivities($data); + $op = new ActivitiesOperation($this, $this->api_key, $token); + return $op->getAppActivities($data); } /** From 86b6b94d929439b3d793be9cc918cd87e69b7aba Mon Sep 17 00:00:00 2001 From: Federico Ruggi Date: Mon, 17 Sep 2018 16:35:32 +0200 Subject: [PATCH 4/6] add example --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bdd6757..2a8f164 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,10 @@ $response = $userFeed->addActivity($data); // Get the latest activities for this user's personal feed, based on who they are following. $response = $userFeed->getActivities(); +// Get activities directly by their ID or combination of foreign ID and time. +$response = $client->getActivitiesById(['74b9e88a-a684-4197-b30c-f5e568ef9ae2', '965f7ba5-8f1d-4fd1-a9ee-22d1a2832645']); +$response = $client->getActivitiesByForeignId(['fid:123', '2006-01-02T15:04:05.000000000'], ['fid:456', '2006-01-02T16:05:06.000000000']); + // The response will be the json decoded API response. // {"duration": 45ms, "next": "/api/v1.0/feed/...", "results": [...]} From 1aa0d7e9658185086817ede5733fff7acd31cfe5 Mon Sep 17 00:00:00 2001 From: Federico Ruggi Date: Mon, 17 Sep 2018 16:56:53 +0200 Subject: [PATCH 5/6] better tests for get app activities --- lib/GetStream/Stream/Client.php | 2 +- lib/GetStream/Stream/StreamClientException.php | 6 ++++++ tests/integration/FeedTest.php | 6 ++++++ tests/unit/ClientTest.php | 8 ++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 lib/GetStream/Stream/StreamClientException.php diff --git a/lib/GetStream/Stream/Client.php b/lib/GetStream/Stream/Client.php index ab9ae89..d3a0bf3 100644 --- a/lib/GetStream/Stream/Client.php +++ b/lib/GetStream/Stream/Client.php @@ -229,7 +229,7 @@ public function getActivitiesByForeignId($foreignIdTimes = []) $timestamps = []; foreach ($foreignIdTimes as $fidTime) { if (count($fidTime) != 2) { - throw new Exception('malformed foreign ID and time combination'); + throw new StreamClientException('malformed foreign ID and time combination'); } array_push($foreignIds, $fidTime[0]); array_push($timestamps, $fidTime[1]); diff --git a/lib/GetStream/Stream/StreamClientException.php b/lib/GetStream/Stream/StreamClientException.php new file mode 100644 index 0000000..e8ca6db --- /dev/null +++ b/lib/GetStream/Stream/StreamClientException.php @@ -0,0 +1,6 @@ +client->getActivitiesById([$id]); $this->assertCount(1, $resp['results']); $this->assertSame($resp['results'][0]['id'], $id); + + $resp = $this->client->getActivitiesByForeignId([ + [$fid, $resp['results'][0]['time']], + ]); + $this->assertCount(1, $resp['results']); + $this->assertSame($resp['results'][0]['id'], $id); } } diff --git a/tests/unit/ClientTest.php b/tests/unit/ClientTest.php index b46d86b..c2fd2c3 100644 --- a/tests/unit/ClientTest.php +++ b/tests/unit/ClientTest.php @@ -68,4 +68,12 @@ public function testEnvironmentVariable() putenv('STREAM_BASE_URL='.$previous); } } + + /** + * @expectedException \GetStream\Stream\StreamClientException + */ + public function testGetActivitiesByForeignIdException() { + $client = new Client('key', 'secret'); + $client->getActivitiesByForeignId([1, 2]); + } } From 49c110e2d6f2660497f0a5e6cfe112a0d399db8a Mon Sep 17 00:00:00 2001 From: Federico Ruggi Date: Tue, 18 Sep 2018 09:54:41 +0200 Subject: [PATCH 6/6] adjust test --- lib/GetStream/Stream/Client.php | 2 +- tests/unit/ClientTest.php | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/GetStream/Stream/Client.php b/lib/GetStream/Stream/Client.php index d3a0bf3..7ef50c7 100644 --- a/lib/GetStream/Stream/Client.php +++ b/lib/GetStream/Stream/Client.php @@ -228,7 +228,7 @@ public function getActivitiesByForeignId($foreignIdTimes = []) $foreignIds = []; $timestamps = []; foreach ($foreignIdTimes as $fidTime) { - if (count($fidTime) != 2) { + if (!is_array($fidTime) || count($fidTime) != 2) { throw new StreamClientException('malformed foreign ID and time combination'); } array_push($foreignIds, $fidTime[0]); diff --git a/tests/unit/ClientTest.php b/tests/unit/ClientTest.php index c2fd2c3..3de5b5f 100644 --- a/tests/unit/ClientTest.php +++ b/tests/unit/ClientTest.php @@ -72,8 +72,16 @@ public function testEnvironmentVariable() /** * @expectedException \GetStream\Stream\StreamClientException */ - public function testGetActivitiesByForeignIdException() { + public function testGetActivitiesByForeignIdExceptionNoArray() { $client = new Client('key', 'secret'); $client->getActivitiesByForeignId([1, 2]); } + + /** + * @expectedException \GetStream\Stream\StreamClientException + */ + public function testGetActivitiesByForeignIdExceptionMalformedArray() { + $client = new Client('key', 'secret'); + $client->getActivitiesByForeignId([[1, 2], [2, 3, 4]]); + } }