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)
留言
張貼留言