Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: users package #845

Merged
merged 1 commit into from
Aug 14, 2023
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
5 changes: 5 additions & 0 deletions jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ const config: Config.InitialOptions = {
testMatch: ['<rootDir>/packages/subaccounts/__tests__/**/*.test.ts'],
coveragePathIgnorePatterns: ['node_modules', '__tests__'],
},
{
displayName: 'USER',
testMatch: ['<rootDir>/packages/user/__tests__/**/*.test.ts'],
coveragePathIgnorePatterns: ['node_modules', '__tests__'],
},
{
displayName: 'VERIFY',
testMatch: ['<rootDir>/packages/verify/__tests__/**/*.test.ts'],
Expand Down
71 changes: 71 additions & 0 deletions packages/user/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Vonage Users SDK for Node.js

![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/Vonage/vonage-node-sdk/ci.yml?branch=3.x) [![Codecov](https://img.shields.io/codecov/c/github/vonage/vonage-node-sdk?label=Codecov&logo=codecov&style=flat-square)](https://codecov.io/gh/Vonage/vonage-server-sdk) ![Latest Release](https://img.shields.io/github/v/release/vonage/vonage-node-sdk?logo=npm&style=flat-square) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg?style=flat-square)](../../CODE_OF_CONDUCT.md) [![License](https://img.shields.io/npm/l/@vonage/server-sdk?label=License&style=flat-square)](../../LICENSE.TXT)

<img src="https://developer.nexmo.com/images/logos/vbc-logo.svg" height="48px" alt="Vonage" />

This is the Vonage Users SDK for Node.js for use with [Vonage APIs](https://www.vonage.com/). To use it you will need a Vonage account. Sign up [for free][signup] at vonage.com.

For full API documentation refer to [developer.nexmo.com](https://developer.nexmo.com/).

* [Installation](#installation)
* [Usage](#usage)
* [Promises](#promises)

## Installation

### With NPM

```bash
npm install @vonage/users
```

### With Yarn

```bash
yarn add @vonage/users
```

## Usage

The SDK can be used standalone from the main [Vonage Server SDK for Node.js](https://github.com/vonage/vonage-node-sdk)
if you only need to use the Users API. All you need to do
is `require('@vonage/users')`, and use the returned object to create your own
client.

```js
const {Auth} = require('@vonage/auth');
const {User} = require('@vonage/user');

const usersClient = new User(new Auth({
apiKey: API_KEY,
apiSecret: API_SECRET,
applicationId: APP_ID,
privateKey: PRIVATE_KEY_PATH,
}), options);
```

## Promises

Most methods that interact with the Vonage API uses Promises. You can either resolve these yourself, or use `await` to
wait for a response.

```js
const resp = await usersClient.getUser(USER_ID);

usersClient.getUser(USER_ID)
.then(resp => console.log(resp))
.catch(err => console.error(err));
```

## Testing

Run:

```bash
npm run test
```

[signup]: https://dashboard.nexmo.com/sign-up?utm_source=DEV_REL&utm_medium=github&utm_campaign=node-server-sdk

[license]: https://github.com/Vonage/vonage-node-sdk/blob/3.x/LICENSE.txt
62 changes: 62 additions & 0 deletions packages/user/__tests__/__dataSets__/create.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { UserResponse } from '../../lib';

import { BASE_URL, testUser, testUserOne, userToApi } from '../common';

const createUser = userToApi(testUser);
delete createUser.id;
export default [
{
label: 'create simple user',
requests: [
[
`/v1/users`,
'POST',
{
name: testUserOne.name,
},
],
],
responses: [
[
200,
{
...userToApi(testUserOne),
id: testUserOne.id,
_links: {
self: {
href: `${BASE_URL}/v1/users/${testUserOne.id}`,
},
},
} as UserResponse,
],
],
clientMethod: 'createUser',
parameters: [testUserOne],
generator: false,
error: false,
expected: testUserOne,
},
{
label: 'create user',
requests: [[`/v1/users`, 'POST', createUser]],
responses: [
[
200,
{
...userToApi(testUser),
id: testUser.id,
_links: {
self: {
href: `${BASE_URL}/v1/users/${testUser.id}`,
},
},
} as UserResponse,
],
],
clientMethod: 'createUser',
parameters: [testUser],
generator: false,
error: false,
expected: testUser,
},
];
14 changes: 14 additions & 0 deletions packages/user/__tests__/__dataSets__/delete.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { testUser } from '../common';

export default [
{
label: 'delete simple user',
requests: [[`/v1/users/${testUser.id}`, 'DELETE']],
responses: [[204]],
clientMethod: 'deleteUser',
parameters: [testUser.id],
generator: false,
error: false,
expected: undefined,
},
];
44 changes: 44 additions & 0 deletions packages/user/__tests__/__dataSets__/get.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { Client } from '@vonage/server-client';
import { UserResponse } from '../../lib';

import { BASE_URL, testUser } from '../common';

export default [
{
label: 'get user',
requests: [[`/v1/users/${testUser.id}`, 'GET']],
responses: [
[
200,
{
...Client.transformers.snakeCaseObjectKeys(testUser, true),
properties: {
custom_data: {
...testUser.properties?.customData,
},
},
channels: {
...testUser.channels,
websocket: [
{
'content-type': testUser.channels?.websocket[0].contentType,
headers: testUser.channels?.websocket[0].headers,
uri: testUser.channels?.websocket[0].uri,
},
],
},
_links: {
self: {
href: `${BASE_URL}/v1/users/${testUser.id}`,
},
},
} as UserResponse,
],
],
clientMethod: 'getUser',
parameters: [testUser.id],
generator: false,
error: false,
expected: testUser,
},
];
28 changes: 28 additions & 0 deletions packages/user/__tests__/__dataSets__/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import userTests from './get';
import listTests from './list';
import createTests from './create';
import updateTests from './put';
import deleteTests from './delete';

export default [
{
label: 'Get User',
tests: userTests,
},
{
label: 'List Users',
tests: listTests,
},
{
label: 'Create User',
tests: createTests,
},
{
label: 'Update User',
tests: updateTests,
},
{
label: 'Delete User',
tests: deleteTests,
},
];
163 changes: 163 additions & 0 deletions packages/user/__tests__/__dataSets__/list.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
import { Client } from '@vonage/server-client';
import {
UserType,
UserPageResponse,
UserListParameters,
SortOrder,
} from '../../lib';

import {
BASE_URL,
testUser,
testUserOne,
testUserTwo,
userToApi,
} from '../common';

export default [
{
label: 'get one page',
requests: [[`/v1/users?`, 'GET']],
responses: [
[
200,
{
page_size: 100,
_embedded: {
users: [
userToApi(testUser),
userToApi(testUserOne),
userToApi(testUserTwo),
],
},
_links: {
self: {
href: `${BASE_URL}/v1/users`,
},
},
} as UserPageResponse,
],
],
clientMethod: 'getUserPage',
parameters: [],
generator: false,
error: false,
expected: {
page_size: 100,
_embedded: {
users: [
userToApi(testUser),
userToApi(testUserOne),
userToApi(testUserTwo),
],
},
_links: {
self: {
href: `${BASE_URL}/v1/users`,
},
},
},
},
{
label: 'get one page with params',
requests: [
[`/v1/users?page_size=1&order=ASC&cursor=foo&name=user_one`, 'GET'],
],
responses: [
[
200,
{
page_size: 1,
_embedded: {
users: [userToApi(testUser)],
},
_links: {
self: {
href: `${BASE_URL}v1/users`,
},
},
} as UserPageResponse,
],
],
clientMethod: 'getUserPage',
parameters: [
{
pageSize: 1,
order: SortOrder.ASC,
cursor: 'foo',
name: 'user_one',
} as UserListParameters,
],
generator: false,
error: false,
expected: {
page_size: 1,
_embedded: {
users: [userToApi(testUser)],
},
_links: {
self: {
href: `${BASE_URL}v1/users`,
},
},
},
},
{
label: 'get all pages',
requests: [
[`/v1/users?`, 'GET'],
[`/v1/users?cursor=fizz`, 'GET'],
],
responses: [
[
200,
{
_embedded: {
users: [userToApi(testUser), userToApi(testUserOne)],
},
_links: {
self: {
href: `${BASE_URL}v1/users`,
},
next: {
href: `${BASE_URL}v1/users?cursor=fizz`,
},
},
} as UserPageResponse,
],
[
200,
{
_embedded: {
users: [userToApi(testUserTwo)],
},
_links: {
self: {
href: `${BASE_URL}v1/users`,
},
prev: {
href: `${BASE_URL}v1/users?`,
},
},
} as UserPageResponse,
],
],
clientMethod: 'listAllUsers',
parameters: [],
generator: true,
error: false,
expected: [
{
...Client.transformers.camelCaseObjectKeys(testUser, true, true),
properties: {
customData: testUser.properties?.customData,
},
channels: {
...testUser.channels,
},
} as UserType,
Client.transformers.camelCaseObjectKeys(testUserOne, true, true),
Client.transformers.camelCaseObjectKeys(testUserTwo, true, true),
],
},
];
Loading