Skip to content

Commit

Permalink
feat: user package
Browse files Browse the repository at this point in the history
  • Loading branch information
manchuck committed Aug 10, 2023
1 parent 3398e96 commit 4fc5248
Show file tree
Hide file tree
Showing 37 changed files with 960 additions and 0 deletions.
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

0 comments on commit 4fc5248

Please sign in to comment.