2017-10-29 2 views
1

私はこのtrick(ありがとう@Robban)を使用して、Webhookをトリガーすることなく、APIを通してContentfulエントリを公開します。webhookに 'unpublish()'命令を出す方法は、ContentfulコンソールではなくAPIから来ますか?

しかし、Webhookを起動せずに、API経由でエントリの公開を解除する方法を理解できませんでした。

がContentful文書によると、APIを介してエントリーを非公開にすること、それはこのように書きます:唯一のペイロードがある

client.getSpace('<space_id>') 
    .then((space) => space.getEntry('<entry_id>')) 
    .then((entry) => entry.unpublish()) 

<entry_id>として、どのように私はそれがいつものように進むべきではないウェブフックに示すことができ、それはAPI呼び出しだったので?

答えて

1

APIからの呼び出しとWebアプリケーションからの呼び出しには違いはありません。 Webアプリケーションは、この呼び出しを正確に行います。

さらに、公開されていない場合、ウェブフックが受け取るのは、フィールドを含まない削除オブジェクトだけです。これは、前の回答に示されているトリックはここでは適用されないことを意味します。

私がこれを解決すると考えることができる唯一の方法は、いくつかのデータストア(Contentfulになる可能性があります)を別の呼び出しにして、エントリIDとおそらくタイムスタンプをそこに入れることです。ウェブフックは、未公開イベントを受け取ったときにこのデータストアにクエリを送信し、処理を続行するか、ウェブアプリから未公開が行われたかどうかを確認できます。このような

基本的には何か:

client.getSpace('<space_id>') 
.then((space) => space.getEntry('<entry_id>')) 
.then((entry) => { 

     otherService.SetUnpublishedThroughManualAPICall(entry.sys.id); 
     entry.unpublish(); 

     }) 

その後、いくつかの擬似コードを使用してウェブフックに:

function HandleUnpublish(object entry) { 

    if(OtherService.CheckIfManualUnpublish(entry.sys.id)){ 
     //Do some processing... 
    } 
} 

あなたは、このためのお店としてContentfulでフィールドを使用することを選ぶことができます。その場合は、このフィールドを設定解除する直前に設定します。

client.getSpace('<space_id>') 
.then((space) => space.getEntry('<entry_id>')) 
.then((entry) => { 
    entry.fields['en-US'].unpublishedTroughApi = true; 
    entry.update(); 
}) 
.then((entry) => entry.unpublish()) 

次に、管理APIを使用してエントリを再度フェッチし、フィールドを検査する必要があります。 Contentfulへの追加のAPIコールがいくつか追加されることに注意してください。

+0

もう一度@Robbanに感謝します。それは賢明な回避策です – Manube

関連する問題