No se puede insertar el registro ContentVersion en el método futuro en Apex [duplicado]
En una comunidad de socios, estoy insertando un registro ContentVersion antes de realizar una llamada futura y también inserto un registro ContentVersion en una llamada futura.
Puedo insertar el registro ContentVersion antes de la llamada futura con éxito, pero dentro de la llamada Fututre está dando un error:
System.DmlException: Error al insertar. Primera excepción en la fila 0; primer error: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, no tienes el nivel de acceso necesario para realizar la operación que solicitaste. Comuníquese con el propietario del registro o con su administrador si el acceso es necesario: [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]*
}
No estoy seguro de por qué el registro de la versión de ContentVersion no se inserta en llamadas futuras.
Respuestas
Se requiere que NetworkId se complete al hacer inserciones en documentos ContentVersion cuando las comunidades están habilitadas y en un contexto de comunidad. He visto problemas similares en el pasado donde si NetworkId no existe, la inserción falla con el siguiente error INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY
Esto es lo que dice la documentación :
Todos los usuarios con una licencia de función de contenido pueden crear versiones en su biblioteca personal. Los usuarios del Portal de clientes y socios también deben proporcionar el NetworkId de la comunidad en la solicitud.
Puede agregar declaraciones de depuración para verificar el valor de la identificación de la red para ver si está devolviendo un valor nulo. Puede hacerlo usando getNetworkId ()
getNetworkId ()
Devuelve la comunidad actual del usuario.
Firma
getNetworkId de cadena estática pública ()
Valor devuelto
Tipo: Cadena
También he visto problemas en el pasado en los que el método @future no puede obtener el contexto de NetworkId para el registro de versión de contenido. Al insertar un ContentVersion y luego un ContentDocumentLink como usuario de las Comunidades de socios, el ID de red se establece correctamente en ContentVersion. Sin embargo, si esa lógica se ejecuta de forma asincrónica, como en un método @future, entonces el ID de red ya no está presente (confirmado al depurar Network.getNetworkId () tanto en la lógica de sincronización como en la asíncrona) y la inserción de ContentDocument falla con el mensaje DERECHOS DE ACCESO INSUFICIENTES EN LA ENTIDAD DE REFERENCIA CRUZADA (NetworkId).
Una posible solución es pasar el valor networkId externamente a la versión de contenido en tales escenarios. Ver código de muestra a continuación
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;
}