Não é possível inserir o registro ContentVersion no método futuro no apex [duplicado]

Dec 07 2020

Em uma comunidade de parceiro, estou inserindo um registro ContentVersion antes de fazer uma chamada futura e também inserindo um registro ContentVersion em uma chamada futura.

Consigo inserir o registro ContentVersion antes do texto explicativo futuro com sucesso, mas dentro do texto explicativo Fututre Ele está apresentando um erro -

System.DmlException: Falha ao inserir. Primeira exceção na linha 0; primeiro erro: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, Você não tem o nível de acesso necessário para realizar a operação solicitada. Entre em contato com o proprietário do registro ou seu administrador se o acesso for necessário: [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]*
}

Não sei por que o registro de versão de ContentVersion não foi inserido em uma frase de destaque futura.

Respostas

AnudeepGopagoni Dec 07 2020 at 15:21

NetworkId deve ser preenchido ao fazer inserções em documentos ContentVersion quando as comunidades estão habilitadas e em um contexto de comunidade. Já vi problemas semelhantes no passado em que If NetworkId não existe, a inserção falha com o seguinte erro: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

Aqui está o que a documentação diz:

Todos os usuários com uma licença de recurso de conteúdo podem criar versões em sua biblioteca pessoal. Os usuários do Portal de clientes e parceiros também devem fornecer o NetworkId da comunidade na solicitação.

Você pode adicionar instruções de depuração para verificar o valor do id de rede para ver se ele está retornando um valor nulo. Você pode fazer isso usando getNetworkId ()

getNetworkId ()

Retorna a comunidade atual do usuário.

Assinatura

public static String getNetworkId ()

Valor de retorno

Tipo: String

Também vi problemas no passado em que o método @future não é capaz de obter o contexto do NetworkId para o registro de versão de conteúdo. Ao inserir um ContentVersion e, em seguida, um ContentDocumentLink como um usuário de Comunidades Parceiras, o ID de rede é definido corretamente no ContentVersion. No entanto, se essa lógica for executada de forma assíncrona, como em um método @future, o ID de rede não estará mais presente (confirmado pela depuração de Network.getNetworkId () nas lógicas de sincronização e assíncrona) e a inserção de ContentDocument falha com a mensagem DIREITOS DE ACESSO INSUFICIENTES À ENTIDADE DE CRUZE REFERÊNCIA (NetworkId).

Uma correção potencial é passar o valor networkId externamente para a versão de conteúdo em tais cenários. Veja o exemplo de código abaixo

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;
}