From 388fe545582d2f005b1733827cce3ed008f1b47f Mon Sep 17 00:00:00 2001 From: aditya Date: Wed, 19 Feb 2025 18:04:01 +0100 Subject: [PATCH 1/2] chore: add batch users support --- src/batch_operations.ts | 37 ++++++++++++++++++++++++++++ src/client.ts | 14 +++++++++-- test/integration/node/client_test.js | 32 +++++++++++++++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/batch_operations.ts b/src/batch_operations.ts index d708570a..0aa5c684 100644 --- a/src/batch_operations.ts +++ b/src/batch_operations.ts @@ -1,5 +1,6 @@ import { StreamClient, APIResponse, DefaultGenerics } from './client'; import utils from './utils'; +import { StreamUser } from './user'; type BaseFollowRelation = { source: string; @@ -84,9 +85,45 @@ function unfollowMany(this: StreamClient, unfollows: UnfollowRelation[]) { token: this.getOrCreateToken(), }); } +export type AddUsersResponse = APIResponse & { + created_users: StreamUser[]; +}; + +export type GetUsersResponse = APIResponse & { + users: StreamUser[]; +}; + +function addUsers(this: StreamClient, users: StreamUser[], overrideExisting: boolean = false) { + return this.post({ + url: 'users/', + body: { + users, + override: overrideExisting, + }, + token: this.getOrCreateToken(), + }); +} + +function getUsers(this: StreamClient, ids: string[]) { + return this.get({ + url: 'users/', + qs: { ids: ids.join(',') }, + token: this.getOrCreateToken(), + }); +} +function deleteUsers(this: StreamClient, ids: string[]) { + return this.delete({ + url: 'users/', + qs: { ids: ids.join(',') }, + token: this.getOrCreateToken(), + }); +} export default { addToMany, followMany, unfollowMany, + addUsers, + getUsers, + deleteUsers, }; diff --git a/src/client.ts b/src/client.ts index b8f8c88e..73bbab46 100644 --- a/src/client.ts +++ b/src/client.ts @@ -16,7 +16,12 @@ import { StreamUser } from './user'; import { JWTScopeToken, JWTUserSessionToken } from './signing'; import { FeedError, StreamApiError, SiteError } from './errors'; import utils from './utils'; -import BatchOperations, { FollowRelation, UnfollowRelation } from './batch_operations'; +import BatchOperations, { + AddUsersResponse, + FollowRelation, + GetUsersResponse, + UnfollowRelation, +} from './batch_operations'; import createRedirectUrl from './redirect_url'; import { StreamFeed, @@ -188,7 +193,9 @@ export class StreamClient Promise; // eslint-disable-line no-use-before-define unfollowMany?: (this: StreamClient, unfollows: UnfollowRelation[]) => Promise; // eslint-disable-line no-use-before-define createRedirectUrl?: (this: StreamClient, targetUrl: string, userId: string, events: unknown[]) => string; // eslint-disable-line no-use-before-define - + addUsers?: (this: StreamClient, users: StreamUser[], overrideExisting: boolean) => Promise; // eslint-disable-line no-use-before-define + getUsers?: (this: StreamClient, ids: string[]) => Promise; // eslint-disable-line no-use-before-define + deleteUsers?: (this: StreamClient, ids: string[]) => Promise; // eslint-disable-line no-use-before-define /** * Initialize a client * @link https://getstream.io/activity-feeds/docs/node/#setup @@ -286,6 +293,9 @@ export class StreamClient { + expect(response.created_users.length).to.be(2); + return this.client.getUsers([id1, id2]).then((getUsersRes) => { + expect(getUsersRes.users.length).to.be(2); + getUsersRes.users.forEach((user) => { + expect(user.data).to.eql(users.find((u) => u.id === user.id).data); + }); + }); + }) + .then(() => { + // delete users + return this.client.deleteUsers([id1, id2]).then((response) => { + return this.client.getUsers([id1, id2]).then((getUsersRes) => { + expect(getUsersRes.users.length).to.be(0); + }); + }); + }); + }); + it('supports batch following', function () { const follows = [ { From b93162840964750b3db9a485bd8a7a0c2b5a4785 Mon Sep 17 00:00:00 2001 From: aditya Date: Wed, 19 Feb 2025 18:42:23 +0100 Subject: [PATCH 2/2] chore: remove unused var --- test/integration/node/client_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/node/client_test.js b/test/integration/node/client_test.js index 8603fad4..e2cf4308 100644 --- a/test/integration/node/client_test.js +++ b/test/integration/node/client_test.js @@ -239,7 +239,7 @@ describe('[INTEGRATION] Stream client (Node)', function () { }) .then(() => { // delete users - return this.client.deleteUsers([id1, id2]).then((response) => { + return this.client.deleteUsers([id1, id2]).then(() => { return this.client.getUsers([id1, id2]).then((getUsersRes) => { expect(getUsersRes.users.length).to.be(0); });