Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions src/batch_operations.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { StreamClient, APIResponse, DefaultGenerics } from './client';
import utils from './utils';
import { StreamUser } from './user';

type BaseFollowRelation = {
source: string;
Expand Down Expand Up @@ -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<AddUsersResponse>({
url: 'users/',
body: {
users,
override: overrideExisting,
},
token: this.getOrCreateToken(),
});
}

function getUsers(this: StreamClient, ids: string[]) {
return this.get<GetUsersResponse>({
url: 'users/',
qs: { ids: ids.join(',') },
token: this.getOrCreateToken(),
});
}
function deleteUsers(this: StreamClient, ids: string[]) {
return this.delete<string[]>({
url: 'users/',
qs: { ids: ids.join(',') },
token: this.getOrCreateToken(),
});
}

export default {
addToMany,
followMany,
unfollowMany,
addUsers,
getUsers,
deleteUsers,
};
14 changes: 12 additions & 2 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -188,7 +193,9 @@ export class StreamClient<StreamFeedGenerics extends DefaultGenerics = DefaultGe
followMany?: (this: StreamClient, follows: FollowRelation[], activityCopyLimit?: number) => Promise<APIResponse>; // eslint-disable-line no-use-before-define
unfollowMany?: (this: StreamClient, unfollows: UnfollowRelation[]) => Promise<APIResponse>; // 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<AddUsersResponse>; // eslint-disable-line no-use-before-define
getUsers?: (this: StreamClient, ids: string[]) => Promise<GetUsersResponse>; // eslint-disable-line no-use-before-define
deleteUsers?: (this: StreamClient, ids: string[]) => Promise<string[]>; // eslint-disable-line no-use-before-define
/**
* Initialize a client
* @link https://getstream.io/activity-feeds/docs/node/#setup
Expand Down Expand Up @@ -286,6 +293,9 @@ export class StreamClient<StreamFeedGenerics extends DefaultGenerics = DefaultGe
this.followMany = BatchOperations.followMany;
this.unfollowMany = BatchOperations.unfollowMany;
this.createRedirectUrl = createRedirectUrl;
this.addUsers = BatchOperations.addUsers;
this.getUsers = BatchOperations.getUsers;
this.deleteUsers = BatchOperations.deleteUsers;
}
}

Expand Down
32 changes: 31 additions & 1 deletion test/integration/node/client_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import expect from 'expect.js';
import { connect } from '../../../src';
import * as errors from '../../../src/errors';

import { init, beforeEachFn } from '../utils/hooks';
import { init, beforeEachFn, randUserId } from '../utils/hooks';

describe('[INTEGRATION] Stream client (Node)', function () {
init.call(this);
Expand Down Expand Up @@ -217,6 +217,36 @@ describe('[INTEGRATION] Stream client (Node)', function () {
});
});

it('add multiple users', function () {
const id1 = randUserId('user1');
const id2 = randUserId('user2');

const users = [
{ id: id1, data: { name: 'u1' } },
{ id: id2, data: { name: 'u2' } },
];

return this.client
.addUsers(users, true)
.then((response) => {
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 = [
{
Expand Down