2017-10-29 13 views
1

나는이 trick (thanks @Robban)을 사용하여 Webhook을 트리거하지 않고 API를 통해 Contentful 항목을 게시합니다.webhook에 '게시 취소()'명령을 전달하는 방법은 Contentful 콘솔이 아니라 API에서 오는 것입니까?

그러나 Webhook을 트리거하지 않고 API를 통해 항목의 게시를 취소하는 방법을 알 수 없습니다.

가 Contentful 문서에 따르면, API를 통해 항목을 게시를 취소하기 위해서는 다음과 같이 진행됩니다 유일한 페이로드가

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

<entry_id>으로, 어떻게 그것이 평소와 같이 진행해서는 안됩니다은 webhook에 나타낼 수 API 호출 이었기 때문에?

답변

1

API의 호출과 웹 앱의 호출 간에는 차이점이 없습니다. 웹 응용 프로그램은 후드 아래에서이 호출을 정확하게 수행합니다.

더 게시판을 게시하지 않은 경우 웹 훅에서 수신하는 것은 필드가없는 삭제 개체입니다. 즉, 이전 답변에 표시된 트릭은 여기에 적용되지 않습니다.

이 문제를 해결할 수있는 유일한 방법은 일부 데이터 저장소 (Contentful 일 수 있음)를 다시 호출하여 항목 ID와 아마도 일부 타임 스탬프를 거기에 넣는 것입니다. 그런 다음 웹 훅은 게시되지 않은 이벤트를 수신하면이 데이터 저장소에 쿼리를 보내 처리를 계속할지 또는 게시되지 않은 것으로 보이는지를 웹 앱을 통해 확인할 수 있습니다. 이 같은

기본적으로 뭔가 : 일부 의사 코드와 함께으로 webhook에서 다음

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

그런 다음 webhook에서 관리 API를 통해 항목을 다시 가져와 필드를 검사해야합니다. Contentful에 대한 추가 API 호출을 유발할 수 있습니다.

+0

다시 한번 감사드립니다. @Robban, 그건 영리한 해결 방법입니다. – Manube