Risposta Discourse

Beh, è successo, non sono riuscito ad aggiornare discourse a causa del plugin retort.

Questo è l’errore di migrazione del database che ho ricevuto:

impossibile creare l'indice univoco "index_post_details_on_post_id_and_key_ccnew_ccnew" DETAIL: La chiave (post_id, key)=(30297, +1|retort) è duplicata.

Ho usato questo script come base per il mio codice di migrazione. Ecco cosa ho fatto.

  • Per far funzionare di nuovo discourse, ho dovuto sovrascrivere la “versione” nel file template .yml con un commit di circa due settimane fa nel repository di discourse
  • Ricostruisci con il plugin delle reazioni aggiunto per riportare il sito online
  • Ho configurato il plugin delle reazioni con lo stesso set di reazioni di retort. Non uso alcuna reazione che possa essere interpretata come un like
  • Ho usato lo script di @mcdanlj leggermente modificato con i seguenti passaggi (poiché volevo migrare tutti i retort e avevo già una mappatura 1-a-1 tra retort e reazioni):
  • Esegui ./launcher enter app
  • Esegui rails c
  • Incolla quanto segue (sembra che la console rails ripeta il codice con modifiche errate alle righe, ho aggiunto doppie interruzioni di riga ma ciò non ha realmente modificato l’output, ma se qualcuno ottiene un errore di sintassi con il codice seguente, aggiungi una riga extra dopo ogni riga):
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 non coerente rispetto all'eliminazione
      $stderr.puts sprintf("Impossibile trovare il post per %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 utente modificato o utente eliminato lascia Retort orfani
      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("Conversione di Retort %s in Reaction %s per l'utente %s in %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
  • A questo punto ho fatto un backup del sito per sicurezza
  • Quindi esegui migrateRetortToReactions che dovrebbe richiedere un po’ di tempo. Per me non ho visto né riscontrato problemi. Dopo l’esecuzione la console sembra mostrare tutti gli oggetti modificati, quindi premi q per uscire
  • Ora sul sito i dati dovrebbero essere migrati correttamente
  • Come ultimo passaggio devi eseguire: PostDetail.where(extra: "retort").destroy_all che eliminerà i dati di retort
  • Ora sono stato in grado di ricostruire il mio sito con l’ultima versione di discourse e senza il plugin retort

Quindi, tutto sommato, non è stato così difficile da migrare, ma è stato piuttosto spaventoso, e come discusso in precedenza, questo sovrascrive i like con le reazioni sui post che avevano sia like che retort dallo stesso utente.

6 Mi Piace