contentful-managementでエントリーの一覧取得と新規作成をasyncでやってみる

# contentful-managementでエントリーの一覧取得と新規作成をasyncでやってみる

contentful-managementのJavaScript用SDKを使ってみたので、忘れない内にメモします。



## 準備する

Contentfulのアカウントやスペースを作成します。作り方は、こちらの記事がわかりやすかったです。
[【画像で説明】Contentfulの使い方。初期設定と各メニューについて学ぶ](https://blog.cloud-acct.com/posts/blog-contentful-signup/)

Node.jsのプロジェクトに必要なパッケージをインストールします。

```bash
npm install dotenv
npm install contentful-management
```

`package.json` と同じ階層に `.env` ファイルを用意し、以下のように記述しておきます。

```ini
personal_access_token=パーソナルアクセストークン
space_id=対象のスペースID
environment_id=対象の環境ID。master等
```

パーソナルアクセストークンは、Delivery APIやPreview APIのAPI Keyとは別に、Contentful Management API専用のものを作成する必要があります。詳しい作り方は公式ページをご覧ください。
[Personal Access Tokens](https://www.contentful.com/help/personal-access-tokens/)



## Contentfulからエントリー一覧を取得する

Contentfulでは、登録しているデータ1つ1つのことをエントリーと呼びます。（RDBでいうレコードに相当する単位）

エントリー一覧を取得するソースコードはこんな感じです。

```javascript
// .envから環境変数として設定値を読み込む。
require('dotenv').config()
const env = process.env

// エラーが発生したときにCatchできるようにする。
process.on('unhandledRejection', console.dir);

// contentful-management用クライアントを作成する。
const contentful = require('contentful-management')
const client = contentful.createClient({
    accessToken: env.personal_access_token
});

(async () => {
    // スペースを取得する。
    const space = await client.getSpace(env.space_id);

    // 環境を取得する。
    const environment = await space.getEnvironment(env.environment_id);

    // エントリー一覧を取得する。
    const entries = await environment.getEntries();

    // エントリー一覧を表示する。
    entries.items.forEach(item => console.log(item));
})();
```



## Contentfulへエントリーを登録する

Contentfulでは、データを保管している領域のことをコンテンツモデルと呼びます。（RDBでいうテーブルに相当する単位）

そのコンテンツモデルに対し、エントリーを新規作成してみます。まず、ドラフト（下書き）で作成し、その後パブリッシュ（公開）します。

ソースコードはこんな感じです。

`fields` の部分は、コンテンツモデルによって異なりますので、適宜読み替えてください。

もし、Contentfulの `Settings > Locales` を `ja` に変更していたら、 `en-US` の部分は `ja` に差し替えてください。

```javascript
// .envから環境変数として設定値を読み込む。
require('dotenv').config()
const env = process.env

// エラーが発生したときにCatchできるようにする。
process.on('unhandledRejection', console.dir);

// contentful-management用クライアントを作成する。
const contentful = require('contentful-management')
const client = contentful.createClient({
    accessToken: env.personal_access_token
});

(async () => {
    // スペースを取得する。
    const space = await client.getSpace(env.space_id);

    // 環境を取得する。
    const environment = await space.getEnvironment(env.environment_id);

    // ドラフトでエントリーを作成する。
    const draftEntry = await environment.createEntry('hoge_content_type', {
        fields: {
            id: {
                'en-US': 'hoge_id'
            },
            name: {
                'en-US': 'hoge_name'
            }
        }
    });

    // エントリーをパブリッシュする。
    try {
        const publishedEntry = await draftEntry.publish();
        console.log(`${publishedEntry.sys.id} をパブリッシュしました。`);
    } catch (err) {
        console.error(err);
    }
})();
```

`'hoge_content_type'` はコンテンツモデルのIDです。こちらも適宜変更してください。



## 最後に

本記事作成にあたり、以下のページを参考にしました。わかりやすい情報ありがとうございました。

- [Content Management API](https://www.contentful.com/developers/docs/references/content-management-api/)
- [APIを用いたエントリーの取得と更新](https://nju33.com/contentful/API%20%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%A8%E6%9B%B4%E6%96%B0)
- [【画像で説明】Contentfulの使い方。初期設定と各メニューについて学ぶ](https://blog.cloud-acct.com/posts/blog-contentful-signup/)
- [Personal Access Tokens](https://www.contentful.com/help/personal-access-tokens/)