Knowledge 開發,再次踩坑再次記錄

 我還以為我跟 Knowledge 這個 module 已經算是混得很熟了……結果還是不小心為了一行 code ,debug de 了幾個小時……

先講結論

如果想要 query archived 的 article,請記得加上 IsLatestVersion = False 的條件。
例如:
list<Foo_Knowledge__kav> lstArchivedKB = [SELECT ID FROM Foo_Knowledge__kav WHERE KnowledgeArticleId =: article.KnowledgeArticleId and IsLatestVersion = False];

踩坑過程

我在 knowledge trigger 裡原本有一行 code:
list<Foo_Knowledge__kav> lstPublishedKB = [SELECT ID FROM Foo_Knowledge__kav WHERE KnowledgeArticleId =: article.KnowledgeArticleId and (PublishStatus = ‘Online’ or PublishStatus = ‘Archived’)];

用意是在一篇 article draft 被 created 的當下,去檢查這篇 article 是全新產生的亦或是從現有 article 衍生的。如果他是衍生的,那必定存在著至少一篇已經是 publish 或是 archived 的 record。

上面這行 code 也跑了幾個月了,UI上好像都運作正常。直到我這次試著使用 Python 打 API 的方式去 unpublish artilce,就出錯了…… 

unpublish API 示意:

sf_api_call(‘/services/data/v51.0/knowledgeManagement/articleVersions/masterVersions/{}’.format(kavid), method=‘patch’, data={“publishStatus”: “draft”})

(相關紀錄請參見:Salesforce 之 Knowledge Object 之 mass update published article)


上述API 打下去,這行 code 怎麼樣都只會 return 0 row。

我檢查了幾個點:

  • 帳號權限/API 權限/欄位權限應該都沒有問題。我可以用同樣的 API credential 去單純 query SELECT ID FROM Foo_Knowledgekav WHERE KnowledgeArticleId
    確實是可以抓到許多資料的

  • 這個 code 不是 Test Class,所以應當也不存在 @isTest(SeeAllData=true) 的議題。

  • Query syntax 應該也沒問題。我拿去 workbench 執行,都可以成功抓到 data。

最後我是反覆對照打 unpublish API 所產生的 log 以及直接在 UI 上 edit as a draft 所產生的log,才發現兩者是有所差異的。

我的理解是:unpublish API,會先 archive article,但是在 UI 上去做一篇新的 draft 卻不會。

根據實驗結果,當某篇 X article 透過上述 API 觸發 trigger 的當下,如果對他本身的 KnowledgeArticleId 進行

SELECT ID FROM Foo_Knowledge__kav WHERE KnowledgeArticleId =: X.KnowledgeArticleId
是得不到結果的。


但是如果是當某篇 X article 透過上述 API 觸發 trigger 的當下,以Y article 的 KnowledgeArticleId 去進行 query,卻是可以正常得到結果的。

SELECT ID FROM Foo_Knowledge__kav WHERE KnowledgeArticleId =: Y.KnowledgeArticleId

最後我是乖乖地加上了 IsLatestVersion = False,結束了這場 debug。
還我寶貴的幾個小時來(T_T)

留言

這個網誌中的熱門文章

ISC2 CC (Certified in Cybersecurity Certification) 考試心得

Salesforce證照考試心得 (Administrator and Advanced Administrator)