NodeJS で contentful-management を使う方法を想定してます。
準備
以下の流れでやっていきます。
依存のインストール
アクセストークンの取得
依存のインストール
まだpacakge.json
が無いのであれば以下のコマンドで NodeJS プロジェクトを準備します。
yarn init -y
以下でcontentful-management
をインストールします。
yarn add contentful-management
アクセストークンの取得
上部のメニューからcontentful-management画像の順番のように辿り、出てきたcontentful-management画像ダイアログに後で分かる名前を付けて Generate します。
生成されたアクセストークンはあとで参照できないので、大切に保存します。
処理を書く
取得から更新の流れは以下のようなフローです。
アクセストークンを使って通信する為の
client
を取得client
からspace
インスタンスを取得space
からenvironment
インスタンスを取得environment
からentry
インスタンスを取得フィールド更新
entry
更新entry
公開
アクセストークンを使って通信する為の client を取得
contentful-management
からcreateClient
を取得し、それにアクセストークンに渡してclient
を作ります。
const {createClient} = require('contentful-management');
const client = createClient({accessToken: ACCESS_TOKEN});
(async () => {
// これより以下はこの中に入る
})();
これより以下はasync
関数の中に入ります。
client から space インスタンスを取得
const space = await client.getSpace(SPACE_ID);
スペースIDSPACE_ID
を渡してspace
を取得します。このスペースIDは Contentful サイトの上部のメニューからcontentful-management画像ダイアログ画像の流れで取得できます。
space
にもgetEntries
やgetEntry
はありますが、contentful@^5.12.0
上では使おうとすると「将来的に撤廃予定です。environment
から使ってください」というような警告メッセージが表示されます。
space から environment インスタンスを取得
environment
には環境名を入れます。何も弄ってなかったり無料プランの場合これはmaster
になります。
const environment = await space.getEnvironment(ENVIRONMENT_ID);
environment から entry インスタンスを取得
const entry = await env.getEntry(ENTRY_ID);
エントリーIDENTRY_ID
はエントリーを書くページの右サイドバーの Info のcontentful-management画像ダイアログ画像画像の位置から取得できます。
フィールド更新
値を更新するには単にfields
に新しい値を代入して更新します。
entry.fields.title.ja = '新しいタイトル';
entry 更新
投稿を更新するにはEntry#update
を実行します。これでエントリーの内容が更新されます。(公開はまだ)
const updatedEntry = await entry.update();
entry 公開
Entry#publish
を実行して公開します。
await updatedEntry.publish();
問題がなければ更新されてるハズです!
注意点は必ずEntry#update
の戻り値を使うことです。もし以下のように実装した場合 API はエラーを返します。
await entry.update();
await entry.publish();
{
"status": 409,
"statusText": "Conflict",
"message": "",
"details": {},
"request": {
"url": "https://api.contentful.com:443/spaces/jfvyr7b4oy3y/environments/master/entries/3uzCE52rkssyRkaFMPwhUF/published",
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/vnd.contentful.management.v1+json",
"X-Contentful-User-Agent": "sdk contentful-management.js/5.12.0; platform node.js/v12.14.1; os macOS/18.7.0;",
"Authorization": "Bearer ...D8vrU",
"user-agent": "node.js/v12.14.1",
"Accept-Encoding": "gzip",
"X-Contentful-Version": 1856
},
"method": "put",
"payloadData": null
},
"requestId": "ac28b8c5beee6aecde8d1856b6cd4efc"
}
entry
はsys.version
プロパティを持ちますが、update
やpublish
後に帰ってくるentry
はこの値が更新されてます。恐らくですが、entry
は「このバージョンではこういうことをやった」という感じの情報を持っていて、既に実行済みのバージョンで何かしようとすると上記のようなエラーが返ってくるのではと思います。
全体コード
const {createClient} = require('contentful-management');
const client = createClient({accessToken: ACCESS_TOKEN});
(async () => {
const space = await client.getSpace(SPACE_ID);
const environment = await space.getEnvironment(ENVIRONMENT_ID);
const entry = await env.getEntry(ENTRY_ID);
entry.fields.title.ja = '新しいタイトル';
const updatedEntry = await entry.update();
await updatedEntry.publish();
})();