Retorno do Discurso

Bem, aconteceu, não consegui atualizar o discourse por causa do plugin retort.

Este é o erro de migração de banco de dados que recebi:

não foi possível criar o índice exclusivo “index_post_details_on_post_id_and_key_ccnew_ccnew” DETAIL: Chave (post_id, key)=(30297, +1|retort) está duplicada.

Usei este script como base para meu próprio código de migração. Veja o que fiz.

  • Para fazer o discourse funcionar novamente, tive que substituir a “versão” no arquivo de modelo .yml por um commit de cerca de duas semanas atrás no repositório do discourse
  • Reconstruí com o plugin de reações adicionado para trazer o site de volta
  • Configurei o plugin de reações com o mesmo conjunto de reações do retort. Não uso nenhuma reação que possa ser interpretada como “like”
  • Usei o script de @mcdanlj um pouco modificado com os seguintes passos (já que eu queria migrar todos os retorts e eu tinha um mapeamento de 1 para 1 entre retorts e reações):
  • Execute ./launcher enter app
  • Execute rails c
  • Cole o seguinte (parece que o console do rails ecoará o código com alterações incorretas de linha, adicionei alterações duplas de linha, mas isso não mudou realmente a saída, mas se alguém tiver um erro de sintaxe com o código a seguir, adicione uma linha extra após cada linha):
def migrateRetortToReactions()
  retort = "retort".freeze
  emojiType = "emoji".freeze
  usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
  postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
  likeType = PostActionType.where(name_key: "like").pluck(:id).first
  PostDetail.where(extra: retort).each do |pd|
    begin
      p = postmap[pd.post_id]
    rescue
      # PostDetail não consistente em relação à exclusão
      $stderr.puts sprintf("Não foi possível encontrar post para %d: %s / %s", pd.post_id, pd.key, pd.value)
      next
    end

    emoji = pd.key.split('|').first
    users = JSON.parse(pd.value)
    users.each do |user|
      u = usermap[user]
      next if u.nil? # nome de usuário alterado ou usuário excluído deixa Retorts órfãos
      e = emoji
      r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
      ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
      next unless ru.nil?
      $stderr.puts sprintf("Convertendo Retort %s para Reação %s para o usuário %s em %s", emoji, e, user, p.url)
      DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
    end
  end
end
  • Neste ponto, fiz um backup do site, por precaução
  • Em seguida, execute migrateRetortToReactions, que deve demorar um pouco. Para mim, não vi nem encontrei problemas. Após a execução, o console parece mostrar todos os objetos alterados, então pressione q para sair
  • Agora, no site, os dados devem ter sido migrados corretamente
  • Como um passo final, você precisa executar: PostDetail.where(extra: "retort").destroy_all, que excluirá os dados do retort
  • Agora pude reconstruir meu site com a versão mais recente do discourse e sem o plugin retort

Portanto, no geral, não é tão difícil de migrar, mas foi bastante assustador, e como discutido anteriormente, isso substitui os likes por reações em posts que tinham ambos os likes e retorts pelo mesmo usuário.

6 curtidas