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(() => { + return this.client.getUsers([id1, id2]).then((getUsersRes) => { + expect(getUsersRes.users.length).to.be(0); + }); + }); + }); + }); + it('supports batch following', function () { const follows = [ {