Discourse Retort

Mein Script framework to rearrange topics and categories hat eine neue Funktion erhalten, die etwas über das Neuanordnen von Themen und Kategorien hinausgeht!

Ich erinnere mich normalerweise daran, Leute zu warnen, dass ich kein Ruby oder Ruby on Rails kann, daher ist mein Code eher eigenwillig als idiomatisch. Aber bisher scheint er in meinen Tests zu funktionieren!

  def migrateRetortToReactions(allowed:, likes: nil, emojimap: nil)
    # migriert, wo möglich, ohne bestehende Likes zu überschreiben
    # dies ist eine zwangsläufig verlustbehaftete Konvertierung und ist nur durch die Reihenfolge von PostDetail konsistent
    # es wird kein Versuch unternommen, einen PostDetail-Datensatz einem anderen vorzuziehen
    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 nicht konsistent WRT Löschung
        $stderr.puts sprintf("Konnte Beitrag nicht finden für %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? # geänderter Benutzername oder gelöschter Benutzer hinterlässt verwaiste Retorts
        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("Füge Like für Retort %s für Benutzer %s in %s hinzu", 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("Konvertiere Retort %s zu Reaktion %s für Benutzer %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)
        else
          $stderr.puts sprintf("Ignoriere nicht zugeordnete Retort %s für Benutzer %s in %s", emoji, user, p.url)
        end
      end
    end
  end

Ich benutze das von mir erstellte Framework, um eine YAML-Konfiguration bereitzustellen, die so aussieht:

- 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

Sie könnten das aber auch einfach in ein Ruby-Skript packen, einschließlich der Umwandlung dieser Argumente in literalen Ruby-Code, es in das Verzeichnis script/ legen und ausführen.

2 „Gefällt mir“