とりあえず走り書き(気が向いたら綺麗にまとめるかもしれないし、このままかもしれない・・・)。
Apexを使用してカスタムRestAPIを作成する仕事をしましたが、ファイルアップロードでかなり行き詰ったところがあるので忘備録として残しておきます。
エラーの経緯とやったこと
ファイルアップロードするときはContentVersionやContentDocumentLinkを使用しますが、以下のエラーが発生してなかなか上手くすすみませんでした。
Insert failed. First exception on row 0; first error: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, [LinkedEntityId]
ちょーざっくり訳でレコード作成失敗したよ、アクセス権が不十分だよ[LinkedEntityId]
みたいなこといっていますが、共有設定の見直しやLinkedEntityIdにかかわるオブジェクトのContentDocumentLinkで項目レベルセキュリティ、挙句の果てにプロファイル内の設定もしらみつぶしに探してみても解消できそうな設定はないんです(´・ω・`)(この調査だけで何日もかかっています)
ContentVersionTriggerHandlerでエラーが起こっていて、ファイルアップロード時に別ユーザに共有しようとしたときに発生しています。またファイルアップロードしたユーザがサイトコミュニティユーザ(外部ユーザ)で、Salesforceユーザ(内部ユーザ)に共有したときにエラーが発生しました。またSalesforceユーザから別のSalesforceユーザに共有するときは何もエラーは起きず正常にファイルの共有ができるという不思議・・・
さて一体何が問題だったんでしょう・・・
対処1.外部ユーザの場合、ContentVersionTriggerHandlerのInsert部分の処理を飛ばす
これで問題ないならとても簡単です。でもだいたいファイルアップロードしたときはどんなときでもファイル共有しなくてはいけないなら、これではダメです。
対処2.Experience Cloud サイトのメンバーに共有したいプロファイルを追加する
どうりでなかなかエラーが解消できなかったわけです(サポートに問い合わせても数日かかった回答です)。
デジタルエクスペリエンスから対象サイトをクリックしてメンバー追加するだけということです。
外部ユーザから内部ユーザにファイルを共有する際はメンバーに追加しないとだめで、このせいで権限がないよといっているようです。とてもわかりにくい・・・
あとは正しいURLで実行すればRestAPIとしてファイルアップロードが機能し外部ユーザからのアップロードしたファイルを内部ユーザへ共有することができますが、もし次のエラーが発生した場合は嫌になるでしょう。
INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY : [NetworkId]
いますぐ仕事を投げ出したい気分になりますが、次の対処法があります。
対処3.ファイルアップロード時はサイト名を必ず含める
上記エラーはサイト名を含めると正常に機能します。
つまり
×:(instance)/apexrest/(Apexクラス名)/・・・
〇:(instance)/(サイト名)/apexrest/(Apexクラス名)/・・・
というわけです。