Some existing product code that creates ContentVersion
instances is now being called from a community and the code fails with:
INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, You do not have the level of access necessary to perform the operation you requested. Please contact the owner of the record or your administrator if access is necessary.: [NetworkId]
The ContentVersion documentation says:
Customer and Partner Portal users must also supply the NetworkId of the community in the request.
So code like this
is needed where the NetworkId
is set:
insert new ContentVersion(
Title = ...,
VersionData = ...,
PathOnClient = ...,
FirstPublishLocationId = ...,
NetworkId = Network.getNetworkId()
);
and this does fix the problem.
But looking at other posts here e.g. Testing with Community User, getNetworkId = null it seems like in unit tests Network.getNetworkId()
always returns null, including when System.runAs
is used with a community user. So I assume that to have code that works for both unit tests and production I would need a method that looks something like this:
public static String getNetworkId() {
// In tests Network.getNetworkId() returns null so use this alternative
if (Test.isRunningTest()) {
// If multiple memberships take newest
for (NetworkMember m : [
select NetworkId
from NetworkMember
where MemberId = :UserInfo.getUserId()
order by Id desc
limit 1
]) {
return m.NetworkId;
}
return null;
} else {
return Network.getNetworkId();
}
}
If you have solved this problem do share your solution.