GROWI TypeScript/JavaScript SDKの紹介（その5：ブックマーク/ブックマークフォルダの操作）

[オープンソースの社内WikiであるGROWI](https://growi.org/)ではREST APIが公開されています。このAPIをより簡単に使えるよう、TypeScript/JavaScript SDKを開発しています。まだ途中ですが、徐々に機能追加していきます。

今回はページをブックマークして置く際に利用するブックマークとブックマークフォルダの操作方法を解説します。

## 注意点

こちらはコミュニティSDKになります。公式への問い合わせはご遠慮ください。

## ソースコード

GROWI TypeScript/JavaScript SDKのソースコードはGitHubにて公開しています。ライセンスはMITです。

[goofmint/growi-sdk-alpha](https://github.com/goofmint/growi-sdk-alpha)

## インストール

インストールはnpm/yarn経由で行います。

```bash
$ npm install @goofmint/growi-js
# または
$ yarn add @goofmint/growi-js
```

## 使い方

まずはSDKをインポートします。

```javascript
const { GROWI, UserGroup } = require('@goofmint/growi-js');
// または
import { GROWI, UserGroup } from '@goofmint/growi-js';
```

そして、初期化します。この時、GROWIのAPIトークンを指定します。

```javascript
const growi = new GROWI({ apiToken: 'your-api-token' });
```

この他、以下のパラメーターを用意しています。

- `url` : GROWIのURLを指定します。デフォルトは`http://localhost:3000`です。
- `path` : GROWIのページパスを指定します。デフォルトは `` です。サブディレクトリにインストールしている際に指定します。

### 現在のユーザーを取得

ブックマークの取得などでユーザー情報を利用するので、 `currentUser` メソッドで現在のユーザーを取得します。

```javascript
const user = await growi.currentUser();
```

### ブックマークフォルダ

#### ブックマークフォルダの取得

現在のブックマークフォルダを取得します。配列で返ってきます。

```javascript
const bookmarkFolders = await user.bookmarkFolders();
```

#### ブックマークフォルダの作成

新しいブックマークフォルダを作成します。名前を付けて、 `save` メソッドで保存します。

```javascript
const bookmarkFolder = new BookmarkFolder();
bookmarkFolder.name = 'my folder';
await bookmarkFolder.save();
```

#### ブックマークフォルダの更新

名前を変更する場合は、 `name` プロパティを変更して、新規作成と同じく `save` メソッドで保存します。

```javascript
bookmarkFolder.name = 'my folder updated';
await bookmarkFolder.save();
```

#### ブックマークフォルダの削除

`remove` メソッドで削除します。子フォルダも削除されます。

```javascript
await bookmarkFolder.remove();
```

#### ブックマークフォルダを親フォルダに追加

ブックマークフォルダは入れ子にできます。この時、やり方は2通りあります。

まずは、親フォルダを指定して保存する方法です。

```javascript
// 親フォルダを作成
const bookmarkFolder = new BookmarkFolder();
bookmarkFolder.name = 'Parent';
await bookmarkFolder.save();

// 子フォルダを作成
const bookmarkFolder2 = new BookmarkFolder();
bookmarkFolder2.name = 'Child';
bookmarkFolder2.parent = bookmarkFolder; // 親フォルダを指定
await bookmarkFolder2.save();
```

または、 `addFolder` メソッドを使って追加する方法です。

```javascript
const bookmarkFolder = new BookmarkFolder();
bookmarkFolder.name = 'Parent';
const bookmarkFolder2 = new BookmarkFolder();
bookmarkFolder2.name = 'Child';
await bookmarkFolder.addFolder(bookmarkFolder2); // 親フォルダに追加
```

#### 親フォルダを変更する

フォルダを移動する際には、 `parent` プロパティを変更して、 `save` メソッドで保存します。

```javascript
const bookmarkFolder3 = new BookmarkFolder();
bookmarkFolder3.name = 'New parent';
bookmarkFolder2.parent = bookmarkFolder3; // 親フォルダを変更
await bookmarkFolder2.save();
```

### ブックマークフォルダの情報を取得

親フォルダを変更した際など、情報を更新したい際には `fetch` メソッドを使います。

```javascript
await bookmarkFolder.fetch();
```

### ブックマーク

#### 自分のブックマークを取得

自分のブックマークは `bookmarks` メソッドで取得します。

```javascript
const bookmarks = await user.bookmarks();
```

### ページに紐付いたブックマーク情報を取得

自分がブックマークしているかどうか、ブックマークしているユーザー一覧などの情報を取得します。

```javascript
const page = await growi.root();
const info = await page.bookmarkInfo();
info.bookmarkCount // ブックマーク数
info.bookmarked    // 自分がブックマークしているかどうか
info.users         // ブックマークしているユーザー一覧
```

#### ブックマークする

ページを指定してブックマークします。

```javascript
await user.bookmark(page); // ブックマーク
```

#### ブックマークを解除

ブックマークを解除します。2つ目の引数に `false` を指定します。

```javascript
await user.bookmark(page, false); // ブックマーク解除
```

#### ブックマークしているかどうか

自分がブックマークしているかどうかを確認します。

```javascript
const bol = await user.isBookmarked(page);
```

#### ブックマークフォルダに追加

ブックマークをフォルダに追加する際には、 `addPage` メソッドを使います。

```javascript
const folder = new BookmarkFolder();
folder.name = 'my folder';
await folder.save();
await folder.addPage(page);
```

## まとめ

GROWIは社内Wikiとして、社内システムとのデータ連係ニーズが出やすいでしょう。ぜひ、Node.js SDKを使って、GROWIをシステムから操作してください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/)