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!