【Contentful】 Content Management API で未公開entryを取得するには
最近はContentfulを簡易DBとして使いこなせないか試すため、個人プロジェクトのパラメータ保存先を少しずつContentfulに移行してみているのだけど、createdAtやupdatedAtなど、Railsで見覚えのあるパラメータだけでなく、publishedAtやfirstPublishedAt、createdByやpublishedByなど、至れり尽くせりのパラメータがデフォルトで用意されていて、なかなか便利。
Content Management API を使うか Content Delivery API を使うかで取得できるパラメータは違うのだけど、公開済みのentryを Content Management API で取得した場合、sysパラメータを覗くと画像のようなパラメータが存在している。
このsysパラメータを使って、ある条件に基づいたentryを取得したい場合は、公式ドキュメント
にあるように、
getEntries({ content_type: 'hoge', 'sys.updatedAt[gte]': '2013-01-01T00:00:00Z', })
などと書いてやれば、簡単に取得できてしまう。
sysのパラメータではなく、自分で入力したfieldsの値に基づいてentryを取得したい場合、Content Management API では
getEntries({ content_type: 'hoge', 'fields.fuga[ja-JP]': 'aaaaaaa', })
Content Delivery API では
getEntries({ content_type: 'hoge', 'fields.fuga': 'aaaaaaa', })
と書くことで、fieldsの値に基づいたentryを取得することができる。
ちなみに、 Full-text search も用意されていて、
getEntries({ 'query': 'design' })
と書けば、content_typeを跨いでentryを検索することもできてしまう。
で、今回の本題は、 Content Management API で未公開entryを取得する方法について。 Contentfulでは、公式ドキュメント
で説明されているように
- Content Delivery API : 公開済みentryにアクセスできる読み込み専用のAPI
- Preview API : 未公開entryにアクセスできる読み込み専用のAPI
- Content Management API : 公開済み/未公開を問わず全てのentryにアクセスできて、CRUD操作可能なAPI
などが用意されていて、entryのCRUD操作をしたいときには Content Management API を使う必要がある。
このとき getEntries({})
内で何も指定しないと、公開済み/未公開を問わず全てのentryが取得されてしまう。
公開済みのentryのみ、未公開のentryのみを取得したいときは、それぞれ Content Delivery API と Preview API が用意されているのだけど、 Content Management API だけで未公開entryのみを取得したいときもあるので、sysパラメータを指定することで選り分けられないかと、公式ドキュメントやコミュニティ/Slackを検索しまくった。
ても、それらしき方法が自分には見つからなくて、なぜContentfulではpublishedという名前のbooleanパラメータが用意されていないのだろうか…、とボヤいていたところ、 @_slont さんに
publishedAtもしくはByの存在自体がboolを兼ねるからではないですかね?カラム増やすと管理コストも上がりがちなので僕も結構やります
— slont@Finatext (@_slont) 2019年5月4日
と教えて頂いた。試しに
getEntries({ content_type: 'hoge', 'sys.publishedAt[exists]': false, })
と書いてみたところ、見事、未公開entryだけを取得することに成功…!
一度公開したentryは、未公開に戻してもpublishedAtが存在し続けると勝手に思い込んでいたのだけど、どうやら、entryを未公開に戻すとsys.publishedAtが消える仕様だったみたい。
念のため、公開から未公開に戻したentryのsysパラメータを覗いてみたところ、画像のように、publishedAtやpublishedByが消えていることも確認できた。
こういうtipsってサービスのドキュメントとかを調べているだけじゃ見つからないことが多いので、ほんとありがたいです。@_slontさん、ありがとうございました!