Impossible d'insérer l'enregistrement ContentVersion dans la future méthode dans l'apex [duplicate]

Dec 07 2020

Dans une communauté partenaire, j'insère un enregistrement ContentVersion avant de faire une future légende et j'insère également un enregistrement ContentVersion dans une future légende.

Je suis capable d'insérer avec succès l'enregistrement ContentVersion avant la future légende, mais dans la légende Fututre, cela donne une erreur -

System.DmlException: l'insertion a échoué. Première exception sur la ligne 0; première erreur: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, vous n'avez pas le niveau d'accès nécessaire pour effectuer l'opération que vous avez demandée. Veuillez contacter le propriétaire de l'enregistrement ou votre administrateur si l'accès est nécessaire: [NetworkId]

public class myclass
{
....
insert ContentVersion1; // Able to insert record
callout();
}

@future(callout = true)
callout(){
...
insert ContentVersion2; // Gives error *System.DmlException: Insert failed. First exception on row 0; first error: 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]*
}

Je ne sais pas pourquoi l'enregistrement de version de ContentVersion n'est pas inséré dans la future légende.

Réponses

AnudeepGopagoni Dec 07 2020 at 15:21

NetworkId doit être rempli lors de l'insertion sur des documents ContentVersion lorsque les communautés sont activées et dans un contexte de communauté. J'ai vu des problèmes similaires dans le passé où si NetworkId n'existe pas, l'insertion échoue avec l'erreur suivante INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

Voici ce que dit la documentation :

Tous les utilisateurs disposant d'une licence de fonctionnalité de contenu peuvent créer des versions dans leur bibliothèque personnelle. Les utilisateurs du portail client et partenaire doivent également fournir le NetworkId de la communauté dans la demande.

Vous pouvez ajouter des instructions de débogage pour vérifier la valeur de l'ID réseau pour voir s'il renvoie une valeur nulle. Vous pouvez le faire en utilisant getNetworkId ()

getNetworkId ()

Renvoie la communauté actuelle de l'utilisateur.

Signature

public static String getNetworkId ()

Valeur de retour

Type: Chaîne

J'ai également vu des problèmes dans le passé où la méthode @future ne pouvait pas obtenir le contexte de NetworkId pour l'enregistrement contentversion. Lors de l'insertion d'un ContentVersion puis d'un ContentDocumentLink en tant qu'utilisateur des communautés partenaires, l'ID de réseau est correctement défini sur ContentVersion. Cependant, si cette logique est exécutée de manière asynchrone, comme dans une méthode @future, alors l'ID de réseau n'est plus présent (confirmé par le débogage de Network.getNetworkId () à la fois dans la logique de synchronisation et asynchrone) et l'insertion de ContentDocument échoue avec le message DROITS D'ACCÈS INSUFFISANTS SUR L'ENTITÉ DE RÉFÉRENCE CROISÉE (NetworkId).

Un correctif potentiel consiste à transmettre la valeur networkId en externe à la version content dans de tels scénarios. Voir l'exemple de code ci-dessous

public static void methodCall(){
String netId = network.getNetworkId();
dummyFutureCall('0010I00002GitdvQAB',netId);
}

@future
public static void dummyFutureCall(Id BasketId,String netValue){
system.debug('**networkId In method : ' + network.getNetworkId());
system.debug('**networkId In method : ' + netValue);
ContentVersion cv = new ContentVersion();
cv.Title = 'Test Document';
cv.PathOnClient = 'TestDocument.pdf';
cv.VersionData = Blob.valueOf('Test Content');
cv.IsMajorVersion = true;
cv.NetworkId = netValue;
Insert cv;
//Get Content Documents
List<ContentVersion> docList = [SELECT Id, contentDocumentId FROM ContentVersion where id =: cv.id ];

//Create ContentDocumentLink
ContentDocumentLink cdl = New ContentDocumentLink();
cdl.LinkedEntityId = basketId;
cdl.ContentDocumentId = docList[0].contentDocumentId;
cdl.shareType = 'V';
Insert cdl;
}