npm package: @icapps/chat-astrum
Description: Chat module ESS
Author: icapps
Latest version: 3.2.0

# ESS Chat module

Module to create custom chat setup

## Context

This module allows to have conversations with one or more recipients into a chat. Socket.io is being used for realtime messages.

## Installation

Install via npm

```shell
npm install @icapps/chat-astrum
```

or via yarn

```shell
yarn add @icapps/chat-astrum
```

## Usage

```javascript
const chat = require('@icapps/chat-astrum');
```

```javascript
import * as chat from '@icapps/chat-astrum';
```

## Prerequisites

### MongoDB

The module uses a MongoDB database combined with mongoose. In order to run everything smoothly you have to make sure a mongoDB is available.

> More information on [MongoDB](https://www.mongodb.com/)

## Available methods

## db

These are related to all MongoDB operations.

### openConnection(url)

Open a connection to MongoDB. This is required to do before trying to fetch any data from other methods below.

```javascript
  db.openConnection('mongodb://localhost:27017/db')
```

## socket

These are related to all socket.io operations

## startSockerServer(server, options)

Start a new socket server instance. This should be called before trying to use any other socket methods. This uses a global singleton so you will always have one connection being used throughout all socket functions.

```javascript
  const app = http.createServer(); // Also works with Express server
  const connection = socket.startSockerServer(app, {
    path: '/socket',
    serveClient: false,
    ...more socket options
  });
```

> All options can be found [here](https://socket.io/docs/server-api/)

> More information on [socket.io](https://socket.io/)

## addNamespace(name)

Add a new namespace onto the socket. Will always check if the namespace already exists and only add when non-existing.

```javascript
  socket.addNamespace('superCoolNamespace');
```

## conversation

## findConversationById(id)

Find an existing by its id (asynchronous)

```javascript
  await conversation.findConversationById('...');
```

## findMyConversations(rights, filters)

List all available conversations for a specific department and employment. (asynchronous)

```javascript
  await conversation.findMyConversations({
      departmentId: '...',
      employmentId: '...',
  },
  {
      limit: 10, // Optional
      offset: 0, // Optional
  })
```

## startConversation(participants)

Start a new conversation (asynchronous)

```javascript
  await conversation.startConversation({
      employmentIds: ['firstId', 'secondId'],
  });
```

## leave(conversationId, employmentId)

Leave a conversation (asynchronous)

```javascript
  await conversation.leave('myConvId', 'myEmplId');
```

## deleteConversation(conversationId)

Deletes a conversation (asynchronous)

```javascript
  await conversation.deleteConversation('myConvId');
```

## markAsRead(conversationId, employmentId)

Mark a conversation as read (asynchronous)

```javascript
  await conversation.markAsRead('myConvId', 'myEmplId');
```

## addJoinedDepartmentLaterOn(employmentId, departmentIds)

Adds a meta tag indicating when an employment joined a department conversation

```javascript
  await conversation.addJoinedDepartmentLaterOn('employmentId', ['departmentId']);
```

## message

## sendMessage(roomId, message)

Send a message to a specific room (conversation)

```javascript
  await message.sendMessage('myRoomId', {
    message: 'This is a message',
    senderId: 'specificEmploymentId',
    firstName: 'Willem',
    lastName: 'Le carrotier',
  });
```

## Tests

- You can run `npm run test` to run all tests
- You can run `npm run test:coverage` to run all tests with coverage report