Sendbird Platform APIを利用してグループチャンネルにメッセージを送信する

# はじめに
自チームが持っているプロダクトのチャット機能をリプレイスするということで、
今まで通りSaaSを利用した開発にしようということになりました

その移管先の一つとして、**「Sendbird」**  🕊️

https://sendbird.co.jp/

色々調べていく中で、チャット機能のこれができないと始まらない機能として
メッセージ送信の実装方法について調査したので記録しやす

# 弊社について
自分が所属している会社についても紹介させてください 🙇‍♂️
弊社では物流課題解決や荷物を配送するドライバーの価値を向上させるために
**「ピックゴー」** というサービスを運用しています

![スクリーンショット 2024-10-01 13.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/830d2ad9-8605-d5e1-16ff-2b6d6c2a274a.png)

自分が所属しているチームは
配送中のトラブルや問い合わせに対する対応をログとして管理する
**「ピックゴー タワー」** というプロダクトを開発するチームに所属しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/3c9597dc-30df-aa7c-d45f-6b27313ddf1a.png)


## Sendbirdに関する記事1本目
さっき、Qiitaで「Sendbird」に関する記事ってあるかなと思い検索してみたら...

検索結果：「Sendbird に一致する記事は見つかりませんでした」

👼：やった〜、Qiita内で「Sendbird」に関する記事1本目やん

![スクリーンショット 2024-10-01 12.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/641a223f-b44f-0b75-f64e-9a8ef72bdddb.png)

てことで、Qiita内でSendbirdに関する記事1本目です(たぶん)

# とりあえず、プロトタイプを作ろう

ドキュメントをひたすら調査しても実際にどう動くのかイメージできないので小さいものを作っていく

## パッケージ追加
プロダクト自体、Nuxt 3 + TypeScriptで実装されているためTypeScriptに対応したパッケージを選択しました
さっそく、パッケージを追加していきます

```plaintext
$ yarn add sendbird-platform-sdk-typescript
```

Githubはこちら：

https://github.com/sendbird/sendbird-platform-sdk-typescript

## ディレクトリ構成
`composables`ディレクトリ配下に`sendbird`という名前のディレクトリ切ってその下に実装していきます
(ファイル名はもっとマシなのを考えたい...)

```plaintext
┣ composables
   ┣ sendbird
      ┗ useChatMessage.ts
```

## 実装していく

親切にGithubの方にAPI仕様書があるではないか~ ✨

と思ったけど、そのまま書いても動きません :warning: 

https://github.com/sendbird/sendbird-platform-sdk-typescript/blob/main/MessageApi.md#sendmessage

時間かけて模索した結果をつらつらと書いていきます...

### APP_IDを設定してあげる
まず、どのSendbirdアプリケーションに対してアクセスするかを識別できないといけません

SendbirdのダッシュボードからAPP_IDを持ってきて、
`new Sendbird.ServerConfiguration()` 内に設定してあげます

```typescript
    const APP_ID = 'MY_SENDBIRD_APP_ID'
    const serverConfig = new Sendbird.ServerConfiguration(`https://api-${APP_ID}.sendbird.com`, { 'app_id': APP_ID })
    const configuration = Sendbird.createConfiguration({ baseServer: serverConfig })
```

:::note info
APP_ID の参照方法
ダッシュボードのサイドメニューから「Settings」→「General」→「Application ID」から参照できました
:::

設定した内容を元にメッセージ機能のモジュール、`MessageApi()`を呼び出してインスタンスを生成してあげます
```typescript
:
const configuration = Sendbird.createConfiguration({ baseServer: serverConfig })
const messageApi = new Sendbird.MessageApi(configuration)
```

### パラメータ設定
パラメータ設定として以下のように設定する
* channelTypeは `group_channels`に設定
* channelUrlの値は ダッシュボードのグループチャンネルからURL取得できます
* sendMessageData.userIdもユーザーのプロフィール情報から取得できる
* sendMessageData.messageTypeは、今回はテキストメッセージなので `MESG`
* createdAtは、UNIXタイムスタンプを設定します

```typescript
const body = {
      channelType: 'group_channels',
      channelUrl: 'sendbird_group_channel_url',
      apiToken: API_TOKEN,
      sendMessageData: {
        userId: 'USER_ID',
        channelType: 'group',
        channelUrl: 'sendbird_group_channel_url',
        messageType: 'MESG',
        message: 'testだよ',
        :
        sortedMetaarray: JSON.stringify([]),
        createdAt: Date.now(),
        :     
      }
    }
```

:warning: `sortedMetaarray` に関しては何の情報なのか全然わかっていないけど待ち受けている型がstringなので値としては `''` (空文字)でいいのではと思われますが「値が不正」だと怒られます

```plaintext
{"error":true,"message":"Invalid value: \"sorted_metaarray\".","code":400111}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/df8aea83-eb01-e3bd-1472-17792bbb908d.png)

> 「分類やフィルタリングに使用できる追加のメッセージ情報を格納するためのキー値項目で構成される 
 JSON オ ブジェクトの配列。
 取得時に、項目は追加された順序で返されます。このフィールドに格納できる内容の詳細については、こちらをご覧ください。」

👼：とりまオブジェクト配列にすればええのね

ってことで、`sortedMetaarray: JSON.stringify([]),`としています

https://sendbird.com/docs/chat/platform-api/v3/message/message-overview#2-send-a-message

### メッセージ送信部分
`MessageApi`で生成したインスタンスから`sendMessage()`を呼び出す
そこにパラメータを設定していけば実装の方は完成 🎉

```typescript
  messageApi.sendMessage(body.apiToken, body.channelType, body.channelUrl, body.sendMessageData)
      .then((data: Sendbird.SendBirdMessageResponse) => {
        console.log('API called successfully. Returned data: ' + data)
      }).catch((err) => {
        console.log(err)
      })
```

### 動かしてみる
とりあえず、動作確認のためなので何かしらボタンを押下したタイミングでこのメソッドを発火させるようにしました

動かしてみた結果、
Sendbirdのダッシュボード上で期待したメッセージが送信されていました！🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/f0e7c310-4821-6b99-300e-77491224ff60.png)

## もっと簡易的にAPI試したい場合

PostmanからSendbird Platform APIを自分のワークスペースにフォークして試せます

https://www.postman.com/sendbird/sendbird-platform-api/overview

# おわりに
Sendbird Platform APIを使用してプロジェクト側からSendbirdに対して「メッセージ送信」機能を試してみました
まだ、パラメータ情報としてどれがどういった情報なのかであったりなど、調査が必要な点はありますがとりあえず送信できて安心しました...

# 宣伝
宣伝もさせてください~🙇‍♂️
現在弊社では絶賛エンジニア募集中です！
自社開発したい方やエンジニアとして成長したい方など少しでも興味ありましたらカジュアル面談や会社説明会も開催していますの気軽にお問い合わせください！

沖縄に支社があるので沖縄でも募集中です

https://recruit-okinawa.cb-cloud.com/?utm_source=web_corporate&utm_medium=bottom_banner&utm_campaign=okinawarecruitecm