Não é possível restaurar posts de descrição de categoria criados por usuário excluído

Em algum momento após a criação de algumas categorias, o usuário que as criou foi excluído. Ao analisar o log, vi que o Discourse excluiu automaticamente essas postagens ao mesmo tempo em que o usuário foi removido.

Não percebemos que isso causou problemas até algum tempo depois, quando ficou claro que, embora os administradores ainda pudessem ver (e editar) as postagens de descrição das categorias afetadas, quando usuários comuns tentavam visualizar essas postagens, recebiam esta mensagem: “Erro; ao tentar carregar; Algo deu errado.”

Essas postagens de descrição de categoria aparecem com fundo vermelho. Posso ver que elas foram excluídas e quando. Vejo o botão ‘recuperar’, mas clicar nele não faz absolutamente nada.

Se eu acessar as configurações de uma das categorias afetadas (clicando no botão Editar) e clicar no botão Editar Descrição, sou levado à postagem excluída correspondente. Posso fazer alterações e salvá-las, e após atualizar a página, a nova descrição aparece. No entanto, usuários não administradores ainda não conseguem ver o conteúdo da postagem (apenas o erro).

Consegui alterar a propriedade de uma das postagens para meu próprio usuário administrador, mas o botão ‘recuperar’ ainda não funciona.

Encontrei relatórios semelhantes no meta Discourse, mas até agora nenhum dos conselhos ajudou.

Encontrei uma referência a uma pessoa que conseguiu recuperar uma postagem com problema semelhante usando a API do Discourse e comecei a investigar, mas não consegui encontrar nada sobre recuperação de postagens na documentação da API. Veja: Can't recover a topic by a deleted user

Espero que haja uma solução que não envolva recriar as categorias afetadas do zero.

Atualização: quando clico no botão ‘recuperar’ para uma dessas postagens, é gerada uma entrada no log de erros:

Erro: Proibido
URL: mysite/assets/ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js
Linha: 1
Coluna: 266460
Localização da Janela: mysite/t/about-the-showcases-and-use-cases-category/28
3 curtidas

Então alguém emitiu um comando de destruição no usuário que criou as categorias? Há alguma razão específica para que esse usuário tenha sido destruído em vez de anonimizado?

É verdade que o tópico de descrição da categoria será de propriedade do usuário que cria a categoria, então destruir esse usuário (e todas as suas postagens) poderia potencialmente causar isso. @tshenry, podemos testar esse cenário na próxima semana?

3 curtidas

Consegui executar o processo rapidamente agora mesmo e reproduzir os mesmos resultados.

  1. Crie uma categoria com um usuário administrador
  2. Revogue o status de administrador dele e exclua o usuário
  3. O tópico “Sobre” da categoria é excluído logicamente (soft-deleted) quando o usuário é excluído
  4. Tentar desfazer a exclusão/restaurar o tópico não funciona
  5. Alterar a propriedade funciona tecnicamente, mas o tópico permanece em um estado de exclusão estranho, não importa o que você faça pela interface.

Pelo console, parece que o registro posts associado ao tópico é excluído quando o usuário é removido. O registro do tópico apresenta muitos zeros ao observar vários atributos relacionados a posts.

Pode valer a pena pedir a um engenheiro para ver se podemos ser um pouco mais elegantes nesse processo, mas suspeito que é mais fácil dizer do que fazer.


Consegui encontrar uma solução alternativa para voltar a um estado adequado, mas precisei usar a linha de comando. @jrivettcsa, recomendo fazer um backup antes de tentar isso:

Valores necessários

Certifique-se de copiar qualquer conteúdo do tópico “Sobre” que deseje usar posteriormente para um bloco de notas ou similar, e então prossiga com o seguinte:

Acesse o console do Rails

cd /var/discourse
./launcher enter app
rails c

Substitua <ABOUT_TOPIC_ID> no comando abaixo pelo ID do tópico “Sobre” da categoria e execute para excluir permanentemente o tópico quebrado.

Topic.where(id: <ABOUT_TOPIC_ID>).destroy_all

Pressione a tecla q para retornar ao console, se necessário.

A categoria ainda está associada ao tópico defeituoso, então precisamos limpar essa associação. Substitua <CATEGORY_ID> no comando abaixo pelo ID da categoria e execute.

Category.where(id: <CATEGORY_ID>).update_all(topic_id: nil)

Pressione a tecla q para retornar ao console, se necessário.

Saia do console do Rails e execute a seguinte tarefa rake para criar um novo tópico “Sobre” para a categoria:

exit
rake categories:create_definition

Agora essa categoria deve estar corrigida! Você pode repetir o processo conforme necessário.

6 curtidas

Sim, algumas mudanças infelizes foram feitas por alguém que deveria saber melhor. Não posso dizer mais. Felizmente, essas coisas são registradas pelo Discourse.

1 curtida

Obrigado por confirmar o problema e fornecer uma solução. Vou tentar e postar os resultados aqui.

1 curtida

Essa solução funcionou perfeitamente. Obrigado!

Eu corrigi cada um individualmente, mas acho que poderia ter feito as coisas do destroy_all e update_all em uma única sessão do console do Rails e, em seguida, executado o comando rake categories:create_definition uma vez no final. O que você acha? Isso pode economizar alguns minutos de alguém em algum momento.

4 curtidas

Definitivamente é um bug, @jrivettcsa — quando a exclusão de um usuário pode levar a um site quebrado, isso é ruim! Vamos corrigir.

4 curtidas

Obrigado por registrar esse problema. Fiz uma correção neste PR:

Quando um usuário é excluído, a postagem que descreve a categoria não é mais excluída. Em vez disso, o autor da postagem é alterado do usuário original para o usuário do sistema.

4 curtidas