Atualizando Artigos da KB em lote

Nossa instância do SN mudou de endereço e praticamente todos os artigos da base de conhecimento tinham links para a URL antiga. Resultado: todos os links quebrados!

Nada disso seria preciso se os links usados não tivessem a indicação de domínio, como por exemplo:
/kb_knowledge.do?sys_id=f2765f9fc0a8011b0120ec1b352bf09b

Essa barra no inicio determina que o restante da URL seja usada no dominio atual, seja ele qual for. Ai com uma eventual mudança do dominio, o link não precisa se preocupar com o nome do dominio, pois será usado o atual.

O problema que nos artigos que tínhamos, os links estavam assim:

https://dominio-antigo.service-now.com/kb_knowledge.do?sys_id=f2765f9fc0a8011b0120ec1b352bf09b

Aí quando um usuário tenta abrí-lo, toma um erro 404 na cabeça.

Solução: gerar um script que corrija todos os links existentes no corpo dos artigos da KB para o domínio correto, ou no caso, deixar sem domínio.

Segue abaixo o script completo e vou explicando por partes:

var urlAntiga = 'https://dominio-antigo.com';
var urlNova   = '';  // string vazia

var boolUpdate = true;

var gr = new GlideRecord('kb_knowledge');
gr.addQuery('text', 'CONTAINS', urlAntiga);
gr.query();

gs.print(gr.getRowCount());
while (gr.next()) {
	gs.print(gr.number);
	var conteudo = gr.text;
	var re = new RegExp(urlAntiga, 'g');
	conteudo = conteudo.replace(re, urlNova);

    if (boolUpdate) {
        gr.setWorkFlow(false);
        gr.text = conteudo;
        gr.update();
    } else {
        gs.print('desativado');
    }
}

Vamos lá:

Linhas 1 e 2: contem os endereços que serão trocados.
Linha 4: é uma flag que eu criei para primeiro ver os artigos que serão atualizados. Se estiver verdadeiro, atualiza, caso contrário, só lista.
Linhas 6 a 8: Consulta na tabela de artigos, procurando por registros que contenham o texto do domínio antigo.
Linha 10: Imprime o total de registros encontrados, para referência.
Linha 11: Início do loop de resultados
Linha 12: Numero do artigo em questão
Linha 13: Guardamos o conteúdo da descrição do artigo em uma variável

Agora que a mágica acontece :

var re = new RegExp(urlAntiga, 'g');
conteudo = conteudo.replace(re, urlNova);

Nas linhas acima criamos uma expressão regular contendo o texto da URL antiga, e a flag “g” significa que desejamos pegar todas as ocorrência da mesma dentro da string.

Depois de definição o nosso “filtro”, fazemos o replace de tudo que o filtro encontrar, pela URL nova, que no caso, é uma string vazia. Vòi-la!

Depois o bloco abaixo verifica nossa flag de atualização, desativa os workflows e regras de negócio para evitar que outros eventos sejam disparados e atualiza o registro!

    if (boolUpdate) {
        gr.setWorkFlow(false);
        gr.text = conteudo;
        gr.update();
    } else {
        gs.print('desativado');
    }

Caso a flag de update esteja falsa, imprime “desativado”.

É isso ai, espero que o script ajude. Mesmo que não seja em artigos, este script pode ser adaptado para atualizar registros em lote para qualquer tabela que desejar.

Abraço!

Leave a Reply

Your email address will not be published. Required fields are marked *