如何告诉webhook'unpublish()'命令来自API,而不是Contentful控制台?

时间:2017-10-29 16:33:01

标签: contentful contentful-management

我使用此trick(感谢@Robban)通过API发布Contentful条目,而不会触发webhook。

但是,我无法弄清楚如何在不触发webhook的情况下通过API取消发布条目。

根据Contentful文档,要通过API取消发布条目,它是这样的:

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

由于<entry_id>是唯一的有效负载,我如何向webhook指示它不应该像往常一样继续进行,因为它是一个API调用?

1 个答案:

答案 0 :(得分:1)

不幸的是,再次直接来自API或来自网络应用的呼叫没有区别。网络应用程序完全可以完成此调用。

此外,在取消发布的情况下,您的webhook唯一会收到的是一个不包含任何字段的删除对象。这意味着上一个答案中显示的技巧不适用于此。

我能想到解决这个问题的唯一方法是再次调用某个数据存储(可能是Contentful)并将条目id和可能还有一些时间戳放在那里。然后,您的webhook可以在收到取消发布的事件后查询此数据存储区,并查看是否应继续处理,或者是否通过Web应用程序进行取消发布。

基本上是这样的:

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

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

      })

然后在您的webhook中使用一些伪代码:

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())

然后在您的webhook中,您必须通过管理API再次获取该条目并检查该字段。请记住,这会导致对Contentful进行大量额外的API调用。