Retours Discourse

Mon Script framework to rearrange topics and categories a une nouvelle fonction qui va un peu au-delà du réarrangement des sujets et des catégories !

Je me souviens généralement de prévenir que je ne connais ni le ruby ni le ruby on rails, donc mon code est idiosyncratique plutôt qu’idiomatique. Mais il semble fonctionner jusqu’à présent dans mes tests !

  def migrateRetortToReactions(allowed:, likes: nil, emojimap: nil)
    # migrer autant que possible sans remplacer les likes existants
    # c'est une conversion nécessairement avec perte, et elle est cohérente uniquement par l'ordre de PostDetail
    # aucune tentative n'est faite pour préférer un enregistrement PostDetail à un autre
    emojimap = {} if emojimap.nil?
    allowed.each do |a|
      emojimap[a] = a
    end
    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 incohérent par rapport à la suppression
        $stderr.puts sprintf("Impossible de trouver le post pour %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? # le changement de nom d'utilisateur ou la suppression d'utilisateur laisse des Retorts orphelins
        if likes.include?(emoji)
          pa = PostAction.where(post_id: p.id, user_id: u.id, post_action_type_id: likeType).first
          next unless pa.nil?
          $stderr.puts sprintf("Ajout d'un like pour Retort %s pour l'utilisateur %s dans %s", emoji, user, p.url)
          PostActionCreator.create(u, p, :like, created_at: pd.created_at, silent: true)
        elsif emojimap.has_key?(emoji)
          e = emojimap[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("Conversion de Retort %s en Reaction %s pour l'utilisateur %s dans %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)
        else
          $stderr.puts sprintf("Ignoré Retort non mappé %s pour l'utilisateur %s dans %s", emoji, user, p.url)
        end
      end
    end
  end

J’utilise le framework que j’ai construit pour fournir une configuration yaml qui ressemble à ceci :

- migrateRetortToReactions:
    allowed:
      - rofl
      - astonished
      - crossed_fingers
      - sob
      - thinking
      - grimacing
      - frowning_face
      - drum
    likes:
      - dart
      - +1
      - joy
      - "100"
      - brain
      - heart
      - heart_eyes
      - hearts
    emojimap:
      rage: sob
      four_leaf_clover: crossed_fingers
      cry: sob
      open_mouth: astonished
      scream: frowning_face

Cependant, vous pourriez simplement envelopper cela dans un script ruby, y compris en transformant ces arguments en code ruby littéral, le placer dans le répertoire script/ et l’exécuter.

2 « J'aime »