# WiseAPI

[![npm version](https://img.shields.io/npm/v/wise-api)](https://www.npmjs.com/package/wise-api)
[![NPM](https://img.shields.io/npm/l/wise-api)](https://www.npmjs.com/package/wuise-api)
[![npm](https://img.shields.io/npm/dm/wise-api)](https://www.npmjs.com/package/wiseapi)
[![npm bundle size](https://img.shields.io/bundlephobia/min/wise-api)](https://www.npmjs.com/package/wise-api)

Biblioteca para o serviço de vídeoconferência segura para saúde, essa aplicação permite colocar em um sistema web já existente vídeo chamadas além de um controle de acesso complexo, onde você é possível delimitar ações dos usuários dependendo do seu papel. Para mais informações clique [aqui](https://wisecare.com.br).

## Sumário

  - [Features](#features)
  - [Instalação](#instalação)
  - [Example](#example)
  - [Client API](#client-api)


## Features

- Controle de organizações e unidades organizacionais
- Controle de usuários
- Funcionalidades dentro da conferências configuráveis
- Customização de interface configurável
- Gravação da videoconferência client-side e server-side
- Storage de vídeos gravados
- Criação de um manifesto de todas as ações ocorridas dentro da conferência
- Manifesto salvo em blockchain
- Integração com serviços de blockchain privadas
- Armazenamento de arquivos

## Instalação

Usando npm:

```bash
$ npm install wise-api
```

Usando yarn:

```bash
$ yarn add wise-api
```

<!-- Usando jsDelivr CDN (desativado):

```html
<script src="https://cdn.jsdelivr.net/gh/wiseapi/wiseapi@latest/wiseapi.min.js"></script>
``` -->

## Client API

A client API deve ser definida da seguinte forma para ser utilizada:

```javascript
import WiseApi from 'wise-api';
const wiseapi = WiseApi(options);
```

Options:
- apiKey: [opcional] chave da organização
- baseUrl: [opcional] url do servidor da API
- domain: [opcional] servidor de videoconferência
- login: [opcional] string de identificação para login no sistema
- password: [opcional] senha para login no sistema
- token: [opcional] token de acesso

Após o setup você estará disponível para accessar as classes que serão descritas abaixo.

#### ``Requisitar videoconferência``

Método responsável por criar uma sessão de 

```javascript
import WiseApi from 'wise-api';
const wiseapi = WiseApi({ apiKey: 'APIKEY' });

const data = {
  profile: 'DEFAULT',
  skin: 'DEFAULT',
  org: 'org',
  orgUnit: 'orgUnit',
  joinPolicy: 'PUBLIC',
  listPolicy: 'PUBLIC'
}

const session = wiseapi.session.create(data).then((response) => {
  console.log(response);
});
```

data: 
- org: Identificador da organização
- orgUnit: Identificador da unidade organizacional
- profile: Identificador do profile
- skin: Identificador do skin da conferência
- joinPolicy: [opcional] Para acessar (entrar), as seguintes políticas podem ser usadas:
  - ORG:  indica que a sessão somente pode acessada por algum usuário da organização
  - ORGUNIT:  somente pode acessada por usuários das unidades organizacionais listadas no atributo allowJoinOu
  - RESTRICT:  indica que a sessão somente pode ser acessada por usuários previamente cadastrados
  - PUBLIC: Indica que o acesso à sessão não requer um usuário credenciado 
  - SESSIONPWD: entra apenas informando a password da sessão
- listPolicy: [opcional] Define como a sessão é enxergada por usuários cadastrados ou públicos na internet. 
  - PUBLIC: a sessão pode aparecer em uma lista pública
  - SHARED: a sessão pode aparecer em uma lista apenas para usuários da organização
  - PRIVATE: a sessão nunca aparece em listas, exceto com autenticação de usuários e permissão verificada para listar
- password: [opcional] senha de acesso da sessão
- allowJoinOu: [opcional] array de unidades organizacionais

Retorno: 

```javascript
{
  id: 1
}
```

#### ``Iniciar videoconferência``

Método para iniciar a conferência em uma div do sistema que está sendo utilizado, esse método não está disponível se for executado utilizando node.

```javascript
import WiseApi from 'wise-api';
const wiseapi = WiseApi({ apiKey: 'APIKEY' });

const sessionName = 'skjdhfsjhbfw3fs';

const options = {
  parentNode: document.getElementById('meet'), 
  userInfo: { 
    displayName: 'Leoberto' 
  }
}

wiseapi.session.startConference(sessionName, options).then((response) => {
  console.log(response);
});
```

options
- parentNode: div html onde deverá ser colocado a videoconferência
- width: [opcional] tamanho em pixels da largura da tela de vídeo conferência
- height: [opcional] tamanho em pixels da altura tela de vídeo conferência
- startWithAudioMuted [opcional] booleano para iniciar com audio habilitado ou desabilitado
- startWithVideoMuted [opcional] booleano para iniciar com video habilitado ou desabilitado
- shareLink [opcional] link que será inserido no botão de compartilhar
- buttons [opcional] array de botões que serão exibidos na tela
- userInfo: [opcional] objeto com informações do usuário
  - displayName: [opcional] nome do usuário que será mostrado na tela
- onLoad [opcional] callback que será executado na abertura da sessão
- onClose [opcional] callback que será executado no encerramento da sessão
- onParticipantLeft [opcional] callback para quando um participante sai da conferência
- onModeratorReject [opcional] callback para quando o moderador rejeitar entrada

#### ``Encerrar videoconferência``

Método para encerrrar uma conferência, esse método não está disponível se for executado utilizando node e só terá efeito quando a conferência já estiver aberta.

```javascript
import WiseApi from 'wise-api';
const wiseapi = WiseApi({ apiKey: 'APIKEY' });

wiseapi.session.stopConference().then(() => {
  console.log('ok');
});
```

#### ``Listar videoconferências``

Método responsável por recuperar todas as sessões criadas.

```javascript
import WiseApi from 'wise-api';
const wiseapi = WiseApi({ apiKey: 'APIKEY' });

wiseapi.session.list().then((sessions) => {
  console.log(sessions);
});
```

Retorno:

```javascript
metadata: {
  offset: 0,
  items: 1,
  total: 1
},
records: [{
  id: 5,
  profile: 1,
  skin: 1,
  org: 9,
  orgUnit: 9,
  service: 15,
  status: "CLOSED",
  firstJoin: "2022-05-31T19:36:16.000Z",
  started: "2022-05-31T19:37:14.000Z",
  finished: "2022-05-31T19:37:55.369Z",
  short: "iwh6m725yn8t9ukz",
  joinPolicy: "PUBLIC",
  listPolicy: "PUBLIC",
  allowJoinOu: null,
  enabled: true,
  created: "2022-05-31T19:17:28.382Z",
  updated: "2022-05-31T19:37:55.374Z"
}]
```

#### ``Recuperar videoconferência``

Método responsável por recuperar informações de uma única sessão.

```javascript
const wiseapi = new WiseApi({ apiKey: 'APIKEY' });
const session = 'sks3lf6lhxqt2a1j';

wiseapi.session.get(sessionId).then((session) => {
  console.log(session);
});
```

Retorno:

```javascript
{
  id: 2,
  profile: 1,
  skin: 1,
  org: 1,
  orgUnit: 1,
  status: 'READY',
  firstJoin: null,
  started: null,
  finished: null,
  short: 'sks3lf6lhxqt2a1j',
  joinPolicy: 'PUBLIC',
  listPolicy: 'PUBLIC',
  allowJoinOu: null
}
```

#### ``Deletar videoconferência``

Método responsável por deletar uma sessão.

```javascript
const wiseapi = new WiseApi({ apiKey: 'APIKEY' });
const session = 'ksdh8127hdi872';

wiseapi.session.delete(session);
```

<!-- ### Organização

Sessões de conferência são criadas por usuários de uma organização. Esta entidade é a base que permite especialização futura para pessoa física ou pessoa jurídica. 

#### ``create(data)``

Método responsável por criar uma organização

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const data = {
  shortname: "organização",
  planId: 1,
  fullname: "organizacao LTDA",
  alias: "organizacao de teste",
  admin: 1,
  type: "J",
  reg: "12345678912"
};

const org = wiseapi.org.create(data).then((response) => {
  console.log(org);
});
```

data: 
- shortname: Nome curto – usado para ocasiões com pouco espaço
- planId: O plano ao qual a organização está vinculada
- fullName: Nome completo ou razão social
- alias: [opcional] Nome de fantasia
- admin: id do usuário administrador da organização
- type: Pessoa física ou jurídica
- reg: Identificador do registro (CNPJ ou CPF)
- logo: [opcional] URL externa para logo

Retorno: 

```javascript
{
  id: 1
}
```

#### ``getAll()``

Método responsável por recuperar todas as organizações criadas

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

wiseapi.org.getAll().then((org) => {
  console.log(org);
});
```

Retorno:

```javascript
[{
  id: 1,
  shortname: "organização",
  planId: 1,
  fullname: "organizacao LTDA",
  alias: "organizacao de teste",
  admin: 1,
  type: "J",
  reg: "12345678912",
  logo: null
}]
```

#### ``get(orgId)``

Método responsável por recuperar informações de uma única organiação pela identificador único da organização.

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const orgId = 1;

wiseapi.org.get(orgId).then((org) => {
  console.log(org);
});
```

Retorno:

```javascript
{
  id: 1,
  shortname: "organização",
  planId: 1,
  fullname: "organizacao LTDA",
  alias: "organizacao de teste",
  admin: 1,
  type: "J",
  reg: "12345678912",
  logo: null
}
```

#### ``update(orgId, data)``

Método responsável por atualizar informações de uma organiação pelo identificador único da organização.

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const orgId = 1;

const data = {
  alias: "organizacao de teste",
};

wiseapi.org.update(orgId, data).then((response) => {
  console.log(response);
});
```

data: 
- shortname: [opcional] Nome curto – usado para ocasiões com pouco espaço
- planId: [opcional] O plano ao qual a organização está vinculada
- fullName: [opcional] Nome completo ou razão social
- alias: [opcional] Nome de fantasia
- admin: [opcional] id do usuário administrador da organização
- type: [opcional] Pessoa física ou jurídica
- reg: [opcional] Identificador do registro (CNPJ ou CPF)
- logo: [opcional] URL externa para logo

Retorno: 

```javascript
true or false
```

#### ``delete(orgId)``

Método responsável por deletar uma organização.

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const orgId = 1;

wiseapi.org.delete(orgId).then((response) => {
  console.log(response);
});
```

Retorno: 

```javascript
true or false
```

#### ``getAllSessions(orgId)``

Método responsável por recuperar todas as sessões de uma organização

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

wiseapi.org.getAllSessions().then((sessions) => {
  console.log(sessions);
});
```

retorno: 

```javascript
[{
  id: 1,
  orgId: 1,
  ouId: 1,
  profileId: 1,
  skinId: 1,
  finished: null,
  firstJoin: null,
  started: null,
  status: "READY"
}]
```

### Unidade organizacional

Organizações maiores podem ter unidades organizacionais (departamentos) ou centros de custo ou projetos que usam o serviço.

#### ``create(data)``

Método responsável por criar uma unidade organização

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const data = {
  name: "unidade_organização",
  orgId: 1,
  descr: "unidade organização de teste",
  admin: 1,
};

const org = wiseapi.orgUnit.create(data).then((response) => {
  console.log(orgUnit);
});
```

data: 
- name: Nome curto da unidade organizacional
- orgId: Identificador único da organização a qual essa orgUnit pertencerá
- descr: [opcional] Descrição da unidade organizacional
- admin: id do usuário administrador da unidade organização
- logoUrl: [opcional] URL externa para logo
- parent: [opcional] Identificador de outra unidade organizacional na qual essa será submissa.

Retorno: 

```javascript
{
  id: 1
}
```

#### ``getAll()``

Método responsável por recuperar todas as unidades organizações

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

wiseapi.orgUnit.getAll().then((orgUnits) => {
  console.log(orgUnits);
});
```

Retorno:

```javascript
[{
  id: 1,
  name: "unidade_organização",
  orgId: 1,
  descr: "unidade organização de teste",
  admin: 1,
  parent: null,
  logoUrl: null
}]
```

#### ``get(ouId)``

Método responsável por recuperar informações de uma única unidade organizacional pelo seu identificador único.

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const ouId = 1;

wiseapi.orgUnit.get(ouId).then((orgUnit) => {
  console.log(orgUnit);
});
```

Retorno:

```javascript
{
  id: 1,
  name: "unidade_organização",
  orgId: 1,
  descr: "unidade organização de teste",
  admin: 1,
  parent: null,
  logoUrl: null
}
```

#### ``update(ouId, data)``

Método responsável por atualizar informações de uma unidade organizacional.

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const ouId = 1;

const data = {
  descr: "organizacao de teste",
};

wiseapi.org.update(ouId, data).then((response) => {
  console.log(response);
});
```

data: 
- name: [opcional] Nome curto da unidade organizacional
- descr: [opcional] Descrição da unidade organizacional
- admin: [opcional] id do usuário administrador da unidade organização
- logoUrl: [opcional] URL externa para logo
- parent: [opcional] Identificador de outra unidade organizacional na qual essa será submissa.

Retorno: 

```javascript
true or false
```

#### ``delete(ouId)``

Método responsável por deletar uma unidade organizacional.

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

const ouId = 1;

wiseapi.orgUnit.delete(ouId).then((response) => {
  console.log(response);
});
```

Retorno: 

```javascript
true or false
```

#### ``getAllSessions(orgId)``

Método responsável por recuperar todas as sessões de uma organização

```javascript
const wiseapi = new WiseApi();
wiseapi.setup({ login: 'usuario', senha: 'senha' });

wiseapi.org.getAllSessions().then((sessions) => {
  console.log(sessions);
});
```

retorno: 

```javascript
[{
  id: 1,
  orgId: 1,
  ouId: 1,
  profileId: 1,
  skinId: 1,
  finished: null,
  firstJoin: null,
  started: null,
  status: "READY"
}]
``` -->